Робот-танк. Новости

В связи с карантином получается чуть-чуть больше времени на развлечение с игрушкой. Вкратце опишу, что наделал.

1 . Прикрутил камеру с двумя сервами, подключил с Raspberry, доработал код на Ардуино для управления сервами с геймпада и с веб приложения. Непричесанный код здесь

https://pastebin.com/0TANSzx1

Но он нуждается в доработке. Танк выглядит так.

IMG_20200421_104519

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

2. Настроил вывод с камеры на веб страницу при помощи программы https://elinux.org/RPi-Cam-Web-Interface

При установке выбрал знакомый мне nginx в качестве вебсервера. Теперь на 80 порту Малины можно любоваться картинкой с камеры

3. Настроил веб интерфейс управления танком с выводом изображения с камеры при помощи Node red Dashboard. Флоу ниже

https://pastebin.com/uuzU8JS9

Снимок

Танк управляется при помощи кнопок на экране, а также при помощи клавиатуры. Картинка просто вырезается с интерфейса RPI Cam при помощи фрейма. Теперь можно сидя за компом управлять движением танка по местности =)

ну и видосик

ezgif.com-optimize

 

Дальше самое интересное в плане реализации: ориентирование на местности, беспроводная зарядка, озвучка робота. Есть идеи, а реализация будет позже.

Робот-танк. Развитие идеи

Потихоньку воплощаю свой проект   Робот-танк. Постановка задачи

Бом лист такой:

  1. Шасси. Ссылка на али

39

 

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

2. Драйвер для двух моторов — шилд для Arduino Uno. Ссылка на али

40

Недорогой и работает.

3. В качестве платы управления выбрана Arduino Uno

4. Для ручного управления выбран беспроводной джойстик для Sony Playstation 2 с али. Ссылка на али

41

Для джойстика есть библиотека для Arduino IDE.

5. Raspberry Pi 3b+ в качестве сервера. На малине установлен Node Red, который пока дублирует управление джойстика, общаясь с Uno по UART.

Чуть позже скину скетч и флоу для Node Red

WhatsApp-Video-2020-01-30-at-21.00.36

 

WhatsApp-Video-2020-01-30-at-20.50.07

Приём данных с датчика LoRa Sensor BME

Наконец-то получил в руки «пироженку», датчик температуры, влажности и давления LoraSensor BME. Сайт проекта http://lorasensor.site/

Датчик передает данные в виде строки с JSON по LoRa на 434Мгц (возможны и другие частоты). Принимать данные можно при помощи любого устройства LoRa, так как любое устройство LoRa является трансивером, т.е. приемопередатчиком. В моем случае таким устройством стала Arduino подобная плата с Ali на базе проца Atmega32u4 и трансивера 433 МГц LoRA RA02 от AI-Thinker. Плата без проблем прошивается из Arduino IDE, предварительно нужно установить библиотеку https://github.com/BSFrance/BSFrance-avr для платы и добавить ее описание.2-433-LoRa32u4-Ra02-LoRa-WiFi.jpg_960x960

Далее необходимо выбрать скетч LoRaReceiverCallback.ino и модифицировать под свои нужды. Мне необходимо было изменить частоту на 434Е6, распиновку выбрать для платы 433 V1.2 и вместо хардварного Serial применять софтовый при помощи библиотеки SoftwareSerial. Данные передаются на пины 10 и 11 и далее на плату NodeMCU (ESP8266) на пины RX и TX. В ESP используется прошивка ESPEASY Mega с плагином Serial2Net. Плата поднивает сервер последовательного порта и транслирует данные на выбранный TCP порт ESP.

https://www.letscontrolit.com/wiki/index.php/Ser2Net

Затем я подключаюсь к выбранному порту ESP при помощи своего нетбука в установленным Node Red.

Ниже ссылка на флоу, где данные забираются из TCP, преобразуются в JSON объект, затем разбираются по метрикам и транслируются в MQTT и Dashboard.

https://pastebin.com/zpeQH59b

 

Передача метеоданных из Node Red на narodmon.ru

Задался целью передачи данных с домашней метеостанции на сервис narodmon.ru.

Так как данные в mqtt я уже давно пробросил, осталось лишь найти способ передать инфу на сервер Народного Монитора. В поиске нашел подходяший флоу для Node Red  https://flows.nodered.org/flow/0053edc0d47781313c4c

Для работы флоу надо установить необходимые ноды из консоли, находясь в папке Node Red (в интерфейсе Node Red установка этих нодов недоступна):

npm install mdef/node-narodmon

Свой флоу я немного доработал под свои нужды:

https://pastebin.com/WPv399L1

Осталось только настроить на сайте единицы измерения для передаваемых переменных.

36

 

