Пользователь
0,0
рейтинг
4 июля 2011 в 14:48

Разработка → Android + Arduino = ♥ tutorial

Не так давно Google открыл API для работы Android устройств с USB. Сегодня пришло время пощупать что же это такое и узнать какие возможности нам открываются.




Итак, у нас имеется Arduino Mega 2560, USB Host Shield и HTC Desire с прошивкой cyanogen 7.1.0 RC1 (Android 2.3.4). На всякий случай напомню, что все что будет описываться дальше — работает только начиная с Android 2.3.4 для телефонов и Android 3.1 для планшетов.
Тут стоит отметить что данный USB Host Shield не совсем удачный, особенно в сочетании с Arduino Mega 2560. Первая проблема заключалась в том что данная плата расширения сделана для Arduino UNO, а она отличается от Mega положениями контактов SPI, поэтому пришлось кидать перемычки (см. фото). Второй проблемой, хотя и вполне ожидаемой, стала потребность во внешнем источнике питания для работы этой платы расширения. Более удачной считается USB Host Shield 2.0 от Circuits@Home, но она и дороже.


Плата с перекинутыми SPI контактами

Настройка Arduino ПО


1. Если еще не установлено, то скачать и установить ПО для Arduino.
2. Скачать и распаковать пакет ADK (содержит DemoKit приложение). Должны появится папки app, firmware, и hardware.
3. Скачать библиотеку CapSense
4. Скопировать firmware/arduino_libs/AndroidAccessory и firmware/arduino_libs/USB_Host_Shield в <arduino_installation_root>/libraries/.
5. Создать директорию CapSense в <arduino_installation_root>/libraries/ и скопировать в нее CapSense.cpp и CapSense.h из архива CapSense.

Загрузка прошивки


Google любезно предоставляет свой DemoKit скетч для Arduino. Все что нужно — это открыть его из firmware/demokit/demokit.pde, скомпилировать и залить на плату.

Тестовое Android приложение


В DemoKit пакете также находятся исходники Android приложения для демонстрации возможностей. Google предлагает нам самостоятельно создать Android проект и собрать это приложение. Для начала нам надо будет установить API Level 10. Дальше все просто — создаем Android проект и указываем путь к папке app, в Build Target указываем Google APIs (Platform 2.3.3, API Level 10). Собираем приложение и устанавливаем на телефон. Кто не хочет возится со сборкой — может скачать готовый APK.

Запуск


Просто подключаем наш телефон к USB Host Shield. Если мы все сделали правильно, то на экране появится запрос запуска DemoKit приложения.



Само приложение содержит две вкладки — In (кнопки, джойстик и сенсоры) и Out (светодиоды, реле и сервоприводы).



Я решил что для демонстрации вполне достаточно пары светодиодов и кнопки. Как это все чудо работает можно пронаблюдать на видео.



Немного кода


В рассматриваемом примере сообщения, передающиеся по USB, состоят из трех байтов:
1-й байт определяет команду или группу устройств, например светодиоды — 0x2
2-й байт указывает на конкретное устройство, например зеленый светодиод — 0x1
3-й байт содержит значение, передаваемое устройству, например максимальная яркость — 0xff

Arduino


...
/* инициализация */
AndroidAccessory acc("Google, Inc.",
                     "DemoKit",
                     "DemoKit Arduino Board",
                     "1.0",
                     "http://www.android.com",
                     "0000000012345678");
void setup()
{
    ....
    acc.powerOn();
}

void loop()
{
    byte msg[3];
    /* проверка подключения */
    if (acc.isConnected()) {
        /* получение сообщения от Android устройства */
        int len = acc.read(msg, sizeof(msg), 1);
        if (len > 0) {
            /* сообщение для светодиодов */
            if (msg[0] == 0x2) {
                if (msg[1] == 0x0)
                    analogWrite(LED3_RED, msg[2]);
                else if (msg[1] == 0x1)
                    analogWrite(LED3_GREEN, msg[2]);
                else if (msg[1] == 0x2)
                    analogWrite(LED3_BLUE, msg[2]);
            }
        }

        msg[0] = 0x1;

        b = digitalRead(BUTTON1);
        if (b != b1) {
            msg[1] = 0;
            msg[2] = b ? 1 : 0;
            /* отправка состояния кнопки */
            acc.write(msg, 3);
            b1 = b;
        }
        
    }
}


Android


import com.android.future.usb.UsbAccessory;
import com.android.future.usb.UsbManager;
...
public class DemoKitActivity extends Activity implements Runnable {
    private UsbManager mUsbManager;
    UsbAccessory mAccessory;
    FileInputStream mInputStream;
    FileOutputStream mOutputStream;

    ...

    private void openAccessory(UsbAccessory accessory) {
        mFileDescriptor = mUsbManager.openAccessory(accessory); 
        if (mFileDescriptor != null) {
            mAccessory = accessory;
            FileDescriptor fd = mFileDescriptor.getFileDescriptor();
            mInputStream = new FileInputStream(fd);
            mOutputStream = new FileOutputStream(fd); 
            Thread thread = new Thread(null, this, "AccessoryThread");
            thread.start();
        }
    }

