Arduino überträgt Daten bei Anschluss über Netzteil nicht

Hallo,

Ich habe 2 Arduino über die SCA/SCL Ports mithilfe der Wire Bibliothek verbunden.

Bei Anschluss an über den USB Port an den PC läuft alles perfekt, schließe ich die Arduino jedoch über ein normales 5V Netzteil an, werden scheinbar keine Daten übertragen. Der Slave Arduino führt seinen Sketch auch scheinbar nicht aus, zumindest bewegen sich die Servos nicht. Kann mir absolut nicht erklären woran das liegt.

Eine Initialisierungsphase wurde schon eingebaut..

Code Master:

#include "Wire.h"
#include <Adafruit_TCS34725.h>
#include "LiquidCrystal.h"
#include <Adafruit_Fingerprint.h>

int licht = analogRead(A0);
int run;

// pin #2 ist INPUT des Sensor (GREEN wire)
// pin #3 ist OUPTOUT von Arduino (WHITE wire)


#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

/*Initialisieren des Displays
PIN 1 LCD an Minus
PIN 2 LCD an Plus
PIN 3 LCD an 10K Drehpoti
PIN 4 LCD an Digital Pin 9
PIN 5 LCD an Minus
PIN 6 LCD an Digital Pin 8
PIN 7 LCD an Leer
PIN 8 LCD an Leer
PIN 9 LCD an Leer
PIN 10 LCD an Leer
PIN 11 LCD an Digital Pin 7
PIN 12 LCD an Digital Pin 6
PIN 13 LCD an Digital Pin 5
PIN 14 LCD an Digital Pin 4
PIN 15 LCD an 10K Drehpoti
PIN 16 LCD an Minus
*/
LiquidCrystal Display(9,8,7,6,5,4);
 
// Color Sensor-Objekt initialisieren
// Parameter siehe: https://learn.adafruit.com/adafruit-color-sensors/program-it
// SCL( Kabel) an
// SDA(xxx Kabel) an
// VIN(Lila Kabel) an
// GND(Graues Kabel) an
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);

