Радиоуправляемая Wi-Fi машинка с камерой
Летом появилась мысль сделать радиоуправляемую машинку, но не просто нечто похожее на творение китайской инженерной мысли, которое продается на каждом шагу, а машинку, управлять которой можно было бы с компьютера или телефона. Понято, что машинка, которой можно управлять через Wi-Fi в чистом виде, совершенно не интересна. А вот если бы у нее была бы камера? А если еще и управление через 3G/EDGE/GPRS? Вот это – другое дело! Значит, управляющее устройство должно иметь USB и Wi-Fi (ну или только USB, можно купить USB Wi-Fi адаптер). Теперь нужно придумать, как управлять двигателями. Изначально я хотел сделать это с помощью COM-порта и регистра сдвига (74HC595), но спалив 5 таких микросхем, от такого способа отказался. Позже мой взгляд пал на Arduino, а именно на Arduino Duemilanove. Эта плата имеет 14 цифровых I/O портов, из них шесть – ШИМ (можно будет управлять напряжением на двигателе и повесить сервы для камеры), два можно использовать как Tx и Rx последовательного порта.
Роутер
Обнаружив в своем городе роутер D-Link DIR-320, у которого есть USB порт, сразу же его купил. Придя домой, узнал, что у этого роутера есть невыведенный UART-порт. Таким образом, у нас появляется канал связи между роутером и ардуиной.
Для роутера я выбрал прошивку OpenWrt. Можно скачать готовую прошивку с OpenWrt для DIR-320 это здесь. Уже не помню почему, но я решил собрать прошивку сам (подробно описано тут). Для этого понадобится Linux (я собирал на Ubuntu 11.10). Для начала, скачаем исходники прошивки и соберем все, что нужно:
svn co svn://svn.openwrt.org/openwrt/branches/backfire dir320 cd dir320 ./scripts/feeds update -a && ./scripts/feeds install –a make prereq && make tools/install && make toolchain/install
- Target System —>Broadcom BCM947xx/953xx – ядро 2.6
- Image configuration —>LAN IP Address —>– [не обязательно] Можно выбрать IP-адрес, который будет у роутера после загрузки ядра и всех модулей
- Kernel modules —>Filesystems —>kmod-fs-ext3 — Об этом позже
- Utilities —> Filesystem —>e2fsprogs – И об этом
- Utilities —> disc —>block-extroot – И об этом тоже
- Kernel modules —>USB Support —>kmod-usb-core – поддержка USB
- Kernel modules —>USB Support —>kmod-usb-ohci – для USB-хаба. Зачем он? Об этом тоже позже
- Kernel modules —>USB Support —>kmod-usb-storage – поддержка USB-флешек
- Kernel modules —>USB Support —>kmod-usb2 – USB 2.0
- Administration —> webif —>webif-applications – админка
- Kernel modules —>Video Support —>kmod-usb-video-core – поддержка USB-video
- Kernel modules —>Video Support —>kmod-usb-video-uvc – поддержка UVC-веб камер
- Device Drivers —>Memory Technology Device (MTD) support —> RAM/ROM/Flash chip drivers —> [*] Flash chip driver advanced configuration options —> [*] Specific CFI Flash geometry selection —> [*] Support 8-bit buswidth
- Device Drivers —>Memory Technology Device (MTD) support —> RAM/ROM/Flash chip drivers —> [*] Flash chip driver advanced configuration options —> [*] Specific CFI Flash geometry selection —> [*] Support 16-bit buswidth
Компилируем и прошиваем
#!/bin/bash echo "==================================================================" echo "This script will upload dd-wrt firmware (firmware.bin)" echo "in the current directory to 192.168.0.1 " echo "during the router's bootup. " echo "" echo "* Set your ethernet card's settings to: " echo " IP: 192.168.0.10 " echo " Mask: 255.255.255.0 " echo " Gateway: 192.168.0.1 " echo "* Unplug the router's power cable. " echo "" echo "Press Ctrl+C to abort or any other key to continue. " read echo "" echo "* Re-plug the router's power cable. " echo "" echo "==================================================================" echo "Waiting for the router. Press Ctrl+C to abort. " echo "" try() < ping -c 1 -w 1 192.168.0.1 >try while [ "$?" != "0" ] ; do try done echo "*** Start Flashing **** " atftp --no-source-port-checking -p -l firmware.bin 192.168.0.1 echo "Firmware successfully loaded!"
@echo off echo ================================================================== echo This batch file will upload dd-wrt firmware in the current directory to echo 192.168.0.1 during the router's bootup. echo. echo * Set your ethernet card's settings to: echo IP: 192.168.0.2 echo Mask: 255.255.255.0 echo Gateway: 192.168.0.1 echo * Unplug the router's power cable. echo. echo Press Ctrl+C to abort or any other key to continue. pause > nul echo. echo * Re-plug the router's power cable. echo. echo ================================================================== echo Waiting for the router. Press Ctrl+C to abort. echo. set FIND=%WINDIR%\command\find.exe if exist %FIND% goto LPING set FIND=%WINDIR%\system32\find.exe if exist %FIND% goto LPING set FIND=find :LPING ping -n 1 -w 50 192.168.0.1 | %FIND% "TTL http:///?action=stream">http:///?action=stream.
Arduino и соединение
Для начала определимся со схемой подключения двигателей. Так как я брал корпус от уже готовой машинки, то мне с двигателями повезло – они уже там были. Передний отвечал за повороты (влево, вправо, прямо), а задний за движение (мне пришлось его поменять на двигатель кнопки блокировки дверей какого-то ВАЗа). Управлять нагрузками можно ардуиной с помощью полевых транзисторов (95N2LH5, но я использовал IRF 630, потому что и эти ели нашел в своём городе). Подключение такое: земля транзистора – к управляющему пину ардуины, source – к земле ардуины и минусу питания нагрузки, drain – к минусу нагрузки, плюс питания к плюсу нагрузки. Но таким образом мы сможем ездить только вперед и поворачивать только в одну сторону. Для того чтобы справиться с проблемой, к нам на помощь спешит реле с двумя группами контактов. У меня один двигатель (передний) питался 6 вольтами, а другой 12. При этом использовалось два 6 вольтовых аккумулятора (один из них — свинцово-кислотный от бесперебойника), учитывая, что минус роутера позже придется соединить с землей ардуины, то получить 6 вольт для роутера не получается (проверяйте сколько вольт подаёте на роутер — мне пришлось покупать еще один после того, как я подал на него 12 вольт). Поэтому пришлось использовать еще одну релюшку для подачи/неподачи питания на передний двигатель.
Схему рисовал давно. Теперь там все транзисторы полевые и нет резисторов.
Теперь о самом коде. У меня все довольно просто – есть 4 команды, у которых есть свой параметр размером 1 байт:
- m – Отвечает за напряжение, а, следовательно, и за скорость, на двигателе значение от 0 до 255
- r – Отвечает за повороты. “1” – поворачивать, “0” – не поворачивать
- n – “1” – ехать назад, “0” – ехать вперед
- e – “1” – поворачивать в другую сторону
Вот мой код программы для ардуины:
int inByte, val; void setup() < Serial.begin(9600); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(7, OUTPUT); >void loop() < if (Serial.available() >0) < inByte = Serial.read(); if ((inByte=='n')||(inByte=='e'))< while (Serial.available()==0) <>val=Serial.read(); if (inByte=='n') < if (val=='1')< digitalWrite(2, HIGH); Serial.print("Writing to 2 pin\n\r"); >if (val=='0') < digitalWrite(2, 0); Serial.print("Writing to 2 pin\n\r"); >> if (inByte=='e') < if (val=='1')< digitalWrite(4, HIGH); Serial.print("Writing to 4 pin\n\r"); >if (val=='0') < digitalWrite(4, LOW); Serial.print("Writing to 4 pin\n\r"); >> > if ((inByte=='m')||(inByte=='r')) < while (Serial.available()==0) <>val=Serial.read(); if (inByte=='m') < if (val!='0') analogWrite(3, val); else analogWrite(3, 0); Serial.print("Writing to 3 pin\n\r"); >if (inByte=='r') < if (val=='1')< digitalWrite(7, HIGH); Serial.print("Writing to 7 pin\n\r"); >if (val=='0') < digitalWrite(7, LOW); Serial.print("Writing to 7 pin\n\r"); >> > > >
Как видно, задний двигатель у меня подключен к 3 пину, передний – к 7, реле заднего – к 2 пину, переднего – к 4. Так как 3 – это ШИМ-пин, то используя analogWrite(3, val);, где val от 0 до 255, мы можем управлять напряжением на двигателе.
Разбираем наш маршрутизатор. Видим UART порт. Соединяем его с ардуиной.
Теперь смотрим, как это все работает. Подключаемся телнетом к нашему порту и проверяем:
- n1 – щелкает реле
- m — колёса начинают немного вращаться
- n0 – колеса вращаются в другую сторону
- m0 – колеса перестают вращаться
- r1 – поворачивают передние колеса
- e1 – колеса поворачивают в другую сторону
- r0 – колеса становятся прямо
- e0 – щелкает реле
Для отладки работы с ком портом на роутере можно использовать minicom ( opkg install minicom ).
Программная часть
В архиве моя программка для управления машинкой (rotate и power из архива нужно скопировать в /bin/ на роутере, card – мой демон). Работает только с джойстиком. На вкладке планирование вы можете написать bash скрипт (не забудьте opkg install bash на роутере) для его выполнения с помощью демона cron. Так как этот демон нужно после изменения его настроек перезапускать, моя программа запускает скрипт по адресу http:///cron-restart. Поэтому нужно его создать (/www/cgi-bin/cron-restart) и не забыть сделать исполняемым. Код:
#!/bin/bash /etc/init.d/cron stop; /etc/init.d/cron start
Заключение
К такому девайсу можно присоединить Bluetooth (не пробовал, но драйвера есть), 3G-модем (интернет получить у меня получилось, но похоже провайдер не выдаёт каждому клиенту собственный внешний ip-адрес, поэтому придется использовать что-то типа back-connect’а или vpn), gps приёмник (проблем возникнуть не должно – ведь он должен определиться как последовательный порт).
Примечания
Если вдруг роутер перезагружается, то стоит убрать от него подальше все провода или все их экранировать. Экспериментальным путем я понял, что роутер может перезагрузиться от наводок, поэтому пришлось обмотать хаб несколькими слоями изоляции и алюминиевой фольги.
И вот еще. Вместо роутера можно использовать Raspberry Pi, а вместо транзисторов и реле — Arduino Motor Shield.
Wi-Fi машинка с камерой своими руками
Машинка с камерой и управлением через интернет на Arduino. Основана на китайской IP камере =) Базируется на самом дешёвом шасси для роботов-машинок (платформа, два приводных колеса, одно ведомое), в связи с особенностями камеры, машинка управляется весьма необычно, но вполне адекватно для простоты и доступности своего устройства.
- Фишки, унаследованные от камеры:
- Картинка 1280×720
- Ночной режим (с ИК подсветкой)
- Запись видео и съёмка фото
- Режим рации (двухсторонняя аудиосвязь)
ВИДЕО
КОМПОНЕНТЫ
Каталоги ссылок на Алиэкспресс на этом сайте:
Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей . Также проект можно попробовать собрать из компонентов моего набора GyverKIT .
- Arduino Nano купить в РФ, aliexpress, aliexpress, искать
- SANNCE камера
- https://ali.ski/impV6
- https://ali.ski/9X1VHa
- https://ali.ski/JF91C
- https://ali.ski/5uKCkE
- https://ali.ski/eQrSR
- https://ali.ski/6wL71