Arduino Mega via USB an Raspberry + php Script -> kleines Problem

hi,

ich habe einen Mega, auf dem unter anderem diverse Sensoren Daten liefern, welche auf dem Raspberry in eine Datenbank geschrieben werden sollen.

Die Daten werden vom Raspberry via usb 'angefordert'.
Zusätzlich sollen auf gleiche weise auch Parameter am Arduino geändert werden können.

Der Arduino teil funktioniert soweit und auch das php script auf dem Raspberry läuft.

ich habe das ganze vorerst ohne datenbank laufen und gebe die Daten in der Konsole aus.

nun zu meiner frage:
die LogDaten sind in etwa so aufgebaut, dass ein telegram so ausschaut

KVL=0;KRL=0;KT=0;KMP=59;HKVL=0;HKRL=0;HKVS=52;HKMP=59;HKVL=0;AP1O=0;AP2O=0;AP3O=0;AP1M=0;AP2M=0;AP3M=0;AP1U=0;AP2U=0;AP3U=0;HKF=1;HKADD=0;HKSUB=0;HKNA=0;HKAN=0;HKVR=52;HKP=30;HKS=85;HKAZ=3;HKHY=2;KPAN=0;KRAUF=68;KRZU=63;KMAX=85;KHY=1;KPTEIN=70;KTPAUS=65;KMPZ=10;KMAZ=3;KMMA=140#

in php wird noch das datum davor geschrieben, so dass es so

2015-01-20 19:03:07:KVL=0;KRL=0;KT=0;KMP=47;HKVL=0;HKRL=0;HKVS=52;HKMP=47;HKVL=0;AP1O=0;AP2O=0;AP3O=0;AP1M=0;AP2M=0;AP3M=0;AP1U=0;AP2U=0;AP3U=0;HKF=1;HKADD=0;HKSUB=0;HKNA=0;HKAN=0;HKVR=52;HKP=30;HKS=85;HKAZ=3;HKHY=2;KPAN=0;KRAUF=68;KRZU=63;KMAX=85;KHY=1;KPTEIN=70;KTPAUS=65;KMPZ=10;KMAZ=3;KMMA=140#

ausschaut.

das '#' ist das abschluss zeichen, welches der arduino sendet.

Das Script läuft jetzt und nach einiger Zeit passiert dann folgendes:

2015-01-20 19:04:55:KVL=0;KRL=0;KT=0;KMP=69;HKVL=0;HKRL=0;HKVS=52;HKMP=69;HKVL=0;AP1O=0;AP2O=0;AP3O=0;AP1M=0;AP2M=0;AP3M=0;AP1U=0;AP2U=0;AP3U=0;HKF=1;HKADD=0;HKSUB=0;HKNA=0;HKAN=0;HKVR=52;HKP=30;HKS=85;HKAZ=3;HKHY=2;KPAN=0;KRAUF=68;KRZU=63;KMAX=85;KHY=1;KPTEIN=70;KTPAUS=65;KMPZ=10;KMAZ=3;KMMA=140#KVL=0;KRL=0;KT=0;KMP=58;HKVL=0;HKRL=0;HKVS=52;HKMP=58;HKVL=0;AP1O=0;AP2O=0;AP3O=
2015-01-20 19:05:01:0;AP1M=0;AP2M=0;AP3M=0;AP1U=0;AP2U=0;AP3U=0;HKF=1;HKADD=0;HKSUB=0;HKNA=0;HKAN=0;HKVR=52;HKP=30;HKS=85;HKAZ=3;HKHY=2;KPAN=0;KRAUF=68;KRZU=63;KMAX=85;KHY=1;KPTEIN=70;KTPAUS=65;KMPZ=10;KMAZ=3;KMMA=140#

hier ein teil der php datei

