Pull to refresh

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

Reading time 3 min
Views 16K
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. Самому переделать, пока скила не хватает.
Tags:
Hubs:
+9
Comments 2
Comments Comments 2

Articles