схема подключения http://mysku.ru/blog/ebay/30626.html (обязательно нужно соединить GPIO15,CH_PD как на схеме, gpio0 сажаем на землю только для заливки новой прошивки)
залил nodemcu поигрался, работает, порадовал размер и дальность (c керамической антенной) (по сравнению с HC-06)
Встал вопрос как быть дальше.
Постановка задачи
1. Требуется надёжный канал для управляющих команд, на данный момент есть простенький шелл (терминал) через который можно манипулировать файлами на карте, запускать/останавливать lua скрипты и т.п.
2. требуется быстрый канал для телеметрии, надёжность не очень важна, но важна скорость.
Например передавать сырые данные с акселерометра/гироскопа/магнетометра с привязкой ко времени
Причём телеметрия по большей части однонаправленная, от робота к рабочей станции.
3.желательно чтобы потоки приходили в разные программы.
Сейчас, для передачи телеметрии приходится жертвовать управляющим каналом связи.
В связи с тем что появилась возможность сделать переходник из uart/spi/i2c в tcp/udp
встал вопрос что и как скрестить.
С одной стороны у esp8266 довольно быстрый uart,а на стороне STM32 FIFO + DMA так что можно передавать и принимать большие объёмы данных, но для 3го пункта нужно как то уметь разделять данные uart для передачи по разным каналам (tcp|udp)либо всё гнать до рабочей станции одним потоком, и уже там разделять, но это не очень удобно.
Кроме того всё равно есть риск переполнения буфера (и как следствие потеря данных), особенно если телеметрия будет вперемешку с управляющими командами.
О том что такое переполнение, и как с ним борются в последовательных соединениях
и о проблеме переполнения буфера говорит разработчик переходника uart<->tcp http://esp8266.ru/forum/threads/proshiv ... o-web.146/
Если коротко, то для надёжного канала нужны сигналы RTS/CTS, есть ещё программная эмуляция XON/XOFF но с ней есть проблемы.
Эта проблема актуальна для любых модулей где используется только две ножки RX,TX (HC-06 в том числе).
С другой стороны, если разделять на управляющие команды и телеметрию уже на стороне ESP, то в случае переполнения (недоступности рабочей станции) телеметрию просто отбрасываем, а управляющие команды со стороны робота переполнить буфер не смогут.
Но дополнительно встаёт вопрос с приоритезацией, нельзя допускать чтобы поток от телеметрии постоянно загружал буфер так что для управляющих команд не оставалось места.
Ещё есть spi и i2c
первый интересен тем что поддерживает высокие скорости до 10Мбит и поддержку DMA (на стороне stm32), второй имеет встроенный механизм адресации (но есть заморочки с DMA ).
В общем практически полный аналог вопроса "соединение 2х ардуин" =)
update:
пара слов про ESP.
по своей сути это тоже самое что arduino (есть даже http://esp8266.ru/arduino-ide-esp8266/), только с драйверами для wifi.
Можно использовать как обычный самостоятельный контроллер например вот экран подключили http://esp8266.ru/forum/threads/esp8266 ... .84/page-3
Можно в качестве мини web сервера использовать http://esp8266.ru/forum/threads/razrabo ... sp8266.56/
Но в основном позиционируется как модуль для IoT (https://ru.wikipedia.org/wiki/%D0%98%D0 ... 0%B5%D0%B9)
А в качестве основного протокола для IoT позиционируется MQTT http://esp8266.ru/esp8266-nodemcu-low-cost-switch/
С одной стороны прочитав об MQTT можно решить что это практически то что нужно (для роботов), но, если разобраться то этот протокол перегружен заголовками, в каждом пакете названия топиков в текстовой форме, это не важно если посылать пакеты раз в секунду, но если раз в миллисекунду, при том что данные могут быть меньше чем заголовки, то как то сложно получается.
MQTT работает только с TCP.
есть протокол MQTT-NS
http://stackoverflow.com/questions/2756 ... -from-mqtt
https://stackoverflow.com/questions/285 ... 4#28730254
Тут всё упрощено, в плоть до статических ID топиков (бинарные и не нужно предварительно регистрироваться на брокере)
Протокол любой, в том числе и UDP
Но MQTT-NS протокол пока не поддерживается в nodemcu, и многим другим по, т.е. в основном используется такая связка
MQTT-NS клиет ->MQTT-NS proxy->MQTT брокер (mosquitto)
Что касается энергопотребления то оно относительно невелико
post326517.html#p326517
На данный момент, самой стабильной качественной и универсальной прошивкой можно назвать nodemcu
Но они сильно урезали elua так что шелла там нет, т.е. чтобы что то выполнить нужно загрузить туда скрипт init.lua
который будет делать всё остальное.
И вторая особенность, nodemcu событийно-ориентированный, например нельзя узнать есть ли данные в uart (uart.getchar(0,uart.NO_TIMEOUT),
Но можно подписаться на событие "данные в uart", причём можно заранее определить какой именно байт нас интересует , или сколько их должно быть.
Но в случае если будет ошибка в init.lua То не будет возможности загрузить исправленный файл (т.е. нужно заново заливать всю прошивку), в качестве обходного решения предлагается использовать задержку в несколько секунд чтобы иметь возможность прервать исполнение .
Я для этого использую такой скрипт
- Код: Выделить всё • Развернуть
uart.setup(0,115200,8,0,1)
wifi.setmode(wifi.STATION)
wifi.sta.config("mywifi_ssid","mypassword")
realtype = wifi.sleeptype(wifi.NON_ESLEEP)
run_files={ "telnet2" }
------------------------------------------------------------------------
print("Starting...")
print("type '#', to interrupt starting")
uart.on("data",'#',
function(data)
tmr.stop(0)
uart.on("data",'#',nil) --remove uart callback
print("start was interrupted by user...")
for key,name in pairs(file.list()) do print(key,name) end
run_file("os")
end, 1) --1: input from uart will go into lua interpreter, and run.
function run_file(name)
if file.open(name..".lc") then
file.close()
s,err = pcall(function() dofile(name..".lc") end)
else
s,err = pcall(function() dofile(name..".lua") end)
end
if not s then print(err) end
end
function autorun()
print('IP address: ',wifi.sta.getip())
uart.on("data",'#',nil)
--~ dofile('main.lua')
local s,err
for key,name in pairs(run_files) do
run_file(name)
end
end --run_file
function init_restart()
if wifi.sta.status() ~= 5 then
node.restart() --перегружаем модуль если не подключились за 3сек.
else
autorun()
end
end
function init_main()
if wifi.sta.status() ~= 5 then
tmr.alarm(0, 3000, 0, init_restart ) -- Zero as third parameter. Call once
else
autorun()
end
end
init_main()
Скрипт устанавливает скорость последовательного порта в 115200 бод, подключается к wifi Точке и только после этого запускает файл telnet2.
чтобы запустить что то ещё нужно поправить строчку run_files={ "telnet2", "another_script" }
в случае если произойдёт ошибка в telnet2 то либо модуль перезагрузится по watchdog либо будет ошибка в консоли.
Если модуль будет перегружаться то можно прервать загрузку символом '#' + enter
Пример http сервера целиком на lua https://github.com/marcoskirsch/nodemcu-httpserver