while(true){

 $read = $serial -> readPort();
if($read != ""){
 echo date("Y-m-d H:i:s"). ":". $read ."\n"; 
 flush();
}

sleep(6);
 $serial -> sendMessage('log#'); // befehl an Arduino das Log zu senden

hat jemand einen hinweis oder eine idee, woran das liegt, dass das telegramm nicht korrekt ausgegeben wird?

Wie sieht der Arduino Sketch aus? Vorallem wichtig ist die Baudrate, wo ich denke die ist suboptimal gewählt worden.

der arduino sketch besteht aus einer reihe serial.print das ist nicht das problem.

warum sollte die baudrate verändert werden?
kann ich aber gwrne testen, wenn du mir sagst, was weniger suboptimal ist.

Der Arduino Mega wie auch alle neueren Arduinos haben nur noch einen Quarz verbaut für den Atmega16U2, welche für die USB Programmierung zur Verfügung steht. Der eigentliche Atmega2560/328 haben keine Quarze mehr verbaut sondern nur noch Resonatoren. Diese haben eine höhere Ungenauigkeit.

Das Problem ist, auf den originalen Arduinos wie auch auf fast jedem Klon werden Keramikresonatoren verbaut. Die haben nur eine Genauigkeit von ~1%. Quarze hingegen ~0,0001%.

Diese Fehlerquelle kann sich gerade auf den UART auswirken, wenn hier die falsche Baudrate gewählt wird. Bei Abweichung um die 2% kann es schon zu Aussetzern kommen, wie bei dir vermutlich.

Für deinen Atmega2560 solltest du folgende Baudraten einmal durchtesten.

Fehlerrate 0,2%
4800
9600
19200
38400
76800

Alternativ währen auch noch
Fehlerrate 0,6%
14400
Fehlerrate 0,8%
28800
möglich, aber eher seltener genutzt.

Viele versuchen - meist auch Anfänger - die Baudraten möglichst hochzusetzen. Der 16MHz Quarz ist dafür aber nicht optimal. "Gerade" Baudraten mit 250k sind da doch einfacher, möglich.

Anbei noch ein bisschen Lektüre, falls es dich interessiert
Quarze_und_AVR
AVR-Tutorial

Bißchen mehr Sketch wäre schon nett.
Haßt Du einen Variablen-typen-Überlauf?
Passiert das auch wenn, Du die Werte einzeln mit Pausen dazwischen schickst?
Grüße Uwe

interessantes thema, war mir dessen nicht bewusst.

habe den arduino noch mal an den windows rechner angeschlossen.
im seriellen monitor werden die daten korrekt empfangen.

habe das ganze dann auf dem raspberry via cu getestet und auch dort werden die daten korrekt angezeigt.

bautrate unveränderte 9600.

mit dem php script dagegen nicht.
denke der fehler liegt irgendwo im php bereich.

mal sehen, werde das script ggf. mit anderer sprache erneut schreiben, bzw. die daten auf gültigkeit prüfen (muss ich ohne hin) und ggf. neu vom arduino anfordern.

@uwe
ich kann gerne teile davon hier posten, allerdings geht das erst später, ich schreibe gerade vom handy aus.
der sketch sendet die daten in einem rutsch, nachdem ein 'log#' empfangen wurde.
davor und danach werden daten gesammelt und entsprechend diverser parameter funktionen abgearbeitet.

bei dem ganzen handelt es sich um ein heizungssteuerung, welche bisher 3 jahre zuverlässig funktioniert.
gesteuert wird der mischermotor der rücklaufanhebung und der mischermotor des heizkreises. witterungsgeführt, mit heizkurve und zeitschaltuhr.
um parameter besser anpassen zu können und den anlagenstatus bequemer abzurufen, soll jetzt via raspberry das ganze erweitert werden.

der mega hängt sich übrigens nicht auf, denn bei einem neustart soll er eine prameterliste anfordern.

uwefed:
Haßt Du einen Variablen-typen-Überlauf?

Wer hasst sowas nicht ? :wink: Sorry :wink:

michael_x:
Wer hasst sowas nicht ? :wink: Sorry :wink:

Ok, Du haßt mich erwischt :wink: :wink: :wink: Mein Fehler.

Grüße Uwe