`
lyunabc
  • 浏览: 526025 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

Android ADK USB 通信简单示例 点亮关闭LED

 
阅读更多

前面Android ADK 编程简介 介绍了ADK编程的一般步骤,这里给出一个简单的实例说明Android手机如果通过USB端口来控制LED。

所使用的Arduino 板子为Freetronics 的 EtherTen ,就一红一绿LED连接到7,8口上。如下图所示:

参考DemoKit的 Arudino 代码,为LED 驱动编写如下代码:

#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
 
#include <adk.h>
 
#include <printhex.h>
#include <message.h>
#include <hexdump.h>
#include <parsetools.h>
 
USB Usb;
USBHub hub0(&Usb);
USBHub hub1(&Usb);
ADK adk(&Usb,"Guidebee Pty Ltd.",
"LedDemoKit",
"DemoKit Arduino Board",
"1.0",
"http://www.imobilebbs.com",
"0000000012345678");
uint8_t  b, b1;
 
#define  START_MOTOR               8
#define  STOP_MOTOR                7
 
#define  ERROR_INDICATOR        13
 
void setup();
void loop();
 
void init_leds()
{
pinMode(START_MOTOR, OUTPUT);
pinMode(STOP_MOTOR, OUTPUT);
digitalWrite(START_MOTOR, LOW);
digitalWrite(STOP_MOTOR, LOW);
}
 
void setup()
{
Serial.begin(115200);
Serial.println("\r\nADK demo start");
 
if (Usb.Init() == -1) {
Serial.println("OSCOKIRQ failed to assert");
while(1); //halt
}//if (Usb.Init() == -1...
 
init_leds();
 
}
 
void loop()
{
uint8_t rcode;
uint8_t msg[3] = { 0x00 };
Usb.Task();
 
if( adk.isReady() == false ) {
digitalWrite(ERROR_INDICATOR, HIGH);
return;
}else{
digitalWrite(ERROR_INDICATOR, LOW);
}
uint16_t len = sizeof(msg);
rcode = adk.RcvData(&len, msg);
 
if(len > 0) {
USBTRACE("\r\nData Packet.");
// assumes only one command per packet
if (msg[0] == 0x2) {
switch( msg[1] ) {
case 0:
USBTRACE("LED 1\r\n.");
if(msg[2]>128){
digitalWrite(START_MOTOR, HIGH);
} else{
digitalWrite(START_MOTOR, LOW);
}
break;
case 1:
USBTRACE("LED 2\r\n.");
if(msg[2]>128){
digitalWrite(STOP_MOTOR, HIGH);
} else{
digitalWrite(STOP_MOTOR, LOW);
}
break;
}//switch( msg[1]...
}
}//if( len > 0...
 
msg[0] = 0x1;
delay( 10 );
}

编写一个简单的Android应用,包含四个按钮,如下:

这里设计一个帮助类ArduinoHelper,用于和Arduino板子USB通信,这个类可以和任意的Activity绑定,因此很容易应用到你自己的代码中。参见代码下载。

有了ArduinoHelper, Android应用和Arduino板子通信就非常简单,在OnCreate 中创建ArudinoHelp 的实例, 在onResume和onDestroy 方法中调用ArduinoHelper 的对于的方法:


public class ArduinoLedDemoActivity extends Activity {
/** Called when the activity is first created. */
 
protected ArduinoHelper mArduinoHelper;
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mArduinoHelper = new ArduinoHelper(this);
Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
mArduinoHelper.sendCommand(ArduinoHelper.LED_SERVO_COMMAND,
(byte) 0x1, 250);
 
}
});
 
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
mArduinoHelper.sendCommand(ArduinoHelper.LED_SERVO_COMMAND,
(byte) 0x1, 1);
 
}
});
 
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
mArduinoHelper.sendCommand(ArduinoHelper.LED_SERVO_COMMAND,
(byte) 0x0, 250);
 
}
});
 
Button button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
mArduinoHelper.sendCommand(ArduinoHelper.LED_SERVO_COMMAND,
(byte) 0x0, 1);
 
}
});
}
 
@Override
public void onDestroy() {
super.onDestroy();
mArduinoHelper.onDestroy();
}
 
@Override
public void onResume() {
super.onResume();
mArduinoHelper.onResume();
}
 
}


代码下载

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics