Назначение шифратора. Шифратор и дешифратор дистанционного управления. У шифраторов обычно имеются служебные входы и выходы

Летом появилась мысль сделать радиоуправляемую машинку, но не просто нечто похожее на творение китайской инженерной мысли, которое продается на каждом шагу, а машинку, управлять которой можно было бы с компьютера или телефона. Понято, что машинка, которой можно управлять через 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
Конфигурирование прошивки
make menuconfig
Выбираем следующие пакеты:
  • 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-веб камер
Последний пункт выбирайте сами, у меня была UVC веб камера.
Так зачем же мы выбрали те пакеты, назначение которых я не объяснил? Проблема в том, что объём флэш-памяти установленной в роутере - 4МБ, что может помешать дальнейшей нашей работе. Мы же перенесем rootfs на флешку, и роутер будет грузиться с нее.
Кстати, про флэш-память: нужно не забыть следующее:
make kernel_menuconfig
  • 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
И еще в Kernel Hacking’е нужно исправить console=/dev/ttyS0 на console=/dev/null , чтоб роутер не использовал этот порт как отладочный.
Компилируем и прошиваем
Компиляция прошивки:
make V=99 -j2
Теперь нужно ее прошить:
Для bash’а:
#!/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=" if errorlevel 1 goto LPING echo *** Start Flashing **** tftp -i 192.168.0.1 put firmware.bin if errorlevel 1 goto LPING set FIND= echo. echo ================================================================== echo * WAIT for about 2 minutes while the firmware is being flashed. echo * Reset your ethernet card"s settings back to DHCP. echo * The default router address will be at 192.168.1.1 echo. Pause
Настройка загрузки с флешки
После первого включения заходим на веб-интерфейс роутера и изменяем пароль. Теперь подключаемся к нему через SSH. Нужно настроить загрузку с флешки, для этого сначала нужно ее разметить. У меня было два раздела: первый – ext3-раздел для rootfs, второй – swap. Открываем /etc/config/fstab в vim’е и пишем то, что соответствует нашей фелшке. У меня так:
config global automount option from_fstab 1 option anon_mount 1 config global autoswap option from_fstab 1 option anon_swap 0 config mount option target / option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 1 option is_rootfs 1 config swap option device /dev/sda2 option enabled 1
Сохраняем, перезагружаемся (reboot).
Демон
Управлять двигателями будет ардуина, поэтому напишем демон, который будет перенаправлять всё, что пришло на TCP порт 5554 в /dev/ttyS0.
Мой скомпилированный вариант демона искать в архиве (card)
Компилируем с помощью gcc, который был собран в процессе подготовки к сборке прошивки:
<…>/dir320/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mipsel-openwrt-linux-uclibc-gcc-4.3.3 <имя файла с исходниками> -o <имя выходного файла>
Небольшое отступление об удобстве организации работы с роутером
  • После каждого включения мне приходилось писать opkg update , поэтому я его добавил в /etc/rc.local
  • Довольно удобно использовать FTP-сервер. Я поставил pure-ftpd. Для этого пишем:
    opkg install pure-ftpd
    Добавим его в /etc/rc.local:
    pure-ftpd -4 –B –M –l unix –U 000:000
  • Удобно будет сменить веб-интерфейс на luci, для этого пишем:
    opkg remove webif* opkg install luci
Демон [продолжение]
Заливаем на роутер наш демон, добавляем его в автозагрузку.
Теперь ставим mjpg-streamer:
opkg install mjpg-streamer
Пишем в /etc/config/mjpg-stramer следующие:
config mjpg-streamer option device “/dev/video0” option resolution “640x480” option fps “24” option port “8080” option enabled “true”
Пробуем подключить камеру. Если все нормально, то можно будет увидеть изображение тут:
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. Так как этот демон нужно после изменения его настроек перезапускать, моя программа запускает скрипт по адресу Летом появилась мысль сделать радиоуправляемую машинку, но не просто нечто похожее на творение китайской инженерной мысли, которое продается на каждом шагу, а машинку, управлять которой можно было бы с компьютера или телефона. Понято, что машинка, которой можно управлять через 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
Конфигурирование прошивки
make menuconfig
Выбираем следующие пакеты:
  • 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-веб камер
Последний пункт выбирайте сами, у меня была UVC веб камера.
Так зачем же мы выбрали те пакеты, назначение которых я не объяснил? Проблема в том, что объём флэш-памяти установленной в роутере - 4МБ, что может помешать дальнейшей нашей работе. Мы же перенесем rootfs на флешку, и роутер будет грузиться с нее.
Кстати, про флэш-память: нужно не забыть следующее:
make kernel_menuconfig
  • 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
И еще в Kernel Hacking’е нужно исправить console=/dev/ttyS0 на console=/dev/null , чтоб роутер не использовал этот порт как отладочный.
Компилируем и прошиваем
Компиляция прошивки:
make V=99 -j2
Теперь нужно ее прошить:
Для bash’а:
#!/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=" if errorlevel 1 goto LPING echo *** Start Flashing **** tftp -i 192.168.0.1 put firmware.bin if errorlevel 1 goto LPING set FIND= echo. echo ================================================================== echo * WAIT for about 2 minutes while the firmware is being flashed. echo * Reset your ethernet card"s settings back to DHCP. echo * The default router address will be at 192.168.1.1 echo. Pause
Настройка загрузки с флешки
После первого включения заходим на веб-интерфейс роутера и изменяем пароль. Теперь подключаемся к нему через SSH. Нужно настроить загрузку с флешки, для этого сначала нужно ее разметить. У меня было два раздела: первый – ext3-раздел для rootfs, второй – swap. Открываем /etc/config/fstab в vim’е и пишем то, что соответствует нашей фелшке. У меня так:
config global automount option from_fstab 1 option anon_mount 1 config global autoswap option from_fstab 1 option anon_swap 0 config mount option target / option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled_fsck 1 option is_rootfs 1 config swap option device /dev/sda2 option enabled 1
Сохраняем, перезагружаемся (reboot).
Демон
Управлять двигателями будет ардуина, поэтому напишем демон, который будет перенаправлять всё, что пришло на TCP порт 5554 в /dev/ttyS0.
Мой скомпилированный вариант демона искать в архиве (card)
Компилируем с помощью gcc, который был собран в процессе подготовки к сборке прошивки:
<…>/dir320/staging_dir/toolchain-mipsel_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mipsel-openwrt-linux-uclibc-gcc-4.3.3 <имя файла с исходниками> -o <имя выходного файла>
Небольшое отступление об удобстве организации работы с роутером
  • После каждого включения мне приходилось писать opkg update , поэтому я его добавил в /etc/rc.local
  • Довольно удобно использовать FTP-сервер. Я поставил pure-ftpd. Для этого пишем:
    opkg install pure-ftpd
    Добавим его в /etc/rc.local:
    pure-ftpd -4 –B –M –l unix –U 000:000
  • Удобно будет сменить веб-интерфейс на luci, для этого пишем:
    opkg remove webif* opkg install luci
Демон [продолжение]
Заливаем на роутер наш демон, добавляем его в автозагрузку.
Теперь ставим mjpg-streamer:
opkg install mjpg-streamer
Пишем в /etc/config/mjpg-stramer следующие:
config mjpg-streamer option device “/dev/video0” option resolution “640x480” option fps “24” option port “8080” option enabled “true”
Пробуем подключить камеру. Если все нормально, то можно будет увидеть изображение тут:
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. Так как этот демон нужно после изменения его настроек перезапускать, моя программа запускает скрипт по адресу

Шифратор (coder) - это комбинационное устройство, выполняющее функции, обратные дешифратору. При подаче сигнала на один из его входов (унитарный код) на выходе должен образоваться соответствующий двоичный код.

Если число входов шифратора равно 2n, то число выходов, очевидно,

должно быть равным n, т.е. числу разрядов двоичного кода, которым можно закодировать 2n ситуаций.

Проиллюстрируем синтез схемы шифратора при n=3. Таблица истинности имеет вид, приведенный в табл. 2.

Работа шифратора описывается тремя функциями y3, y2, y1, каждая из которых равна единице на четырех наборах (номер набора соответствует номеру входа). Сов ДНФ функций выхода равны:

Три функции реализуются тремя дизъюнкторами (рис. 11), на выходах которых формируется трехразрядный двоичных код.

