[Из песочницы] Как я наступил на грабли и разобрался с NanoPi2
Примерно 3 месяца назад пришла мне идея сделать гонки на машинках, управляемых через интернет.
Аналог микрогонки и гонки тарантасов. Оба этих проекта заглохли, по тем или иным причинам.
Начал я подбирать одноплатник, который бы наиболее подошел для данного проекта. Можно было бы использовать virt2real или Raspberry PI, ну или на крайний случай tp-link tl-mr3020 c CyberWRT на борту.
Но мне на глаза попалась плата NanoPi2, которая, как я подумал тогда, является полным клоном Raspberry PI, только по размерам по меньше, ну и с WI-FI на борту.
Заказал я плату в количестве 2-х штук и стал ожидать, когда же они придут, продавец оказался из Благовещенска не очень порядочный и сперва говорил мне одно, потом другое, обещал различные плюшки в виде подарков.
Но худо-бедно через 1,5 месяца платы пришли ко мне. Хочу отдать должное китайцам, когда я заказывал у них дополнительно камеры к данной плате, они пришли за 1,5 недели.
Собственно, когда пришли платы, я начал устанавливать модули для своего проекта.
Первое глубокое разочарование меня постигло, когда я не смог подключить камеру Logitech c270. Я пробовал различные программы под Debian, который у меня установлен в качестве операционной системы. В конце концов, я добился трансляции видеопотока в сетку, оказалось что в программе Motion изменился конфигурационный файл, и те переменные которые надо было изменять назывались уже по другому. Рабочий конфигурационный файл для Motion выкладываю тут
Установка motion проста до безобразия.
-----------
Обновляемся
-----------
# apt-get update
# apt-get upgrade
-----------
Устанавливаем Motion
-----------
# apt-get install motion
-----------
Проверяем, подключена ли камера (рекомендую самую простую Logitech c270).
-----------
#lsusb
-----------
Консоль выдает нам что-то типа этого.
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Где 2-я строка показывает нам, что камера подключена к нашему компьютеру.
Дальше нам следует исправить конфигурационный файл.
Проходим в папку /etc/motion и заменяем файл motion.conf (тем, который я выложил выше по ссылке). Для этого я использую WinSCP.
Ну, а дальше началось самое интересное, нужно было как-то управлять выходами GPIO. Как я и написал раньше, плата оказалась неполным клоном Raspberry Pi. Так что все библиотеки для работы с GPIO, от малинки оказались за бортом.
Я нашел 2 библиотеки matrix-python и matrix. Но к сожалению обе библиотеки мне не очень подошли.
В первой был функционал для работы с GPIO, но не было функционала работы с PWM для подключения сервопривода. Вторая же вовсе оказалась на Си, а я с сями не очень дружу.
В общем начал разбираться с ctypes, сразу скажу копий было переломано не мало, подключится к библиотеке получилось, но вызовы функций, возвращали различные ошибки типа контакт не может быть использован. Я даже начал искать фрилансера, который бы мне помог сделать обертку для библиотеки matrix, пару человек нашел, но они были заняты и у меня ни как не было времени конкретно переговорить с человеком по скайпу. И тут меня осенило, надо полностью повторить код, который приводился в качестве примера на С.
Первая же попытка даже без одной из функций увенчалась успехом, ну не думал я, что функция boardInit () фактически инициализирует библиотеку. И вот чего из этого получилось.
Программа работы с PWM на Python.
import os
import time
from ctypes import *
lib = cdll.LoadLibrary('/root/matrix-master/lib/libfahw.so')
lib.boardInit()
os.system("modprobe matrix_pwm")
lib.PWMPlay(0, 1000, 1)
time.sleep(5)
i = 1
while i < 1000:
print(i)
i = i + 10
time.sleep(1)
lib.PWMPlay(0, 1000, i)
lib.PWMStop(0)
Программа работы с GPIO на Python.
import os
import time
from ctypes import *
lib = cdll.LoadLibrary('/root/matrix-master/lib/libfahw.so')
lib.boardInit()
os.system("modprobe matrix_gpio_int")
lib.exportGPIOPin(22)
lib.setGPIODirection(22, 2)
lib.setGPIOValue(22, 1)
time.sleep(5)
lib.setGPIOValue(22, 0)
lib.unexportGPIOPin(22)
print 222
Соответственно, чтобы начать работать с библиотекой, надо её скачать с сайта и инсталлировать.
На данный момент уже развернул сервер на Flask, на NanoPi2 и уже приступаю к подключению сервопривода и двигателя сломанной машинки сына.