Für die Datenübertragung nutze ich die SoftSerial Bibliothek.
Das funktioniert aber komischerweise nur sporadisch.
Nur jedes zehnte mal (ungefär) kann der Arduino eine serielle Verbindung zum Kompass aufbauen.
Ich habe schon überlegt, ob es an einem zu kleinen Cach-Speicher der SoftSerial Schnittstelle liegt, aber es werde ja nur ca. 13 bytes beim auslesen übertragen.
Hat jemand eine Idee was ich falsch mache, oder woran es liegen kann und was ich besser machen könnte
Gruß
Max
#include <SoftwareSerial.h>
//Pins für SoftSerial Verbindung
const int rxPin = 2;
const int txPin = 3;
//SoftSerial initialisieren
SoftwareSerial compass(rxPin, txPin);
//String in den die Daten vom Kompass eingelesen werden
String heading = "void_heading";
//Funktion die die Daten vom Kompass abruft
void readCompass(void)
{
compass.println("$sure ga"); // Daten anfordern
delay(10);
if (compass.available() !=0)
{
heading = "";
while(compass.available() > 0)
{
heading = String(heading + char(compass.read()));
}
}
}
void setup()
{
Serial.begin(9600);
Serial.println("Compass Serial Test");
compass.begin(9600);
}
void loop()
{
readCompass();
Serial.println(heading);
delay(100);
}
Auch ich würde sagen daß beide If -bedingungen gleichwertig sind.
9600 Baud heißt bei 10 Bit pro Byte (start, stop) eine Datenübertragung von 960 Byte pro Sekunde. Das heißt ca 1 Byte pro Sekunde. Bei 13 übertragenen Bytes sind 10 mS zu wenig, daß alle Daten in den Speicher eintreffen. Außerdem hab ich im Datenblatt keine Zeit gefunden die der Sensor nach der Anfrage für eine Messung und Berechnung ders Winkelwerts braucht.
delay(10); sind zu wenig.
im Datenblatt wird als Abschluß der Datenabfrage ein 0x0d und 0x0a gefordert. Ich weiß nicht ob println() mit 0x0d und 0x0a abschließt oder nur mit einem von beiden.
Notfalls einfach statt
compass.println("$sure ga");
compass.print("$sure ga");compass.print0x0d);compass.print(0x0a);
falls du ein Mega nutzt würde ich das an deiner Stelle mal an einen der anderen Seriellen Anschlüsse hängen zum testen, ich habe bei meinem GPS-Empfänger 3 Wochen intensiver Fehlersuche gebraucht bis ich festgestellt habe das das mit der NSS einfach nicht funktioniert hat.
Ich nutze ein Arduino Uno Rev.2 zusammen mit einem ProtoShield auf das ich ein kleines Breadboard geklebt habe.
Es wird immer merkwürdiger:
ich habe jetzt ein delay von 100ms eingebaut (sollte doch eigentlich reichen um alle Daten zu empfangen)
außerdem habe ich den Befehl ("$sure ga") aufgeteilt in:
kein Effekt.
zwischendurch habe ich nochmal den ursprüglichen sketch mit delay(100) laufen lassen und bekam plötzlich ganz andere Ausgaben:
erst ca. 10 mal "Angle=045deg.", so wie es auch seien sollte
dann "Bad command"
und zwischen durch immer wider 5-10 Zeilen lang zufällige Zeichen.
alles in dem gleich Sketch und ohne das ich dem Kompass bewegt habe.
Jetzt funktioniert wieder garnichts =(
Gruß Max
Edit:
habe es geschafft die merkwürdige ausgabe nochmal zu bekommen:
Compass Serial Test
void_heading
void_heading
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
Angle=258deg.
............5R.
............5R.
............5R.
............5R.
.Bad command!
.Bad command!
.Bad command!
.Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bd command!
Bd command!
Bd command!
Bd command!
CPXY...mmand!
CPXY...mmand!
CPXY...mmand!
CPXY...mmand!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
H*.....[X[.HC.
H*.....[X[.HC.
H*.....[X[.HC.
H*.....[X[.HC.
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
............5R.
............5R.
............5R.
............5R.
CPXY...mmand!
CPXY...mmand!
CPXY...mmand!
CPXY...mmand!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
Bad command!
H*......X[...
H*......X[...
H*......X[...
H*......X[...
Bad command!
Bad command!