Mittwoch, 19. Juni 2013

JY-MCU Bluetooth Modul am Arduino

Beim Chinesen um die Ecke (eBay) waren Bluetooth Module im Sonderangebot. Warum also nicht testen? - getreu dem Motto: "Everything is better with bluetooth.":


 Das "Platinchen" hat etwa die Breite eines kleinen Fingers und dessen halbe Länge:



Darauf befindet sich neben einen Spannungswandler für die Versorgung der ICs von links nach rechts:

MX29LV800CB
        8M-BIT [1Mx8/512K x16] CMOS SINGLE VOLTAGE 3V ONLY FLASH MEMORY

CSR BC417
        Single Chip Bluetooth® v2.0+EDR System

... und die markante Bluetooth-Antenne.

Auf der Rückseite ist die Anschlussbelegung ersichtlich. Die Pins VCC, GND, TXD und RXD sind mit einer gewinkelten Stiftleiste bestückt. Als Versorgungsspannung kommen die vom Arduino gelieferten 5V in Frage. Als Send-Empfangs-Pegel sind 3,3 V angegeben. Es wird sich zeigen, dass die Pins meines Moduls auch mit dem 5V Pegel zurecht kommen, ohne dass das Modul schaden nimmt.





Die Board Version wird mit V1.05 angegeben, beim Anmelden meldet sich das Modul als "HC-06" und verlangt die Eingabe des Codes "1234".

Links zu weiteren Informationen:
m2.img.dxcdn.com/CDDriver/sku.121326.pdf
http://air.imag.fr/mediawiki/index.php/Wireless_Bluetooth_RS232_TTL_Transceiver_Module

Der Versuchsaufbau


2 Leitungen zur Spannungversorgung, die beiden anderen Leitungen werden wie folgt angeschlossen:


          JY-MCU    Arduino Mega
            TXD <----> RX1 
            RXD <----> TX1 

Über die Serial 1 findet also die Kommunikation mit dem JY-MCU statt, die Serial 0-Schnittstelle wird zum Monitoring benutzt. 

Zum Testen des Datenaustauschs habe ich den MultiSerialMega-Sketch aus der Arduino-Beispielsammlung abgeändert:

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    if( inByte ){
      Serial1.write("*");
    }     
    Serial.write(inByte);
  }
 
  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}



Wenn nun das JY-MCU Modul auf dem Serial 1 Port via Bluetooth empfangene Daten an den Arduino liefert, werden diese am Serial Monitor sichtbar und zusätzlich via Bluetooth dem ursprünglichen Sender durch eine Anzahl von * quittiert,  die der Anzahl der empfangenen Zeichen entspricht.

Als Sender den PC zu nutzen, der auch am Arduino zum Monitoring hängt, erschien mir dann doch etwas langweilig. Stattdessen habe ich als Sender ein Android Smartphone mit der App LM BT Terminal benutzt. Das Finden und Anmelden funktionierte auch hier problemlos.


... und hier die "Empfangsseite" als Serial Monitor Ausgabe:



Hin- und Rückrichtung der Bluetooth Verbindung funktionieren demnach.
Danach habe ich mir die Schnittstellenpegel angeschaut. Leider bisher nur in Senderichtung. Das Programm habe ich so erweitert, dass der JY-MCU ständig das Zeichen "x" sendet. Für Android habe ich noch keine passende App gefunden, die ähnliches erlaubt oder mit der man eine ausreichend große Datei seriell übertragen könnte. Wer suchet, der findet ...

Messaufbau: einfach mit dem Oszilloskop am RXD Pin messen.


Einstellung: 5 V/cm vertikal und 0,2 ms/cm Zeitbasis horizontal



Das Signal im Detail:
Es handelt sich um einen asynchronen seriellen Datenstrom, mit 9600 bit/s, 8 Datenbits, ohne Paritätsbit, und einem Stopbit - kurz: 9600 8N1



Der Datenstrom wird also mit einem Spannungspegel von 5 V an das JY-MCU Modul übergeben.

Jetzt interessiert mich noch der Pegel, den das Modul an den Arduino liefert. Einerseits sollten es 3,3 V sein, aber das wäre nicht ausreichend für den Arduino. Andererseits funktioniert in der Praxis die Kommunikation. Sind es nun 5 V oder nur 3,3 V? 
Also weiter nach einer brauchbaren App suchen, um einen messbaren Empfangsbitstrom zu erzeugen. Wer eine kennt, bitte melden. (Sonst muss ich noch selbst eine programmieren).


