关于arduino与android设备通过usb进行通信-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15445|回复: 11

[已解决] 关于arduino与android设备通过usb进行通信

[复制链接]
发表于 2013-11-11 20:06 | 显示全部楼层 |阅读模式
目前在进行arduino的学习,之前也学过一段时间安卓编程,现在想做一个关于关于arduino与android设备通过usb进行通信的项目,但是环境一直搭建不出来,我先把运行案例报的错贴出来。
导入newNewSoftSerial库
In file included from D:\adruino\libraries\NewSoftSerial\NewSoftSerial.cpp:45:
D:\adruino\libraries\NewSoftSerial\/NewSoftSerial.h:33:2: error: #error NewSoftSerial has been moved into the Arduino core as of version 1.0. Use SoftwareSerial instead.
In file included from D:\adruino\libraries\NewSoftSerial\NewSoftSerial.cpp:45:
D:\adruino\libraries\NewSoftSerial\/NewSoftSerial.h:99: error: conflicting return type specified for 'virtual void NewSoftSerial::write(uint8_t)'
D:\adruino\hardware\arduino\avr\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
导入AndroidAccessory运行了一个叫demokit的案例报的错如下:









In file included from demokit.pde:6:
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:37: error: 'EP_RECORD' does not name a type
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:50: error: 'EP_RECORD' has not been declared
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:50: error: 'EP_RECORD' has not been declared
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:64: error: 'USB_NAK_LIMIT' was not declared in this scope
demokit.pde: In function 'void init_buttons()':
demokit:61: error: 'A8' was not declared in this scope
demokit:62: error: 'A9' was not declared in this scope
demokit.pde: In function 'void setup()':
demokit:132: error: 'A8' was not declared in this scope
demokit:133: error: 'A9' was not declared in this scope
demokit.pde: In function 'void loop()':
demokit:208: error: 'A8' was not declared in this scope
demokit:216: error: 'A9' was not declared in this scope
demokit.pde: In function 'void init_joystick(int)':
demokit:291: error: 'A9' was not declared in this scope
demokit:294: error: 'A10' was not declared in this scope
demokit:297: error: 'A11' was not declared in this scope
demokit.pde: In function 'char joystick_interrupt()':
demokit:366: error: 'A10' was not declared in this scope

demokit:208: error: 'A8' was not declared in this scope
demokit:216: error: 'A9' was not declared in this scope
demokit.pde: In function 'void init_joystick(int)':
 楼主| 发表于 2013-11-11 20:06 | 显示全部楼层
继续楼上
demokit:291: error: 'A9' was not declared in this scope
demokit:294: error: 'A10' was not declared in this scope
demokit:297: error: 'A11' was not declared in this scope
demokit.pde: In function 'char joystick_interrupt()':
demokit:366: error: 'A10' was not declared in this scope
 楼主| 发表于 2013-11-11 20:06 | 显示全部楼层
再把demokit的源代码给贴出来
#include <Wire.h>
#include <Servo.h>

#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

#include <CapSense.h>

#define  LED3_RED       2
#define  LED3_GREEN     4
#define  LED3_BLUE      3

#define  LED2_RED       5
#define  LED2_GREEN     7
#define  LED2_BLUE      6

#define  LED1_RED       8
#define  LED1_GREEN     10
#define  LED1_BLUE      9

#define  SERVO1         11
#define  SERVO2         12
#define  SERVO3         13

#define  TOUCH_RECV     14
#define  TOUCH_SEND     15

#define  RELAY1         A0
#define  RELAY2         A1

#define  LIGHT_SENSOR   A2
#define  TEMP_SENSOR    A3

#define  BUTTON1        A6
#define  BUTTON2        A7
#define  BUTTON3        A8

#define  JOY_SWITCH     A9      // pulls line down when pressed
#define  JOY_nINT       A10     // active low interrupt input
#define  JOY_nRESET     A11     // active low reset output

AndroidAccessory acc("Google, Inc.",
                     "DemoKit",
                     "DemoKit Arduino Board",
                     "1.0",
                     "http://www.android.com",
                     "0000000012345678");
Servo servos[3];

// 10M ohm resistor on demo shield
CapSense   touch_robot = CapSense(TOUCH_SEND, TOUCH_RECV);

void setup();
void loop();

void init_buttons()
{
        pinMode(BUTTON1, INPUT);
        pinMode(BUTTON2, INPUT);
        pinMode(BUTTON3, INPUT);
        pinMode(JOY_SWITCH, INPUT);

        // enable the internal pullups
        digitalWrite(BUTTON1, HIGH);
        digitalWrite(BUTTON2, HIGH);
        digitalWrite(BUTTON3, HIGH);
        digitalWrite(JOY_SWITCH, HIGH);
}


void init_relays()
{
        pinMode(RELAY1, OUTPUT);
        pinMode(RELAY2, OUTPUT);
}


void init_leds()
{
        digitalWrite(LED1_RED, 1);
        digitalWrite(LED1_GREEN, 1);
        digitalWrite(LED1_BLUE, 1);

        pinMode(LED1_RED, OUTPUT);
        pinMode(LED1_GREEN, OUTPUT);
        pinMode(LED1_BLUE, OUTPUT);

        digitalWrite(LED2_RED, 1);
        digitalWrite(LED2_GREEN, 1);
        digitalWrite(LED2_BLUE, 1);

        pinMode(LED2_RED, OUTPUT);
        pinMode(LED2_GREEN, OUTPUT);
        pinMode(LED2_BLUE, OUTPUT);

        digitalWrite(LED3_RED, 1);
        digitalWrite(LED3_GREEN, 1);
        digitalWrite(LED3_BLUE, 1);

        pinMode(LED3_RED, OUTPUT);
        pinMode(LED3_GREEN, OUTPUT);
        pinMode(LED3_BLUE, OUTPUT);
}

void init_joystick(int threshold);

byte b1, b2, b3, b4, c;
void setup()
{
        Serial.begin(115200);
        Serial.print("\r\nStart");

        init_leds();
        init_relays();
        init_buttons();
        init_joystick( 5 );

        // autocalibrate OFF
        touch_robot.set_CS_AutocaL_Millis(0xFFFFFFFF);

        servos[0].attach(SERVO1);
        servos[0].write(90);
        servos[1].attach(SERVO2);
        servos[1].write(90);
        servos[2].attach(SERVO3);
        servos[2].write(90);


        b1 = digitalRead(BUTTON1);
        b2 = digitalRead(BUTTON2);
        b3 = digitalRead(BUTTON3);
        b4 = digitalRead(JOY_SWITCH);
        c = 0;

        acc.powerOn();
}

