NRF24 и ESP8266

После долгих мучений наконец-то заставил NodeMCU (ESP8266) работать с nRF24L01p. В этом деле мне здорово помог логический анализатор. Сначала я снял обмен данными с ардуины, где есть отлаженная библиотека и всё работает с полпинка. Затем привел свой код в аналогичный вид, но без какого-либо результата. При снифе моего обмена оказалось, что модуль SPI в NodeMCU поднимает Chip Select после каждого байта! Естественно, загрузка адресов и полезных данных в nRF24 нифига не работала. Сильно запутало то, что чтение и запись одиночных регистров при этом происходили правильно — в одной транзакции я отправлял адрес регистра, в следующей — успешно получал содержимое. Чудеса! Решилось ручным управлением Chip Select’ом с отдельного GPIO. Ну и вишенкой на торте стали перепутанные провода CE и CSN на одной из тестовых плат.

Теперь наконец можно сделать перекладыватель из nRF в MQTT и перенести батарейные датчики с ESP8266 на STM8L+nRF24. Предварительный расчет показал, что батарейки CR2032 должно хватить на 5 лет при отправке данных каждую минуту. Правда, это без каких либо датчиков.

ESP8266: обновление прошивки

Собрать свою прошивку для esp8266 можно на сайте https://nodemcu-build.com/. Для заливки в контроллер мне удобнее использовать инструмент командной строки — esptool.py.

Команда для записи во флэш выглядит так:

esptool.py -p /dev/ttyUSB0 write_flash --flash_mode dio 0x0 ./firmware.bin

Стоит обратить особое внимание на параметр —flash_mode dio, т. к. многие модули не смогут прошиться в режиме qio, который используется по умолчанию. После неудачной прошивки такой модуль будет жаловаться:

rf_cal[0] !=0x05,is 0x74

Я сначала думал, что дело в испорченном разделе конфигурации, но оказалось, что прошивка неправильно пишется. QIO — это quad IO, а DIO — dual IO. Т.е. в первом случае биты данных передаются по четырём линиям, а во втором — только по двум. Получается, что выдаём мы 4 бита за раз, а флэш, не зная об этом, пишет только два. И вместо прошивки получается мусор :-/

Realtek RTL8710: Убийца ESP8266

Процессор ARM Cortex M3 @ 166 MHz, встроенный мегабайт флэша (как у недавно анонсированного ESP8285) и больше периферии. Выглядит многообещающе, но SDK и даташитов пока нет.

http://www.cnx-software.com/2016/07/28/an-alternative-to-esp8266-realtek-rtl8710-arm-cortex-m3-wifi-iot-modules-sell-for-2-and-up/

NodeMCU: не работает adc.read()

Как оказалось, из коробки в NodeMCU ацп настроен на измерение напряжения питания и не может измерять напряжение на ножке TOUT, adc.read(0) возвращает 65535. Для того, чтобы изменить это поведение нужно подправить область конфигурации в флэше. Первыми робкими экспериментами я немного окирпичил тестовую платку и долго пытался вернуть её к жизни 🙂

Конфигурация хранится  в последних 16 килобайтах флэша, так что её точное местоположение зависит от размера флэшки. На моей плате node.flashid() возвращает 1458400, что в шестнадцатеричном виде превращается в 0x1640E0. Из этих цифр трудно сделать далеко идущие выводы, но в итоге оказалось, что флэшка у меня на 4 МБ (32 Мбит). Таким образом область конфигурации начинается с адреса 0x3FC000. Для флэшек 512 КБ (4 Мбит) адрес будет 0x7C000.

Сливаем  8 КБ с помощью esptool.py:

python esptool.py -p COM4 read_flash 0x3FC000 0x2000 init.bin

В любом hex-редакторе находим байт по смещению 107 (десятичное). Скорее всего, он будет равен 0xFF. Заменяем на 0x21 (33, т.е. 3.3 В), сохраняем файл и заливаем обратно:

python esptool.py -p COM4 write_flash 0x3FC000 init.bin

Теперь АЦП измеряет напряжение на входе и радует разнообразными значениями от не нуля до 1024.