[Fortsetzung folgt ...]

Samstag, 8. Juni 2013

GPS-Mouse RoyalTek RGM-2000

Ich habe sie beim Aufräumen wieder gefunden. Ursprünglich war die GPS-Mouse zum Anschluss an die Vpower Teleskopsteuerung gedacht. Da ich mich damals jedoch nicht entscheiden konnte, wo ich genau die Stecker an der Vpower anbringe (Handbox oder Hauptgerät), habe ich die Idee nicht weiter verfolgt.





Nun ist die RoyalTek RGM-2000 wieder aus der Versenkung aufgetaucht und hat meine Neugier geweckt.
Da der Stecker der GPS-Mouse nicht zu gebrauchen war, wurde er durch eine einfachere Zugangsmöglichkeit ersetzt:


Kabelbelegung der RGM-2000:


                           rot = +5 V
                       schwarz = GND
                          gelb = TX
                          weiß = RX


Die GPS-Mouse habe ich an den Arduino Mega angeschlossen, weil er hardwareseitig mehrere serielle Schnittstellen hat.

Anschluss:


GPS-Mouse TX --> Arduino Pin 18 (RX1)
GPS-Mouse RX --> Arduino Pin 19 (TX1)

Mit dem Programm "MultiSerialMega" und dem seriellen Monitor kann man ohne großen Aufwand die NMEA 0183 Datensätze sichtbar machen (NMEA = National Marine Electronics Association).



Bei mehreren Inbetriebnahmen der Schaltung dauerte es zwischen 50 s und 2 Minuten bis ein gültiger Datensatz generiert wurde.





NMEA 0183 definiert, dass der Sender die Daten gemäß RS-232 (z.B. serielle Schnittstelle am PC) bereitstellt. Die Übertragungsgeschwindigkeit beträgt 4800 bit/s. Die Daten werden im ASCII-Format (American Standard Code for Information Interchange) bereitgestellt.
Geliefert werden von der RGM-2000 zwei Datensätze:

$GPGGA,174916.918,4912.3456,N,00612.3456,E,1,05,1.8,183.9,M,47.8,M,0.0,0000*7A
$GPVTG,,T,,M,0.00,N,0.0,K*7E


Der Inhalt wird auf der Web-Site http://www.NMEA.de beschrieben. 
Das erste Datenfeld (Komma als Trennzeichen) bedeutet:

$GP = GPS
GGA = Global Positioning System Fix Data
VTG = Track made good and Ground speed

Der GGA-Datensatz setzt sich wie folgt zusammen:

174916.918 = Zeit (UTC) im Format hhmmss.sss
 4912.3456 = Breitengrad im Format XXYY.ZZZZ ⇒ XX°YY'(0.ZZZZ * 60)" 
         N = Nord
00612.3456 = Längengrad im Format XXXYY.ZZZZ 
         E = Ost
         1 = GPS Signalqualität (0 - fix not available, 1 - GPS fix,
             2 - Differential GPS fix )
        05 = Anzahl der empfangbaren Satelliten (00 - 12)
       1.8 = horizontale Abweichung
     183.9 = Höhe der Antenne über dem Geoiden (eine idealisierte Form 
             der Erde zu Messzwecken)
         M = Einheit des vorherigen Datenfeldes = Meter
      47.8 = Abweichung des  WGS-84 Ellipsoiden vom Geoiden
         M = Einheit des vorherigen Datenfeldes = Meter
       0.0 = Alter des differential GPS Datensatzes
      0000 = Differential GPS Referenz Stations ID, 0000-1023
         * = Ende des Datensatzes (Payload)
        7A = Prüfsumme des Datensatzes


Der VTG-Datensatz enthält folgende Felder:

leer = Richtung in ° (leer, weil sich der Empfänger nicht bewegt hat)
   T = True (geografische Richtung)
leer = Richtung in °
   M = Magnetic (Richtung gemäß Magnetfeld)
leer = Geschwindigkeit in Knoten
   N = Knoten
leer = Geschwindigkeit in km/h
   K = km/h
   * = Ende des Datensatzes (Payload)
  7E = Prüfsumme


Ein Programm, um die Daten zu visuallisieren ist VisualGPS.
Man kann nach Auswertung mehrerer Datensätze z.B. erkennen, dass die mittlere Genauigkeit - hier beim Empfang von 3 bis 5 Satelliten - ca. 6 m im Breitengrad und 5 m im Längengrad betrug: