Hallo
Ich habe vor einiger Zeit das Senden von Zahlenwerten über I2C erfolgreich machen können. Nun habe ich von meinem ursprünglich funktionierenden Sketch der per Serial sendet, zu I2C wechseln wollen, da ich den Datenaustausch zwischen den Arduinos per I2C erledigen kann und somit die serielle UART Schnittstelle für anderes frei halten kann.
Nun hier den seriellen Sende- und Empfangsteil der funktioniert hat:
Empfangs- Sende Arduino seriell:
while(Serial.available() > 0){
var = Serial.read();
switch(var){
case 'A' : DP1 = Serial.parseInt();
break;
case 'B' : DP2 = Serial.parseInt();
break;
case 'C' : DP3 = Serial.parseInt();
break;
case 'D' : DP4 = Serial.parseInt();
break;
case 'E' : DP5 = Serial.parseInt();
break;
case 'F' : DP6 = Serial.parseInt();
break;
case 'G' : Serial2.print('G');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'H' : Serial2.print('H');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'I' : Serial2.print('I');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'J' : Serial2.print('J');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'K' : Serial2.print('K');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'L' : Serial2.print('L');
Serial2.println(Serial.parseInt());
Serial2.flush();
break;
case 'M' : HTLR = Serial.parseInt();
break;
Und hier der Testsketch per I2C der funktioniert hat.
Sende Arduino I2C:
#include <Wire.h>
int x = 0;
int y = 20;
int z = 300;
void setup() {
// Start the I2C Bus as Master
Wire.begin();
Wire.setClock(33000L);
}
void loop() {
x = x + 1;
Wire.beginTransmission(9); // transmit to device #9
Wire.write('G'); //sends character G to I2C
Wire.write((uint8_t*)&x, sizeof x); // sends x
Wire.flush();
delay(3);
Wire.write('H'); //sends character H to I2C
Wire.write((uint8_t*)&y, sizeof y); // sends y
Wire.flush();
delay(3);
Wire.write('I'); //sends character I to I2C
Wire.write((uint8_t*)&z, sizeof z); // sends z
Wire.flush();
Wire.endTransmission(); // stop transmitting
}
Empfangs Arduino I2C:
#include <Wire.h>
const unsigned long Baudrate = 38400; //starts serial port for the Bluetooth module with a baudrate by 38200 b/s
char var = 0;
int DP1 = 0;
int DP2 = 0;
int DP3 = 0;
void setup() {
// Start the I2C Bus as Slave on address 9
Wire.begin(9);
// Attach a function to trigger when something is received.
Wire.onReceive(receiveEvent);
Serial.begin(Baudrate);
}
void loop() {
Serial.print("DP1 = ");
Serial.println(DP1);
Serial.print("DP2 = ");
Serial.println(DP2);
Serial.print("DP3 = ");
Serial.println(DP3);
}
void receiveEvent(int bytes) {
while(Wire.available() > 0){
var = Wire.read(); // read one character from the I2C
switch(var){
case 'G' : DP1 = Wire.read(); //read the first part of DP1
DP1 |= Wire.read() << 8; //shift it 8 bits to the left and add the second part to DP1
break;
case 'H' : DP2 = Wire.read();
DP2 |= Wire.read() << 8;
break;
case 'I' : DP3 = Wire.read();
DP3 |= Wire.read() << 8;
break;
}
}
}
Wenn ich nun den seriellen Sketch mit dem erfolgreich getesteten I2C Sketch kombiniere, sendet er nicht alle Werte:
Sende Arduino I2C:
while(Serial1.available() > 0){
var = Serial1.read();
switch(var){
case 'A' : DP1 = Serial1.parseInt();
break;
case 'B' : DP2 = Serial1.parseInt();
break;
case 'C' : DP3 = Serial1.parseInt();
break;
case 'D' : DP4 = Serial1.parseInt();
break;
case 'E' : DP5 = Serial1.parseInt();
break;
case 'F' : DP6 = Serial1.parseInt();
break;
case 'G' : DP7 = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('G');
Wire.write((uint8_t*)&DP7, sizeof DP7);
Wire.flush();
Wire.endTransmission();
break;
case 'H' : DP8 = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('H');
Wire.write((uint8_t*)&DP8, sizeof DP8);
Wire.flush();
Wire.endTransmission();
break;
case 'I' : DP9 = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('I');
Wire.write((uint8_t*)&DP9, sizeof DP9);
Wire.flush();
Wire.endTransmission();
break;
case 'J' : DP10 = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('J');
Wire.write((uint8_t*)&DP10, sizeof DP10);
Wire.flush();
Wire.endTransmission();
break;
case 'K' : HFLR = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('K');
Wire.write((uint8_t*)&HFLR, sizeof HFLR);
Wire.flush();
Wire.endTransmission();
break;
case 'L' : HFUD = Serial1.parseInt();
Wire.beginTransmission(2);
Wire.write('L');
Wire.write((uint8_t*)&HFUD, sizeof HFUD);
Wire.flush();
Wire.endTransmission();
break;
case 'M' : HTLR = Serial1.parseInt();
break;
Empfangs Arduino I2C:
void receiveEvent(int bytes) {
while(Wire.available() > 0){
var = Wire.read();
switch(var){
case 'G' : DP7 = Wire.read();
DP7 |= Wire.read() << 8;
break;
case 'H' : DP8 = Wire.read();
DP8 |= Wire.read() << 8;
break;
case 'I' : DP9 = Wire.read();
DP9 |= Wire.read() << 8;
break;
case 'J' : DP10 = Wire.read();
DP10 |= Wire.read() << 8;
break;
case 'K' : HFLR = Wire.read();
HFLR |= Wire.read() << 8;
break;
case 'L' : HFUD = Wire.read();
HFUD |= Wire.read() << 8;
break;
Bei mehreren Werten die zum gleichen Arduino gehen, sende ich dann alle hintereinander wie im Testsketch I2C versucht:
Wire.beginTransmission(2);
Wire.write('t');
Wire.write((uint8_t*)&BUT16, sizeof BUT16);
Wire.flush();
delay(3);
Wire.write('G');
Wire.write((uint8_t*)&DPangleMAX, sizeof DPangleMAX);
Wire.flush();
delay(3);
Wire.write('H');
Wire.write((uint8_t*)&DPangleMAX, sizeof DPangleMAX);
Wire.flush();
delay(3);
Wire.write('I');
Wire.write((uint8_t*)&DPangleMAX, sizeof DPangleMAX);
Wire.flush();
delay(3);
Wire.write('J');
Wire.write((uint8_t*)&DPangleMAX, sizeof DPangleMAX);
Wire.flush();
Wire.endTransmission();
Nun scheint es per I2C nicht so zu funktionieren wie beim Testsketch I2C und sendet/empfängt nicht alles. Es werden auch nicht immer die gleichen Buchstaben/Zahlen gesendet, da dies Joysticks sind die Werte ausgeben. Kann mir hier jemand helfen, wie ich die Daten wie bei Serial korrekt senden kann, sodass es auch per I2C funktioniert?
Zur Info noch: Am Serial1 Port vom Mega hängt ein Xbee welches die Joystick Werte empfängt. Ein Teil der Daten wird vom Mega weiterverarbeitet, andere werden dann zum nächsten Arduino gesendet.
Grüsse
Stef