void loop()
{
        byte err;
        byte idle;
        static byte count = 0;
        byte msg[3];
        long touchcount;

        if (acc.isConnected()) {
                int len = acc.read(msg, sizeof(msg), 1);
                int i;
                byte b;
                uint16_t val;
                int x, y;
                char c0;

                if (len > 0) {
                        // assumes only one command per packet
                        if (msg[0] == 0x2) {
                                if (msg[1] == 0x0)
                                        analogWrite(LED1_RED, 255 - msg[2]);
                                else if (msg[1] == 0x1)
                                        analogWrite(LED1_GREEN, 255 - msg[2]);
                                else if (msg[1] == 0x2)
                                        analogWrite(LED1_BLUE, 255 - msg[2]);
                                else if (msg[1] == 0x3)
                                        analogWrite(LED2_RED, 255 - msg[2]);
                                else if (msg[1] == 0x4)
                                        analogWrite(LED2_GREEN, 255 - msg[2]);
                                else if (msg[1] == 0x5)
                                        analogWrite(LED2_BLUE, 255 - msg[2]);
                                else if (msg[1] == 0x6)
                                        analogWrite(LED3_RED, 255 - msg[2]);
                                else if (msg[1] == 0x7)
                                        analogWrite(LED3_GREEN, 255 - msg[2]);
                                else if (msg[1] == 0x8)
                                        analogWrite(LED3_BLUE, 255 - msg[2]);
                                else if (msg[1] == 0x10)
                                        servos[0].write(map(msg[2], 0, 255, 0, 180));
                                else if (msg[1] == 0x11)
                                        servos[1].write(map(msg[2], 0, 255, 0, 180));
                                else if (msg[1] == 0x12)
                                        servos[2].write(map(msg[2], 0, 255, 0, 180));
                        } else if (msg[0] == 0x3) {
                                if (msg[1] == 0x0)
                                        digitalWrite(RELAY1, msg[2] ? HIGH : LOW);
                                else if (msg[1] == 0x1)
                                        digitalWrite(RELAY2, msg[2] ? HIGH : LOW);
                        }
                }

                msg[0] = 0x1;

                b = digitalRead(BUTTON1);
                if (b != b1) {
                        msg[1] = 0;
                        msg[2] = b ? 0 : 1;
                        acc.write(msg, 3);
                        b1 = b;
                }

                b = digitalRead(BUTTON2);
                if (b != b2) {
                        msg[1] = 1;
                        msg[2] = b ? 0 : 1;
                        acc.write(msg, 3);
                        b2 = b;
                }

                b = digitalRead(BUTTON3);
                if (b != b3) {
                        msg[1] = 2;
                        msg[2] = b ? 0 : 1;
                        acc.write(msg, 3);
                        b3 = b;
                }

                b = digitalRead(JOY_SWITCH);
                if (b != b4) {
                        msg[1] = 4;
                        msg[2] = b ? 0 : 1;
                        acc.write(msg, 3);
                        b4 = b;
                }

                switch (count++ % 0x10) {
                case 0:
                        val = analogRead(TEMP_SENSOR);
                        msg[0] = 0x4;
                        msg[1] = val >> 8;
                        msg[2] = val & 0xff;
                        acc.write(msg, 3);
                        break;

                case 0x4:
                        val = analogRead(LIGHT_SENSOR);
                        msg[0] = 0x5;
                        msg[1] = val >> 8;
                        msg[2] = val & 0xff;
                        acc.write(msg, 3);
                        break;

                case 0x8:
                        read_joystick(&x, &y);
                        msg[0] = 0x6;
                        msg[1] = constrain(x, -128, 127);
                        msg[2] = constrain(y, -128, 127);
                        acc.write(msg, 3);
                        break;

                case 0xc:
                        touchcount = touch_robot.capSense(5);

                        c0 = touchcount > 750;

                        if (c0 != c) {
                                msg[0] = 0x1;
                                msg[1] = 3;
                                msg[2] = c0;
                                acc.write(msg, 3);
                                c = c0;
                        }

                        break;
                }
        } else {
                // reset outputs to default values on disconnect
                analogWrite(LED1_RED, 255);
                analogWrite(LED1_GREEN, 255);
                analogWrite(LED1_BLUE, 255);
                analogWrite(LED2_RED, 255);
                analogWrite(LED2_GREEN, 255);
                analogWrite(LED2_BLUE, 255);
                analogWrite(LED3_RED, 255);
                analogWrite(LED3_GREEN, 255);
                analogWrite(LED3_BLUE, 255);
                servos[0].write(90);
                servos[0].write(90);
                servos[0].write(90);
                digitalWrite(RELAY1, LOW);
                digitalWrite(RELAY2, LOW);
        }

        delay(10);
}

// ==============================================================================
// Austria Microsystems i2c Joystick
void init_joystick(int threshold)
{
        byte status = 0;

        pinMode(JOY_SWITCH, INPUT);
        digitalWrite(JOY_SWITCH, HIGH);

        pinMode(JOY_nINT, INPUT);
        digitalWrite(JOY_nINT, HIGH);

        pinMode(JOY_nRESET, OUTPUT);

        digitalWrite(JOY_nRESET, 1);
        delay(1);
        digitalWrite(JOY_nRESET, 0);
        delay(1);
        digitalWrite(JOY_nRESET, 1);

        Wire.begin();

        do {
                status = read_joy_reg(0x0f);
        } while ((status & 0xf0) != 0xf0);

        // invert magnet polarity setting, per datasheet
        write_joy_reg(0x2e, 0x86);

        calibrate_joystick(threshold);
}


