Tuesday, September 16, 2014

Arduino ADK USB 控制 Arduino LED 開關

這次用的是Arduino MEGA ADK
Android完整代碼:AALed


個人認為較重要的地方:
public void sendLedSwitchCommand(byte target,Boolean isSwitchedOn){
     byte[] buffer = new byte[3];
     buffer[0] = COMMAND_LED;
     buffer[1] = target;
     if (isSwitchedOn) {
         buffer[2] = VALUE_ON;
     }else {
     buffer[2] = VALUE_OFF;
 }
     if(mOutputStream != null){
     try{
         mOutputStream.write(buffer);
     }catch(IOException e){
         Log.e(TAG“write failed", e);
}
}
}
這個是把開燈和關燈的指令傳給Arduino
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(ACTION_USB_PERMISSION.equals(action)){
synchronized (this) {
UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTEDfalse)){
openAccessory(accessory);
}else{
Log.d(TAG“permission denied for accessory" + accessory);
}
mPermissionRequestPending = false;
}
}else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if(accessory != null && accessory.equals(mAccessory)){
closeAccessory();
}
}
}
};
這個就是接收/連接USB
有個地方非常重要:
一.在res檔裡創建一個xml檔(accessory_filter.xml)
二.在AndroidManifest裡的</activity>上面 加入
  <intent-filter>
<actionandroid:name=“android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
</intent-filter>
<meta-dataandroid:name=“android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource=“@xml/accessory_filter"/>
在</activity>後加入:
        <uses-libraryandroid:name=“com.android.future.usb.accessory"/>
之後就是Arduino的
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
#define COMMAND_LED 0×2
#define TARGET_PIN_2 0×2
#define VALUE_ON 0×1
#define VALUE_OFF 0×0
#define PIN 2
AndroidAccessory acc(“Manufacturer",
“Model",
“Description",
“Version",
“URL",
“Serial");
byte rcvmsg[3];
void setup(){
Serial.begin(9600);
acc.powerOn();
pinMode(PIN, OUTPUT);
}
void loop(){
if(acc.isConnected()){
int len = acc.read(rcvmsg, sizeof(rcvmsg), 1);
if(len > 0){
if(rcvmsg[0] == COMMAND_LED){
if(rcvmsg[1] == TARGET_PIN_2){
byte value = rcvmsg[2];
if(value == VALUE_ON){
digitalWrite(PIN, HIGH);
}else if(value == VALUE_OFF){
digitalWrite(PIN, LOW);
}
}
}
}
}
}
編譯前請把board 轉成 ArduinoMega2560/Mega ADK
編譯失敗請參考ArduinoADK環境搭配

No comments:

Post a Comment