В своих предыдущих статьях я рассказывал о том, как помочь парализованным людям общаться с внешним миром: сообщать о своих желаниях, писать письма, лазить по интернету, используя лишь свои глаза и устройство, отслеживающее направление взгляда (айтрекер). При этом физически человек всё равно остаётся ограничен миром компьютера и постели.
Здесь я расскажу о простейших (на мой взгляд) способах самому менять что-то во внешнем мире: включить свет или гирлянду на новогодней ёлке, поуправлять вездеходом на радиоуправлении, заставить моторизованную коляску двигаться в нужном направлении.
Содержание
Введение
Необходимые компоненты
Подключение Arduino к компьютеру
Схема управления электророзетками
Схема управления моторами
Введение
В дополнение к устройству отслеживания взгляда и бесплатного программного обеспечения к нему, описываемых вот в этой статье, нам понадобится что-то, связывающее компьютер с внешними объектами.
Несмотря на наличие в продаже всевозможных устройств, которыми можно управлять с компьютера, наиболее простым и дешёвым мне показался вариант использования двух деталей: платы Arduino и платы из нескольких реле.
Если вы никогда не сталкивались с Arduino, всё же не бросайте чтение, в дальнейшем вы увидите, что в данном контексте работать с ним довольно просто, не даром в продаже есть множество детских конструкторов на основе Arduino.
В то же время, если вы не знакомы с электробезопасностью и никогда не делали электропроводку в доме, не пытайтесь повторить схемы, в которых используется подключение к розеткам!
Всё, что вам нужно знать об Arduino: это небольшое устройство, которое можно воткнуть в USB-разъём компьютера, после чего оно сможет включать/выключать электрические сигналы на своих контактах согласно полученной инструкции.
Сигналы довольно маломощные, поэтому для управления чем-нибудь помощнее (электролампами, например), поставим блок реле, которые в ответ на сигнал от Arduino замыкают-размыкают контакты управления внешними приборами. Кроме того, реле изолируют электрические цепи компьютера+Arduino от электрических цепей управляемого устройства.
Итак, основу схем управления электророзетками и моторами, которые будут далее описаны, составляет следующее: две детали, соединённые проводами между собой, подключенные кабелем USB к компьютеру и проводами к тому, чем мы хотим управлять:
В реальном мире это может выглядеть вот так:
Мы посылаем команду с компьютера, Arduino одним из своих контактов включает/выключает реле, которое является выключателем какого-либо устройства или отдельной кнопки на устройстве.
Необходимые компоненты
Нам потребуются (в скобках приведены цены 2018 года в местном магазине. Умеющие покупать в Китае могут существенно сэкономить в деньгах, но проиграть во времени):
1) Плата Arduino UNO с кабелем USB (можно неоригинальная, с дешёвым CH340 вместо дорогого FTDI) (450 руб.)
2) Плата с четырьмя реле, работающими от напряжения 5 Вольт и способными управлять устройствами с напряжением 220 Вольт. (450 руб.). Бывают ещё платы, работающие от 12 Вольт, не перепутайте!
3) Пучок проводов для соединения двух плат. В моём случае потребовались провода с гнездом с одной стороны и штырьком – с другой, так как блок реле имеет штырьковые контакты, а Arduino — гнёзда. Посмотрите, какие разъёмы на ваших платах, покупая провода (150 руб.).
Подключение Arduino к компьютеру
Для начала установим программное обеспечение для программирования Arduino с сайта www.arduino.cc:
На странице https://www.arduino.cc/en/Main/Software щёлкаем на “Windows Installer”:
Жмём “Just Download”:
Скачиваем и запускам программу-установщик:
Соглашаемся на всё:
По завершении установки программы соединим кабелем USB плату Arduino и компьютер.
На плате Arduino загорятся огоньки, а в диспетчере устройств вы увидите, что появился новый порт, и ему присвоили некий номер, например, COM3:
Давайте поменяем его номер на COM9, так как в дальнейшем всё будет привязано именно к COM9. Для этого нажмём на нём правой кнопкой мыши, вызовем контекстное меню и выберем в нём “свойства”:
На закладке “параметры порта” жмём кнопку “дополнительно”:
И, наконец, выбираем “COM9” в качестве номера COM-порта.
Закрываем все открытые окна кнопкой “OK”, после чего вынем и вставим USB-кабель, чтобы проверить, что Arduino в дальнейшем будет подключаться по порту COM9, если будет вставлен в тот же USB-разъём компьютера:
Теперь вызовем и настроим недавно установленную с сайта программу Arduino:
В меню “инструменты” выставьте плату “Arduino UNO”, а порт – “COM9”:
Теперь всё готово для того, чтобы собрать схемы и вдохнуть в них жизнь.
Схема управления электророзетками
Если вы не знакомы с электробезопасностью и никогда не делали электропроводку в доме, не пытайтесь повторить эту схему! В схеме используется опасное для жизни напряжение!
Ещё раз контрольные вопросы:
- Вы знаете, как отличить в розетке провод с фазой от провода с нулём?
- Вы знаете, как прозвонить провода и убедиться в том, что после включения в розетку не случится короткого замыкания?
Если вы неуверенно отвечаете на эти вопросы, попросите собрать схему кого-нибудь более опытного.
Теперь к делу.
Работает это вот так:
Схема подключения розеток выглядит так:
Ноль подаём на розетки напрямую, а фазу – через реле. Если сделаете наоборот, то работать будет, но возникнет опасность поражения током от ВЫКЛЮЧЕННЫХ НЕИСПРАВНЫХ приборов. То есть, хватаетесь за выключенный неисправный телевизор, а он вас током бьёт.
Если в доме есть защитное заземление, то используйте розетки с заземлением.
Дальше – мой референсный дизайн. В нём я допустил ошибку с цветом проводов: цвет нулевого провода сделал коричневым, а фазы – голубым. Обратите на это внимание.
Берём кусок доски подходящего размера, чтобы на нём уместились (слева направо): Arduino, блок реле, четыре розетки, скоба для прижатия провода к доске.
Отпиливаем лишнее и стамеской проделываем жёлоб для проводов, чтобы они свободно укладывались под розетками.
Платы Arduino и блока реле прикручиваем саморезами к доске, проложив пластиковые шайбы.
Если шайб под рукой не оказалось, можно нарезать дюбели:
Подготовим провода: обрежем до нужной длины и зачистим от изоляции. Желательно их залудить паяльником в местах контактов с розетками и реле.
Прижмём провод к доске при помощи скобы, чтобы его нельзя было выдернуть.
Подключаем провода и привинчиваем розетки. Прозваниваем цепи.
Соединяем плату Arduino с блоком реле пучком проводов в соответствии с приведённой выше схемой.
Закрываем платы защитным кожухом из непроводящего ток материала. Здесь это нужно сделать обязательно, так как к блоку реле подходит опасное для жизни напряжение! В крайнем случае хотя-бы замотайте изолентой контакты у реле.
Я использовал в качестве кожуха контейнер для продуктов из жёсткого пластика, прикрепив его саморезами:
Не забудьте проделать отверстие для USB-кабеля.
Соединим устройство с компьютером, но не включаем его в розетку.
Запускаем программу “Arduino” и копируем туда вот этот текст программы:
// Реле подключены к пинам 2,3,4,5
int Relay1=2, Relay2=3, Relay3=4, Relay4=5;
void setup() {
pinMode(Relay1,OUTPUT);
pinMode(Relay2,OUTPUT);
pinMode(Relay3,OUTPUT);
pinMode(Relay4,OUTPUT);
Serial.begin(9600);
}
void loop()
{
delay (200);
// 1. Принимаем команду от компьютера
while(Serial.available())
{
switch(Serial.read())
{
case '0': // первое реле выключить
digitalWrite(Relay1,0);
break;
case '1': // первое реле включить
digitalWrite(Relay1,1);
break;
case '2': // второе реле выключить
digitalWrite(Relay2,0);
break;
case '3': // второе реле включить
digitalWrite(Relay2,1);
break;
case '4': // третье реле выключить
digitalWrite(Relay3,0);
break;
case '5': // третье реле включить
digitalWrite(Relay3,1);
break;
case '6': // четвертое реле выключить
digitalWrite(Relay4,0);
break;
case '7': // четвертое реле включить
digitalWrite(Relay4,1);
break;
} // switch
} // while
}
Затем жмём на кнопку загрузки программы в Arduino (см. рисунок ниже). Если всё прошло без ошибок, то видим надпись “Загрузка завершена”.
Проверим, что наше устройство исполняет команды. Для этого вызовем монитор порта:
Теперь наберём там цифру 1 и нажмём Enter или кнопку «Отправить»:
Раздастся характерный щелчок реле и контакт в первой розетке соединится с проводом фазы. Проверьте это при помощи тестера. Затем наберите цифру 0 и реле отключит контакт.
Посмотрев на текст программы, можно заметить, что будет, если мы наберём другие цифры:
3,2 – включить, выключить вторую розетку
5,4 – включить, выключить третью розетку
7,6 — включить, выключить четвёртую розетку
Проверьте тестером подключение этих розеток. После проверки можно подключить провод к напряжению в сети и начать включать/выключать реальные приборы.
Наша следующая задача – включать и выключать приборы при помощи взгляда. Для этого сконфигурируем программу bkb, описанную вот в этой статье, (НУЖНА ПОСЛЕДНЯЯ ВЕРСИЯ ПРОГРАММЫ!!!).
Допустим, мы хотим включать и выключать лампу и ёлочную гирлянду.
Нарисуем в стандартной программе Paint четыре рисунка размером 200x200 в формате BMP:
Создадим также четыре командных файла: c.cmd, d.cmd, e.cmd, f.cmd
Они будут содержать команды отсылки в порт COM9 символов 1,0,3,2. А мы помним, что они включают и выключают первую и вторую розетки. Важно, чтобы между двумя строками в этих файлах не было пустых строк!
c.cmd:
MODE COM9: BAUD=9600 DATA=8 STOP=1 PARITY=N to=off xon=off odsr=off octs=off rts=off idsr=off dtr=off
echo 1 > com9:
d.cmd:
MODE COM9: BAUD=9600 DATA=8 STOP=1 PARITY=N to=off xon=off odsr=off octs=off rts=off idsr=off dtr=off
echo 0 > com9:
e.cmd:
MODE COM9: BAUD=9600 DATA=8 STOP=1 PARITY=N to=off xon=off odsr=off octs=off rts=off idsr=off dtr=off
echo 3 > com9:
f.cmd:
MODE COM9: BAUD=9600 DATA=8 STOP=1 PARITY=N to=off xon=off odsr=off octs=off rts=off idsr=off dtr=off
echo 2 > com9:
Созданные файлы .bmp и .cmd переписываем в каталог grid программы bkb.
После запуска программы bkb в режиме таблицы появится новая, пятая строка с нашими картинками:
Когда мы задержим взгляд на картинке, запускается соответствующий ей действие.
ВНИМАНИЕ! Первый раз после запуска программы действие не срабатывает. Все последующие разы – срабатывает. Это связано с тем, что при первой инициализации порта изменяется сигнал на линии DTR, что вызывает перезагрузку Arduino, которая длится секунды три.
Говорят, что это решается при помощи паяльника, но я такой ювелирной работой заниматься не рискнул. Так что пока просто помните, что первый раз включать нужно дважды.
Замечание
Вы, наверное, уже поняли, что в файлах .cmd вы можете вызывать любые внешние программы. Если у вас есть какое-либо устройство, которым можно управлять из командной строки, вы сами можете исполнять такие команды, приписав любым картинкам в таблице необходимые действия.
Схема управления моторами
Мой знакомый модернизировал гироскутер и заменил им заднюю ось детской коляски. Управление осуществлялось пультами через плату Arduino.
Мы решили попробовать предоставить ребёнку возможность управлять коляской самостоятельно при помощи взгляда. Для этого в программу bkb был добавлен режим управления коляской.
После запуска в таком режиме на экране появляются стрелочки, взгляд на которые заставляет программу посылать в порт COM9 символы управления, которые потом интерпретируются коляской для движения вперёд/назад, разворотов влево/вправо и остановки.
Пока коляска находится в состоянии доработки, я решил использовать эту же программу для дистанционного управления моделью гусеничного танка. Это тоже довольно полезная вещь. Во-первых, ребёнок получает навыки, которые пригодятся для управления коляской. Во-вторых, это просто увлекательная игра.
Каждая из гусениц танка управляется рычагом, который можно сдвинуть вперёд или назад. При перемещении рычага вперёд он нажимает на кнопку, заставляющую мотор вращаться вперёд. При перемещении рычага назад он нажимает на кнопку, которая заставляет вращаться мотор в обратном направлении. Одновременно нажать две кнопки – вперёд и назад невозможно.
Блок реле был подключён к кнопкам пульта дистанционного управления согласно приведённой ниже схеме. Схема не позволяет активировать кнопки “мотор вперёд” и “мотор назад” одновременно. Одно реле включает/отключает мотор, а второе выбирает направление вперёд или назад.
Найдите на плате пульта управления, куда подключаются кнопки и подключитесь к ним, согласно приведённой схеме.
Обратите внимание, что в отличие от предыдущей схемы, Arduino управляет блоком реле выводами с 6 по 9.
Блок реле я соединил с пультом через разъём, чтобы пульт можно было легко отсоединить и использовать отдельно:
Программа, которую нужно загрузить Arduino, принимает от компьютера те же команды, какие используются для управления моторизованной коляской:
F-вперёд
B-назад
L-влево
R-вправо
S- стоп
Текст программы приведён ниже.
// Реле подключены к пинам 6,7,8,9
int Relay1=6, Relay2=7, Relay3=8, Relay4=9;
int heartbeat=0; // для обнаружения разрыва связи
void setup() {
pinMode(Relay1,OUTPUT);
pinMode(Relay2,OUTPUT);
pinMode(Relay3,OUTPUT);
pinMode(Relay4,OUTPUT);
Serial.begin(9600);
}
void RCStop()
{
digitalWrite(Relay1,0);
digitalWrite(Relay2,0);
digitalWrite(Relay3,0);
digitalWrite(Relay4,0);
}
void RCForward()
{
digitalWrite(Relay1,1);
digitalWrite(Relay2,1);
digitalWrite(Relay3,1);
digitalWrite(Relay4,1);
}
void RCBack()
{
digitalWrite(Relay1,1);
digitalWrite(Relay2,0);
digitalWrite(Relay3,1);
digitalWrite(Relay4,0);
}
void RCLeft()
{
digitalWrite(Relay1,1);
digitalWrite(Relay2,0);
digitalWrite(Relay3,1);
digitalWrite(Relay4,1);
}
void RCRight()
{
digitalWrite(Relay1,1);
digitalWrite(Relay2,1);
digitalWrite(Relay3,1);
digitalWrite(Relay4,0);
}
void loop()
{
// 1. Принимаем команду от компьютера
while(Serial.available())
{
switch(Serial.read())
{
case 'S': // Стоп машина!
RCStop();
heartbeat=0;
break;
case 'F': // Ехать вперёд!
RCForward();
heartbeat=0;
break;
case 'B': // Ехать назад!
RCBack();
heartbeat=0;
break;
case 'L': // Поворот влево!
RCLeft();
heartbeat=0;
break;
case 'R': // Поворот вправо!
RCRight();
heartbeat=0;
break;
} // switch
} // while
// 2. Обнаруживаем обрыв связи
// Если треть секунды не было команд - отключаем моторы
delay(10);
heartbeat++;
if(heartbeat>30)
{
heartbeat=30; // не расти же бесконечно!
RCStop(); // связь потеряна - моторы выключаем
}
}
Если связь с компьютером обрывается (не приходят никакие символы в течение 0,3 сек, то Arduino выключает моторы). Такую ситуацию можно смоделировать, закрыв глаза при управлении взглядом. Айтрекер не сможет определить направление взгляда и сигналы не будут посылаться. Моторы остановятся.
Модель танка я оснастил видеокамерой, которая обычно именуется курсовой, или FPV (First Person View), передающей аналоговый сигнал на частоте около 5,8 ГГц. Я взял одну из самых дешёвых камер, оснащённую также передатчиком и антенной: AKK BA-3. Мне она обошлась в 1050 рублей. Камера с передатчиком столь мала, что умещается в руках у фигурки «Лего»:
Всё, что нужно сделать для работы камеры – подключить её к питанию (от 3,2 до 5,5 Вольт). Потом единственной кнопкой выбрать диапазон, частоту и мощность передатчика.
Камера ощутимо греется, поэтому рекомендую выставить минимальную мощность (25 милливатт). К тому же я подключил её к аккумулятору танка с напряжением 6 Вольт, что превышает допустимые значения. Поэтому не знаю, сколько она протянет. Вам же рекомендую использовать стабилизатор напряжения для питания камеры.
При креплении камеры я приклеил к танку один элемент конструктора «Лего», а остальные элементы уже крепил к нему простым соединением. Это позволяет легко снимать и убирать камеру. Также при врезании в препятствие камера может просто сложиться, что спасёт её от повреждения.
Для приёма видеосигнала от камеры я использовал приёмник Eachine ROTG01. Брал не новый за 1800 руб. Это просто коробочка с антенной, которая соединяется с USB-портом компьютера и видна как USB-камера. То есть запускаем приложение “Камера” в Windows и видим то, что принимает приёмник. Ещё в начале нужно подержать нажатой единственную кнопку приёмника, чтобы он просканировал эфир и нашёл частоту, на которой передаёт сигнал наша камера.
В целом нам потребуются три порта USB в компьютере:
— для айтрекера
— для Arduino, управляющего пультом управления танком
— для приёмника видеосигнала
Запускаем вывод изображения с камеры, например, программой «Камера». Запускаем программу bkb и выбираем режим управления моторизованной коляской.
Что может произойти дальше – показано на видео:
Видно, что скорость движения, и, особенно, скорость поворотов, великовата. Так что, если будете выбирать радиоуправляемую модель, выбирайте самую медленную. Экскаватор, что ли, какой-нибудь.
А почему бы не взять готового «робота-шпиона»?
Попал мне в руки один такой, HappyCow 777-325.
Я было обрадовался: всё у него есть, и дистанционное управление, и передача видео, и едет довольно медленно. Есть, правда, одна особенность – управляется только через приложение в Android или iOS. Ну так это мы решим через удаленное управление Android, например, при помощи scrcpy.
Но оказалось, что кроме исправимых недостатков (узкий угол обзора камеры) у машинки есть один неисправимый. Видео, передаваемое им через Wi-Fi, имеет чудовищную задержку.
То есть этот робот уже давно врезался во что-то, а вы всё жмёте на газ, думая, что он ещё до препятствия не доехал.
Для ребёнка, который учится дистанционно управлять машиной, это, на мой взгляд, неприемлемо.
Так что робот получает отставку. Хотя шасси от него я бы позаимствовал.
Заключение
Желаю всем успехов в повторении и развитии описанных технических решений.
fenst
Как владелец детской коляски Kimba, желаю Вам всяческих успехов. Если есть желание это дело монетизированно распространить на большой пласт нуждающихся и вам нужны единомышленники, буду рад помочь.