LeJOS: ІЧ приймач в режимі пошуку 1


Як я вже згадував у попередній статті про роботу з інфрачервоним приймачем Mindstorms EV3, цей сенсор може працювати у режимі “Seek”, який дозвроляє визначати напрямок на маяк. Зараз ми спробуємо продемонструвати роботу у цьому режимі для чого скористаємося також інформацією зі статті про відтворення звуку у EV3.

Ми спробуємо зробити невеличкий девайс для пошуку маячка за допомогою звуку: типу металошукача. Зразу попереджаю, що з музичним слухом у мене не дуже, тому какофонія буде ще та – краще скрутити звук 🙂

Я вирішив не заморочуватися з LEGO і просто відкрутив голову у стандартної моделі Mindstorms EV3 Home Edition: робота EV3RSTORMEV3RSTORM

а також взяв готового бота-мішень від нього ж, тому скласти аналогічний пристрій можете за готовими інструкціями від LEGO.IR Seeker

Переходимо до програмування 🙂 За своєю суттю нічого нового ми не робитимемо: використаємо звичайнісінький SampleProvider, як і для інших сенсорів, проте у нашому випадку розмір семпла складатиме аж 8 елементів, з яких ми використаємо два. Перший елемент міститиме інформацію про напрям на маячок (величина у діапазоні від -25 до 25, яку я беру за модулем), а другий – дистанцію до нього.

Для чого потрібні інші 6 елементів? Пульт-маяк LEGO Mindstorms може працювати на 4-х каналах, тож ми можемо використати до чотирьох пультів водночас (насправді більше, бо можна і на один канал кілька пультів причепити, якщо не потрібно їх розрізняти).

import lejos.hardware.Button;
import lejos.hardware.Sound;
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 IRSeeker {

	public static void main(String[] args) {
		Port port = LocalEV3.get().getPort("S1");
		@SuppressWarnings("resource")
		SensorModes sensor = new EV3IRSensor(port);
		SampleProvider provider = sensor.getMode("Seek");
		float[] sample = new float[provider.sampleSize()];
		int keys = 0;
		System.out.println("Tone Seeker: \nENTER - start \nESCAPE - stop");
		Button.ENTER.waitForPress();
		while (keys != 32) {// Press ESCAPE to stop
			keys = Button.readButtons();
			provider.fetchSample(sample, 0);
			float azimut = Math.abs(sample[0]);
			float distance = sample[1];
			if (azimut < 25 && distance < 100) {
				Sound.setVolume(50);
				Sound.playTone((int) (100 + azimut * 60),
						(int) (50 + distance * 10));
			}
			System.out.println("Az:" + azimut + " Dst: " + distance);
		}
	}
}

Тут наче все зрозуміло: кубик відтворює звук, тривалість якого залежить від дистанції до маяка, а частота тону – віз напряму. На рахунок magic numbers нічого сказати не можу: просто підбирва величини “на око” і впевнений, що людина, у якої все в порядку з музикою, зможе запропонувати кращий варіант. Коментарі відкриті 🙂

Наостанок невеличке відео, яке я зняв для демонстрації роботи цього девайсу:

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


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

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

Думка на тему “LeJOS: ІЧ приймач в режимі пошуку