2011-12-21 21 views
9

Ho una buona conoscenza di Arduino e Java e ho deciso di provare a controllare il mio Arduino ATMega con la mia scheda Samsung Galaxy 10.1. Ho installato l'API 12 con il gestore SDK, il plugin ADT per Eclipse e ora sto seguendo le istruzioni da Installing the Arduino software and necessary libraries (al Kit di sviluppo accessorio Open Android) per installare il firmware per la scheda ADK. Quando mi ha colpito compilarlo mi da due errori:Perché il programma di demokit per ADK non viene compilato in Arduino?

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

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

e dice

'AndroidAccessory' does not name a type.

Il codice è simile al seguente:

#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(); 
} 

A proposito, ho anche provato a copiare l'ADK_relsease_0512 la cartella nella mia directory arduino non funzionava ancora. Grazie in anticipo!

risposta

9

Ora ho raggiunto successo con Arduino 1.0, e voglio condividere la soluzione:

  1. ho usato il CapSense04.zip biblioteca:
  2. ho cambiato il tipo da vuoto a size_t in seguenti file dalla arduino_bundle_ADK.zip:

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

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

Ho cambiato anche invia a write e ricevono a leggono, nel demokit.pde (lo troverete in adk_release_0512.zip)

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

+0

Non c'è la riga 280 nel file AndroidAccessory.cpp ora nel 2016 – Ajji

0

solo per condividere informazioni, se si utilizza Uno Arduino (Mega328), controllare this site. Il firmware per lo uno è here. Nota usa arduino IDE v0.22 e ha bisogno di aggiungere librerie.

Programmazione microcontrollore felice ...

Con i migliori saluti,
pak

1

Non c'è WProgram.h in Arduino 1.0 IDE. La dichiarazione include dovrebbe essere:

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

Questo risolverà il problema dell'intestazione non trovato in Arduino 1.0.

1

La versione successiva del codice (arduino_bundle_ADK_02) non deve essere riparata.

di responsabilità: non riesco ancora a fare questo lavoro zoo con Nexus S al di là ADK app popping up (temuta "errore di pacchetto di installazione: D" dopo pochi secondi dopo la connessione iniziale), ma penso che la ragione di ciò è altrove .

+0

Un'altra cosa da notare: su Nexus S, ADK funziona solo a partire da ICS 4.0.4 - era spento 4.0.3. –

1

ho cambiato nelle linee con errori "CapSense" a "CapacitiveSensor" considerando che la classe è ora denominata (CapacitiveSensor) nella libreria CapSense v.04 e la libreria è ora denominata CapacitiveSensor e quindi dopo aver premuto verify ho dovuto modificare una proprietà "touch_robot.capSense" in "touch_robot.capacitiveSensor"

Problemi correlati