    public void run() {
        int ret = 0; 
        byte[] buffer = new byte[16384]; 
        int i;

        while (ret >= 0) { 
            // получение входящих сообщений
            ret = mInputStream.read(buffer); 

            i = 0;
            while (i < ret) {
                int len = ret - i; 
                switch (buffer[i]) {
                    case 0x1: // сообщение от кнопки
                        if (len >= 3) {
                            Message m = Message.obtain(mHandler, MESSAGE_SWITCH); 
                            m.obj = new SwitchMsg(buffer[i + 1], buffer[i + 2]);
                            mHandler.sendMessage(m);
                        }
                        i += 3;
                        break; 
                }
            }
        }
    }

    // пример использования - включить красный светодиод на полную яркость:
    // mActivity.sendCommand((byte)2, (byte)0, (byte)255)
    public void sendCommand(byte command, byte target, int value) {
        byte[] buffer = new byte[3];
        if (value > 255)
            value = 255;

        buffer[0] = command;
        buffer[1] = target;
        buffer[2] = (byte) value;
        if (mOutputStream != null && buffer[1] != -1) {
            try {
                mOutputStream.write(buffer);
            } catch (IOException e) {
                ...
            }
        }
    } 
}


Выводы


Открывая такие возможности Google в первую очередь конечно же рассчитывает на появление большого числа активных Android аксессуаров, но далеко не последнее место занимает тот факт, что по сути мы получаем удобное устройство для взаимодействия с различными датчиками, сенсорами и приводами. Такое устройство запросто может стать мозгом чего-то роботизированного.

Также нельзя забывать о том, что Android устройство для Arduino может выполнять роль платы расширения, в которой есть GPS, Bluetooth, WiFi, акселерометр и многое другое.

Ссылки