int offset_X, offset_Y;

void calibrate_joystick(int dz)
{
        char iii;
        int x_cal = 0;
        int y_cal = 0;

        // Low Power Mode, 20ms auto wakeup
        // INTn output enabled
        // INTn active after each measurement
        // Normal (non-Reset) mode
        write_joy_reg(0x0f, 0x00);
        delay(1);

        // dummy read of Y_reg to reset interrupt
        read_joy_reg(0x11);

        for(iii = 0; iii != 16; iii++) {
                while(!joystick_interrupt()) {}

                x_cal += read_joy_reg(0x10);
                y_cal += read_joy_reg(0x11);
        }

        // divide by 16 to get average
        offset_X = -(x_cal>>4);
        offset_Y = -(y_cal>>4);

        write_joy_reg(0x12, dz - offset_X);  // Xp, LEFT threshold for INTn
        write_joy_reg(0x13, -dz - offset_X);  // Xn, RIGHT threshold for INTn
        write_joy_reg(0x14, dz - offset_Y);  // Yp, UP threshold for INTn
        write_joy_reg(0x15, -dz - offset_Y);  // Yn, DOWN threshold for INTn

        // dead zone threshold detect requested?
        if (dz)
                write_joy_reg(0x0f, 0x04);
}


void read_joystick(int *x, int *y)
{
        *x = read_joy_reg(0x10) + offset_X;
        *y = read_joy_reg(0x11) + offset_Y;  // reading Y clears the interrupt
}

char joystick_interrupt()
{
        return digitalRead(JOY_nINT) == 0;
}


#define  JOY_I2C_ADDR    0x40

char read_joy_reg(char reg_addr)
{
        char c;

        Wire.beginTransmission(JOY_I2C_ADDR);
        Wire.write(reg_addr);
        Wire.endTransmission();

        Wire.requestFrom(JOY_I2C_ADDR, 1);

        while(Wire.available())
                c = Wire.read();

        return c;
}

void write_joy_reg(char reg_addr, char val)
{
        Wire.beginTransmission(JOY_I2C_ADDR);
        Wire.write(reg_addr);
        Wire.write(val);
        Wire.endTransmission();
}
 楼主| 发表于 2013-11-11 20:06 | 显示全部楼层
这是所有的库文件,欢迎有经验的大牛给小弟解答,不胜感激。或者有感兴趣的童鞋,可以和我一起讨论讨论,谢谢!

libraries.rar

480.09 KB, 下载次数: 81

发表于 2013-11-11 21:31 | 显示全部楼层
直接使用SoftwareSerial就行,不用那个newxxx的库
 楼主| 发表于 2013-11-12 17:37 | 显示全部楼层
谢谢啊   我今天试试
 楼主| 发表于 2013-11-12 20:37 | 显示全部楼层
哪位大神赶紧来教教我  怎么把安卓设备与arduino  usb环境搭建起来


跪谢了


 楼主| 发表于 2013-11-12 20:37 | 显示全部楼层
连基本demo都编译不了
发表于 2013-11-13 00:12 | 显示全部楼层
確定Android有抓到開發板嗎??

印象中許多Android設備並不支持外接USB-Serial介面....
或許先確認一下這一點吧
 楼主| 发表于 2013-11-13 15:44 | 显示全部楼层
In file included from FingerprintAccessory.ino:4:
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:37: error: 'EP_RECORD' does not name a type
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:50: error: 'EP_RECORD' has not been declared
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:50: error: 'EP_RECORD' has not been declared
D:\adruino\libraries\AndroidAccessory/AndroidAccessory.h:64: error: 'USB_NAK_LIMIT' was not declared in this scope


谁来拯救我啊,快放弃了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-4 03:56 , Processed in 0.085097 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表