diff --git a/README.md b/README.md index d866da5..f2be60b 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ ## Сервис раздел -- [Страница](https://www.waveshare.com/wiki/AlphaBot2-Pi) с роботом -- [Схема](https://www.waveshare.com/w/upload/9/91/AlphaBot2-Base-Schematic.pdf) части с мотороми и аккумами и контроллером заряда (НИЗ) -- [Схема](https://www.waveshare.com/w/upload/7/72/AlphaBot2-Pi-Schematic.pdf) части с креплением для малины (ВЕРХ) -- User [Manual](https://www.waveshare.com/w/upload/1/1f/Alphabot2-user-manual-en.pdf) -- Набор [даташитов](https://www.waveshare.com/wiki/AlphaBot2_Datasheet) с компонентами на плате -- Примеры ```wget https://www.waveshare.com/w/upload/e/ee/AlphaBot2-Demo.7z``` +- [Wiki-страница](https://www.waveshare.com/wiki/AlphaBot2-Pi) с общей информацией о роботе. +- [Принципиальная схема](https://www.waveshare.com/w/upload/9/91/AlphaBot2-Base-Schematic.pdf) платы-шасси робота. +- [Принципиальная схема](https://www.waveshare.com/w/upload/7/72/AlphaBot2-Pi-Schematic.pdf) платы-адаптера робота. +- User [manual](https://www.waveshare.com/w/upload/1/1f/Alphabot2-user-manual-en.pdf) +- Набор [документации](https://www.waveshare.com/wiki/AlphaBot2_Datasheet) на компоненты робота +- Примеры кода ```wget https://www.waveshare.com/w/upload/e/ee/AlphaBot2-Demo.7z``` -Примеры: +Скачивание и разархивированиеы: ```bash cd @@ -206,16 +206,18 @@ network={ ![rasp13](pic/raspb/rasp13.png) -7. Для работы с камерой вам потребуется доступ к рабочему столу Raspberry Pi, для этого нужно до установить необходимые пакеты, чтобы иметь возможность видеть рабочий стол. +7. Для работы с камерой вам потребуется доступ к рабочему столу Raspberry Pi, для этого нужно установить необходимые пакеты, чтобы иметь возможность видеть рабочий стол. -> Для Дальнейшей работы с этим сервисом нужно выполнить настройки из следующего раздела ```Настройка робота```. +> Для дальнейшей работы с этим сервисом нужно выполнить настройки из раздела ```Настройка робота```. + +Для начала установим на Raspberry Pi программы, необходимые для трансляции рабочего стола: ```bash sudo apt install realvnc-vnc-server realvnc-vnc-viewer vncserver ``` -После запуска последний команды в терминале появится что-то похожее на это: +После исполнения последний команды вы увидите схожий вывод в терминале: ```bash Running applications in /etc/vnc/xstartup @@ -227,13 +229,16 @@ Log file is /home/pi/.vnc/raspberrypi:2.log New desktop is raspberrypi:1 (192.168.2.108:1) ``` -Нужно запомнить ```raspberrypi:1``` т.к. это нужно будет использовать как адрес в клиенте. +Нужно запомнить ```raspberrypi:1```, эта строчка будет использоваться как адрес в клиенте. + +Теперь переходим к вашему рабочему компьютеру - откройте [ссылку](https://www.realvnc.com/en/connect/download/viewer/) (https://www.realvnc.com/en/connect/download/viewer/), и скачайте версию программы, подходящую под вашу операционную систему. Установите и запустите программу. +После включение вы увидете окно, вверху которого расположена форма для ввода. Введите туда ```raspberrypi:1``` и нажмите Enter. -Потом переходим сюда (https://www.realvnc.com/en/connect/download/viewer/) и качаем оттуда версию для вашей операционной системы. +![rasp16](pic/raspb/rasp16.png) ![rasp14](pic/raspb/rasp14.png) -Вводите туда пароль, нажимаете Enter. После чего вам предложат ввести логин и пароль от Raspberry Pi, напомню это pi а пароль raspberry. После чего вы увидите рабочий стол малины. +Вам предложат ввести логин и пароль от Raspberry Pi. Они стандартные - логин это ```pi```, а пароль - ```raspberry```. После этих действий вы увидите рабочий стол Raspberry Pi. ![rasp15](pic/raspb/rasp15.png) @@ -483,9 +488,11 @@ except KeyboardInterrupt: GPIO.cleanup() ``` -### RGB диоды +### RGB светодиоды + +![RGB](pic/bsp/RGB.png) -Для работы с RGB необходимо внести некоторые изменения в конфиг запуска расбери, т.к. такие светодиоды WS2812B требуют очень специфического сигнала управления. Реализовать его средствами linux не возможно, поэтому на помощь нам приходят такие модули как DMA и PWM. DMA позволяет передавать данные на светодиоды минуя центральный процессор, а PWM через управление скважностью позволяет передрать данные от DMA в требуемом формате. Но за такую реализацию нужно платить, поэтому одновременно со светодиодами нельзя использовать аудиокарту встроенную в малину. Собственно для ее отключения нам и нужно исправить настройки запуска, для чего: +Для работы с RGB светодиодами необходимо внести некоторые изменения в конфигурацию запуска Raspberry Pi, так как адресные светодиоды WS2812B требуют специфического сигнала управления. Реализовать его средствами linux не возможно, поэтому на помощь нам приходят такие модули как DMA и PWM. DMA позволяет передавать данные на светодиоды минуя центральный процессор, а PWM через управление скважностью позволяет передать данные от DMA в требуемом формате. Но за такую реализацию нужно платить, поэтому одновременно со светодиодами нельзя использовать аудиокарту, встроенную в Raspberry Pi. Для ее отключения нам и нужно исправить настройки запуска следующим образом: ```bash sudo nano /boot/config.txt @@ -504,13 +511,13 @@ hdmi_force_edid_audio=1 dtparam=audio=on ``` -превратив ее в такую: +таким образом: ```txt #dtparam=audio=on ``` -Так-же для работы необходимо установить дополнительные библиотеки, для чего необходимо сделать следующее: +Также для работы нужно установить дополнительные библиотеки, для чего сделаем следующее: ```bash sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel @@ -527,7 +534,7 @@ r.color(2, 0, 255, 0) r.color(3, 255, 0, 0) ``` -Такого-же эффекта можно добиться если указать не яркость каждого отдельного цвета, а применить название соответствующего цвета. +Такого же эффекта можно добиться если указать не яркость каждого отдельного цвета, а применить название соответствующего цвета. ```python r = rgb_led() @@ -550,7 +557,9 @@ r.color(3, "Red") ## Датчики линии -Для отслеживания линии в нижней части робота есть 5 оптических датчиков. Для простого примера можно просто считать с них значения: +![line](pic/bsp/line_sensor.png) + +Для отслеживания линии в нижней части робота есть 5 оптических датчиков. Для примера можно просто считать с них значения: ```python l = line_sensor() @@ -563,16 +572,16 @@ while True: ## Управление положением камеры -Для управлением положением камеры (2мя сервоприводами) здесь отвечает специальная микросхема - PCA9685, её необходимо задать угол поворота камеры и она будет его поддерживать, пока мы не передадим новое значение угла. Для реализации данного функционала можно воспользоваться следующей функцией: +Для управлением положением камеры (а оно регулируется с помощью кронштейна с двумя сервоприводами) здесь отвечает специальная микросхема - PCA9685. Принцип работы с ней следующий - ей задается угол поворота камеры и она будет его поддерживать, пока мы не передадим новое значение угла. Для реализации данного функционала можно воспользоваться следующей функцией: ```python c = CameraAngle() c.setCameraAngle(30, 90) ``` -Установит на 30 градусов по вертикальной оси и 90 градусов по горизонтальной. +Этот код установит камеру на 30 градусов по вертикальной оси и 90 градусов по горизонтальной. -Пример программы которая двигает камерой вправо и влево, а так-же вверх и низ: +Пример программы, которая двигает камерой вправо и влево, а также вверх и низ: ```python c = CameraAngle() @@ -589,7 +598,7 @@ while True: # Примеры простых программ -Для примера работы с роботом давайте реализуем программу движения по линии, по датчикам линии. Данная программа позволит двигаться роботу по замкнутому контуру который можно получить распечатав страницы 2,2,2,2,3,3,3,3,11 из документа с элементами трассы. +Для примера работы с роботом реализуем программу движения по линии с помощью датчиков линии. Данная программа позволит двигаться роботу по замкнутому контуру, который можно получить распечатав страницы 2,2,2,2,3,3,3,3,11 из документа с элементами трассы (документ linefollowtiles.pdf в папке docs). ```python from bsp import rgb_led, line_sensor, motor @@ -600,20 +609,20 @@ l = line_sensor() colors = {0:4, 1:3, 2:1, 3:0} -delta_sensor = 200 +delta_sensor = 200 # Пороговое значение срабатывания сенсора while True: - c = l.AnalogRead() + c = l.AnalogRead() # Получаем текущее значение датчика линии i = 0 for i in range(4): if c[colors[i]] < delta_sensor: - r.color(i, "Red") + r.color(i, "Red") # Включаем красный на светодиоде, соотвсетствующем датчику, обнаружевшему черную линиб else: - r.color(i, "Black") + r.color(i, "Black") # Выключаем светодиод, если нет i = i+1 - + # Начинаем поворачивать в зависимости от того, какие датчики заметил черную линию if c[1] < delta_sensor: m.setMotor(40,0) elif c[3] < delta_sensor: @@ -626,13 +635,15 @@ while True: m.setMotor(10, 10) ``` -В данном примере робот ездит по черной линии, также светодиодами подсвечивается сенсор под которым обнаружена линия. delta_sensor это пороговое значения срабатывания сенсора, оно может меняться в зависимости от освещения. Это значение можно узнать если воспользоваться примером выше который считывает значения с сенсоров. +В данном примере робот ездит по черной линии, светодиодами подсвечивается сенсор под которым обнаружена линия. delta_sensor - пороговое значения срабатывания сенсора, оно может меняться в зависимости от освещения. Это значение можно узнать если воспользоваться примером, который считывает значения с сенсоров. ## Компьютерное зрение -В рамках данного блока я предлагаю рассмотреть пример который позволит распознать зеленый круг, а также взаимодействовать с ним. Этот процесс состоит из 2х этапов, первое это подбор параметров, а второе это непосредственная работа с программой по распознаванию. +В рамках данного блока предлагается рассмотреть пример, который позволит распознать зеленый круг, а также взаимодействовать с ним. Этот процесс состоит из двух этапов: +1. подбор параметров; +2. непосредственная работа с программой по распознаванию. -Для реализации нужно сделать следующее: +Перейдем к примеру: 1. Поставим пакеты для работы с компьютерным зрением: @@ -641,7 +652,7 @@ sudo apt install libatlas-base-dev pip3 install numpy opencv-python ``` -2. Далее запускаем скрипт предназначенный для подбора параметров. +2. Далее запускаем скрипт, предназначенный для подбора параметров. ```python import cv2 @@ -717,11 +728,11 @@ cv2.destroyAllWindows() ![cv1](pic/CV/cv_1.png) -Суть происходящего в том что для того чтобы определить объект на фото или видео нам нужно выделить его контур, а для этого необходимо знать его цвет. Также для более удобной работы мы переводим цвет в HSV (тон, насыщенность, значение) представление. +Суть происходящего в том, что для того чтобы определить объект на фото или видео нам нужно выделить его контур, а для этого необходимо знать его цвет. Также для более удобной работы мы переводим цвет в HSV (тон, насыщенность, значение) представление. ![cv0](pic/CV/HSV_cone.png) -Наша задача подобрать минимальное и максимальное значения для 3х параметров h, s, v. Сначала нужно подобрать нижнюю границу параметра тона h (h1). По сути это и есть выбор того цвета который мы хоти распознать. Для этого нужно двигать первый ползунок до тех пор пока круг не станет быть виден. потом подгоняем максимальное значение h (h2) так чтобы круг все еще отчетливо был виден, но при этом эти 2 ползунка были максимально близки. Потом также подгоняем второй параметр s - это насыщенность, чем больше этот параметр, тем «чище» цвет, а чем ближе этот параметр к нулю, тем ближе цвет к нейтральному серому. Третий v - это яркость. +Наша задача подобрать минимальное и максимальное значения для трех параметров - H, S, V. Сначала нужно подобрать нижнюю границу параметра тона H (h1). По сути это и есть выбор того цвета, который мы хотим распознать. Для этого нужно двигать первый ползунок до тех пор пока круг не станет видемым. Потом подгоняем максимальное значение H (h2) так, чтобы круг все еще отчетливо был виден, но при этом эти два ползунка были максимально близки. Потом также подгоняем второй параметр S - это насыщенность, чем больше этот параметр, тем «чище» цвет, а чем ближе этот параметр к нулю, тем ближе цвет к нейтральному серому. Третий V - это яркость. В итоге должно получится что-то похожее на это: diff --git a/exemple/circul_detect.py b/example/circul_detect.py similarity index 100% rename from exemple/circul_detect.py rename to example/circul_detect.py diff --git a/exemple/find_filter.py b/example/find_filter.py similarity index 100% rename from exemple/find_filter.py rename to example/find_filter.py diff --git a/exemple/mnist_trained_model.h5 b/example/mnist_trained_model.h5 similarity index 100% rename from exemple/mnist_trained_model.h5 rename to example/mnist_trained_model.h5 diff --git a/exemple/number_detect.py b/example/number_detect.py similarity index 100% rename from exemple/number_detect.py rename to example/number_detect.py diff --git a/pic/bsp/RGB.png b/pic/bsp/RGB.png new file mode 100644 index 0000000..cde305c Binary files /dev/null and b/pic/bsp/RGB.png differ diff --git a/pic/bsp/line_sensor.png b/pic/bsp/line_sensor.png new file mode 100644 index 0000000..c90fc8a Binary files /dev/null and b/pic/bsp/line_sensor.png differ diff --git a/pic/raspb/rasp16.png b/pic/raspb/rasp16.png new file mode 100644 index 0000000..200f737 Binary files /dev/null and b/pic/raspb/rasp16.png differ