
Всичко започна с придобиването от автора на вторичния пазар на интересното устройство — Smart Response XE (). То е предназначено за училища: всеки ученик в класа получава устройство, което прилича на електронен записник или преводач от деветдесетте, учителят задава въпрос, а учениците въвеждат отговорите на клавиатурите на устройствата, което се предава по радиоканал (802.15.4) на приемник, свързан към компютъра на учителя.
Поддръжката на тези устройства е прекратена преди няколко години, и това, което училищата са купували за по 100-200 долара за брой, сега излиза на eBay за 10 и по-малко. „Железото“ там е много подходящо за гик експерименти:
- клавиатура с 60 клавиша
- дисплей с резолюция 384×136, 2 бита на пиксел — аналогично на БК, CGA, но 4 не цветове, а градации на яркостта
- микроконтролер ATmega128RFA1 (128 кБ флаш памет, 4 кБ EEPROM, 16 кБ RAM, приемник-предавател от стандарт 802.15.4)
- външна (относно микроконтролера, а не цялото устройство) флаш памет от 1 мегабит (128 килобайта) с SPI интерфейс
- отсек за 4 елемента AAA.
От името на микроконтролера е ясно, че той принадлежи към семейството на AVR, което прави задачата за съвместимост с Arduino повече от тривиална...
От новината на авторът научи, че вече е (по тази същата връзка е описано какво къде да се свърже), получавайки възможността да стартира игри за Arduboy:

Но авторът се интересува повече от възможността не да играе на устройството, а да изследва:
- флаш памет с последователен SPI интерфейс
- загрузчици за AVR
- стандарт 802.15.4
Авторът започна с написването на (GPL v3), която позволява инициализация на дисплея, извеждане на текст и правоъгълници, както и достъп до флаш памет с SPI интерфейс. След това той започна да измисля идеи за praktychesko използване на устройството: портативен VT-100-съвместим терминал, многопотребителски игри. След като преобърна три устройства, той реши да "научи" тях да получават зареждания "по въздуха". Това щеше да бъде не само интересно, но и много удобно: трудно е всеки път да отваряш корпуса на устройството, а под капака на отсек за батерии има само отвори, позволяващи свързването на платка към JTAG програмист.

Това е достатъчно, за да качите Arduino зареждача, но не и скеча — последователният порт не е извеждан, така че не може да се избегне отварянето на корпуса. Линиите TX0 и RX0 на първия последователен порт са съвместени с линиите за опит на клавиатурната матрица, а именно — тези, по които се извършва опитът на функционалните клавиши отстрани на дисплея. Но какво да се прави — авторът създаде следното:

Той изведе линиите JTAG, и сега не е необходимо да се отваря батерийното отделение. А за да може да се качват и скечове, изведе на този същия конектор и двата последователни порта, добавяйки също и ключ, защото при поставени батерии устройството физически не може да бъде изключено по друг начин.
Трябваше да се работи доста дълго с запояваща станция, канцеларски нож и лепилен пистолет. В общи линии, „по въздуха“ е много по-удобно да се качват скечове, трябва спешно да се изобрети нещо за това.
Arduino IDE за качване на скечове използва програмата . Тя взаимодействува с микроконтролера чрез протокола , който позволява предаване на файлове в двете посоки. Той е слабо съвместим с канали, където са възможни променливи закъснения, изкривяване и загуба на данни. Ако в последователния канал нещо „мърда“ или „шумоли“, можете да полудеете в търсене на причината. Веднъж авторът се мъчи половин ден, докато не осъзна, че проблемът е в лошия кабел, а също и капризния интерфейсен преобразовател CP2102. Дори микроконтролер с вграден интерфеен преобразовател, например, ATmega32u4, понякога може да „пребълва“. Всеки потребител на Arduino е забелязал, че грешките при качването на скечове не са толкова редки. Понякога записа протича нормално, а при проверочно четене се открива грешка. Това не означава, че грешката е била при записа — неуспех е имало при четенето. А сега си представете, че при работа „по въздуха“ ще се случва същото, но много по-често.
След като пробва различни начини за преодоляване на този проблем, авторът измисли следното. Устройството има 128-килобайтова флаш памет с SPI интерфейс — приемаме данни по проводниците (помним, че авторът вече има едно устройство с конектор отстрани), използваме тази памет като буфер и по радиоканала изпращаме данни на друго устройство. Такъв поздрав от Cybiko.
След написването на кода за работа с радиоканала, както и шрифта, зареждащият модул стана по-дълъг от 4 килобайта. Поради това стойността на HFUSE беше променена от 0xDA на 0xD8. Сега зареждащият модул може да бъде дълъг до 8 килобайта, а началният адрес стана 0x1E000. Това е отразено в Makefile, но трябва да се има предвид и при качването. с помощта на avrdude.
Приемопредавателят по стандарт 802.15.4 в ATmega128RFA1 първоначално е предназначен за работа по протокол , който е доста сложен, затова авторът реши вместо това просто да предава пакети. Това в ATmega128RFA1 е реализирано хардуерно, така че кодът ще бъде минимален. За улеснение авторът също реши да използва фиксиран канал, без да позволява дори ръчно да се избира. Стандарт 802.15.4 поддържа 16 канала с номера от 11 до 26. Те са доста натоварени, някои също така се припокриват с WiFi каналите (с червено са обозначени ZigBee каналите, синьо, зелено и жълто — WiFi).

