I2c probleem tussen Arduino Due en Uno

Arduino specifieke Software
Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 05 Jul 2018, 21:27

ok, bedankt voor de info! 8-) 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 :oops:

Mijn eerste testdoelen zijn behaald. :D
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

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Koepel » 05 Jul 2018, 23:13

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 ?
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;
    }
  }
}

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 06 Jul 2018, 05:58

Zal ik doen

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 08 Jul 2018, 16:34

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.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Koepel » 08 Jul 2018, 17:00

Laat de sketch van beide in hun geheel zien.

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 08 Jul 2018, 18:43

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

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Koepel » 08 Jul 2018, 22:23

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):
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/.

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 15 Jul 2018, 10:48

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.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Koepel » 15 Jul 2018, 15:24

Kun je een foto maken van je project met alle draden ?

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: I2c probleem tussen Arduino Due en Uno

Berichtdoor Nightmystic » 16 Jul 2018, 18:00

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. :D

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.

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: etakaegemuhuw en 28 gasten