[Из песочницы] Serial, UART и Android, как связь с микроконтроллерами

image

Наши испытуемые:


Планшет на 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. Самому переделать, пока скила не хватает.

© Habrahabr.ru