В этой статье обсудим способы беспроводного взаимодействия Arduino, а так же как нам поможет macnhester.h реализовать это на микропроцессорах Attiny.

У многих ардуинщиков часто возникает задача беспроводного управления или передачи микро-данных между устройствами. Как правило, первое что приходит в голову - связать устройства через wi-fi или bluetooth, что в принципе резонно, если вам нужно передавать достаточно объёмные наборы данных. Но что если объёмы не столь велики, а устройства ограничены в энергопотреблении?
Тут то на помощь и приходят радиомодули, которых на китайском рынке целое море! Вот например пара RF-TX модулей, которые я использую в своих поделках:
Так же для увеличения дальности и качества сигнала рекомендую вам запастись антеннами. Можно просто припаять кусок проволоки длиной 17,5см/35см либо купить готовенькие, накрученные антенки, как я и сделал!
И так, как с ними работать?
Когда ищешь гайдлайны на тему как завести трансмиттер с ресивером на arduino, то первым делом натыкаешься на многочисленные реализации с использованием библиотеки VirtualWire.h. Так вот - не используйте её!
Да, библиотека может показаться удобной и простой, но тут таятся опасности:
- Она жрёт много ресурсов - как ОЗУ, так и ПЗУ.
- Она не будет работать на серии микроконтроллеров Attiny (ввиду того, что физически туда не влезет)
Попытки оптимизировать библиотеку особо не увенчались успехом, потому было принято решение найти альтернативу! И она нашлась в репозитории пользователя mchr3k на GitHub.
manchester.h
Ссылка на библиотеку: https://github.com/mchr3k/arduino-libs-manchester
В первую очередь стоит сказать, что работать с manchester.h несколько сложнее, чем с предыдущим героем. Библиотека занимает в несколько раз меньше памяти в ОЗУ и позволяет осуществлять передачу данных со скоростью до 10кб/с, чего для многих задач хватит с головой.
Как видно из рисунка выше, результат оптимизации исключительно положительный. Вместо 604 байт ОЗУ программа занимает всего 43 байта, а так же вместо 4956 байт ППЗУ код использует 3830 байт.
Особенностью применения библиотеки Manchester можно выделить то, что за одно сообщение можно передать только один двухбайтовый unsigned int, что несколько затрудняет процесс формирования сообщения. Если unsigned int (число от 0 до 65535) вам недостаточно для передачи полного сообщения, то вам придётся разбить его на кусочки и сформировать что-то вроде собственного пакета и протокола передачи данных.
Manchester.h может работать не только на arduinках и их копиях, но и на микроконтроллерах ATmega328, ATmega8, ATMega32U4, ATtiny84/44/24, ATtiny85/45/25 с частотой от 1Mhz до 16.5Mhz (чего VirtualWire даже и не снилось).
Начало работы с manchester.h
В первую очередь закиньте библиотеку в папку со всеми библиотеками среды Arduino IDE, либо по пути создайте в рабочем каталоге папку libraries.
Затем подключите в ваш скетч:
#include <Manchester.h>
В функции setup() укажите параметры инициализации приёмника или :
man.setupTransmit(PIN, MAN_1200);
PIN - Пин, к которому подключен приёмник или передатчик (rx/tx)
MAN_* - скорость передачи данных, измеряемая в БОД (baud rate). Macnhester.h может работать со следующими скоростями: 300, 600, 1200, 2400, 4800, 9600, 19200.
Рекомендую вам начинать работать со скоростью в 1200 бод (MAN_1200). На более высоких скоростях некоторые RX/TX модули могут тупить, хотя чаще всего они без проблем справляются и со скоростями в 9600 бод.
Важно следить за тем, чтобы скорость на передатчике и приёмнике была одинаковой!
Пример кода для отправки массива:
Пример кода приёма массива:
Видите? Всё очень просто.
А для того, чтобы код заработал на attiny с частотой 1MHz вам нужно добавить в setup() следущую строчку кода до настройки параметров инициализации:
man.workAround1MhzTinyCore();
Но что, если я вам кажу, что эта библиотека может отправлять не только данные, но и их контрольные суммы и автоматически сверять полученные данные на предмет повреждения помехами?
Эта возможность может оказаться крайне востребованной в вашем проекте!
Но всё становится несколько сложнее и куда интереснее, когда у нас встаёт задача отправить массив сообщений с хэш суммой к каждому отдельному элементу, из-за того, что библиотека не позволяет получить хэш сумму целого массива сообщений.
Чтож, видимо это тема для следующей статьи :)
P.S. А вот и продолжение статьи!
Беспроводная передача массива с хешем при помощи Manchester.h
Saturday, 05 November 2016