Оказа се, че най-малко податливи на смущения от WiFi са каналите 15 и 26. Вторият от тях беше избран от автора. Дисклеймер: преводачът не знае, разрешено ли е да се опростява ZigBee по този начин. Може би, струва си да се програмира още малко и да се реализира напълно?
На първото от устройствата трябва да се реализира крайният автомат, предаващ данни по протокол STK500. В по-голямата си част предаваните и получените съобщения са самодостатъчни, но някои са свързани с минали съобщения по канала. Описание на диалога е предоставено. .
Важен аспект на този диалог е предаване на пакети, предназначени за запис на флаш паметта на целевото устройство. При простите микроконтролери от семейство AVR размерът на страницата е 128 байта, но при ATmega128RFA1 - 256. Същият размер е и при флаш памет, която се свързва по SPI протокол. Програмата в първото устройство при качване на скеч не го предава веднага на второто, а записва в тази памет. Когато Arduino IDE проверява за правилността на записа, му се изпращат записаните данни. Сега трябва да се предадат получените данни по радиоканала на второто устройство. При това превключването от прием на предаване и обратно става доста често. Протоколът STK500 е безразличен към закъсненията, но не търпи загуба на данни (странно, но по-горе е споменато, че закъсненията при предаване на данни също влияят). А загубите при безжично предаване са неизменни. ATmega128RFA1 има хардуерна реализация на повторни заявки при съмнения в правилността на предаването, но авторът решава да реализира същото програмистки. Той разработва протокол, при който в една посока преминават много повече данни, отколкото в другата.
Той не е идеален, но всичко работи. 256-байтовата страница се разделя на четири сегмента, всеки от които се предава по радиоканала под формата на пакет. Пакетът съдържа до 125 байта данни плюс един байт - дължина и два - CRC. Така че фрагменти с дължина по 64 байта заедно с номер на страниците и сегментите (от 0 до 3) се поставят вътре. В приемното устройство има променлива, която следи колко сегмента са приети, и когато пристигнат всичките четири, на предаващото устройство се изпраща потвърждение, че цялата страница е приета. Няма потвърждение (CRC не съвпада) - изпращаме цялата страница отново. Скоростта при това е дори по-висока, отколкото при предаване по кабел. Вижте:

Но всъщност, трябва да се предвиди удобен начин за свързване на устройства чрез кабел за качване на скечове. Например, може да се постави вътре такъв интерфейсен конвертор на CP2102, както е на снимката, и да се залепи към платката така, че да издържа усилието при свързване и отключване на Micro USB кабела.

В него също така има 3,3-волтов стабилизатор (и как може да се използва в устройство с 6-волтово захранване — само ако там има същия стабилизатор, и може да се добавят два диода, за да се избере автоматично от кой от тях ще се захранва устройството). Трябва да се извадят трите светодиода от платката на интерфейсния преобразувател, в противен случай те ще натоварват допълнително батериите при работа с тях, а също така ще пречат на опитите за работа с клавиатурата и флеш паметта с SPI интерфейс.
Стремежът към целта се оказа даже по-интересен от самото ѝ постигане (и нека не споменаваме онази шега за автобуса). Авторът научи много нови неща за зареждачите за AVR, флеш паметта с SPI интерфейс, протокола STK500 и стандарта 802.15.4.
Целият останал код в допълнение към описаната по-горе библиотека — , и той също е под GPL v3. Twitter на автора — .
Източник: habr.com
