Skip to main content

Why doesn"t the demokit program for the ADK compile in Arduino?


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!


Source: Tips4all
Source: Tips4allSource: CCNA FINAL EXAM

Comments

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


    I used the CapSense04.zip library:
    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);

    ReplyDelete
  2. 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.

    ReplyDelete
  3. 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

    ReplyDelete
  4. 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.

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex