Для обеспечения передачи телеметрии с автономного квадрокоптера, в китайской народной республике были куплены два модуля APC220. Данные радиомодули достаточно распространены среди авиамоделистов, прежде всего, из-за своей низкой цены. На местных сайтах пара APC220 стоит около 1600р, цена надо сказать конская. Мне удалось купить пару модулей за $35 на ebay.com и я доволен ими как слон.
1) Перед подключением модулей к контроллеру, согласно разным инструкциям, рекомендуется настроить модули с помощью специальной программы rfmagic.
Программу можно скачать практически с любого интернет магазина где имеется APC220.
2) Также потребуется установить драйвера для USB-UART моста:
http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
После установки драйверов windows лучше перезагрузить.
3) Теперь подключаем модуль к USB-COM мосту и втыкаем все это в USB порт ПК.
4) Пробуем запустить rfmagic, что с первого раза может не получиться - вываливается ошибка после которой программа не видит модуль. Пробуем снова.
5) После того как rfmagic успешно запустится, меняем настройки на нужные и жмем "Write W".
Теперь подробнее о настройках APC220.
Лично в моем случае, оба модули были изначально правильно настроены, поэтому перезаписывать настройки не было необходимости. Правильная же настройка заключается в следующем:
1) Оба модуля должны иметь одинаковую (естественно) частоту RF frequency, я оставил 434МГц.
2)
Оба модуля должны иметь NET ID (не проверено) и одинаковую скорость RF TRx rate (скорость передачи данных между модулями).
3) Что касается NODE ID, то я искренне считал что это уникальный идентификатор модуля, ввиду чего эти параметры должны различаться для разных модулей (так и пишут в прочих тестах). Но у меня оба модуля имеют одинаковый NODE ID и это не мешает им общаться. В общем, вопрос назначения Net параметров требует дополнительного изучения.
Прочие параметры:
Параметр RF Power определяет мощность излучения передатчика, я оставил 9 как и было. Настройки связи с контроллером также оставил по-умолчанию: 9600б/с и отключенный Parity (в софтине опечатка кстати).
Кстати сказать, согласно даташита, настройку модуля можно меня online, то есть прямо во время полета. Здесь сразу возникает ассоциация с печально известным Фобос-грунт-ом и неудачными попытками его перепрограммировать...
Подключение к mbed
В комплекте с парой модулей имеется переходник USB-UART (виден на фото). По сути переходник нужен лишь для изменения настроек модулей и для тестирования.
Распиновка APC220:
- GND - земля;
- VCC - 3.3 - 5.5В;
- EN - Enable; вкл. при >1.6В (либо N/C) и выкл. при <0.5В;
- RXD - UART RX;
- TXD - UART TX;
- AUX - режим модуля Master/Slave?
- SET - настройка модуля (низкий уровень).
В общем случае, к контроллеру подключаются только четыре вывода APC220. Схема подключения:
- GND APC220 - GND mbed
- VCC APC220 - +5V mbed
- RXD APC220 - TXD mbed
- TXD APC220 - RXD mbed
Во всех инструкциях по подключению APC220 используют схему PC-APC220-APC220-MCU. То есть один модуль подключают к компьютеру через переходник, а другой к контроллеру. Затем запускают на ПК какой-нибудь терминал и принимают/отправляют данные с/на контроллер. У меня такой вариант не получился, так как оба терминала (putty и TeraTerm) с различными вариантами настроек напрочь отказывались принимать данные. Именно поэтому в моем тесте оба APC220 подключены к контроллеру mbed. Я уверен что проблема все-таки решаемая, но в данный момент задача состояла в базовой проверке работоспособности купленных устройств.
Для эксперимента, как и всегда, использовался MCU mbed. Вывод данных осуществлялся на LCD 1602. Схема стенда представлена ниже.
Программа
Код программы чрезвычайно прост. В бесконечном цикле происходит опрос одного модуля на предмет получения данных, отправка новых данных через второй модуль и вывод отправленных и полученных данных на дисплей.
APC220 LCD
#include "mbed.h"
#include "TextLCD.h"
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Serial apc_1(p9, p10); // tx, rx
Serial apc_2(p28, p27); // tx, rx
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2); // rs, e, d4-d7
Timer tmr;
Timeout t2, t1;
void t1out(void) { led1 = 0; }
void blip1(void) { led1 = 1; t1.attach(&t1out, 0.01); }
void t2out(void) { led2 = 0; }
void blip2(void) { led2 = 1; t2.attach(&t2out, 0.01); }
int main() {
char data[8];
char idx;
int unsigned sec;
tmr.start();
apc_1.baud(9600);
apc_2.baud(9600);
while(1) {
sec = tmr.read();
idx = 0;
while( apc_1.readable() ){
data[idx++] = apc_1.getc();
blip1();
}
if( apc_2.writeable() ){
apc_2.printf("%d", sec);
blip2();
}
lcd.locate(0,0);
lcd.printf("%d - %s", sec, data);
wait_ms(500);
}
}
Запуск
В итоге, как всегда, небольшая демонстрация:
На следующем этапе будут проведены полевые испытания с целью выяснить реальную рабочую дистанцию модуля в городе и в лесу.