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

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

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

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

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

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

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

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

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

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

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

int sen = 6; 
// аналоговый пин, в который включён датчик int val; //

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

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

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

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

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

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

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!

Похожие записи:

Если вам понравилась статья, вы можете подписаться на RSS или E-mail рассылку. Для получения обновлений по электронной почте, введите ваш e-mail адрес в эту форму (Доставка от FeedBurner):

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *