-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: KAP(Luftbildfotografie)-Steuerung per XBee realisieren

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72

    KAP(Luftbildfotografie)-Steuerung per XBee realisieren

    Anzeige

    Hallo,

    es geht um folgendes Vorhaben, nämlich Luftbildfotografie von einem am Himmel stehenden Drachen aus:

    KAP-Rig

    Grds. realisieren die Leute dies über eine RC-Fernsteuerung aus dem Modellbaubereich.

    Ich habe nun eine Schaltung aufgebaut, bei der die Kameraeinheit, das KAP-Rig, per XBee an eine (noch nicht vorhandene) Bodenstation angebunden ist.

    Ich überlege gerade, wie die Kommunikation, also der Syntax aussehen sollte - bin Bascom-/AVR-Anfänger!

    uC ist ein Atmega8, gespeist durch einen 2S LiPo.

    Folgende Parameter müssen übertragen werden:

    - Temperaturwert mit Komma von DS18B20Z 1Wire
    - Spannung des 2S-LiPo
    - Höhe über NN von Navilock NL-504ETTL (soll am Boden gegengerechnet werden!)
    - Empfang von Befehlen und Quittierung dieser

    Ich würde mich am String des NMEA-Syntax orientieren bspw.:

    Sendesyntax zu Bodenstation: $GROUND#quittierung#zellspannung#gpshoehe#Temperat ur#
    Sendesyntax zu KAPRIG/Drachen: $KAPRIG#commands#nn#nn#nn#nn#

    Dann würde ich mir den String aufteilen, orientiert an den "#"...



    Habt ihr Tipps, wie es einfacher und natürlich besser gehen würde?

    Danke,
    Christoph

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    keiner einen rat oder Tipp?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    Wenn du dich schon an NMEA orientierst, würde ich einfach zusätzliche Sentences designen und die in die Kommunikation einschleifen.
    So bleibst du konform zu NMEA und kannst deine Daten auch mit anderer Software auswerten.

    Rein vom Performance-Aspekt her würde ich natürlich ein binäres Format bevorzugen.
    So z.B.

    Offset Länge (Bytes) Wert
    0 2 Temperatur
    2 2 Batteriespannung
    4 2 Höhe
    6 1 Flags

    evtl. noch weitere Felder für Lat/Lon etc.
    Über die Flags könntest du ACK/NACK für gesendete Befehle geben.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo lokirobotics,

    ich muss zugeben, dass ich deinen Hinweis nicht ganz verstanden habe...

    Du meinst umrechnen in binär und dann übertragen?

    Aktuell sieht / soll es so aussehen:

    $GROUND#01#7.1#29.9#67.8
    | | | |
    | | | -- Höhe in Metern
    | | -- Grad in Celsius
    | |-- Spannung in Volt
    |-- "Quittierung" als Byte

    Ich habe nun schon jede Menge gelesen etc. und ausprobiert...

    Ich habe leider keinen Erfolg! Das hier habe ich auch ausprobiert, aber irgendwas mache ich falsch:

    Befehls_zeichen = Inkey() ' Zeichen einlesen

    If Befehls_zeichen = 36 Then Input , Befehlsdaten Noecho ' ist "$" vorhanden, dann Daten/HardUART einlesen >> Befehlsdaten

    Befehls_header = Mid(befehlsdaten , 1 , 6) 'ersten 6 Zeichen nach Befehls_header einlesen
    If Befehls_header = "KAPRIG" Then 'wenn KAPRIG Befehlssatz, dann

    Befehls_anzahl = Split(befehlsdaten , Befehls_teilstring(1) , "#") 'aus Befehlsdaten in 5 Teilstrings/Arrays, getrennt durch "#", aufteilen
    Befehlsdaten = "" 'befehlsdaten leeren
    Gosub Commands ' Auswertung der Befehle/Teilstrings in Subroutine "commands"

    End If

    Ich bin auf der Suche nach einer Lösung bei der ich mir einen String wie den hier:

    $GROUND#01#7.1#29.9#67.8 und den NMEA String auflösen und einfach auf die einzelnen Teilstrings, getrennt durch "#" zugreifen kann....

    Danke für eure Hilfe!

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    Ich muss nochmal fragen: Ist es notwendig, deine Datensätze anders zu formattieren, als die NMEA-Datensätze?
    Gesetzt den Fall, du baust deine Datensätze NMEA-Konform auf. Dann kannst du in einer zentralen Routine immer einen ganzen
    Satz einlesen, in eine Datenstruktur überführen und diese dann anhand ihres Tags an eine speziellere Auswertefunktion übergeben.

    Ich würde auch davon abraten, diverse Felder nur vielleicht zu übertragen. Das ist immer eine potenzielle Fehlerquelle.
    Alle Felder sollten immer vorhanden sein.

    Aus deinem Code in dem Kommentarfeld werde ich nicht schlau.

    Wenn du den String nur anhand der Hashes trennen willst, benutze einfach die Split-Funktion.
    Bascom Split

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo,

    zum einen möchte ich per SW UART das GPS Signal einlesen, um so die Höhe zu verwenden (ich brauche z. Zt. nur die Höhe).

    Weiterhin möchte ich Steuersignale vom Boden in die Luft per RS232 über XBee übetragen. Hierbei kann ich ja ein Byte senden und in der Luft das Byte einlesen und entsprechend was tun...

    Weiterhin wird aus der Luft zum Boden eine Quittierung für den vom Boden ausgesandten Befehl geschickt. Hierdran sollen auch die Temperatur, die (GPS-)Höhe und die Spannung der Versorgung in der Luft mitgesendet werden.

    Fest nach dem NMEA Satz ist natürlich nur das GPS Signal, um die Höhe zu bestimmen. Alles andere ist total frei!

    Den o. g. Code habe ich aus dem Bascom-Buch von Stefan Hoffmann. Da ist ja der Split Befehl enthalten, aber irgendwie will das nicht....

    Ich sende von einem Atmega8 folgenden String:

    Print "$ground" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
    die Variablen werden auch entsprechend gefüllt und ich kann sie empfangen, wenn ich das XBee Modul direkt an meinen PC anschliesse und die Daten in das Terminal einlese...

    mit dem o. g. Code möchte ich per Input den String in einen Atmega16 einlesen. Inkey() für das $-zeichen und Input für den String... Aber da stimmt etwas nicht...

    Danke für Deine/Eure Hilfe

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von da_miez3
    Registriert seit
    24.02.2012
    Ort
    Ilmenau
    Alter
    30
    Beiträge
    198
    Hey spelli. So sollte es eig gehen:

    Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
    Dim Teildaten(14) As String * 12 ' Array mit den extrahierten Daten
    Dim Anzahl As Byte
    Dim Datenstring As String * 98
    Dim Datenkopf As String * 6







    Do
    Dollarzeicheneingang = Inkey()
    If Dollarzeicheneingang = 36 Then Input Datenstring Noecho '36 ist das Dollarzeichen
    Datenkopf = Mid(datenstring , 1 , 5)

    If Datenkopf = "Ground" Then
    Cls
    Anzahl = Split(datenstring , Teildaten(1) , "#") '# Trennzeichen der Daten
    Datenstring = ""



    'Dann kann man sich die extrahierten Datenstücke einzeln anzeigen lassen

    ' Beispiel:
    Locate 2 , 1
    Lcd Teildaten(3)



    End If
    Loop
    End

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo da_miez3,

    danke für deine Hilfe!

    den teilstring(3) konnte ich mir nicht anzeigen lassen, dafür konnte ich mir per lcd dollarzeicheneingang die "36" anzeigen lassen
    -> $ Zeichen kommt schon mal an... Allerdings hat er alle anderen zeichen angezeigt, soweit ja nicht schlimm, da alles per Inkey kommt.

    auch mit lcd datentring kommt nichts...

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von da_miez3
    Registriert seit
    24.02.2012
    Ort
    Ilmenau
    Alter
    30
    Beiträge
    198
    Probiers mal damit, war wohl fehlerhaft:

    $regfile = "m32def.dat"
    $crystal = 1000000
    $baud = 4800 'serial ing
    Config Serialin = Buffered , Size = 100 ' konfig serial in
    Enable Interrupts

    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
    Config Lcd = 20 * 4
    Cls
    Cursor Off

    Dim Gelesen As Byte 'dollarzeichen einlesen

    Dim Teilstring(14) As String * 12
    Dim Anzahl As Byte

    Dim Datenstring As String * 98
    Dim Header As String * 6
    Dim Tempstring As String * 2






    Do
    Gelesen = Inkey()
    If Gelesen = 36 Then Input Datenstring Noecho
    Header = Mid(datenstring , 1 , 6)

    If Header = "GROUND" Then
    Cls
    Anzahl = Split(datenstring , Teilstring(1) , "#")
    Datenstring = ""



    'Test
    Locate 3 , 1
    Lcd Teilstring(2)


    Wait 2
    End If
    Loop
    End

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo,

    also über ein print gehd das hier raus:

    $ground#quit-test#7.1#24.6#gpshigh
    Zeige ich mir "gelesen" auf dem LCD an, so wird dort immer wieder neu "028" angezeigt...

    aber kein teilstring...

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. XBEE beschaltung
    Von Thalhammer im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 15.01.2012, 13:18
  2. [ERLEDIGT] Probleme xbee
    Von Ratzfatz78 im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 18.04.2011, 10:24
  3. XBee Pro und X-CTU
    Von Robo2004 im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 10
    Letzter Beitrag: 14.02.2011, 19:55
  4. Xbee von Reichelt
    Von shedepe im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 12.06.2010, 22:47
  5. Xbee
    Von RobbyFan im Forum Robby RP6
    Antworten: 21
    Letzter Beitrag: 15.04.2010, 16:04

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •