Особенности работы с Serial (usb) из-под Android
- Войдите на сайт для отправки комментариев
Ситуация такая. Есть Arduino Nano. Прошивка примитивна (получили хоть, что-то на входе - включили светодиод):
const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); Serial.begin(9600); } void loop(){ if (Serial.available() > 0) { int incomingByte = Serial.read(); digitalWrite(ledPin, HIGH); } }
Всё отлично работает, если слать данные, через Монитор порта. Данные принимаются, мограет Rx-светодиод, включается светодиод на 13м пине.
Задача в том, что бы послать данные с Android-устройства. Операционка Android 4.0 (ICS), а значит имеется USB Host, и можно пользоваться ардуиной как устройством. По интернету найдено разных примеров, но внятно запустить ничего не получается. Устройство обнаруживается приложением на Андроиде, можно получить всю информацию о USB (вендор, эндпоинты и т.п.). Но при попытке отправить хоть что-то на ардуино, получаю такую картину: моргает Rx-светодиод (т.е. что-то пришло), но сведодиод на 13м пине не включается, код на андроиде говорит, что он выполнился и на этом всё.
Вопрос: перед отправкой данных может нужно слать какие-то служебные данные? как-то конфигурировать адруино по usb? или после отправки слать что-то для подтвеждения?
А скорость какую использует приложение на Андройде? 9600?
Видимо, вопрос мой о том же. В API андроида нет каких-то средств указать скорость напряму. Но можно слать controlTransfer запросы, с не очень понятным форматом и без каких-то внятных разъяснений в документации.
А как вы вообще его подключаете? Что за кабель? Переходник? Что за приложение, что шлет с Андройда? Хоть какие-то детали.
Собствено само "Android-устройсво" - это виртуальная машина на компьютере, с устрановленным Android x86 ICS, который подцеплен к ADB через eth0. Работает как полноценное устройство. Arduino Nano, подключено стандартным mini-USB кабелем к комптьютеру, а порт проброшен на виртуалку с андроидом.
Приложение, которое шлёт данные... В общем-то пробовал разные примеры. Например вот этот: http://android.serverbox.ch/?p=549
Светодиод RX моргает, но на 13м пине не загорается, тем не менее.
Пробовал писать код "в лоб", т.е. просто слать данные в порт, без лишних заморочек (правильная многопоточность, и т.п.):
Приложение после запуска находит устройство, выводит в лог его описание. Затем нужно только подтведить права доступа и нажав на кнопку отправить пару байт. При выполнении, резульат тот же - моргает Rx, но 13й не включается.
Есть подозрения, что возможно нужно слать какую-то дополнительную информацию (параметры скорсти и т.п.). Или какие-то данные по дтверждении отправки. Но, если так, то не ясно какие именно и где об этом вычитать можно?
В общем, пока не разобрался как работать напрямую. Нашёл обходной путь попроще:
https://github.com/ksksue/FTDriver/blob/master/FTDriver/src/jp/ksksue/dr...
Этот класс реализует всю работу с USB, предоставляя интерфейс с более удобными методами read и write.
https://github.com/ksksue/FTDriver/blob/master/FTDriver/src/jp/ksksue/dr...
Этот класс реализует всю работу с USB, предоставляя интерфейс с более удобными методами read и write.
Извините пожалуйста, у меня просьба - поместите туда несколько строк ползовании Этой оболочки, и поясните, если удобо, как вставит в андроид (еклипс) проект или как сделат инсталацию (драйвера) на таблет!
не совсем понял о какой оболочке идёт речь и куда поместить какие строки...
если верню помню, то просто нужно в анрдоид-приложении создать экземпляр класса драйвера, и запустить его методом begin, указав baudrate. дальше работа сводиться к методома read и write.
Привет всем!
Кто-нибудь сталкивался с проблемой, когда getDeviceList() возвращает пустой список при подключенных девайсах?
Причем в логе строчки
12-28 17:04:22.051: D/EventHub(153): No input device configuration file found for device 'PITPRO USB JOYSTIK'.
12-28 17:04:22.071: I/EventHub(153): New device: id=6, fd=170, path='/dev/input/event4', name='PITPRO USB JOYSTIK', classes=0x80000141, configuration='', keyLayout='/system/usr/keylayout/Generic.kl', keyCharacterMap='/system/usr/keychars/Generic.kcm', builtinKeyboard=false
12-28 17:04:22.071: I/InputReader(153): Device added: id=6, name='PITPRO USB JOYSTIK', sources=0x01000511
явно говорят, что девайс подключен
может какое разрешение надо подцепить?
Нашел!
моя проблем решается вот так:
http://stackoverflow.com/questions/11183792/android-usb-host-and-hidden-devices
https://groups.google.com/forum/?fromgroups=#!topic/usb-serial-for-android/CBtnRSuS8EM
добавляем в папку /system/etc/permissions файл android.hardware.usb.host.xml содержащий строчки:
Ищем там же файл handheld_core_hardware.xml или tablet_core_hardware.xml
и дописываем строчку <feature name="android.hardware.usb.host"> к остальным таким же.
Перезагружаемся, радуемся
Нашел!
моя проблем решается вот так:
Огромное спасибо! Я неделю мучался с этой проблемой!
А никто не пробовал с драйверами FTDI работать ( libftd2xx-jni.so ), у меня тестовое приложение вылетает с ошибкой.
Спасибо!
У меня FT311 (UMFT311EV: http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_UMFT311E...), пробовал, но не успел подключит к PriVileg 7D (китайскии таблед Андроид 4.0.3. с болгарское имя :)). Сейчась у меня другой проект, но надеюс скоро опять вернусь к Андроид и 311.
У меня FT311 UMFT311EV
Интересный девайс. Они уже в России продаются?
Было бы интересно пообщаться на эту тему. Я только учусь программы писать под андроид, у меня много вопросов ))
Для полноценной работы arduino + android нужен usb host shild, тот usb что стоит на arduino nano неподходит он используется для заливки скетчей ну и соответственно ))) питания.
Например вот так Android + Arduino = ♥ tutorial