Оригинальная инструкция по сборке тут (https://www.waveshare.com/w/upload/1/1a/Alphabot2-pi-assembly-diagram-en.pdf), а так же в папке docs (см. Alphabot2-pi-assembly-diagram-en.pdf).
### Сборка шасси робота
Установите две батареи 14500 **(A)** на базу-шасси AlphaBot2, восьмисантиметровый кабель FC-20P **(B)** вставьте в соответствующий разъем шасси. Вкрутите стойки **(C&D)**.
Поместите сервопривод между стойками **(f)** и **(g)** и скрепите винтами (7). Обратите внимание на то,чтобы ротор сервопривода был установлен в правильном направлении.
Установите насадку **(c)** на сервопривод в специальную выемку в корпусе. Если она не подходит **(g)** под выемку в корпусе - слегка подрежете ее. Закрепите с помощью винтов **(5)**. Далее установите крестообразную насадку **(b)** в основание стойки. Также при необходимости подрежете. Закрутите винты **(5)** с задней стороны основания стойки.
Вставьте в крестообразную насадку сервопривод и закрепите винтом **(1)**. Второй, еще никуда не установленный, сервопривод прикрепите двумя винтами **(7)** к подставке для камеры **(e)** как показано на рисунке ниже. Установите подставку под камеру **(e)** и сервопривод на собранную ранее стойку **(f&g)** и прикрутите насадку к сервоприводу с помощью винте **(1)**.
Закрепите стойку для камеры на плате-адаптере с помощью винтов и гаек **(I&J)**, как показано на рисунке ниже. Проведите кабели от сервоприводов через отверстие в нижней части платы-адаптера и вставьте коннектор в соответствующие пины на обратной стороне платы-адаптера. Через то же отверстие проведите шлейф от камеры и вставьте его в соответствующий разъем на Raspberry Pi.
Вставьте кабель FC-20P, установленный на шасси робота, в плату адаптер. Обратите внимание, что коннектор должен вставляться в разъем в соответствие с шелкографией на печатной плате!
Установите ультразвуковой дальномер в соответствующий разъем на шасси робота **(G)**. Соедините плату-адаптер с Raspberry Pi с помощью винтов **(I)**. Соедините шасси робота и плату-адаптер с помощью винтов **(F)**.
В этом разделе мы рассмотрим процесс установки операционной системы на Raspberry Pi и рассмотрим способы взаимодействия с ней в операционной системе linux и windows. Предполагается что изучающие это руководство владеют linux консолью, и языком программирования python. Для того чтобы запустить linux на Raspberry Pi необходимо выполнить следующие действия:
1. Скачать отсюда (https://www.raspberrypi.org/softwanumpy>=1.20.0re/operating-systems/#raspberry-pi-os-32-bit) образ ```Raspberry Pi OS ```. Я рекомендую использовать ```Raspberry Pi OS with desktop and recommended software```, этот образ будет содержать большинство вещей необходимых нам в будущем.
3. Записать образ на карту памяти *(обратите внимание, что объем памяти должен быть больше 4Gb)*. Создатели Raspberry Pi советуют использовать для этого программу Etcher (https://www.balena.io/etcher/). Скачиваем ее и устанавливаем себе на компьютер. Нас встретит простой интерфейс. Сначала нужно выбрать образ, потом выбрать карту память на которую мы хотим его записать, и после согласится на запись. Все ваши данные будут удалены с данной карты. Цифрой 1 на изображении указано, где выбирать образ, 2 - где выбирать карту памяти, 3 - начало прошивки.
4. Для того, чтобы избавиться от необходимости работать с Raspberry Pi, подключая к ней монитор, клавиатуру и мышку, мы будем использовать подключение с удаленного компьютера по ssh. Для этого нам нужно будет прописать некоторые настройки Wi-Fi.
* ssh.txt - писать в него ничего не нужно, он необходим для того чтобы мы могли подключится к малинке используя сервис ssh ( https://ru.wikipedia.org/wiki/SSH)
* wpa_supplicant.conf - тут необходимо приписать параметры вашей Wi-Fi сети в следующем формате:
Соглашайтесь. Нажмите правой кнопкой мышки на файл ```wpa_supplicant.conf```, выберите ```Открыть с помощью```, и откройте с помощью блокнота. Добавьте в открывшийся документ строки, указанные выше, заменив название точки доступа и пароль на свои. Сохраните. Содержимое этого файла будет автоматически перенесено в ```/etc/wpa_supplicant/wpa_supplicant.conf``` при старте системы.
5. Запуск робота. Далее извлекаем карту памяти из компьютера, предварительно воспользовавшись функцией безопасного извлечения, после чего вставляем карту в разъем на Rasbperry Pi, установленную в роботе. ``` ВНИМАНИЕ! Для того, чтобы на этом этапе не возникло проблем, убедитесь в том, что аккумуляторы заряжены. Это очень важно, так как отключение питания во время загрузки системы может привести к неправильной настройке системы. Во время работы с Raspberry Pi робот не должен заряжаться!```
Переводим ```PWR SWITCH``` находящийся снизу робота из состояния ```OFF``` в ```ON``` для включения робота, после чего ждем около 3х минут чтобы система успела применить все настройки. Для того, чтобы на этом этапе не возникло проблем убедитесь что аккумуляторы заряжены, это очень важно потому что робот в неактивном состоянии когда находится на зарядке.
6. Перейдем к подключению к Raspberry Pi. Для этого воспользуемся бесплатной версией программы MobaXterm, которая позволит нам совершить подключение gj практически любому протоколу. (Скачать можно здесь: https://mobaxterm.mobatek.net/). Установите программу на свой компьютер. Для подключения к Raspberry Pi по ssh сделайте следующее:
Стандартный пароль для Raspberry Pi OS - ```raspberry```, введите его. После чего вы можете сохранить данный пароль в системе, если вам будет так удобнее. После чего система предложит вам ввести команды на исполнение:
Если вы видите такой же вывод, что и на изображении выше - значит все заработало. Если нет, это может свидетельствовать о проблемах с сетью. Первым делом подключитесь к роутеру (обычно он находится на адресе http://192.168.0.1/ или http://192.168.1.1/) и посмотрите список подключенных устройств.
Если это произошло значит все хорошо и все работает если нет, это свидетельствует о проблемах с сетью. Первое что можно сделать это подключится к роутеру (обычно он находится на адресе http://192.168.0.1/или http://192.168.1.1/) и посмотреть там в списках клиентов Raspberry Pi. На моем роутере это выглядит так:
Оттуда можно узнать IP адрес. Далее повторите действия пункта 6, только вместо хоста с названием Raspberry Pi используя полученный IP. Если это тоже не работает остается только одно - отсоединить Raspberry Pi от робота, подключить к монитору и с помощью клавиатуры и мыши через графический интерфейс подключить Raspberry Pi к сети Wi-Fi.
7. Для работы с камерой вам потребуется доступ к рабочему столу Raspberry Pi, для этого нужно установить необходимые пакеты, чтобы иметь возможность видеть рабочий стол.
Нужно запомнить ```raspberrypi:1```, эта строчка будет использоваться как адрес в клиенте.
Теперь переходим к вашему рабочему компьютеру - откройте [ссылку](https://www.realvnc.com/en/connect/download/viewer/) (https://www.realvnc.com/en/connect/download/viewer/), и скачайте версию программы, подходящую под вашу операционную систему. Установите и запустите программу.
После включение вы увидете окно, вверху которого расположена форма для ввода. Введите туда ```raspberrypi:1``` и нажмите Enter.
Вам предложат ввести логин и пароль от Raspberry Pi. Они стандартные - логин это ```pi```, а пароль - ```raspberry```. После этих действий вы увидите рабочий стол Raspberry Pi.
Для работы с роботом необходимо выполнить ряд настроек. Для начала их нужно будет сделать в специальной консольной программе для конфигурирования Raspberry Pi - ```raspi-config```, Для чего используем следующую команду:
*Если вам будет удобнее, терминал можно открепить от программы ModaXterm и перенести в любую область рабочего стола - просто нажмите левой кнопкой мыши на вкладку с терминалом и перетащите в свободную область рабочего стола.*
Навигация в данном режиме очень проста. Стрелками вверх и вниз мы выбираем нужный пункт меню, enter позволяет пройти в подпункты выбранного пункта или выбрать конкретную настройку. Стрелки вправо и влево позволяют выбрать один из пунктов, находящихся внизу (Select и Finish на изображении выше). Ниже перечислено, какие настройки необходимо сделать:
После завершения настройки выберите finish и система предложит вам перезагрузить Raspberry Pi, на что соглашаемся. Подключится можно будет способом описанным выше, либо нажать кнопку R и MobaXterm автоматически постарается переподключиться к роботу.
После того как система загрузится установите пакеты, необходимые для работы с периферией робота. Для этого сначала обновляем систему, потом ставим все необходимое:
Для управления роботом предлагается использовать библиотеку bsp.py. Для того, чтобы воспользоваться ей, ее нужно поместить в папку с вашим проектом и добавить ее в ваш код следующим образом:
Рассмотрим управление моторами в роботе. Для этого на плате-шасси установлен двухканальный мостовой драйвер (2 Н-моста) моторов TB6612FNG. На изображении ниже вы видите часть принципиальной схемы платы-шасси, отвечающей за управление моторами:
- PWMA\PWMB - вход для управления скоростью вращения мотора, для канала A и В (соответственно, для первого и второго мотора) с помощью ШИМ (*англ. PWM*);
- AIN1\AIN2 - входы полумостов канала A;
- BIN1\BIN2 - входы полумостов канала B;
- А01\А02 - выходы полумостов канала А;
- В01\В02 - выходы полумостов канала В;
- STBY - включение микросхемы;
- VM - вход питания силовой части микросхемы, двигателей;
H-мост состоит из четырех переключателей, которыми могут быть, например, транзисторы или реле. Когда ключи S1 и S4 замкнуты, а S2 и S3 разомкнуты, мотор крутится в одну сторону, если же замкнуть S2 и S3, а S4 и S1 разомкнуть - мотор будет крутиться в другую сторону.
ШИМ (широтно-импульсная модуляция, англ. PWM) - способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.
Вернемся к части принципиальной схемы, отвечающей за управление моторам. Видно, что оно осуществляется с помощью четырех пинов GPIO, которые задают направление вращения двух моторов (AIN1\AIN2, BIN1\BIN2) и двух пинов с функцией ШИМ (PWMA\PWMB), которые задают скорость вращения.
Пьезодинамик (англ. buzzer) - устройство на основе обратного пьезоэлектрического эффекта, который заключается в механической деформации пьезоэлектрика под воздействием электрического поля. Простыми словами - при подаче напряжения на пьезодинамик, устройство переводит его в колебание мембраны динамика.
На верхней плате-адаптере робота расположен джойстик. На изображении он обведен в красный кружок. Джойстик может возвращать информацию об отклонении его влево, вправо, вперед и назад, а так же о центральном расположении.
### Инфракрасные датчики для обнаружения препятствий
На плате-шасси робота расположены два инфракрасных датчика, которые предназначены для обнаружения препятствий роботом.
![ir_obtacle](pic/bsp/ir_obstacle.png)
*Нужно понимать, что с помощью такого датчика вы можете получить информацию о факте наличия препятствия, но не о том, как, например, оно далеко от вас. Такому типу датчиков могут помешать засветы, например от солнца.*
Средствами bsp.py вы можете взаимодействовать с инфракрасными датчиками следующим образом:
Ультразвуковой дальномер генерирует звуковые импульсы и слушает эхо. Замеряя время, за которое отраженная звуковая волна вернется обратно можно определить расстояние до объекта.
В отличие от инфракрасных датчиков, рассмотренных выше, мы можем получить информацию о расстоянии до объекта, так же такому сенсору будут нестрашны засветы от солнца, но он может плохо работать с очень тонкими и пушистыми предметами.
Средствами bsp.py вы можете взаимодействовать с ультразвуковыми датчиками следующим образом:
Для работы с RGB светодиодами необходимо внести некоторые изменения в конфигурацию запуска Raspberry Pi, так как адресные светодиоды WS2812B требуют специфического сигнала управления. Реализовать его средствами linux не возможно, поэтому на помощь нам приходят такие модули как DMA и PWM. DMA позволяет передавать данные на светодиоды минуя центральный процессор, а PWM через управление скважностью позволяет передать данные от DMA в требуемом формате. Но за такую реализацию нужно платить, поэтому одновременно со светодиодами нельзя использовать аудиокарту, встроенную в Raspberry Pi. Для ее отключения нам и нужно исправить настройки запуска следующим образом:
Если поставить робота на трассу (ее можно найти в папке docs), то меленькие значения (<200)будутполученыссенсоракоторыйнаходитсянадчернойлинией,абольшие(> 800) над белым участком трассы.
Для управлением положением камеры (а оно регулируется с помощью кронштейна с двумя сервоприводами) здесь отвечает специальная микросхема - PCA9685. Принцип работы с ней следующий - ей задается угол поворота камеры и она будет его поддерживать, пока мы не передадим новое значение угла. Для реализации данного функционала можно воспользоваться следующей функцией:
Для примера работы с роботом реализуем программу движения по линии с помощью датчиков линии. Данная программа позволит двигаться роботу по замкнутому контуру, который можно получить распечатав страницы 2,2,2,2,3,3,3,3,11 из документа с элементами трассы (документ linefollowtiles.pdf в папке docs).
В данном примере робот ездит по черной линии, светодиодами подсвечивается сенсор под которым обнаружена линия. delta_sensor - пороговое значения срабатывания сенсора, оно может меняться в зависимости от освещения. Это значение можно узнать если воспользоваться примером, который считывает значения с сенсоров.
В рамках данного блока предлагается рассмотреть пример, который позволит распознать зеленый круг, а также взаимодействовать с ним. Этот процесс состоит из двух этапов:
1. подбор параметров;
2. непосредственная работа с программой по распознаванию.
Суть происходящего в том, что для того чтобы определить объект на фото или видео нам нужно выделить его контур, а для этого необходимо знать его цвет. Также для более удобной работы мы переводим цвет в HSV (тон, насыщенность, значение) представление.
Наша задача подобрать минимальное и максимальное значения для трех параметров - H, S, V. Сначала нужно подобрать нижнюю границу параметра тона H (h1). По сути это и есть выбор того цвета, который мы хотим распознать. Для этого нужно двигать первый ползунок до тех пор пока круг не станет видемым. Потом подгоняем максимальное значение H (h2) так, чтобы круг все еще отчетливо был виден, но при этом эти два ползунка были максимально близки. Потом также подгоняем второй параметр S - это насыщенность, чем больше этот параметр, тем «чище» цвет, а чем ближе этот параметр к нулю, тем ближе цвет к нейтральному серому. Третий V - это яркость.
Изображение, полученное с камеры, проходит несколько этапов преобразования для того, чтобы мы могли распознать на нем объект. Сначала мы преобразуем изображение в HSV формат, который мы использовали в предыдущим примере. Потом с помощью алгоритма, определяющего контур, ищем объект нужного цвета. Вот тут и нужны параметры полученные в прошлом примере, из-за того что у вас может отличатся освещение или камера то эти параметры всегда нужно подбирать экспериментально. Этот контур можно увидеть на изображении выше, он состоит из синих точек. Далее мы ищем две самые удаленные друг от друга точки и строим вокруг них окружность, определяем площадь этой окружности, выводя сообщение о том что она слишком близко или далеко от камеры. Здесь можно добавить, например, движение робота за объектом если он далеко и от него если он близко, также можно определить положение объекта на экране, таким образом заставив робота следовать за объектом.
Тут в качестве примера я предложу вам обучить свою нейронную серь на открытом датасете который содержит тысячи изображений цифр - MNIST. Этот датасет уже встроен в библиотеку keras.
Для того чтобы использовать нейронную сеть ее нужно сначала обучить, для этого я предлагаю использовать сервис google colaboratory - https://colab.research.google.com/notebooks/intro.ipynb, потому что обучение сетей требует значительных вычислительных мощностей, а компания Google готова нам предоставить их бесплатно в образовательных целях. Данный сервис представляет из себя страницу jupiter notebook, код в которой исполняется поблочно. Давайте рассмотрим блоки, которые нам необходимы для получения обученной сети:
Это сработает только для Python 3.7. В случае установленной более новой версии найдите подходящую версию tensorflow здесь (https://github.com/lhelontra/tensorflow-on-arm/releases) или используйте ```pyenv```, также версия tensorflow должна совпадать с версией на google colaboratory, иначе ничего не заработает.
На первом этапе (который выделен в отдельную функцию *find_number(frame)* ) мы ищем все контура изображений (тоже самое, что мы делали в предыдущем примере для распознавания цветного круга), потом перебераем контуры, отсеивая неподходящие. Первым делом мы отбрасываем контуры маленькой площади, затем выбрасываем контуры, вытянутые по горизонтали (так как все цифры вытянуты по вертикали), потом переводим изображение в черно-белый формат, сжимаем до размера 28х28 и делаем его монохромным. Это формат необходимый для обученной нами ранее сетки. Далее мы применяем еще один фильтр, суть которого заключается в том, что мы отбрасываем изображения, в которых черного цвета больше чем белого. И после этого отправляем подготовленное изображение в нейронную сеть, а она выдает предполагаемое число. Тут необходимо помнить, что данный датасет собран на числах написанных ручкой в маленькой тетрадной клетке, из-за чего в реальность точность будет около 75%, несмотря на то что на тестовых данных было 99%. Также озображение должно быть хорошо освещено чтобы корректно распознатся.