Serial, UART и Android, как связь с микроконтроллерами

Наши испытуемые:
Планшет на Android 4.1.1 “DNS AirTab M101w” и следующие устройства:
1. Плата Tiva C Series TM4C123G LaunchPad
2. Плата Stellaris LaunchPad EK-LM4F120XL
3. Плата Arduino MEGA 2560
4. Плата MSP430 LaunchPad, M430G2553

И сейчас мы будем по очерёдности подключать все эти платы через USB OTG к планшету и пытаться установить с ними связь не прибегая к root доступу.

Испытуемый 1. Плата Tiva C Series TM4C123G LaunchPad
Плата имеет разъём micro-usb “DEBUG”, и RGB светодиод, с ними то и будем играться.
Был залит при помощи Energia IDE следующий скетч:
char data = ‘ ‘; //переменная для приёма символа
boolean rs, gs, bs = false; //статус каждого светодиода

void setup()
{
//Настройка выходов
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);

Serial.begin(9600); //открытие Serial соединения на скорости 9600
}

void loop()
{
if (Serial.available()){ //если были получены данные
data = Serial.read(); //прочитать их
switch (data){ //и выполнить
case ‘1’:
rs = !rs;
break;
case ‘2’:
gs = !gs;
break;
case ‘3’:
bs = !bs;
break;
}

//Зажигаем светодиод
digitalWrite(RED_LED, rs);
digitalWrite(GREEN_LED, gs);
digitalWrite(BLUE_LED, bs);

//Отправляем текущее состояние светодиодов
Serial.print("RGB=");
Serial.print(rs);
Serial.print(gs);
Serial.println(bs);

}
}

В моём случае при подключении к планшету в директории /dev/usb/ появляется файл tty1-1:1.0. Попробуем в эмуляторе терминала прописать следующее:
$ echo 2 > /dev/tty1-1:1.0
$ read s < /dev/tty1-1:1.0
$ echo $s
RGB=010

И тут неожиданно для меня загорается зелёный свет и я увидел строку вывода. Почему неожиданно? Потому что я пренебрёг предварительной настройкой соединения, ткнул пальцем в небо, но за то как удачно! Не будем останавливаться на этом. Но скажу что в разных версиях ядра платы будут определяться по разному, и единой строки команды без костылей не придумаешь (да-да linux обыкновенный).

Немного поигравшись с цветами, отправляя в так называемый COM порт разные цифры приступил к поиску универсального Android решения. В Google Play находится много по запросу “Serial UART”, и большинство приложений работает как надо с игрушкой от Texas Instruments. Но мои попытки найти что нить совместимое Open Source окончились почти ничем. Для Arduino нашёл классную библиотеку, но об этом ниже…

Испытуемый 2: Плата Stellaris LaunchPad EK-LM4F120XL
Как я понял, это предыдущая версия нашего первого испытуемого и с андройдом ведёт себя точно так же. Но актуальная на данный момент Energia 0101E0010 при попытке залить скетч не видит эту плату (Windows 8).
No ICDI device with USB VID:PID 1cbe:00fd found!
Failed!

Поэтому я просто включил вывод в консоль пути конечного бинарника и загружал его вручную при помощи LM Flash Programmer.

Испытуемый 3: Плата Arduino MEGA 2560
Немного изменим скетч и будем мигать только одним светодиодом.
Заливаем при помощи Arduino IDE
#define LED 13
char data = ‘ ‘;
boolean ls = false;

void setup()
{
pinMode(LED, OUTPUT);
Serial.begin(9600);
}

void loop()
{
if (Serial.available()){
data = Serial.read();
switch (data){
case ‘1’:
ls = !ls;
break;
}

digitalWrite(LED, ls);

Serial.print("LED=");
Serial.println(ls);
}
}

Подключаем к планшету, снова видим в директории /dev/usb/ файлик tty1-1:1.0, повторяем эксперимент:
$ echo 1 > /dev/tty1-1:1.0

и тут обнаруживаю что светодиод 2 раза мигнул с периодом около 100 мс и погас. Ладно пробую следующее:
$ read s < /dev/tty1-1:1.0

И тут терминал застыл в ожидании… Ладно Ctrl+C
$ echo $s

Логично что в выводе ничего нет.

Но это было только вступление, есть один замечательный проект Physicaloid Library. Для начала откроем библиотеку как обыкновенный android проект в Eclipse. Теперь создадим новый проект и в его свойствах в пункте android, Library жмём Add… и выбираем Physicaloid Library. Теперь что бы при нажатии кнопки отправить строку “1” в ардуину:
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
mPhysicaloid = new Physicaloid(this);
if(mPhysicaloid.open()) {
byte[] buf = "1".getBytes();
mPhysicaloid.write(buf, buf.length);
mPhysicaloid.close();
}
break;
}

Как прочитать полученные данные, думаю рассказывать не нужно, ибо в документации к библиотеке всё есть.

Испытуемый 4: Плата MSP430 LaunchPad, M430G2553.
Эта плата совсем не захотела работать с моим железом. Просто не определяется системой, а USB Device info просто виснет при рефреше.

Итог:
Хотелось бы такую библиотеку для работы с платами Tiva C Series. Самому переделать, пока скила не хватает.

Оставить комментарий