Hi, I received my cores a couple of days ago and started tinkering around with it.
Now I wanted to port some of my Arduino Uno Apps to SparkCore. This App uses 2 Sensors via I2C protocol (Wire) which should be supported by the Cores. After flashing the Code to a core it freezes with a call of the Wire library, like endTransmission() or requestFrom(). The same code runs on the Arduino perfectly fine. So I’m sure my circuit is correct and the adresses and stuff for wire also. What else can go wrong?
P.S. The freezes can be interrupted by reset, but flashing the core is impossible via wifi, so I have to do a factory reset everytime.
P.P.S The Wire library also freezes when nothing is connected to Core
void setup() {
Serial.begin(9600);
Wire.begin();
delay(10000); //10sec delay to be able to connect serial
pinMode(7, OUTPUT);
digitalWrite(7, HIGH); // just light the blue led to indicate loop is starting
Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>"); // just to be sure things are working
}
void loop() {
byte address = 0x27; //adress of HIH-6130
Serial.println("Begin");
Wire.beginTransmission(address);
Serial.println("Ending");
Wire.endTransmission();
Serial.println("End");
delay(1000);
}
The serial output is:
>>>>>>>>>>>>>>>>>>>>>>>>
Begin
Ending
Then the core froze. No circuit was connected to the core.
@Taron I’m able to replicate this bug on my side as well. @satishgn and I are looking into it right now. Will post as soon as we are able to resolve this. Thanks!
This explains all the problems I’ve been having. I was blaming my code flashing issues on the cloud, but it looks like this must have been the cause. I’m currently working on interfacing a wii nunchuck to the core and it uses wire extensively. Factory resetting is the only way I can re-flash.
/********************************************************************************
* Code for read data from Wii nunchuck., base on http://www.windmeadow.com/node/42 * File : ArduinoNunchuk.pde
* by : K.Worapoht
* Hardware: Arduino, POP-168 , AVR ATMega168 , * connect SDA to PC4 (An4) and SCL PC5 (An5)
* from: http://www.robotshop.com/media/files/PDF/inex-zx-nunchuck-datasheet.pdf
*******************************************************************************/
//#include <Wire.h>
//#define nunchuck_ID 0xA4 >> 1
#define nunchuck_ID 0x52//0xA4 //0x52
unsigned char buffer[6];// array to store arduino output
int cnt = 0;
void nunchuck_init() {
Wire.beginTransmission(nunchuck_ID);// transmit to device 0x52
Wire.write(0x40); // sends memory address
Wire.write(0x00); // sends sent a zero.
Wire.endTransmission(); // stop transmitting
}
void send_zero() {
Wire.beginTransmission(nunchuck_ID);// transmit to device 0x52
Wire.write(0x00); // sends one byte
Wire.endTransmission(); // stop transmitting
}
// Print the input data we have recieved // accel data is 10 bits long
// so we read 8 bits, then we have to add // on the last 2 bits.
void print() {
unsigned char joy_x_axis;
unsigned char joy_y_axis;
int accel_x_axis;
int accel_y_axis;
int accel_z_axis;
unsigned char z_button;
unsigned char c_button;
joy_x_axis = buffer[0];
joy_y_axis = buffer[1];
accel_x_axis = (buffer[2]) << 2;
accel_y_axis = (buffer[3]) << 2;
accel_z_axis = (buffer[4]) << 2;
// byte outbuf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((buffer[5] & 0x01)!=0) {
z_button = 1;
} else {
z_button = 0;
}
if ((buffer[5] & 0x02)!=0){
c_button = 1;
} else{
c_button = 0;
}
accel_x_axis += ((buffer[5]) >> 2) & 0x03;
accel_y_axis += ((buffer[5]) >> 4) & 0x03;
accel_z_axis += ((buffer[5]) >> 6) & 0x03;
Serial.print(joy_x_axis, DEC);
Serial.print("\t");
Serial.print(joy_y_axis, DEC);
Serial.print("\t");
Serial.print(accel_x_axis, DEC);
Serial.print("\t");
Serial.print(accel_y_axis, DEC);
Serial.print("\t");
Serial.print(accel_z_axis, DEC);
Serial.print("\t");
Serial.print(z_button, DEC);
Serial.print("\t");
Serial.print(c_button, DEC);
Serial.print("\r\n");
}
// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char nunchuk_decode_byte(char x) {
x = (x ^ 0x17) + 0x17;
return x;
}
void setup() {
Serial.begin(9600);
Wire.begin(); // join i2c bus with address 0x52
nunchuck_init(); // send the initilization handshake
delay(10000); //was 100
Serial.println("welcome to nunchucknorris");
}
void loop() {
Serial.print(".");
Wire.requestFrom(nunchuck_ID, 6);// request data from nunchuck
while (Wire.available()) {
buffer[cnt] = nunchuk_decode_byte(Wire.read()); // receive byte as an integer
cnt++;
}
// If we recieved the 6 bytes, then go print them
if (cnt >= 5) {
print();
}
cnt = 0;
send_zero(); // send the request for next bytes
delay(100);
}
It’s possible that the 10 second delay in your setup function is causing your core to time out with respect to the cloud. Right now the core checks its connection every 15 seconds, and it’s possible it thinks it went offline. We’re working on a fix for this bug, but it’s possible reducing the delay might help?
I was working on interfacing SparkCore via I2C to an LCD module. Was going nuts trying to get old code that had worked on other chips to fly with Spark. Finally found that I needed to shift the address left one bit when using the Write library in the cloud vs. other Arduino stuff.
This link says that address passed to Write.beginTransmission() is not to be shifted… but it must be to work with Spark: