LeJOS як рахувати натискання кнопки 1


Своє знайомство з Java для Mindstorms (LeJOS) я вирішив почати не з типового Hello World (яке, між іншим, нічим не відрізняється від такого для платформи ПК, бо LeJOS прекрасно розуміє що таке System.out.println() і виводить повідомлення просто на екран кубика Mindstorms). Насправді я вирішив написати програму підрахунку натискання кнопки (сенсора доторку), бо таку ж програму я до того вже реалізував на Mindstorms. Для порівняння, так би мовити 🙂

Як уже зазначалося, я використовую LeJOS 0.9, яка на момент написання статті є актуальною, але деякі приклади від старіших версій тут не працюють. Зокрема сенсор дотику, який за суттю своєю просто кнопка, у версії 0.9 інтегровано до Sensor Framework, тож працювати з ним потрібно через API цього фреймворку. Для прикладу, раніше існував метод isPressed(), що повертав логічне значення відповідно до стану кнопки, а зараз його вже нема.

Так от, Sensor Framework всі сенсори видають результати вимірювань у семплах (Samples). Семпл – це одновимірний масив, що містить певні дані, отримані з давача. Для опитування сенсора служить метод fetchSample(float[] sample, int offset), який не повертає значень, але заповнює масив sample. Цей метод викликається на об’єкті типу SampleProvider, який, у свою чергу, можна отримати із сенсора, вказавши режим.

Сенсор може працювати у одному чи кількох режимах (Modes). Для потрібного режиму можна отримати Sample Provider за допомогою методу getMode(string modeName); існує також перевантажена версія цього методу, яка приймає на вхід int.

Для роботи з сенсором доторку цієї інформації нам достатньо, тож далі код програми:

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

public class TouchTest {

	public static void main(String[] args) {
		// Отримуємо екземпляр порта вводу для нашого кубика
		Port port = LocalEV3.get().getPort("S1");
		SensorModes sensor = new EV3TouchSensor(port);
		// Отримуємо семпл-провайдер для єдиного режиму: Touch
		SampleProvider touch = sensor.getMode("Touch");
		// Ініціалізуємо масив для зберігання семплів, розмір масиву отримуємо
		// зі виклику методу touch.sampleSize();
		float[] sample = new float[touch.sampleSize()];
		int i = 0;
		float previous = 0;
		System.out.println("Ready!");
		while (i < 15) {
			// Здійснюємо опитування сенсора
			touch.fetchSample(sample, 0);
			if ((sample[0] == 1) && (previous != sample[0])) {
				i++;
				System.out.println("Count: " + i);
			}
			// Зберігаємо попереднє значення щоб відстежити натискання-відпускання 
			previous = sample[0];
		}
	}
}

При опитуванні сендора доторку нас цікавить нульовий елемент семплу (вір рівний 1 якщо кнопку натиснуто і 0 якщо ні). Єдиний неочевидний момент тут – змінна previous, яка використовується для зберігання попереднього елемента семплу. Справа у тому, що ми хочемо рахувати саме натискання-відпускання кнопки, тож нам потрідно відстежувати зміну її стану, а отже зміну значення sample[0] з нуля на одиницю.

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


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

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

Думка на тему “LeJOS як рахувати натискання кнопки