Особенности работы с Serial (usb) из-под Android

DsKTY
Offline
Зарегистрирован: 30.07.2012

Ситуация такая. Есть 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? или после отправки слать что-то для подтвеждения?

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 А скорость какую использует приложение на Андройде? 9600?

DsKTY
Offline
Зарегистрирован: 30.07.2012

Видимо, вопрос мой о том же. В API андроида нет каких-то средств указать скорость напряму. Но можно слать controlTransfer запросы, с не очень понятным форматом и без каких-то внятных разъяснений в документации.

Zapek@n
Offline
Зарегистрирован: 16.02.2012

 А как вы вообще его подключаете? Что за кабель? Переходник? Что за приложение, что шлет с Андройда? Хоть какие-то детали.

DsKTY
Offline
Зарегистрирован: 30.07.2012

Собствено само "Android-устройсво" - это виртуальная машина на компьютере, с устрановленным Android x86 ICS, который подцеплен к ADB через eth0. Работает как полноценное устройство. Arduino Nano, подключено стандартным mini-USB кабелем к комптьютеру, а порт проброшен на виртуалку с андроидом.

Приложение, которое шлёт данные... В общем-то пробовал разные примеры. Например вот этот: http://android.serverbox.ch/?p=549

Светодиод RX моргает, но на 13м пине не загорается, тем не менее.

Пробовал писать код "в лоб", т.е. просто слать данные в порт, без лишних заморочек (правильная многопоточность, и т.п.):

package test.usb;

import java.util.HashMap;
import java.util.Iterator;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;


public class IcsUsbHubTestActivity extends Activity {

	public UsbDevice device;
	public UsbManager manager;
	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// получаем устройство
		manager = (UsbManager) getSystemService(Context.USB_SERVICE);
		HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
		Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
		device = deviceIterator.next();

		// описание устройства в лог
		Log.d("", "### device: " + device.toString());
		
		// запрашиаем подтвеждение прав доступа
		PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, 
				new Intent("com.android.example.USB_PERMISSION"), 0);
		manager.requestPermission(device, mPermissionIntent);
	}
	
	
	public void onClickHandler(View v) {
		// получаем интерфейс и эндпоинт
		UsbInterface intf = device.getInterface(0);
		UsbEndpoint endpoint = intf.getEndpoint(1);
		UsbDeviceConnection connection = manager.openDevice(device); 
		connection.claimInterface(intf, true);

		// шлем произвольные данные
		byte[] bytes = {127, 127, 127, 127};
		connection.bulkTransfer(endpoint, bytes, bytes.length, 0);
	}
}

Приложение после запуска находит устройство, выводит в лог его описание. Затем нужно только подтведить права доступа и нажав на кнопку отправить пару байт. При выполнении, резульат тот же - моргает Rx, но 13й не включается.

Есть подозрения, что возможно нужно слать какую-то дополнительную информацию (параметры скорсти и т.п.). Или какие-то данные по дтверждении отправки. Но, если так, то не ясно какие именно и где об этом вычитать можно?

DsKTY
Offline
Зарегистрирован: 30.07.2012

В общем, пока не разобрался как работать напрямую. Нашёл обходной путь попроще:

https://github.com/ksksue/FTDriver/blob/master/FTDriver/src/jp/ksksue/dr...

Этот класс реализует всю работу с USB, предоставляя интерфейс с более удобными методами read и write.

 

NikB
Offline
Зарегистрирован: 01.12.2012

DsKTY пишет:
...Нашёл обходной путь попроще:

https://github.com/ksksue/FTDriver/blob/master/FTDriver/src/jp/ksksue/dr...

Этот класс реализует всю работу с USB, предоставляя интерфейс с более удобными методами read и write.

Извините пожалуйста, у меня просьба - поместите туда несколько строк ползовании Этой оболочки, и поясните, если удобо, как вставит в андроид (еклипс) проект или как сделат инсталацию (драйвера) на таблет!

DsKTY
Offline
Зарегистрирован: 30.07.2012

не совсем понял о какой оболочке идёт речь и куда поместить какие строки...

если верню помню, то просто нужно в анрдоид-приложении создать экземпляр класса драйвера, и запустить его методом begin, указав baudrate. дальше работа сводиться к методома read и write.

pitpro
Offline
Зарегистрирован: 29.12.2012

Привет всем!

Кто-нибудь сталкивался с проблемой, когда 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

явно говорят, что девайс подключен

может какое разрешение надо подцепить?

pitpro
Offline
Зарегистрирован: 29.12.2012

Нашел!

моя проблем решается вот так:

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 содержащий строчки:

<permissions> 
<feature name="android.hardware.usb.host"/>
</permissions>

Ищем там же файл handheld_core_hardware.xml или tablet_core_hardware.xml 

и  дописываем строчку <feature name="android.hardware.usb.host"к остальным таким же.

Перезагружаемся, радуемся

Arkhan
Offline
Зарегистрирован: 05.01.2013

pitpro пишет:

Нашел!

моя проблем решается вот так:

Огромное спасибо! Я неделю мучался с этой проблемой! 

А никто не пробовал с драйверами FTDI работать ( libftd2xx-jni.so ), у меня тестовое приложение вылетает с ошибкой.

Спасибо!

NikB
Offline
Зарегистрирован: 01.12.2012

У меня FT311 (UMFT311EV:  http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_UMFT311E...), пробовал, но не успел подключит к PriVileg 7D (китайскии таблед Андроид 4.0.3. с болгарское имя :)). Сейчась у меня другой проект, но надеюс скоро опять вернусь к Андроид и 311.

Arkhan
Offline
Зарегистрирован: 05.01.2013

NikB пишет:

У меня FT311 UMFT311EV 

Интересный девайс. Они уже в России продаются?

Было бы интересно пообщаться на эту тему.  Я только учусь программы писать под андроид, у меня много вопросов ))

icms
Offline
Зарегистрирован: 22.03.2011

Для полноценной работы arduino + android нужен usb host shild, тот usb что стоит на arduino nano неподходит он используется для заливки скетчей ну и соответственно ))) питания. 

Например вот так  Android + Arduino = ♥ tutorial