Управление светом на 433 Мгц при помощи OpenMQTTGate

Захотелось научиться управлять светом с мобильника или Telegram. Для этой цели были закуплены выключатели света с 433Мгц приемником на ali.

https://ru.aliexpress.com/item/32814191331.html?spm=a2g0s.9042311.0.0.41ca33ed1Ox8Tq

Также, были приобретены самые дешевые приемник и передатчик 433MГц

https://ru.aliexpress.com/item/32840951211.html?spm=a2g0s.9042311.0.0.735533edZFhEhL

 

Из закромов был извлечён модуль esp8266 NodeMCU

32.PNG

Идея такова: Приемник и передатчик 433 подключаются к ESP. ESP используется как WIFI шлюз 433toMQTT. MQTT брокер Mosquitto уже установлен на Raspberry и является связующим звеном между логикой умного дома в Node red и шлюзом.

В качестве прошивки для ESP использован OpenMQTTGateway

34.PNG

 

Прошивка тут

ESP8266_OpenMQTTGateway_V092_RF.zip

Описание и схема подключений тут. Данная схема у меня не заработала, почему то на пине VIN  было всего 1.8В. Я подключил передатчик на VV, а приемник на 3.3В.

https://github.com/1technophile/OpenMQTTGateway/wiki/ESP8266-RF-Send-and-Receive

 

33

 

 

Нюансы:

  1. При первичной настройке шлюз поднимает точку доступа, пароль «your_password»
  2. При первичной настройке надо указать ssid и пароль к домашней wifi сети и данные mqtt сервера. При настройке mqtt сервера надо быть аккуратным, потому что изменить их после не получится, придется стирать всю память esp и заливать прошивку по новому (возможно это не так, все поднималось на бегу).

35.PNG

3. После настройки нужно открыть консоль raspberry и подписаться на все топики mosquitto, чтобы узнать точное название топиков, которые создает шлюз. Названия могут отличаться

sudo mosquitto_sub -t +/# -v -u имя_для_авторизации -P пароль_для_авторизации

если  увидели такие статусы, то все настроено правильно

home/OpenMQTTGateway_ESP8266_RF/LWT Online
home/OpenMQTTGateway_ESP8266_RF/version Х.ХХ

После того, как убедились, что все работает, можно перейти к настройке Node Red. У разработчика шлюза уже был готовый флоу.

https://github.com/1technophile/OpenMQTTGateway/wiki/NodeRED-integration

Осталось выбрать свою последовательность кода для отправки выключателю и обучить его. Для обучения надо нажать и удерживать сенсор, вы услышите звук. Теперь надо отправить код и выключатель его запомнит. Включение и выключение происходит одним кодом.

 

 

Отправка снимков с камеры Dahua в Telegram при помощи Node Red

Идея такая была:

По запросу из бота Телеграма получать снимок с IP камеры. Применение технологии может быть различное. Например, охранная сигнализация или СКУД.

1. Камера своими средствами обнаружения движения выдает сигнал тревоги, сигнал принимается в среде разработки, отправляется GET запрос на снимок, снимок получается и отправляетcя в Телеграм.

Или можно докрутить идею:

2. На снимке средствами OpenCV распознается лицо и предоставляется доступ авторизованному человеку.

Итак, перейдем с флоу Node red.

22

Тут показан алгоритм для приема снимка в Телеграм по запросу и также вывод снимка на UI Dashboard по нажатию кнопки. Код ниже

https://pastebin.com/bqFqzQ2G

Вкратце опишу, что творится здесь.

По команде /snap из бота получаем команду на GET запрос на IP камеру. Тут важный момент, в камерах Dahua работает дайджест аутентификация, так что этот момент надо учесть в настройках нода http request. Также нужно настроить выхлоп в бинарном виде binary buffer. URL запроса для моей камеры Dahua такой IP/cgi-bin/snapshot.cgi

23

Далее функциональным нодом выполняем инструкции API Telegram для отправки фото в бот:

https://pastebin.com/cZhCGBQ7

Далее идет отправка в Telegram.

Ниже алгоритм для отправки снимка в Dashboard по нажатию кнопки. Get запрос аналогичный, далее идет base64 кодирование бинарного массива и выгрузка в UI.

24.PNG

25.PNG

 

Код для вставки в шаблон виджета ниже:

https://pastebin.com/5W6bsWzH

 

GPS трекинг Android смартфона с помощью Traccar и Node Red

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

  1. Установка приложения Traccar Client. Приложение доступно в Маркете.
  2. Настройка  приложения примитивна

Картинки по запросу Traccar Client

По умолчанию установлен адрес демо-сервера Traccar. Всего в системе 5 демо серверов. Я использовал http://demo5.traccar.org/

