Датчики, кнопки, переключатели, регуляторы и прочая-прочая полезная, интересная и забавная «ерунда» :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!