UART Kommunikation mit Kompass Modul

Hallo,

ich versuche gerade einen zwei Achsen Magnet Sensor auszulesen.
Hier das Modell das ich verwende:
Sure Electronics DC-SS504 - http://www.sure-electronics.net/download/DC-SS504_Ver1.0_EN.pdf

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);
}
if (compass.available() !=0)

Bilde mir ein, irgendwo gelesen zu haben dass das nicht funktioniert sondern:

if (compass.available())

df6ih:

if (compass.available() !=0)

Bilde mir ein, irgendwo gelesen zu haben dass das nicht funktioniert sondern:

if (compass.available())

Warum sollte das nicht funktionieren?
available() liefert die Anzahl der Zeichen im Puffer zurück, beide Schreibweisen wären somit ok.

Auch ich würde sagen daß beide If -bedingungen gleichwertig sind.

  1. 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.

  2. 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);

Grüße Uwe

Hallo,

danke für die schnellen antworten.

@df6ih:

habe schon sämtliche variationen ausprobiert, machte keinen Unterschied.

@uwefed:

danke für den Tip, werde das später Zuhause mal ausprobieren.

das Merkwürdige ist ja das es manchmal geht, ohne dass ich am Code irgendetwas verändert habe.

naja, ich probier das nachher aus und werde das Ergebniss berichten.

Gruß

Max

Moin,
welches Board nutzt du denn?

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.

Gruß Arne

Hallo,

@Arne1985

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:

compass.print("$sure");
compass.print(0x20, HEX);
compass.print("ga");
compass.print(0x0d, HEX);
compass.print(0x0a, HEX);

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!

Vielleicht kann damit jemand was anfangen

Wie versorgst Du das Modul mit Spannung?
Grüße Uwe

5 Volt vom Arduino und mit einem 10kOhm Pullup auf den 'OPT' pin am Moudul .
Der Pullup hat aber keinen Einfluss auf das Ergebniss.