Arduino Android USB-соединение
Я использую Arduino Duemilanove и Nexus 7. Я успешно обнаружил плату Arduino и отобразил идентификатор поставщика и идентификатор продукта. Я пытаюсь перенести данные со своего планшета на плату Arduino и пытаюсь мигать светодиодом на плате. Код для Android выглядит следующим образом.
Основная активность.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbDeviceConnection connection;
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
UsbDevice device = null;
while(deviceIterator.hasNext()){
device = deviceIterator.next();
String s = device.getDeviceName();
int pid = device.getProductId();
int did = device.getDeviceId();
int vid = device.getVendorId();
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(s+"\n"+Integer.toString(pid)+"\n"+Integer.toString(did));
}
connection = manager.openDevice(device);
DataTransfer dt = new DataTransfer(device,connection);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
DataTrasfer.java
public class DataTransfer extends Thread {
UsbDevice device;
UsbDeviceConnection connection;
byte data = 1;
public DataTransfer(UsbDevice device, UsbDeviceConnection connection) {
// TODO: Auto-generated constructor stub
device = this.device;
connection = this.connection;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
UsbInterface usbIf = device.getInterface(0);
UsbEndpoint end1 = usbIf.getEndpoint(0);
//UsbRequest ureq = connection.requestWait();
final Object[] sSendLock = new Object[]{};
boolean mStop = false;
byte mData = 0x00;
if(!connection.claimInterface(usbIf, true))
{
return;
}
connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80,
0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0);
connection.controlTransfer(0x40, 0x03, 0x4138, 0, null, 0, 0); //Baudrate 9600
UsbEndpoint epIN = null;
UsbEndpoint epOUT = null;
for (int i = 0; i < usbIf.getEndpointCount(); i++) {
if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
epIN = usbIf.getEndpoint(i);
else
epOUT = usbIf.getEndpoint(i);
}
}
for (;;) { // This is the main loop for transferring
synchronized (sSendLock) { //OK, there should be a OUT queue, no guarantee that the byte is sent actually.
try {
sSendLock.wait();
}
catch (InterruptedException e) {
if (mStop) {
return;
}
e.printStackTrace();
}
connection.bulkTransfer(epOUT,new byte[] {data}, 1, 0);
}
}
}
}
И мой код Arduino:
int incomingByte = 0; // For incoming serial data
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // Opens serial port, sets data rate to 9600 bps.
}
void loop() {
// Send data only when you receive data:
if (Serial.available() > 0) {
// Read the incoming byte:
incomingByte = Serial.read();
digitalWrite(13, HIGH); // Set the LED on
delay(1000); // Wait for a second
digitalWrite(13, LOW); // Set the LED off
// Say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
Проблема в том, что на плате Arduino нет светящихся светодиодов. Я не уверен, в чем проблема, потому что я только начал работать в этой области.
2 ответа
Проект, на который вы ссылаетесь с http://android.serverbox.ch/?p=549 в комментариях, будет работать только с более свежими платами Arduino, такими как Uno (или с чем-то еще, использующим CDC-ACM serial-over-USB схема, которую они реализуют).
Старые платы Arduino, такие как duemilanove, используют USB-последовательный чип FTDI, для которого потребуются другие операции USB.
Вы можете найти что-нибудь где-нибудь о сопряжении семейства USB-последовательных преобразователей FT232 с API-интерфейсом USB хоста Android (части FTDI широко используются во встроенных системах, так что не исключено, что вы что-то найдете), или вы можете получить доску Uno, чтобы попробовать уже имеющийся у вас код.
Я знаю, что это было давно, но в любом случае, я сделал небольшую библиотеку, чтобы сделать это. Вот как вы используете это:
Arduino arduino = new Arduino(Context);
@Override
protected void onStart() {
super.onStart();
arduino.setArduinoListener(new ArduinoListener() {
@Override
public void onArduinoAttached(UsbDevice device) {
// arduino plugged in
arduino.open(device);
}
@Override
public void onArduinoDetached() {
// arduino unplugged from phone
}
@Override
public void onArduinoMessage(byte[] bytes) {
String message = new String(bytes);
// new message received from arduino
}
@Override
public void onArduinoOpened() {
// you can start the communication
String str = "Hello Arduino !";
arduino.sendMessage(str.getBytes());
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
arduino.unsetArduinoListener();
arduino.close();
}
И код на стороне Arduino может быть примерно таким:
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available()){
char c = Serial.read();
Serial.print(c);
}
}
Вы можете проверить страницу GitHub, если вы заинтересованы.