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