// Fingerabdrucksensor initialisieren
// Blaues Kabel an
// Gelbes Kabel an
// Grünes Kabel an
// xxx Kabel an
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()  
{
  delay(15000);
  Wire.begin(); //Beginn der Datenübertragung von Sender zu Empfänger
  Serial.begin(9600); 
  while (!Serial);  
  delay(100);
 Serial.println("M&Ms Sortiermaschine");
 Display.begin(16,2); //Beschreibung des Displays mit 2 Zeilen á 16 Zeichen
 Display.setCursor(1,0); //Display schreibt nun in erste Zeile
 Display.println("Sortiermaschine");
 

  finger.begin(57600); //Setzen der Daten Rate für den seriellen Port

   
 if (tcs.begin()) {  // Überprüfen, ob Color Sensor sich auch zurückmeldet
 Serial.println("Farbsensor gefunden!"); // Alles OK
 } else {
 // Kein Sensor gefunden. Programm an dieser Stelle einfrieren
 Serial.println("TCS34725 nicht gefunden ... Ablauf gestoppt!");
 while (1); // Halt!
 } 
  
  if (finger.verifyPassword()) {  //Überprüfen ob Fingerabdrucksensor sich zurückmeldet
    Serial.println("Fingerabdrucksensor gefunden!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  finger.getTemplateCount();
  Serial.print("Sensor enthält "); Serial.print(finger.templateCount); Serial.println(" Fingerabdrücke");
  Serial.println("Warten auf gültigen Finger . . .");

delay(15000);

}







void loop()                     // run over and over again
{
  getFingerprintIDez();
  
       if(run == 0)
     {
         run = 0;
         SEND(5);
     }
     else
     {
         run = 1;
     }
  

  if(run == 1)
  {
  Display.setCursor(0,1);
  // Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück
 uint16_t clearcol, red, green, blue;
 float average, r, g, b;
 delay(100); // Farbmessung dauert c. 50ms 
 tcs.getRawData(&red, &green, &blue, &clearcol);
 
 // Durchschnitt von RGB ermitteln
 average = (red+green+blue)/3;
 // Farbwerte durch Durchschnitt, 
 // alle Werte bewegen sich jetzt rund um 1 
 r = red/average;
 g = green/average;
 b = blue/average;

 // Clear-Wert und r,g,b seriell ausgeben zur Kontrolle
 Serial.print("\tClear:"); Serial.print(clearcol);
 Serial.print("\tRed:"); Serial.print(r);
 Serial.print("\tGreen:"); Serial.print(g);
 Serial.print("\tBlue:"); Serial.print(b);


 
 // Versuch der Farbfeststellung anhand der r,g,b-Werte.
 // Anpassen der Schwellwerte anhand der Kontrollausgabe auf der Konsole
 
 if ((r > 1.7) && (g < 0.7) && (b < 0.7)) {
 Serial.print("\tROT");
 SEND(1);
 Display.print("Rot");
 Display.print(".........");
 }
 
 else if ((r < 0.95) && (g > 1.4) && (b < 0.9)) {
 Serial.print("\tGRUEN");
 SEND(2);
 Display.print("Gruen");
 Display.print("........");
 }
 
 else if ((r < 0.8) && (g < 1.2) && (b > 1.2)) {
 Serial.print("\tBLAU");
SEND(3);
 Display.print("Blau");
 Display.print(".........");
 }
 
  else if ((r > 1.4) && (g < 1.1) && (b < 0.5)) {
 Serial.print("\tGELB");
SEND(6);
 Display.print("Gelb");
 Display.print(".........");
 }
 
  else if ((r > 1.4) && (g < 0.85) && (b < 0.85)) {
 Serial.print("\tBRAUN");
SEND(7);
 Display.print("Braun");
 Display.print(".........");
 }

 else {
 Serial.print("\tNICHT ERKANNT");
SEND(4);
 Display.print("Nicht erkannt"); 
 }




 // Zeilenwechsel ausgeben
 Serial.println("");

// Wartezeit anpassen für serielles Debugging
delay(100);

// Funktion um Programm zu beenden wenn die M&M's leer sind
 Serial.print("\tLichtstaerke:"); Serial.print(licht);
 if (licht > 1000)
 {
 Display.print("M&M's LEER");
  }


}
}




void SEND(byte nummer) //Funktion zur Datenübertragung auf anderen Arduino
{
  Wire.beginTransmission(4); //Daten werden an Arduino mit Nummer 4 senden
  Wire.write(nummer);  //Arduino überträgt die durch die obige Farberkennung ausgegebene Nummer
  Wire.endTransmission(); //Datenübertragung wird beendet
  }


 
int getFingerprintIDez() {  //Funktion zum Überprüfen des Fingerabdrucks
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;
  
  // Passender Finger gefunden!
  Serial.print("ID #"); Serial.print(finger.fingerID); 
  Serial.print(" mit Genauigkeit von "); Serial.println(finger.confidence); Serial.print(" gefunden. ");
  run = 1;  //Ändern der run-Variable bei erfolgreichem Fingerscan
  return finger.fingerID; 
}

Hast Du evtl. die GND-Verbindung zwischen beiden vergessen?

Gruß Tommy

Da die Zeichen erreicht waren, hier noch der Code des Slave

#include <Wire.h>
#include <Servo.h>



const int redPos = 150;
const int greenPos = 90;
const int bluePos = 30;
const int gutteil = 10;
const int schlechtteil = 180;
const int nonePos = 0; // Kein Objekt erkannt
const int greenLEDPin = 9;
const int blueLEDPin = 10;
const int redLEDPin = 11;
const int greenLEDopen = 4;
const int redLEDclosed = 2;
byte nummer = 0;


int Daten = 0;
int redValue = 0;
int blueValue = 0;
int greenValue = 0;


//Servo initialisieren
Servo einsortierer;
Servo aussortierer;



void setup() {

  delay(15000);
  // put your setup code here, to run once:
Wire.onReceive(receiveEvent);
Wire.begin(4);
 Serial.begin(9600);
 
pinMode(redLEDclosed, OUTPUT);
pinMode(greenLEDopen, OUTPUT);
 pinMode(greenLEDPin, OUTPUT);
 pinMode(redLEDPin, OUTPUT);
 pinMode(blueLEDPin, OUTPUT);
 
 // Der Servo zum Aussortieren hängt am PWM-Pin XX
 // Der Servo zum Einsortieren der Gutteile hängt an PWN-Pin XX 
 einsortierer.attach(5);
 aussortierer.attach(6);
 // Servo in Grundstellung fahren
 einsortierer.write(0);
 aussortierer.write(0);
 delay(15000); //Initialisierungsphase

 
 }

void loop() {}
 
  

void receiveEvent(int howMany){

nummer = Wire.read();

Serial.print(nummer);

 
 // Versuch der Farbfeststellung anhand der r,g,b-Werte.
 // Am besten mit Rot, Grün, Blau anfangen die die Schwellenwerte
 // mit der seriellen Ausgabe entsprechend anpassen
 if (nummer == 1)
 {
 Serial.print("\tROT");
 redValue = 255;
 blueValue = 0;
 greenValue = 0;
 digitalWrite(redLEDPin, redValue);
 digitalWrite(blueLEDPin, blueValue);
 digitalWrite(greenLEDPin, greenValue);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
 einsortierer.write(redPos);
 aussortierer.write(gutteil);
 //Display.print("Rot/Gutteil");
 //Display.print("........");
 }
 else if (nummer == 2)
 {
 Serial.print("\tGRUEN");
  redValue = 0;
 blueValue = 0;
 greenValue = 255;
 digitalWrite(redLEDPin, redValue);
 digitalWrite(blueLEDPin, blueValue);
 digitalWrite(greenLEDPin, greenValue);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
 einsortierer.write(greenPos);
 aussortierer.write(gutteil);
 //Display.print("Grün/Gutteil");
 //Display.print(".......");
 }
 else if (nummer == 3)
 {
 Serial.print("\tBLAU");
  redValue = 0;
 blueValue = 255;
 greenValue = 0;
 digitalWrite(redLEDPin, redValue);
 digitalWrite(blueLEDPin, blueValue);
 digitalWrite(greenLEDPin, greenValue);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
einsortierer.write(bluePos);
aussortierer.write(gutteil);
//Display.print("Blau/Gutteil");
//Display.print("........");
 }

 else if (nummer == 6)
 {
 Serial.print("\tGELB");
  redValue = 0;
 blueValue = 255;
 greenValue = 0;
 digitalWrite(redLEDPin, redValue);
 digitalWrite(blueLEDPin, blueValue);
 digitalWrite(greenLEDPin, greenValue);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
aussortierer.write(schlechtteil);
//Display.print("Blau/Gutteil");
//Display.print("........");
 }
  else if (nummer == 7)
 {
 Serial.print("\tBRAUN");
  redValue = 0;
 blueValue = 255;
 greenValue = 0;
 digitalWrite(redLEDPin, redValue);
 digitalWrite(blueLEDPin, blueValue);
 digitalWrite(greenLEDPin, greenValue);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
aussortierer.write(schlechtteil);
//Display.print("Blau/Gutteil");
//Display.print("........");
 }

 // Wenn keine Regel greift, dann ehrlich sein
 else if (nummer == 4) {
 Serial.print("\tNICHT ERKANNT");
 analogWrite(redLEDPin, 0);
 analogWrite(blueLEDPin, 0);
 analogWrite(greenLEDPin, 0);
 digitalWrite(redLEDclosed, LOW);
 digitalWrite(greenLEDopen, HIGH);
 //Display.print("Nicht erkannt"); 
 aussortierer.write(95);
 }

 else if (nummer ==5)
 {
  digitalWrite(greenLEDopen, LOW);
  digitalWrite(redLEDclosed, HIGH);
  }

 
 delay(50);

 
 // Zeilenwechsel ausgeben
 Serial.println("");

 


}

Tommy56:
Hast Du evtl. die GND-Verbindung zwischen beiden vergessen?

Gruß Tommy

Jup..

Das war etwas doof.
Aber danke für die schnelle Hilfe!!

Grüße

Den vermutlichen Grund hat dir Tommy schon genannt.
Allerding verstehe ich deine "Initialisierungsphase nicht.

Was glaubst du denn, was in den 15 Sek. delay alles passiert ?

Ich sags dir: nichts, außer dass der Controller wartet, bis die Zeit um ist.

HotSystems:
Den vermutlichen Grund hat dir Tommy schon genannt.
Allerding verstehe ich deine "Initialisierungsphase nicht.

Was glaubst du denn, was in den 15 Sek. delay alles passiert ?

Ich sags dir: nichts, außer dass der Controller wartet, bis die Zeit um ist.

Habe ich in einem anderen Forumsbeitrag gelesen, hatte schon einige Versuche das Problem zu lösen, was aber leider nicht zum Erfolg geführt hat.

hrtmn:
Habe ich in einem anderen Forumsbeitrag gelesen, hatte schon einige Versuche das Problem zu lösen, was aber leider nicht zum Erfolg geführt hat.

Ok, also dann weg damit und so wenig wie möglich delays einsetzen.
Bzw. nur da, wo es unbedingt notwendig ist, kurze delays verwenden.