Урок 4. Методы Ввода

Датчики, кнопки, переключатели, регуляторы и прочая-прочая полезная, интересная и забавная «ерунда» :D… Всё это требует чего?! Нет, не свободных денег, а знаний об особенностях ввода(приёма) входящей информации или входящего сигнала с этих устройств!

Все устройства такого типа можно разделить на два типа: на кнопки и не кнопки (шутка), если серьёзно — то на те, кто «отсылает» неточный и точный сигнал/импульс. ТО есть кнопки, рычажки, переключатели и всякие подобные устройства на выходе имеют сигнал только ВЫСОКИЙ или НИЗКИЙ (1 или 0).

Это очень упрощает задачу, так как базовая структура кода на кнопку очень простая. Есть одно «но»: для кнопок есть специфическая схема «включения в схему», которую обязательно надо соблюдать (рисунок прилагается). По-этому, я прилагаю вторую половину фрагмента кода «считывания кнопки» — (DigitalPin == LOW), где DigitalPin — «диджитал» ножка подключения кнопки (или чего-то подобного). Дальше будет интересней — дальше первый фрагмент. Эти первые фрагменты могут быть разными, они напрямую зависят от назначения конкретной кнопки в конкретном случае. По-этому продумайте всё заранее. Итак, если мы регистрируем / реагируем на одиночное нажатие, то мы используем команду «if».

1
2
3
if (DigitalPin == LOW)
// именно низкий сигнал, т.к. тут чистая физика (смайл)
{ //что-то делаем... }

Но, если мы хотим что-то «переключать» или реагировать на длительные зажатия, то нам нужна команда «while».

1
2
while (DigitalPin == LOW)
{ //что-то делаем... }

Скажу по секрету, однажды я с этим столкнулся и … удачно справился. Я строил руку манипулятора на трёх сервах (сервоприводах/сервомашинках, кому как удобнее называть…), (без непосредственного захвата) там было управление перемещением руки с кнопок, но так как у меня Arduino Nano, с маленьким количеством ножек, то я и «скомбинировал» хитрость: использовал две кнопки непосредственно для управления, и ещё один «четверной» переключатель для смены режимов.

Я, честно говоря, был даже горд за такую догадку :). Код этого — слишком длинен и не соответствует тематике этого урока, поэтому я выкладываю его в отдельную страницу (сюда, но позже)!

Теперь мы будем изучать и осваивать приём данных с «умных» датчиков. Это будет более долго и трудоёмко, но более действенно и практично. Я думаю, что более-менее подробного разбора работы с классическим датчиком расстояния «Sharp» вам хватит надолго, учитывая то, что он — основное устройство в своём роде, а мы — только начинающие… (Sharp GP2D12 — гуглите схемы)

Подключим наш датчик к Arduino, инициализируем его для корректной работы. Можете написать код сами, а можете взять мой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int sen = 6;
// аналоговый пин, в который включён датчик int val; //

void setup ()
{
Serial.begin (9600);
// настройка ком-порта:
//на данной стадии мы ничего про него не прошли,
//поэтому просто напишите Так;
//скоро будет статья конкретно о нём!
}

void loop()
{
val = analogRead(sen);
// присваиваем переменной цифровой сигнал с датчика

Serial.println(val);
// выводим в консоль этот сигнал (переменную)

delay (500);
// задержка, чтобы успеть посмотреть на результат
}

Сначала — поэкспериментируем с «дальностью», потом «обдумаем», какое расстояние мы будем замерять, и, точно отмерив его цифровой сигнал, выпишем результат; позже вставим это значение в очередную программу.

Если хотите, то вот вам для наглядности один из моих «тестовых» кодов для элементарного движения (для пущей наглядности всё откомментировал):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
int di1 = 5;
// мотор 1 вперед...

int di2 = 4;
// ...назад

int di3 = 3;
// мотор 2 вперед...

int di4 = 2;
// ...назад

int s1 = 6;
// наш сенсор

int val;
// переменная "хранения"

int nnn;
// =x, время, для проезда на один корпус вперёд
//(у каждого - своя)

void setup ()
{
pinMode (di1 , OUTPUT); // все
pinMode (di2 , OUTPUT); // моторы
pinMode (di3 , OUTPUT); // на
pinMode (di4 , OUTPUT); // вывод!
forward(); turn();
}

void loop()
{
val = analogRead(s1);
// считываем значение с дачика, записывая в переменную

val /=4;
// делим на 4 для удобности
//(необязательно!!! я просто так сделал)

delay (500);

if (digitalRead (val) < 50)
// проверяем замеренное значение
{
forward();
// препятствие далеко - продолжаем движение вперёд
}
else if (digitalRead (val) > 90)
{
turn();
// если близко, то поворачиваем
}
}

void forward()
{
digitalWrite(di1, 1);
digitalWrite(di3, 1); delay (nnn); digitalWrite(di1, 0);
digitalWrite(di3, 0);
}

void turn()
{
digitalWrite(di2, 1);
digitalWrite(di3, 1); delay (nnn); digitalWrite(di2, 0);
digitalWrite(di3, 0);
}

Что ж, хоть это очень примитивно, но наглядно вам показало, как работать некоторыми устройствами ввода. В принципе, с остальными работать так же или аналогично. Главное: перед началом работы с любым устройством правильно подключить его, а потом просто «играться» с ним до тех пор, пока не будет ясен смысл и причины получения от него определённых сигналов.
Спасибо за внимание, до скорого на kiloom.ru!

Добавить комментарий

Ваш адрес email не будет опубликован.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>