При этом аргумент x0 не входит ни в одну из логических функций и шина x0 остается незадействованной. Действительно, входному сигналу x0 должен соответствовать код «000», который все равно будет на выходе шифратора, если все остальные аргументы равны нулю.

Рис. 11.

Структура шифратора

При построении шифратора для получения на выходе натурального двоичного кода учитывают, что единицу в младшем разряде такого кода имеют нечетные десятичные цифры 1, 3, 5, 7,…, т.е. на выходе младшего разряда должна быть 1, если она есть на входе №1 или на входе №3 и т.д. Поэтому входы под указанными номерами через элемент ИЛИ соединяются с выходом младшего разряда. Единицу во втором разряде двоичного кода имеют десятичные цифры 2, 3, 6, 7,…; входы с этими номерами через элемент ИЛИ должны подключаться к выходу шифратора, на котором устанавливается второй разряд кода. Аналогично, входы 4, 5, 6, 7,… через элемент ИЛИ должны быть соединены с выходом, на котором устанавливается третий разряд, так как их коды имеют в этом разряде единицу, и т.д.

Схема шифратора, построенная в соответствии с изложенным принципом, приведена на рис. 12, а, а условное изображение - на рис. 12, б, где E - вход разрешения работы, а Е0 - выход, логический 0 на котором свидетельствует о том, что ни один информационный вход не возбужден.

Для расширения разрядности (каскадирования) шифраторов вход E последующего шифратора соединяют с выходом E0.предыдущего. Если информационные входы предыдущего шифратора не возбуждены (E0=0), то последующий шифратор получает разрешение работать.

Рис. 12. Схема шифратора (а) и условное изображение (б)

Применение шифраторов

Шифратор может быть организован не только для представления (кодирования) десятичного числа двоичным кодом, но и для выдачи определенного кода (его значение заранее выбирается), например, при нажатии клавиши с соответствующим символом. При появлении этого кода система оповещается о том, что нажата определенная клавиша клавиатуры.

Шифраторы применяются в устройствах, преобразующих один вид кода в другой. При этом вначале дешифрируется комбинация исходного кода, в результате чего на соответствующем выходе дешифратора появляется логическая 1. Это отображение входного кода, значение которого определено номером возбужденного выхода дешифратора, подается на шифратор, организованный с таким расчетом, чтобы каждый входной код вызывал появление заданного выходного кода.

Шифраторы используются для построения устройств ввода первичной информации - клавиатур. Для этого необходимо активные уровни сигнала унитарного входного кода формировать с помощью ключей-кнопок клавиатуры. Аналогично можно реализовывать устройства вывода информации с использованием дешифраторов, например индикаторы или исполнительные механизмы.

На рис. 13 показан пример построения линейной и матричной клавиатур на 8 и 64 клавиш соответственно.


Рис. 13.

В схеме рис. 13, а входной логический ноль формируется путем нажатия соответствующей кнопки и замыкания входной цепи на нулевой потенциал общего провода. При отсутствии воздействия на кнопки входные потенциалы шифратора через резисторы R1…R8 подтянуты к напряжению питания, т.е. имеют пассивные уровни логических единиц. Соответствующий двоичный код номера нажатой кнопки с выхода шифратора поступает в цифровую часть схемы измерительного устройства для последующей обработки. Признаком того, что хотя бы одна из кнопок нажата, является активный уровень сигнала «кнопка нажата», сформированный выводом G микросхемы шифратора. Этот сигнал может служить командой цифровому устройству, к которому подключена клавиатура, на то, чтобы оно приступило к считыванию кода нажатой кнопки. Такой сигнал может быть подан, например, на линию прерывания микропроцессорной системы.

