Очень важно помнить, что любой полноценный робот - сложная система, состоящая из множества частей, плат и датчиков…
В этой статье мы попробуем сделать маленький шажок к созданию полноценной роботизированной системы: попробуем совместить два контроллера, выполняющих определенные задачи. А именно, подключим Arduino с датчиком DHT-22 к контроллеру CM-530, управляющим роботизированной платформой. Сделаем это в два этапа:
Первый- просто протестируем взаимодействие Arduino и CM-530 через последовательный порт.
Второй- используем это в более прикладном ключе: Arduino будет считывать показания с датчиком DHT-22 и передавать по последовательному порту данные контроллеру CM-530, который будет при определенных значениях температуры выполнять некоторые действия.
Один из способов заставить общаться два данных контроллера- соединить их через последовательные порты. Arduino использует для этого RX и TX порты, а, также, может задействовать любые PWM пины в качестве дополнительных последовательных портов. У CM-530 будем использовать соответствующий Serial порт для подключения Zigbee и подобной периферии. К счастью, он оказался полно дуплексным.
Cначала разберемся с самим последовательным портом на CM-530:
- GND: Земля( 0В)
- VDD: Напряжение питания(7-3.6В)
- RXD: Приемник
- TXD: Транслятор
Как видно, TTL интерфейс ( транзистор-транзисторная логика) CM-530 через данный порт поддерживает только 3.3 В. Поэтому подключать TTL, работающий на 5 В к CM-530 можно лишь при наличии стабилизатора, преобразующий 5 В к 3.3 В (он подключается между VDD, RX и TX выходами обоих контроллеров). В нашем же примере мы воспользуемся моделью платы Arduino Pro Mini работающей на 3.3 В изначально:
Вместе с тем, стандартный RX и TX порты Arduino Pro Mini заменим на PWM порты 10 и 11 (далее просто RX и TX) ( это связано с проблемой перезаписи прошивки на этой плате из-за того, что те же самые стандартные RX и TX используются программатором для заливки прошивки(см статью про прошивке Arduino Pro Mini).
Подключение:
- Соединяем пины GND обеих плат.
- VDD CM-530 подключаем к VCC платы Arduino Pro Mini
- У обеих плат RXD одного контроллера соединяем с TXD другого.
Теперь, если мы попробуем через Arduino отсылать данные на CM-530, то… ничего не выйдет. Дело в том, что CM-530 для общение с wireless аппаратурой использует особый пакет. Т.к. это общение происходит через наш порт, то мы должны также формировать этот пакет. Но более того, контроллер имеет интересную особенность. Во всех тестах, проведенных вашим покорным слугой, была выявлена следующая зависимость:
Даже если пакет сформирован верно, CM-530 просто так не будет верно принимать и дешифровывать его. Оказалось, что перед посылкой самих интересующих нас данных контроллер требует “авторизации устройства”- в первую очередь при подключении Arduino Pro Mini мы должны отослать особый набор байт. Но простой передачей этого пакета все не заканчивается. Во-первых, это обязательно требуется сделать перед тем, как мы запустим прошивку контроллера (то есть во время выбора режима работы CM-530). Во-вторых, не отсылая более никаких данных после этого на контроллер, войти в режим запуска прошивки CM-530. Далее, вплоть до выключения контроллера, можно будет более не повторять эту процедуру даже если вы будете менять режимы работы контроллера.
На данный момент программно это реализовано следующим образом: Arduino отсылает этот стартовый пакет, ждет 6 секунд за которые мы должны войти в режим воспроизведения прошивки, и начинает слать уже нужный нам пакет.
Это несколько муторно, но в дальнейшем программа будет модернизирована и достаточно будет лишь подключить Arduino к CM-530.
Что любопытно, так это отсутствие такой программы у других подобных проектов. В большинстве своем, эти проекты были основаны либо на другом контроллере(CM-5), либо Serial порт был связан с каким-либо сторонним wireless устройством, а не Arduino напрямую.
Инициализационный пакет:
Прежде чем описывать сам инициализационный пакет, стоит отметить следующее:
- Этот пакет (именно инициализационный пакет) не постоянен, то есть в большинстве случаев на контроллер при подключении Bluetooth модуля приходили именно эти данные. Но не всегда. Этот вопрос требует дополнительного уточнения и исследования. Скорее всего, часть данных может быть опущена, но пока тесты показали отсутствие такой возможности.
- Данные были получены соединением RX пина CM-530 с RX пином Arduino и выходом TX модуля BT-210.
Сам пакет состоит из 27 байт и выглядит в HEX форме следующим образом:
0xD, 0xA, 0x42, 0x54, 0x57, 0x49, 0x4E, 0x20, 0x53, 0x6C, 0x61, 0x76, 0x65, 0x20, 0x4D, 0x6F, 0x64, 0x65, 0x20, 0x41, 0x54, 0x2D, 0x32, 0x31, 0x30, 0xD, 0xA
Описание основного пакета:
Основной отсылаемый пакет состоит из 6 байт:
255 | 85 | byteL | ~byteL | byteH | ~byteH |
Или в Hex:
FF | 55 | byteL | ~byteL | byteH | ~byteH |
Отсылать данные на CM-530 можно как раз в байтовом виде или в HEX. В любом случае, контроллер CM-530 дешифрует данный пакет и выделяет значения byteL и byteH, которые в итоге и определяют отсылаемое число. Но сам же CM-530 будет отсылать данные в HEX форме полным пакетом, так что принимающее устройство должно самостоятельно дешифровать пакет.
Знак ~- инверсия значения. Если мы отсылаем число <=255, то используем только byteL, а bytH обнуляем( при том ~byteH равен 255). Если число >255, то используем оба байта.
К примеру, для того, чтобы CM530 распознал байт со значением 65, мы отослать пакет в следующем формате:
255 85 45 210 0 255
Для 65:
255 85 65 190 0 255
Важно помнить: byteL+~byteL=255; byteH+~byteH=255.
Тот же самый пакет, содержащий 65, в HEX форме, через которую и осуществляется общение:
0xFF 0x55 0x41 0xBE 0x00 0xFF
Для числа >255, то есть, к примеру, числа 0x1234 в HEX (4660 в DEC):
0xFF 0x55 0x34 0xCB 0x12 0xED
Или:
255 85 52 203 18 237
Вновь: 52+203=255, 18+ 237=255.
Теперь попробуем написать простой скетч мигания светодиодом:
Прошивка для Arduino pro mini:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
Используем библиотеку SoftwareSerial (для введения дополнительного последовательного порта) ввиду особенностей прошивки платы Arduino Pro Mini. Этот шаг не обязателен и можно использовать стандартный Serial порт).
Вначале мы будем отсылать инициализационный пакет, представленный в HEX форме. Мы можем использовать здесь либо тип байт, либо представить все в 16-ом виде типа uint8. Т.к. переводить 27 символов в DEC систему нет смысла, представляем этот пакет в HEX виде:
uint8_t stpck[27]={0xD, 0xA, 0x42, 0x54, 0x57, 0x49, 0x4E, 0x20, 0x53, 0x6C, 0x61, 0x76, 0x65, 0x20, 0x4D, 0x6F, 0x64, 0x65, 0x20, 0x41, 0x54, 0x2D, 0x32, 0x31, 0x30, 0xD, 0xA};
Основной пакет состоит из 6 байт. Теперь следует составить этот пакет. Выбор используемых типов тот же:
byte packet[6] = {255, 85, 52, 203, 18,237};
либо
uint8_t packet[6] = {0xFF, 0x55, 0x34, 0xCB, 0x12,0xED};
Скорость передачи данных по-нашему COM порту на CM-530 составляет 57600 бит/с. Соответственно, настраиваем на ту же скорость и наш Serial порт. Вместе с тем, при запуске Arduino Pro Mini будем слать инициализационный пакет и ждать 6 секунд. Следовательно, важно подключать Arduino после включения контроллера CM-530.
void setup()
{
mySerial.begin(57600);
mySerial.write(stpck,27);
delay(6000);
}
В цикле будет отсылать байт 0x1234(4660):
void loop()
{
mySerial.write(packet,6);
}
Итого код для Arduino:
Код для CM-530:
Для CM-530 прошивка ничем не отличается от той, которую вы пишите для приема данных через ZigBee, ведь контроллер будет дешифровать пакет и получать именно число 4660.
В бесконечном цикле ждем получения данных. Если полученное число равно 4660, то зажигаем светодиод AUX. Если получаем любое другое значение или не получаем вообще ничего- выключаем его.
В итоге, светодиод AUX будет постоянно гореть. Попробуйте отослать любое другое значение и вы увидите, что AUX перестал светиться.