Why doesn't the demokit program for the ADK compile in Arduino?
Asked Answered
F

7

9

I have a pretty good understanding of Arduino and Java, and I decided to take a stab at trying to control my Arduino ATMega with my Samsung Galaxy 10.1 tab. I have installed API 12 with SDK manager, the ADT plugin for Eclipse, and now I am following the instructions from Installing the Arduino software and necessary libraries (at Android Open Accessory Development Kit) to install the firmware for the ADK board. When I hit compile it gives me two errors:

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

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

and says

'AndroidAccessory' does not name a type.

The code looks like this:

#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];

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

By the way, I even tried to copy the ADK_relsease_0512 folder in my arduino directory at that still didn't work. Thanks in advance!

Fabiolafabiolas answered 21/12, 2011 at 16:19 Comment(0)
U
9

Now I reached sucess with Arduino 1.0 , and I want to share the solution:

  1. I used the CapSense04.zip library:
  2. I changed the type from void to size_t in following files from arduino_bundle_ADK.zip:

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

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

I also changed send to write and receive to read, in the demokit.pde (you will find it in adk_release_0512.zip)

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

Underpainting answered 27/12, 2011 at 20:8 Comment(1)
There's no line 280 in AndroidAccessory.cpp file now in 2016Check
L
2

Perhaps try using an earlier version of Arduino (i.e. not arduino 1.0) - a recent update has changed some class names as far as I can see.

I was experiencing the errors detailed here and so this fixed it for me: http://www.jjoe64.com/2011/12/adk-arduino-wprogramh-not-found.html

Lizabethlizard answered 21/12, 2011 at 21:11 Comment(0)
R
1

There is no WProgram.h in Arduino 1.0 IDE. The include statement should be:

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

This will fix the header not found problem under Arduino 1.0.

Rhoda answered 5/3, 2012 at 3:59 Comment(0)
B
1

Later version of the code (arduino_bundle_ADK_02) doesn't need to be patched.

Disclaimer: I still can't make this zoo work with Nexus S beyond ADK app popping up (dreaded "Setup packet error: D" after a few seconds after initial connection), but I think the reason for that is elsewhere.

Brookins answered 3/4, 2012 at 7:3 Comment(1)
Another thing to note: on Nexus S, ADK works only starting with ICS 4.0.4 - it was dead on 4.0.3.Brookins
A
1

I've changed in the lines with errors "CapSense" to "CapacitiveSensor" considering that the class is now named (CapacitiveSensor) at CapSense library v.04 and the library is now called CapacitiveSensor as well then after pressing verify I had to change a property "touch_robot.capSense" to "touch_robot.capacitiveSensor"

Avens answered 3/3, 2013 at 20:57 Comment(0)
R
0

Just to share info, if you use arduino uno (Mega328), check this site. The firmware for the uno is here. Note it uses arduino IDE v0.22 and need to add libraries.

Happy microcontroller programming...

Best regards,
pak

Rutilant answered 28/2, 2012 at 14:2 Comment(0)
T
0

The ADK software was just recently updated to be compatible with Arduino 1.0.

Check the ADK page on developer.android.com: http://developer.android.com/guide/topics/usb/adk.html

New download link is: https://dl-ssl.google.com/android/adk/adk_release_20120606.zip

Topical answered 10/6, 2012 at 15:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.