Собираю датчик качества воздуха (температура, относительная влажность и содержание углекислоты) на базе esp8266, который будет интегрирован с системой мониторинга. Сейчас у меня esp8266 есть только в виде модуля ESP-01 (выводы модуля vcc, gnd, ch_en, reset, gpio0, gpio2, rx, tx), но уже заказал модуль в варианте ESP-12S.
 |
ESP8266 ESP-01 |
 |
ESP8266 ESP-12S |
На ESP-01 выведены только два gpio, но и те доступны с ограничениями. Оба этих вывода участвуют в выборе режима запуска модуля
Bootloader Modes
Mode | gpio0 | gpio2 | gpio15 |
UART Download Mode (Programming) | 0 | 1 | 0 |
Flash Startup (Normal) | 1 | 1 | 0 |
SD-Card Boot | 0 | 0 | 1 |
Соответственно gpio0/gpio2 желательно не использовать на модуле ESP-01, но поскольку особого выбора не было, то для подключения датчика температуры и влажности DHT22 (AM2302) я использовал gpio2. Чтобы подключить датчик углекислоты mh-z19 мне нужно использовать uart (выводы rx/tx) и после этого для программирования модуля его придется извлекать. Перед подключением датчика проверяю что выдается в uart помимо отладочных сообщений прошивки.
Подключаю конвертер на базе Prolific PL2303, который я использую для связи с компьютеров и настраиваю порт /dev/ttyUSB0 на скорость 115200 бод:
$ stty -F /dev/ttyUSB0 115200 raw
$ cat /dev/ttyUSB0
После этого жму reset и вижу "мусор" перед первой строчкой, которую выдает прошивка.
 |
ESP8266 UART 115200 bps |
Скорее всего это лог встроенного загрузчика, но который передается на другой скорости (не 115200). Попробовал несколько вариантов 9600, 38400, 57600, но разборчивого текста так и не получилось.
После гугления я выяснил что лог загрузчика передается на нестандартной скорости 74880 бод и потому я вижу "мусор" в терминале. Пробую переключить порт на 74880:
$ stty -F /dev/ttyUSB0 74880
stty: invalid argument ‘74880’
Try 'stty --help' for more information.
Облом, не дает задать произвольную скорость, но при этом в linux уже давно есть возможность задавать произвольную скорость для последовательных портов. Нашел простую утилитку
anybaud.c, которая позволяет выставить произвольную скорость. Компилирую ее и пробую выставить настройку:
$ wget -O anybaud.c https://gist.githubusercontent.com/peterhurley/fbace59b55d87306a5b8/raw/5017e43f9fde34e9ac37ab2c3fd35b5ca3c3e73f/anybaud.c
$ gcc -static -o anybaud anybaud.c
$ ./anybaud /dev/ttyUSB0 74880
/dev/ttyUSB0 speed changed to 74880 baud
Хотя команда и прошла без ошибок, но лучше не стало
 |
ESP8266 UART 74880 bps |
Сообщения прошивки превратились в мусор, но сообщения загрузчика текстом не стали.
Загрузил Windows 7 в VirtualBox, пробросил pl2303 в виртуальную машину и попробовал подключиться к порту через Putty
 |
ESP8266 UART 74880 bps в Putty |
Сначала подумал, что это проблемы из-за эмуляции USB в VirtualBox, но переключение скорости порта в Putty на 115200 опровергает эту теорию
 |
ESP8266 UART 115200 bps в Putty |
Гугление приносит результат - для поддержки скорости 74880 бод нужно добавить настройку в реестр:
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Ser2pl]
"ExtBaudrate"="74880,2147485264"
После импорта в реестр перезагрузил виртуальную машину и снова попробовал подключиться к порту к Putty. На этот раз все сработало и появились сообшения загрузчика
 |
ESP8266 UART 74880 bps в Putty после патча реестра |
Забегая вперед скажу, что я уже нашел способ как пропатчить pl2303 в linux, но напишу об этом в следующий раз.
Обновлено 22/05/2017: описал способ пропатчить модуль ядра pl2303 в linux для поддержки произвольной скорости передачи данных.