I2c probleem tussen Arduino Due en Uno
20 berichten
• Pagina 2 van 2 • 1, 2
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
ok, bedankt voor de info! Daar ga ik ook nog testen mee doen.
Ik weet al waarom dat "X is" niet door kwam. Het werd verzonden als characters, maar ontvangen als integer. Duh, silly me
Mijn eerste testdoelen zijn behaald.
De RGB Led aan de UNO wordt rood als ik via het keyboard als input 1 invoer middels de seriele monitor op de DUE.
En groen als ik 2 invoer.
Ik begrijp alleen niet waarom de Led bij het aangaan al meteen Groen wordt.
Also, Is dit wat je bedoelde met interrupt? Dat ie in de Setup de functie "Receive event" al aanslingerd?
Zender (DUE):
cpp code
Ontvanger (UNO):
cpp code
Ik weet al waarom dat "X is" niet door kwam. Het werd verzonden als characters, maar ontvangen als integer. Duh, silly me
Mijn eerste testdoelen zijn behaald.
De RGB Led aan de UNO wordt rood als ik via het keyboard als input 1 invoer middels de seriele monitor op de DUE.
En groen als ik 2 invoer.
Ik begrijp alleen niet waarom de Led bij het aangaan al meteen Groen wordt.
Also, Is dit wat je bedoelde met interrupt? Dat ie in de Setup de functie "Receive event" al aanslingerd?
Zender (DUE):
cpp code
#include <Wire.h>
String input = "";
boolean newData = false;
int x = 2;
int y = 1;
void setup()
{
Wire1.begin();
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > 0)
{
input = (char) Serial.read();
newData = true;
}
if (input == "1")
{
Wire1.beginTransmission(8); // transmit to device #8
Wire1.write(x); // sends one byte
Wire1.endTransmission(); // stop transmitting
delay(1);
if (newData == true)
{
Serial.print("Verzonden Character: ");
Serial.println("1");
newData = false;
}
}
else if (input == "2")
{
Wire1.beginTransmission(8);
Wire1.write(y);
Wire1.endTransmission();
delay(1);
if (newData == true)
{
Serial.print("Verzonden Character: ");
Serial.println("2");
newData = false;
}
}
}
Ontvanger (UNO):
cpp code
#include <Wire.h>
int rood = 13;
int groen = 12;
int blauw = 11;
int x;
void setup ()
{
Wire.begin (8);
Serial.begin(115200);
Wire.onReceive(receiveEvent); // register event
pinMode(rood, OUTPUT);
pinMode(groen, OUTPUT);
pinMode(blauw, OUTPUT);
digitalWrite(rood, LOW);
digitalWrite(groen, LOW);
}
void loop()
{
}
void receiveEvent(int howMany)
{
x = Wire.read(); // receive as an integer
// Serial.println(x); // print the integer
if (x == 2)
{
digitalWrite(rood, HIGH);
digitalWrite(groen, LOW);
}
if (x == 1)
{
digitalWrite(groen, HIGH);
digitalWrite(rood, LOW);
}
}
Advertisement
Re: I2c probleem tussen Arduino Due en Uno
Ik hoop dat je het nog even volhoudt, want het kan beter.
Een String object om een enkel teken in te bewaren, doe dat maar niet. Ook de logische opbouw met 'newData' ontgaat me.
Een delay(1) lijkt me niet nodig.
Let op: de Wire.endTransmission() is geen "stop transmitting".
Deze drie horen bij elkaar: Wire.beginTransmission() ---- Wire.write() --- Wire.endTransmission().
Wat ze doen hangt van de Wire library af. Meestal vult Wire.write() een buffer, en Wire.endTransmission() doet pas de hele I2C bus transfer.
Je gebruikt nu "Wire1" zie ik. Dat is een gelukkig een normale I2C bus.
Is dit misschien eenvoudiger ?
Jouw receiveEvent() wordt vanuit de Wire library vanuit een interrupt routine aangeroepen. Dus jouw receiveEvent() noem ik voor het gemak ook zelf een interrupt routine. Des korter die interrupt routine duurt, des te soepeler loopt de Arduino Uno.
Ik weet niet waarom de groene led aan gaat. Mogelijk zie ik iets over het hoofd, of misschien iets in de hardware. Soms zit ergens een (interne) pullup die een led een klein beetje laat oplichten.
Kun je een extra check toevoegen ? Kijk naar 'howMany' of je inderdaad 1 byte ontvangt.
Een String object om een enkel teken in te bewaren, doe dat maar niet. Ook de logische opbouw met 'newData' ontgaat me.
Een delay(1) lijkt me niet nodig.
Let op: de Wire.endTransmission() is geen "stop transmitting".
Deze drie horen bij elkaar: Wire.beginTransmission() ---- Wire.write() --- Wire.endTransmission().
Wat ze doen hangt van de Wire library af. Meestal vult Wire.write() een buffer, en Wire.endTransmission() doet pas de hele I2C bus transfer.
Je gebruikt nu "Wire1" zie ik. Dat is een gelukkig een normale I2C bus.
Is dit misschien eenvoudiger ?
- Code: Alles selecteren
if (Serial.available() > 0)
{
int inChar = Serial.read();
switch( inChar)
{
case '1': // ascii readable number 1
Wire1.beginTransmission(8); // select Slave device with I2C address 8
Wire1.write(1); // 1 is rood
Wire1.endTransmission();
break;
case '2': // ascii readable number 2
Wire1.beginTransmission(8); // select Slave device with I2C address 8
Wire1.write(2);
Wire1.endTransmission();
break;
}
}
Jouw receiveEvent() wordt vanuit de Wire library vanuit een interrupt routine aangeroepen. Dus jouw receiveEvent() noem ik voor het gemak ook zelf een interrupt routine. Des korter die interrupt routine duurt, des te soepeler loopt de Arduino Uno.
Ik weet niet waarom de groene led aan gaat. Mogelijk zie ik iets over het hoofd, of misschien iets in de hardware. Soms zit ergens een (interne) pullup die een led een klein beetje laat oplichten.
Kun je een extra check toevoegen ? Kijk naar 'howMany' of je inderdaad 1 byte ontvangt.
- Code: Alles selecteren
void receiveEvent(int howMany)
{
if( howMany == 1)
{
int data = Wire.read(); // receive a byte, put it into an integer
switch( data)
{
case 1: // binary number 1, 1 is rood
digitalWrite(rood, HIGH);
digitalWrite(groen, LOW);
break;
case 2: // binary number 2
digitalWrite(groen, HIGH);
digitalWrite(rood, LOW);
break;
}
}
}
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
Zal ik doen
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
Hallo Koepel,
Bedankt voor de info!
Het werkt. Echter ik moet vaak 2-4x de 1 of 2 opnieuw invoeren in de serial monitor voordat het doorkomt bij de UNO en de Led van kleur veranderd.
Heb je een idee waarom dit zo is en wat daar aan te doen is.
Bedankt voor de info!
Het werkt. Echter ik moet vaak 2-4x de 1 of 2 opnieuw invoeren in de serial monitor voordat het doorkomt bij de UNO en de Led van kleur veranderd.
Heb je een idee waarom dit zo is en wat daar aan te doen is.
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
Wat me opvalt is dat hij soms in 1x pakt en dat ik soms 2-4x een 1 of 2 in moet voeren, maar als ik 1111 invoer of 2222 pakt hij altijd.
cpp code
cpp code
cpp code
#include <Wire.h>
int x = 2;
int y = 1;
void setup()
{
Wire1.begin();
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > 0)
{
int inChar = Serial.read();
switch(inChar)
{
case '1': // ascii readable number 1
Wire1.beginTransmission(8); // select Slave device with I2C address 8
Wire1.write(1); // 1 is rood
Wire1.endTransmission();
break;
case '2': // ascii readable number 2
Wire1.beginTransmission(8); // select Slave device with I2C address 8
Wire1.write(2);
Wire1.endTransmission();
break;
}
}
}
cpp code
#include <Wire.h>
int rood = 13;
int groen = 12;
int blauw = 11;
int x;
void setup ()
{
Wire.begin (8);
Serial.begin(115200);
Wire.onReceive(receiveEvent); // register event
pinMode(rood, OUTPUT);
pinMode(groen, OUTPUT);
pinMode(blauw, OUTPUT);
digitalWrite(rood, LOW);
digitalWrite(groen, LOW);
}
void loop()
{
}
void receiveEvent(int howMany)
{
if(howMany == 1)
{
int data = Wire.read(); // receive a byte, put it into an integer
switch(data)
{
case 1: // binary number 1, 1 is rood
digitalWrite(rood, HIGH);
digitalWrite(groen, LOW);
break;
case 2: // binary number 2
digitalWrite(groen, HIGH);
digitalWrite(rood, LOW);
break;
}
}
}
Re: I2c probleem tussen Arduino Due en Uno
Raar, ik zie het niet.
Je kunt kijken of de Master contact maakt met de Slave door de error van Wire.endTransmission() te bekijken.
https://www.arduino.cc/en/Reference/WireEndTransmission.
Bijvoorbeeld zo (niet getest):
Naar mijn mening kan een beetje werkende I2C bus misschien één op de miljoen keer fout gaan. Dus als je "fout !" ziet, dan is er iets mis.
Als dat goed gaat, dan kan de Slave misschien gaan bijhouden of er inderdaad één byte binnen komt, en dat 1 of 2 is.
Heb je een logic analyzer ? Die dingen zijn reuze handig voor de I2C bus.
Een logic analyzer kan al voor tien euro.
Saleae heeft mooi spul, maar 349 tot 859 euro is extreem belachelijk: https://www.saleae.com/.
Je kunt kijken of de Master contact maakt met de Slave door de error van Wire.endTransmission() te bekijken.
https://www.arduino.cc/en/Reference/WireEndTransmission.
Bijvoorbeeld zo (niet getest):
- Code: Alles selecteren
void loop()
{
if (Serial.available() > 0)
{
int inChar = Serial.read();
byte nummer = inChar - '0'; // vertaal ascii '0', '1', '2' naar binair 0, 1, 2
Wire1.beginTransmission( 8); // select Slave device with I2C address 8
Wire1.write( nummer); // 1 is rood
byte error = Wire1.endTransmission();
Serial.print( "nummer ");
Serial.print( nummer);
Serial.print( " : ");
if( error == 0)
{
Serial.print( "success");
}
else
{
Serial.print( "fout !");
}
Serial.println();
}
}
Naar mijn mening kan een beetje werkende I2C bus misschien één op de miljoen keer fout gaan. Dus als je "fout !" ziet, dan is er iets mis.
Als dat goed gaat, dan kan de Slave misschien gaan bijhouden of er inderdaad één byte binnen komt, en dat 1 of 2 is.
Heb je een logic analyzer ? Die dingen zijn reuze handig voor de I2C bus.
Een logic analyzer kan al voor tien euro.
Saleae heeft mooi spul, maar 349 tot 859 euro is extreem belachelijk: https://www.saleae.com/.
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
Ik krijg idd de melding Fout!
Ik zal eens gaan kijken voor een logic analyser.
De komende weken kan ik even niets doen, maar daarna pak ik het weer op.
Ik zal eens gaan kijken voor een logic analyser.
De komende weken kan ik even niets doen, maar daarna pak ik het weer op.
- Nightmystic
- Berichten: 133
- Geregistreerd: 10 Jan 2016, 16:39
Re: I2c probleem tussen Arduino Due en Uno
Het probleem zat erin dat ik dacht dat het voldoende was om een ground van arduino naar adruino via de level shifter te laten gaan.
Nu ik een extra ground kabel heb van GND naar GND op beide arduinos werkt alles perfect.
Iemand raadde ergens op een website of forum de easytransfer library aan, maar die werkt niet voor een DUE arduino. Is gemaakt voor AVR en DUE is SAM.
Wel jammer want het ziet er erg goed uit, ondanks dat je alleen van master naar slave kunt sturen.
Nu ik een extra ground kabel heb van GND naar GND op beide arduinos werkt alles perfect.
Iemand raadde ergens op een website of forum de easytransfer library aan, maar die werkt niet voor een DUE arduino. Is gemaakt voor AVR en DUE is SAM.
Wel jammer want het ziet er erg goed uit, ondanks dat je alleen van master naar slave kunt sturen.
20 berichten
• Pagina 2 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten