NanoTerminal. Автономный отладчик на Atmega 328 (Arduino). Часть 2.

miniterminal1

miniterminal1Первая вводная часть здесь.
А в этой части о железном воплощении NanoTerminal’а: текущая версия выполнена на двусторонней
стеклотекстолитовой плате размером 7х5 см. Фотографии все сделаны на мобильный телефон в условиях комнатного освещения, так что особо не придирайтесь.

На верхней стороне платы расположен собственно дисплей на базе контроллера SSD1306, распространенный и дешевый. Стоил он около 170 рублей на Aliexpress. Под ним прячется микросхема EEPROM-памяти AT24C256 в SMD-корпусе SOIC8, а также часть центрального микроконтроллера ATMEGA328PU в корпусе DIP28. Также видно кварц нереальных размеров, светодиод 3мм, шесть кнопок и разъем для UART и питания. Слева две кнопки — RESET и ESC, а слева четыре — три из них для навигации по меню и пролистывания лога UARTа, а четвертая пока ни для чего кроме Тетриса не используется.

miniterminal_backПрактически весь нехитрый монтаж я выполнил на нижней стороне платы SMD — компонентами. Резисторы для подтяжки кнопок к шине GROUND и для сопряжения уровней 5 и 3.3 Вольта. К сожалению, только на таких уровнях работает микросхема оперативной памяти 23K256, очень кстати капризная. На фотке её не видно потому, что я её выпаял, остались только резисторы и пустое место. Дело в том, что я в этой версии подключил её к питанию 5В, а он чот не выдержала. Капризная, говорю же. Ошибку в схеме, я заметил уже после того спалил микросхему, но о ней позже в отдельном разделе посвященном работе с 23K256. Для программирования контроллера я подпаял провода интерфейса SPI и вывод RESET.
 
miniterminal3Вот на этой фотке главное меню:

TERMINAL — ну тут понятно, в этом режиме терминал ловит в UART всё что ему шлют и отображает на экране

SETUP — за этим пунктом меню я спрятал настройки

SERVOTESTER — тут мы сервоприводы тестируем

TETRIS -тут мы в Тетрис гоняем
 
term_sett
Вот подменю настроек в котором можно выбрать скорость порта от 300 до 57600 бод, а также задать крайние значения длительности импульсов ШИМ для сервопривода. Ну а еще можно вернуть значения по умолчанию или сохранить во внутреннем EEPROMе свои настройки. Они читаются всякий раз при загрузке терминала.
 
Поскольку программа изначально писалась в Arduino IDE и для китайского аналога Nano V3.0 (как я и говорил ранее, «Nano» стала приставкой в названии терминала), то чтобы ничего не переписывать, я залил фьюзы от Arduino Nano и шью контроллер как Arduino.
 
v01
Но обо всём попозже, а сейчас несколько фотографий первой и второй версии терминала. Первая версия была собрана на коленках. Из новых компонентов там были только кнопки и дисплей. OLED-дисплей SSD 1306 0.96 дюймов — ОООООЧЕНЬ хрупкая вещь. Его очень легко убить. Вот посмотрите на фотке обведено самое хрупкое место — ломается на раз и обрывает дорожки внутренних проводников. А этих дорожек там четыреста штук. В результате часть колонок или строк дисплея не работает, создавая полосатую картинку. Будьте очень аккуратны при работе с этим дисплеем. Я убил таких два. Один раз когда нёс в кармане куртки (ну тут понятно — раздавил чем-то), а второй раз даже не пойму как. Он просто начал показывать полосы — я пригляделся и увидел трещину в стекле.
 
v01_2
 
Это нижняя часть «платы» первой версии. И она работала, пока я не спалил что-то в Nano, подозреваю, что стабилизатор или CH340G. Короче будет время — разберусь, может восстановлю, а может и на распайку пойдет.
 
v02
 
И на последней фотографии останки второй версии, которую я выполнил на двух платах 5х5 см, соединяющихся, поначалу коннекторами, а позднее спаянных проводами. Atmega вставлялась в кроватку, рядом стояла микросхема ОЗУ. На второй плате был дисплей, кнопки и EEPROM AT24C256. Короче, очень неудачная конструкция, коннекторы отваливались, память не читалась. Было решено распаять её и собрать всё на одной плате. Собственно так и получился вариант №3, описанный в самом начале.

Замечу сразу, что это не окончательный вариант. Как минимум, потому, что нужно будет запилить схему питания для ОЗУ на простеньком стабилизаторе AMS 1117 3.3 В. Но и на этом варианте можно писать и отлаживать программу.

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

NanoTerminal. Автономный отладчик на Atmega 328 (Arduino). Часть 1.

miniterminal1
Очень часто для отлаживания программы загруженной в микроконтроллер используется последовательный интерфейс UART подключенный к реальному или виртуальному COM-порту компьютера. В частности, в Arduino IDE имеется простенький, но вполне рабочий инструмент — Монитор последовательного порта. Очень удобно отлавливая баг или просто наблюдая значение переменной написать строчку вроде Serial.println(variable); и в Монитор порта полетят цифры, буквы и прочая дребедень.

Это всё хорошо, когда мы отлаживаем изделие, которое просто лежит на столе и подключено к компьютеру. А как быть с автономными роботами, которых мёдом не корми — дай поездить, побегать, поплавать или полетать? Провода исключаются — робот ведь автономный, а значит любит свободу. Радиоканал, вроде Wi-Fi, bluetooth или что-то вроде — хорошо, но очень недалеко, а вообще желательно в пределах помещения. А самое главное надо специально переписывать программу под средства отладки по радиоканалу.

От всех этих недостатков свободен автономный терминал, представляющий собой связку микроконтроллера и дисплея. В сети лежит уже куча примеров реализации подобных устройств, бери да копируй. Но я не такой, я лёгких путей не ищу обычно, а потому решил самостоятельно разработать и реализовать NanoTerminal.
Несмотря на то, что статья датирована концом октября, данному проекту уже четыре месяца и он пережил уже три реинкарнации.

Первая версия была построена буквально за вечер, что называется «на коленках» на базе китайского клона ArduinoNano (отсюда и название NanoTerminal), с OLED-дисплеем на базе контроллера SSD1306. Всё это хозяйство было смонтировано на китайской макетной плате весьма поганого качества. Но тем не менее на этой первой версии я смог написать основной код программы.

Основные характеристики терминала на текущий момент (октябрь 2016):
1) Разрешение дисплея 128х64;
2) МК — Atmega328;
3) Расширенная память — 32 кбайта статического ОЗУ и 32 кбайта EEPROM;
4) Гибкая система меню;
5) Настраиваемая скорость приема/передачи;
6) Встроенный тестер сервоприводов;
7) Игра Тетрис;

Планируется:
1) Встроенный макроязык, аналогичный AT-командам, для управления функциями минитерминала, такими как: сохранение содержимого ОЗУ в EEPROM, чтение EEPROM, очистка памяти, включение/выключение дисплея и так далее.
2) Батарейное питание, выгрузка данных через USB на компьютер.

В серии статей об этом изделии я опишу работу с контроллером дисплея SSD1306, микросхемой EEPROM AT24C256 через интерфейс I2C, а также с микросхемой статической памяти 23К256 через интерфейс SPI.