LeJOS: дистанційне керування з пульта 4


У нинішній статті буде аж два приклади: робота з інфрачервоним дальноміром і використання комплектного інфрачервоного пульта дистанційного керування.

Стосовно сенсора відстані то він поганенький і краще окремо купити ультразвуковий далекомір Lego 45504 – він вартує 30 баксів, але на порядок кращий (насправді кращий за характеристиками навіть старий сенсор 9846 від Mindstorms NXT). Та ми маємо що маємо, тож спробуємо вимірювати дистанцію інфрачервоним сенсором.

import lejos.hardware.Button;
import lejos.hardware.ev3.LocalEV3;
import lejos.hardware.port.Port;
import lejos.hardware.sensor.EV3IRSensor;
import lejos.hardware.sensor.SensorModes;
import lejos.robotics.SampleProvider;

public class IRTest {

	public static void main(String[] args) {
		Port port = LocalEV3.get().getPort("S1");
		@SuppressWarnings("resource")
		SensorModes sensor = new EV3IRSensor(port);
		SampleProvider provider = sensor.getMode("Distance");
		// Use 'Seek' for beacon detection
		float[] sample = new float[provider.sampleSize()];
		System.out.println("Distance measure");
		int keys = 0;
		while (keys != 2) {
			provider.fetchSample(sample, 0);
			System.out.println(sample[0]);
			Button.waitForAnyPress();
			keys = Button.readButtons();
		}
	}
}

Lego IR Receiver

Він працює у двох режимах: “Distance” і “Seek”: у першому якраз використовується для визначення дистанції до перешкоди, а у другому – для пошуку “маячка” (пульт Mindstorms EV3 має спеціальний режим роботи маячка, який може знадобитися, скажімо, для пошуку роботом певної точки у просторі і “повернення на базу” або стеження).

В принципі, робота з цим сенсором нічим не відрізняється від роботи з будь-яким іншим датчиком де використовується Sensor Framework: ми отримуємо екземпляр SampleProvider для сенсора і у циклі викликаємо метод fetchSample(). Далі я просто виводжу результат на екран: це число у діапазоні від 0 до 40, яке пропорційне відстані до об’єкту-перешкоди. Насправді не факт, що ці покази можна однозначно сконвертувати у якісь одиниці відстані, та й максимальна дистанція, яку можна виміряти таким чином, складає десь півметра…

У режимі “Seek” сенсор повертає напрям на маяк (число у діапазоні від -25 до +25) і дистанцію. Підтримується кілька маяків, якщо вони працюють на різних каналах. Наразі я не буду розглядати пошук маяка і повернуся до цього питання у якійсь із наступних статей.

А нас цікавить дистанційне керування роботом з пульта і для цього слід трохи модифікувати програму:

import lejos.hardware.ev3.LocalEV3;
import lejos.hardware.port.Port;
import lejos.hardware.sensor.EV3IRSensor;
import lejos.hardware.sensor.SensorModes;

public class IRTest {

	public static void main(String[] args) {
		Port port = LocalEV3.get().getPort("S1");
		@SuppressWarnings("resource")
		SensorModes sensor = new EV3IRSensor(port);
		System.out.println("Remote control");
		int keys = 0;
		while (keys != 2) {
			// 0 stands for channel 1
			System.out.println(((EV3IRSensor) sensor).getRemoteCommand(0));
		}
	}
}

Тепер ми використовуємо не Sensor Framework, а викликаємо метод getRemoteCommand() самого сенсора і передаємо йому номер каналу, який слід “слухати”. Номер каналу вибираєтся перемикачем на пульті і тут є невеличкий проїзд: на пульті канали пронумеровано від 1 до 4, а у програмі їм відповідають канали 0-3, тому краще, мабуть, оголосити якісь константи, аби уникнути плутанини.

Метод getRemoteCommand() повертає ціле число, яке є кодом натиснутої на пульті кнопки або їх комбінації. Список кодів можна знайти у документації, та я продублюю їх тут:

EV3 IR Remote

1 Верхня ліва
2 Нижня ліва
3 Верхня права
4 Нижня права
5 Верхня ліва і верхня права
6 Верхня права і нижня права
7 Нижня ліва і верхня права
8 Нижня ліва і нижня права
9 Кнопка маяка
10 Нижня ліва і верхня ліва
11 Верхня права і нижня права

Також існує метод getRemoteCommands(), який отримує на вхід масив і може опрацьовувати одночасно нібір команд від кількох пультів.

Почитайте ще оце:


Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

4 thoughts on “LeJOS: дистанційне керування з пульта