2011-12-21 52 views
9

我對Arduino和Java有很好的理解,於是我決定嘗試用我的Samsung Galaxy 10.1選項卡來控制我的Arduino ATMega。我已經安裝了帶SDK管理器的API 12,Eclipse的ADT插件,現在我遵循Installing the Arduino software and necessary libraries(在Android開放配件開發套件)的指示安裝ADK板卡的固件。當我打編譯它給了我兩個錯誤:爲什麼ADK的demokit程序在Arduino中編譯?

demokit:146: error: 'acc' was not declared in this scope

demokit:249: error: 'touch_robot' was not declared in this scope

,並說

'AndroidAccessory' does not name a type.

的代碼看起來是這樣的:

#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", 
        "0000000"); 
Servo servos[3]; 

// 10 Mohm 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.send(reg_addr); 
    Wire.endTransmission(); 

    Wire.requestFrom(JOY_I2C_ADDR, 1); 

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

    return c; 
} 

void write_joy_reg(char reg_addr, char val) 
{ 
    Wire.beginTransmission(JOY_I2C_ADDR); 
    Wire.send(reg_addr); 
    Wire.send(val); 
    Wire.endTransmission(); 
} 

順便說一句,我甚至試圖複製ADK_relsease_0512在我的arduino目錄中仍然沒有工作的文件夾。提前致謝!

回答

9

現在我達到了sucess與Arduino的1.0,我想分享的解決方案:

  1. 我用了CapSense04.zip庫:
  2. 我從空隙變型在以下文件爲size_t從arduino_bundle_ADK.zip

AndroidAccessory.cpp線280:size_t AndroidAccessory::write(uint8_t b)
AndroidAccessory.h線71:size_t write(uint8_t b);

Max_LCD.cpp線257:inline size_t Max_LCD::write(uint8_t value)
Max_LCD.h線101:virtual size_t write(uint8_t);

我也改變發送收到閱讀,在demokit.pde(你會發現它在adk_release_0512.zip)

Demokit.pde行377:Wire.write(reg_addr);
行383:c = Wire.read();
行391:Wire.write(reg_addr);
行392:Wire.write(val);

+0

2016年AndroidAccessory.cpp文件中沒有第280行 – Ajji 2016-02-18 03:15:01

0

只是爲了分享信息,如果你使用的Arduino UNO(Mega328),檢查this site。 uno的固件是here。注意它使用arduino IDE v0.22並需要添加庫。

快樂的單片機編程...

最好的問候,
小唐

1

有一個在Arduino的1.0 IDE沒有WProgram.h。包括聲明應該是:

#if ARDUINO >= 100 
#include "Arduino.h" 
#else 
#include "WProgram.h" 
#endif 

這將修復在Arduino 1.0下找不到頭的問題。

1

更高版本的代碼(arduino_bundle_ADK_02)不需要修補。

聲明:我仍然無法使這個動物園與超越ADK應用程序彈出的Nexus S一起工作(在初始連接後幾秒鐘內可怕的「安裝數據包錯誤:D」),但我認爲其原因在於其他地方。

+0

另一件需要注意的事情:在Nexus S上,ADK只能從ICS 4.0.4開始 - 它在4.0.3上已經死機。 – 2012-04-11 07:26:01

1

我在有錯誤 「的CapSense」 到 「CapacitiveSensor」 的臺詞改變 考慮該類現在在CapSense庫v.04 上命名(CapacitiveSensor),並且該庫現在稱爲CapacitiveSensor以及 ,然後在按下後確認我必須將屬性「touch_robot.capSense」更改爲「touch_robot.capacitiveSensor」