3. Запускаем сервис и идем на http://demo5.traccar.org/ , где регистрируемся

1

далее проходим в главное окно сервера. Слева вверху добавляем свой смартфон по идентификатору из программы клиента на смартфоне

2

4. Идем в Node-Red и вставляем код

[{"id":"c1f90c37.cb4f5","type":"ui_button","z":"11a9e76c.e4d6c9","name":"","group":"7baf26a1.ac95f8","order":0,"width":0,"height":0,"passthru":false,"label":"Найти","tooltip":"","color":"","bgcolor":"","icon":"fa-male","payload":"","payloadType":"str","topic":"","x":110,"y":140,"wires":[["2c2108e7.e959a8"]]},{"id":"2c2108e7.e959a8","type":"template","z":"11a9e76c.e4d6c9","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"","x":380,"y":140,"wires":[["393dcfa1.8e9c"]]},{"id":"393dcfa1.8e9c","type":"ui_template","z":"11a9e76c.e4d6c9","group":"7baf26a1.ac95f8","name":"","order":0,"width":"20","height":"12","format":" ","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":600,"y":140,"wires":[[]]},{"id":"165c2e2d.b2dcf2","type":"ui_button","z":"11a9e76c.e4d6c9","name":"","group":"7baf26a1.ac95f8","order":0,"width":0,"height":0,"passthru":false,"label":"Стереть трек","tooltip":"","color":"","bgcolor":"","icon":"fa-male","payload":"{\"name\":\"HOMTOM\",\"deleted\":true}","payloadType":"json","topic":"","x":420,"y":180,"wires":[["d08e3258.83aa3"]]},{"id":"86b2bf02.597cc","type":"http request","z":"11a9e76c.e4d6c9","name":"","method":"GET","ret":"obj","paytoqs":false,"url":"http://demo5.traccar.org/api/positions","tls":"","proxy":"","authType":"basic","x":370,"y":240,"wires":[["51900a14.1bc154"]]},{"id":"c411863c.76d408","type":"inject","z":"11a9e76c.e4d6c9","name":"","topic":"","payload":"","payloadType":"date","repeat":"15","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":240,"wires":[["86b2bf02.597cc","2c2108e7.e959a8"]]},{"id":"51900a14.1bc154","type":"function","z":"11a9e76c.e4d6c9","name":"Adaptation","func":"var latitude = msg.payload[0].latitude;\nvar longitude = msg.payload[0].longitude;\nmsg.payload = {\"name\":\"HOMTOM\", \"lat\":latitude, \"lon\":longitude}; \nmsg.payload.layer = \"SensorData\";\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":240,"wires":[["d08e3258.83aa3","5cbe26e7.09fa98","c158bb0d.8bbc08","92f83141.27846","66767f0d.f19b6"]]},{"id":"d08e3258.83aa3","type":"worldmap-tracks","z":"11a9e76c.e4d6c9","name":"","depth":"250","layer":"combined","x":790,"y":200,"wires":[["3ad91905.0a9266","c158bb0d.8bbc08"]]},{"id":"c158bb0d.8bbc08","type":"worldmap","z":"11a9e76c.e4d6c9","name":"","lat":"","lon":"","zoom":"18","layer":"OSM grey","cluster":"","maxage":"12000","usermenu":"show","layers":"show","panit":"true","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"deg","path":"/worldmap","x":980,"y":240,"wires":[]},{"id":"7baf26a1.ac95f8","type":"ui_group","z":"","name":"GPS tracking","tab":"4745ebe5.566154","order":2,"disp":true,"width":"20","collapse":false},{"id":"4745ebe5.566154","type":"ui_tab","z":"","name":"Map","icon":"dashboard","order":7,"disabled":false,"hidden":false}]

Алгоритм несложный: каждые 15 сек отправляем GET на сервер Traccar, полученный json адаптируем под Worldmap нод. При отправке запроса необходимо указать логин и пароль. В dashboard на вкладке Map с маркером положения и треком.

 

8

9
10.png

Для корректного отображения в dashboard в коричневый template надо вставить код

https://pastebin.com/DUsn4JXW

и в бирюзовый template вставить код

https://pastebin.com/2BG2LBSk

URL запроса имеет простой вид

http://demo5.traccar.org/api/positions

Сервер дает в ответ json вида:
11

[{"id":459488518,"attributes":{"batteryLevel":4,"distance":27.8,"totalDistance":64667.05,"motion":false},"deviceId":15852,"type":null,"protocol":"osmand","serverTime":"2019-04-23T12:39:15.000+0000","deviceTime":"2019-04-23T12:39:11.000+0000","fixTime":"2019-04-23T12:39:11.000+0000","outdated":false,"valid":true,"latitude":55.7974995,"longitude":37.5793154,"altitude":186.5,"speed":0,"course":0,"address":null,"accuracy":64.0989990234375,"network":null}]

Нам нужны значения latitude и longitude, которые обрабатывают нодом Adaptation и адаптируются под формат Worldmap.

По адресу

http://Node_RED_IP/worldmap имеем картинку

7

UPD По умолчанию при использовании своего сервера сильно грузится система ненужными java процессами, слушающими множество портов. Это все потому, что сервер поддерживает десятки устройств и для каждого типа у него свой процесс. ненужные порты,процессы, девайсы легко отключаются закомменчиванием ненужных типов в конфиге traccar по адресу /opt/traccar/conf/default.xml
12.png
в случае с клиентом на android оставить надо только порт 5055

UPDATE!
Придумал простой способ приема местоположения от Android клиента без использования локального или demo сервера при помощи Node Red. Достаточно просто слушать POST запросы на локальном http и забрать из полученного json нужные данные

13

[{"id":"ecfb5d77.af908","type":"http in","z":"11a9e76c.e4d6c9","name":"","url":"/my","method":"post","upload":false,"swaggerDoc":"","x":220,"y":1180,"wires":[["9074b787.96c388"]]},{"id":"9074b787.96c388","type":"function","z":"11a9e76c.e4d6c9","name":"Adaptation_node","func":"//function getTimeFromTimestamp(timestamp) {\n//    var today = new Date(timestamp);\n//    return today.toISOString().substring(12, 19);\n//}\n   // \"time\":getTimeFromTimestamp(msg.req.query.timestamp),\nmsg.payload = {\"name\":\"HOMTOM\",\"lat\":Number(msg.req.query.lat),\"lon\":Number(msg.req.query.lon)}; \nmsg.payload.layer = \"SensorData\";\nreturn msg;","outputs":1,"noerr":0,"x":610,"y":1180,"wires":[["cd1abf63.5dbd2","78619e4a.a70eb"]]},{"id":"cd1abf63.5dbd2","type":"worldmap-tracks","z":"11a9e76c.e4d6c9","name":"Track","depth":"30","layer":"combined","x":830,"y":1120,"wires":[["78619e4a.a70eb"]]},{"id":"78619e4a.a70eb","type":"worldmap","z":"11a9e76c.e4d6c9","name":"My map","lat":"55.7521","lon":"37.6173","zoom":"15","layer":"OSM","cluster":"15","maxage":"3000","usermenu":"show","layers":"show","panit":"true","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"deg","path":"/worldmap","x":1060,"y":1180,"wires":[]}]

Думаю, остальная настройка — уже дело техники. Всем спасибо за внимание!

Отдельное спасибо сообществу https://t.me/node_red   и пользователю @cronyx  за идеи и форуму https://discourse.nodered.org/ за помощь.

Концепция умного дома

Идея метеостанции с веб интерфейсом гармонически эволюционировала: решено расширять функционал. Краткий перечень хотелок был таков:
1. Сделать приемлемую визуализацию и управление с web интерфейса, приложения на смартфоне;
2. Реализовать автоматические функции системы, т.е. внедрить среду программирования в систему управления умным домом;
3. Реализовать голосовое управление системой.

По началу мысли были реализовать логику на локальных ESP8266 и вывод информации на общую web страничку с управлением устройствами при помощи get запросов. Но концепция кардинально изменилась после покупки Raspberry Pi. По мере знакомства с Linux и изучением темы умного дома было решено применить связку:

  • MQTT брокер Mocquitto (центральный узел передачи информации);
  • Node Red (среда программирования, центральный сервер обработки логики работы), визуализация на Dashboard;
  • Domoticz (визуализация + дополнительные возможности по программированию логики работы устройств);
  • Голосовое управление реализовано при помощи навыка Яндекс Алисы, который обращается к https webhook, поднятый на Node Red;
  • Управление также реализовано через бота Telegram;
  • Оповещение о превышении уровня CO2 и низкой влажности передаются на SmartTV LG.

Что реализовано:

  • Функции контроля микроклимата (CO2, температура, влажность в двух комнатах). Автоматизировать тут нечего, т.к. нет исполнительных устройств. Откр\закр проветривание и вкл\выкл увлажнители осуществляется вручную;
  • Управление 1 светильником

Что в планах:

  • Управление светом по сценариям, в том числе в с\у;
  • Интеграция Android  телефона. Для начала оповещение о приближении к дому;
  • Настройка Telegram и Алисы на вывод всей информации;

Возникшие проблемы:

  • Периодическое падение связи ESP с MQTT брокером. В интернете есть мнение, что на ESP лучше использовать GET запросы;
  • Периодические  зависания Node-Red

Немного скринов