1. Android USB Accessory
2. Android Open Accessory Development Kit
Алексей Журбицкий @blo
карма
104,1
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (53)

  • +6
    Потрясающе. Все больше и больше хочется приобрести чудо андроид :)
    • +1
      Дык чего же вы ждёте? Тот же SGS-i9000 с ещё AMOLED-экраном вполне можно найти за 12.5-13 килорублей. А дури в нём достаточно, чтоб не менять его ещё год-полтора.
      • 0
        Единственный доход — 1450 рублей степендия )
        • 0
          Ну тут уже проблемы негров и беспечный шериф. Обычно желание заработать приносит рано или поздно деньги :)
  • +5
    хм, а если к Arduino прилепить BT передатчик и всякие плюшки типа «вкл-выкл свет, комп, etc», то можно из смарта сделать ничего такой пульт для «умного дома» :)
    • 0
      такой умный дом встанет намного дороже андроида.
      • +2
        Если делать руками и не включать в расчет стоимости своё время, то наврядли.
        • +1
          руками BT передатчик тоже делать?
          • 0
            Таки для Дурино есть готовые BT модули, для него это всеголишь ком прот.
            И наверняка уже есть дурины которые чере BT можно шить.
            • 0
              да со стороны девайса думаю проблем нет.
              Проблемы с другой стороны которая должна команды обработать и включить/выключить свет, печку и т.д.
              • 0
                Это тоже не проблема, все эти устройства включаются в розетку, через сеть можно и передавать команды. Та дурина что с блютусом, будет «пищать» команды в сеть. А другие контроллеры будут слушать сеть, и управлять нагрузкой.
                • 0
                  интересно, во кто-нибудь бы написал про это статью.
                  Я бы с удовольствием почитал, еще бы теорию небольшую туда включить.
      • 0
        Если делать руками и не включать в расчет стоимости свое время, то наврядли.
        • 0
          Сорри, глюк.
    • +1
      связь через BT уже давно есть: www.amarino-toolkit.net/, а бт модуль для ардуинки где то 20$ выйдет
      • +3
        можно и так
        • +1
          тоже вариант, только USB Host шилд + USB BT имхо дороже выйдет… но зато при должном умении в USB дырку можно и wifi втыкнуть или еще какую полезняшку =)
          • 0
            Помилуйте, BT 2.0-донглы дешёвые, как грязь. В моих краях кулера 92х92 дороже стоят.
            • 0
              не спорю, у меня несколько штук валяется, которые заказывал на dx, чтобы до 15$ дотянуть =) но вот сколько стоит USB шилд?
              • 0
                Шилд-то да, но как бы его и так покупать.
                • 0
                  но можно за 15-25$ купить serial bluetooth, если не требуется потом в USB host шилд тыркать еще что-то
                  • 0
                    Зато донгл всегда можно заюзать для чего-то ещё. Тут как бы вилка между универсальностью и взаимозаменяемостью элементов и ценой конечного решения.
          • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      А не проще (раз это все дома) подключить плату по Ethernet, а управлять через вайфай?
      • 0
        Тут нужно не забывать что устройства, которыми вы хотите управлять, тоже должны поддерживать WiFi. Это же относится и к Bluetooth.
        • 0
          Ну собственно, как-то умные устройства должны «слушать» хозяина. Вот передатчик такого типа и нужно вставить в ардуино.
  • 0
    Полезнейшая статья. Спасибо!)
  • +2
    Круто! Это именно то, что я искал. Вы прочитали мои мысли)
  • 0
    Я ждал этого давно!
  • 0
    Мне кажется применение данному фреймворку более актуально на небольших платах, например Beagle Board. Лишний провод, торчащий из телефона будет мешаться, поэтому например умный дом стоит делать через беспроводной интерфейс, который и так уже есть в телефоне. Хотя где-то можно сделать и стационарный пульт, но лучше не из телефона.

    Сама статья великолепна, думаю многие уже начали греть паяльники)
    • +1
      Для умного дома Google анонсировала специально заточенный для этого фреймворк Android@Home и проект Tungsten. Надеюсь скоро узнаем что у них получилось.
    • 0
      Стационарный пульт из телефона позволяет избавиться от многих минусов постоянно включенного компьютера, который используется для мозгов умного дома.
      Тут и резервная батарея есть и резервный канал в интернет, меньше шума и потребления энергии.

      Если раньше думал добавить мозгов дому на основе какого-либо ноута, то теперь есть отличная альтернатива.

      Спасибо за статью, теперь мозг немного успокоен и упорядочен)
  • +2
    А можно все это добро теперь прикрутить к авто… Тут тебе и бортокомпьютер и сигналка и видеорегистратор и прочее…
    А можно прикрутить и сканер МК
    А можно прикрутить… ооооо столько много чего можно прикрутить… фантазия то у меня буйная…
  • +1
    Android + Arduino = Andruino
    • 0
      andruido
  • +1
    Этот пост должна была написать Телеграммочка, но еще не придумали телефона в форм-факторе е61 на Андроиде :)
    • 0
      HTC Status
      промахнулся ):
    • 0
      Она, вообще-то, Теледамочка :)
      • 0
        Кто о чём, а она, вообще-то ТелеГамочка ;-)
  • 0
    HTC Status
  • 0
    не подскажете, где в России(Москве) можно USB Host Shield 2.0 приобрести?
    • 0
      Такие вещи довольно узкоспециализированные, разве что где-то договорится чтобы привезли под заказ, но в таком случае лучше уж сразу у первоисточника купить.
  • 0
    У меня есть маленький вопрос к топикастеру.
    Что и как делать с аудриной, если андройд-устройство таки да, поддерживает юсб-хост?
    • 0
      Не совсем понял вопрос, но в данном случае Android устройство не поддерживает USB host, USB хостом выступает Arduino вместе с платой расширения.
      • 0
        Да, в данном случае хостом будет Ардуино.
        Повторю вопрос: сейчас на рынке довольно много андройд-устройств, поддерживающих ЮСБ-Хост. Что делать и как писать под андройд, чтобы сам девайс выступал хостом, а Ардуино (без шильда, напрямую) работал бы слейвом?
        • 0
          В документации есть описание работы с USB, когда телефон выступает хостом.
          Скорее бы вышел апдейт к галакси s 2. С 2.3.3 ни туда, и ни сюда.
    • 0
      Можно на Androd воспользоваться замечательной библиотекой с открытыми исходниками — usb-serial-for-android, и не покупать никакие дорогущие хост-шилды для Ардуино. Просто подключайте его к Андроид через кабель OTG, и будет Вам счастье. В этом случае Андроид работает как хост, а Ардуино как устройство USB (виртуальный ком-порт, USB CDC).
  • 0
    Купил похожий хост и возникли проблемы с подключением к mega2650. Не мог бы уважаемый автор объяснить подробнее про подключение SPI и питания(желательно взять с мега питание). На картинках видны отогнутые ноги у шилда, не совсем понятны две ноги отогнутые на контактах TX RX насколько смог отличить на фотке.
    • 0
      Насколько я помню эти ноги мешали старту платы. Питание берется с arduino, но сам блок должен быть не слабее 9В 1А.
      • 0
        а если при отладке питание ардуино по юсб идет, не потянет?
        • 0
          У меня не тянула. Использовал отдельный блок питания.
          • 0
            спасибо! плюсовать не хватает «кармы»
  • +1
    Android можно подключить к Arduino (как, впрочем, и к любому USB-девайсу) и без платы USB-хоста, так как в Android начиная с версии 3.1 встроена поддержка режима хоста, и виртуальный последовательный порт Arduino будет программно виден на Android. Т. е. Android будет работать как хост, а Arduino как USB-устройство.

    Для такого подключения нужен OTG-кабель, который конечно же дешевле платы хоста для Arduino (в этом кабеле ничего, кроме проводов, нет, и его можно сделать самому), и в телефоне/смартфоне должна быть аппаратно заложена поддержка хоста + должна быть версия Android 3.1 и выше.

    Андроид как хост очень радует, поскольку может управлять через USB не только Ардуиной, но и дешевыми устройствами USB на основе обычных AVR (устройства на основе V-USB). Да и вообще любыми устройствами USB, кроме тех, у которых применяются изохронные конечные точки. Дополнительный бонус — работая как хост, Android еще и запитывает подключенную через USB платку, т. е. подает на неё через USB честные 5 вольт!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.