Линейные клавиатуры имеют ограничения по количеству кнопок, определяемые разрядностью шифратора. Поскольку многие современные измерительные устройства имеют широкую функциональность и могут требовать наличия большого количества управляемых органов, линейная организации в таком случае может оказаться недостаточной. Когда требуется формировать клавиатуры с большим количеством кнопок, конструктивно и схемотехнически оптимальной является матричная организация, пример которой показан на рис. 13, б. В такой схеме кнопки SA1…SA64 устанавливаются в пересечениях строк и столбцов прямоугольной матрицы размерностью 8х8. Опрос кнопок осуществляется путем сканирования их в матрице. Цифровое устройство вырабатывает двоичный код, который преобразуется дешифратором DD2 (дешифратор в схеме изображен в зеркальном отображении, т.е. его входы в УГО показаны справа, а выходы слева) в унитарный инверсный код, в результате чего выбранный столбец матрицы приобретает потенциал уровня логического нуля. Это эквивалентно подключению к земле одного из контактов кнопок SA1…SA8 в схеме рис. 10, а. Далее, если в выбранном столбце нажата кнопка, то на выходе шифратора DD1 сформируется ее двоичный код, а также станет активным сигнал «кнопка нажата». В противном случае сигнал «кнопка нажата» будет иметь пассивный уровень. С определенной периодичностью цифровое устройство будет менять двоичный код активизируемого столбца матрицы, в результате чего циклически будет производиться опрос всех столбцов. Таким образом, двоичный код активизируемого столбца будет выходным для цифрового устройства, к которому данная клавиатура подключена, а код номера кнопки в столбце - входным. При такой организации от цифрового устройства требуется, чтобы оно постоянно опрашивало клавиатуру, формируя двоичный код столбца на дешифратор столбцов. Часто подобным цифровым устройством является микропроцессорная система. Возложение на нее задачи постоянного формирования и чередования кодов столбцов матрицы приводит ее к загрузке этим процессом, что снижает производительность системы. Поэтому для разгрузки микропроцессорной системы в схеме клавиатуры используют устройство, автономно формирующее и чередующее коды столбцов матрицы. Таким устройством является счетчик DD3, на входы которого подается последовательность импульсов с генератора импульсов GN. В схеме подключение счетчика к входам дешифратора показано пунктирными линиями. В общем случае счетчик формирует на выходе двоичный код количества импульсов, поступающих на его вход. Таким образом, код с выхода счетчика будет постоянно увеличиваться на единицу, что повлечет за собой активизацию соседних столбцов в матрице. Этот же код будет поступать в цифровое устройство уже как входной код для идентификации им номера активного столбца матрицы. Признаком того, что хотя бы одна кнопка нажата, будет наличие на выходе «кнопка нажата» активного уровня сигнала, являющегося для цифрового устройства командой на считывания кодов номеров столбца и нажатой кнопки в столбце.

Приоритетные шифраторы

Кроме обычных шифраторов существуют также приоритетные шифраторы. Такие шифраторы выполняют более сложную операцию. При работе ЭВМ и других устройств часто решается задача определения приоритетного претендента на обслуживание. Несколько конкурентов выставляют свои запросы на обслуживание, которые не могут быть удовлетворены одновременно. Нужно выбрать, кому предоставляется право первоочередного обслуживания. Простейший вариант задачи - присвоение каждому источнику запросов фиксированного приоритета. Например, группа из восьми запросов R7,…, R0 (R - от англ. request - запрос) формируется так, что высший приоритет уменьшается от номера к номеру. Самый младший приоритет у нулевого источника - он будет обслуживаться только при отсутствии всех других запросов. Если имеются одновременно несколько запросов, обслуживается запрос с наибольшим номером.

Приоритетный шифратор вырабатывает на выходе двоичный номер старшего запроса. При наличии всего одного возбужденного входа приоритетный шифратор работает так же, как и двоичный. Поэтому в сериях ИС двоичный шифратор как самостоятельный элемент может отсутствовать. Режим его работы - частный случай работы приоритетного шифратора.

Дешифраторы позволяют преобразовывать одни виды бинарных кодов в другие. Например, преобразовывать позиционный двоичный код в линейный восьмеричный или шестнадцатеричный. Преобразование производится по правилам, описанным в таблицах истинности, поэтому построение дешифраторов не представляет трудностей. Для построения дешифратора можно воспользоваться правилами .

Десятичный дешифратор

Рассмотрим пример разработки схемы дешифратора из двоичного кода в десятичный. Десятичный код обычно отображается одним битом на одну десятичную цифру. В десятичном коде десять цифр, поэтому для отображения одного десятичного разряда требуется десять выходов дешифратора. Сигнал с этих выводов можно подать на . В простейшем случае над светодиодом можно просто подписать индицируемую цифру.Таблица истинности десятичного дешифратора приведена в таблице 1.

