Все почалося з придбання автором на вторинному ринку цікавого пристрою Smart Response XE (
Підтримка цих пристроїв припинена кілька років тому, і те, що школи закуповували по 100-200 доларів за штуку, тепер спливає на eBay по 10 і менше. «Залізо» там дуже підходить для гіковських дослідів:
- клавіатура на 60 клавіш
- дисплей з роздільною здатністю 384×136, 2 біти на піксель — аналогічно БК, CGA, але 4 не кольори, а градації яскравості
- мікроконтролер ATmega128RFA1 (128 кБ флеш-пам'яті, 4 кБ ПЗУ, 16 кБ ОЗУ, приймач стандарту 802.15.4)
- зовнішня (стосовно мікроконтролера, а не всього пристрою) флеш-пам'ять на 1 мегабіт (128 кілобайт) з інтерфейсом SPI
- відсік для 4 елементів ААА.
За назвою мікроконтролера зрозуміло, що він відноситься до сімейства AVR, а значить, зробити пристрій Arduino-сумісним - завдання більш ніж тривіальне.
З новини на
Але автора більше цікавить можливість не пограти на пристрої, а вивчити:
- флеш-пам'ять із послідовним інтерфейсом SPI
- завантажувачі для AVR
- стандарт 802.15.4
Автор почав із написання
Цього достатньо, щоб залити завантажувач Arduino, але не скетч — послідовний порт туди не виведений, без відкриття корпусу все одно не обійтися. Також лінії TX0 і RX0 першого послідовного порту поєднані з лініями опитування матриці клавіатури, а саме тими, якими йде опитування функціональних клавіш по сторонах від дисплея. Але що вдієш — автор зробив ось що:
Туди він вивів лінії JTAG, і тепер відсік батарей відкривати не обов'язково. А щоб можна було заливати і скетчі, вивів на цей же роз'єм і обидва послідовні порти, додавши також вимикач, тому що при встановлених батарейках пристрій по-іншому фізично вимкнути неможливо.
Потрібно було досить довго попрацювати паяльником, канцелярським ножем і клейовим пістолетом. Загалом «по повітрю» заливати скетчі значно зручніше, треба для цього терміново щось винаходити.
Arduino IDE для заливки скетчів використовує програму
Перепробувавши різні способи подолання цієї проблеми, автор вигадав таке. У пристрою є 128-кілобайтна флеш-пам'ять з інтерфейсом SPI - приймаємо дані по дротах (пам'ятаємо, що один девайси з роз'ємом на боці автора вже є), використовуємо цю пам'ять як буфер, і по радіоканалу відправляємо дані в інший пристрій. Таке привіт від Cybiko.
Після написання коду для роботи з радіоканалом, а також шрифту, завантажувач став довшим за 4 кілобайти. Тому значення HFUSE довелося змінити з 0xDA to 0xD8. Тепер завантажувач може бути довжиною до 8 кілобайт, а початкова адреса стала дорівнює 0x1E000. Це відображено в Makefile, але має бути враховано і при заливанні
Приймач стандарту 802.15.4 в ATmega128RFA1 спочатку призначений для роботи по протоколу
Виявилося, що найменш схильні до перешкод від 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.
Весь решта коду на додаток до описаної вище бібліотеки.
Джерело: habr.com