2

ArduinoDuemilanoveNexus7を使用しています。Arduinoボードを正常に検出し、ベンダーIDと製品IDを表示しました。タブレットからArduinoボードにデータを転送し、ボードのLEDを点滅させようとしています。Androidのコードは次のとおりです。

Main Activity.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ボードにLEDが光っていないことです。この分野で働き始めたばかりなので、どこに問題があるのか​​わかりません。

4

2 に答える 2

1

コメントでhttp://android.serverbox.ch/?p=549から参照するプロジェクトは、Unoなどの最新のArduinoボード(またはCDC-ACMシリアルオーバーUSBを使用する他のボード)でのみ機能します彼らが実装するスキーム)。

duemilanoveなどの古いArduinoボードは、FTDI USBシリアルチップを使用しているため、さまざまなUSB操作が必要になります。

USBシリアルコンバーターのFT232ファミリーをAndroidのUSBホストAPIとインターフェースすることについてどこかで何かを見つけることができるかもしれません(FTDIパーツは組み込みシステムで広く使用されているので、何かを見つけるのは間違いありません)。すでに持っているコードを試すためにUnoボードを入手できます。

于 2013-02-02T14:37:52.123 に答える
0

久しぶりですが、とにかく、これを行うための短いライブラリを作成しました。これはあなたがそれを使う方法です:

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ページを確認してください。

于 2017-05-26T08:10:43.810 に答える