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
Радиоуправляемая 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
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.Последние посетители 0 пользователей онлайн
Объявления
Сообщения
Да мне кагбе все равно на что согласится ТС. С пол годика поищет рабочую схему на XTR106 и вполне может быть сделает правильные выводы. Весопроцессоры для прома не просто так имеют ценник 250+
Вот темброблок, один канал, у меня будет два таких канала: У меня стабилизатор собранный уже на LM 7812.
Вы мощность трансформатора определили? Знаете не знаком с Галченковым и его темброблоком, может он им дом отапливает, но что то мне подсказывает что так сделать можно
Собрал темброблок Галченкова, работает хорошо, если немного домотать вторичную обмотку данного трансформатора, там есть возможность без разборки домотать вторичную обмотку до 12-ти вольт, хватит ли этого трансформатора по мощности для питания темброблока Галченкова в стерео варианте?