Таблица 1. Таблица истинности десятичного дешифратора.

Входы Выходы
8 4 2 1 0 1 2 3 4 5 6 7 8 9
0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0 0 0 0 0
0 0 1 1 0 0 0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0 0 1 0 0 0 0
0 1 1 0 0 0 0 0 0 0 1 0 0 0
0 1 1 1 0 0 0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0 0 0 0 0 1 0
1 0 0 1 0 0 0 0 0 0 0 0 0 1

Микросхемы дешифратора на принципиальных схемах приведено на рисунке 2. На этом рисунке приведено обозначение двоично-десятичного дешифратора, полная внутренняя принципиальная схема которого изображена на рисунке 1.


Рисунок 2. Условно-графическое обозначение двоично-десятичного дешифратора

Точно таким же образом можно получить принципиальную схему и для любого другого декодера (дешифратора). Наиболее распространены схемы восьмеричных и шестнадцатеричных дешифраторов. Для индикации такие дешифраторы в настоящее время практически не используются. В основном такие дешифраторы используются как составная часть более сложных цифровых модулей.

Семисегментный дешифратор

Для отображения десятичных и шестнадцатеричных цифр часто используется . Изображение семисегментного индикатора и название его сегментов приведено на рисунке 3.


Рисунок 3. Изображение семисегментного индикатора и название его сегментов

Для изображения на таком индикаторе цифры 0 достаточно зажечь сегменты a, b, c, d, e, f. Для изображения цифры "1" зажигают сегменты b и c. Точно таким же образом можно получить изображения всех остальных десятичных или шестнадцатеричных цифр. Все комбинации таких изображений получили название семисегментного кода.

Составим таблицу истинности дешифратора, который позволит преобразовывать двоичный код в семисегментный. Пусть сегменты зажигаются нулевым потенциалом. Тогда таблица истинности семисегментного дешифратора примет вид, приведенный в таблице 2. Конкретное значение сигналов на выходе дешифратора зависит от к выходу микросхемы. Эти схемы мы рассмотрим позднее, в главе, посвящённой отображению различных видов информации.

Таблица 2. Таблица истинности семисегментного дешифратора

Входы Выходы
8 4 2 1 a b c d e f g
0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 1 0 0 1 1 1 1
0 0 1 0 0 0 1 0 0 1 0
0 0 1 1 0 0 0 0 1 1 0
0 1 0 0 1 0 0 1 1 0 0
0 1 0 1 0 1 0 0 1 0 0
0 1 1 0 0 1 0 0 0 0 0
0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 1 0 0

В соответствии с принципами построения произвольной таблицы истинности по произвольной таблице истинности получим принципиальную схему семисегментного дешифратора, реализующего таблицу истинности, приведённую в таблице 2. На этот раз не будем подробно расписывать процесс разработки схемы. Полученная принципиальная схема семисегментного дешифратора приведена на рисунке 4.

Шифратор осуществляет преобразование десятичных чисел в двоичную систему счисления. На рис.9.9 приведено символическое изображение шифратора, преобразующего десятичные числа 0, 1, 2, … , 9 в выходной код 8421 и его таблица истинности. Символ CD образован из букв английского слова Coder . Слева показаны 10 входов шифратора, справа – выходы шифратора; цифрами 1,2,4,8 обозначены весовые коэффициенты двоичных четырёх разрядов шифратора.

Из таблицы истинности видно, что выходу x 1 будет соответствовать лог. 1 , если одна из входных переменных y 1 , y 3 , y 5 , y 7 , y 9 будет также иметь лог. 1 . Следовательно, можно составить логическую операцию x 1 =y 1 y 3 y 5 y 7 y 9 . Для остальных выходов можно составить логические операции: x 2 =y 2 y 3 y 6 y 7 , x 4 =y 4 y 5 y 6 y 7 , x 8 =y 8 y 9.

Рис.9.9. Символическое изображение шифратораи его таблица истинности

Используя полученные логические операции, можно реализовать логическую схему шифратора, построенную на логических элементах ИЛИ , приведённую на рис.9.10. Шифраторы используются в устройствах ввода информации в цифровые системы с клавиатуры.

Рис.9.10. Логическая схема шифратора

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то