PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : KAP(Luftbildfotografie)-Steuerung per XBee realisieren



spelli2001
20.04.2012, 22:51
Hallo,

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

KAP-Rig (http://www.google.de/search?hl=de&q=kap+rig&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=FMqRT9nzMIWRswazmJzKBA&biw=1280&bih=646&sei=FsqRT6SOI8ORswbB5fnWBA)

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

spelli2001
22.04.2012, 15:07
keiner einen rat oder Tipp?

lokirobotics
23.04.2012, 11:06
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.

spelli2001
24.04.2012, 01:04
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!

lokirobotics
24.04.2012, 15:32
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 (http://avrhelp.mcselec.com/index.html?split.htm)

spelli2001
24.04.2012, 16:11
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

da_miez3
24.04.2012, 16:19
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

spelli2001
24.04.2012, 16:31
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... :-(

da_miez3
24.04.2012, 17:19
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

spelli2001
24.04.2012, 17:41
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...

spelli2001
24.04.2012, 19:43
Zum Verständnis der Code des Sende-Atmega8:

Gesendet wird am Ende sub XBee:


'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m8def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64

$baud = 9600


'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Pwr_all Alias Portd.2 'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portd.3
Pwr_video Alias Portd.4

Led_rot Alias Portc.5

Pan1 Alias Portb.0 ' für L293 D
Pan2 Alias Portd.7



'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------

Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen



'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5

'---- Commands ----
Dim Quittierung As String * 21
Dim Gpshoehe As String * 10

'---- Command empfangen ----
Dim Cmd As Byte

'---- GPS-String einlesen ----
Dim Gps_zeichen As Byte
Dim Gpsdaten As String * 98
Dim Gps_header As String * 6
Dim Gps_anzahl As Byte
Dim Gps_teilstring(14) As String * 12
Dim Gps_hoehenteilstring(2) As String * 8

'---- Commands einlesen ----
Dim Befehls_zeichen As Byte
Dim Befehlsdaten As String * 101
Dim Befehls_header As String * 6
Dim Befehls_anzahl As Byte
Dim Befehls_teilstring(5) As String * 21

'---- Temperaturmessung ----
Dim Temp(9) As Byte
Dim X As Byte
Dim Celsius As Integer
Dim T As Single
Dim Temperatur As String * 5

'---- PWM für A293D ----
Dim A As Byte



'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Config Serialin = Buffered , Size = 128
'Open "com1:" For Binary As #1
'Open "COMB.7:9600,8,N,1" For Input As #2 'PB.7 = RxD SoftUART / GPS

' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren

' Timer für PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

' schaltbare Ausgänge
Config Pwr_all = Output ' GPS- und Video-Modul sowie 5 Volt Versorgung hierfür abschalten
Config Pwr_gps = Output
Config Pwr_video = Output

' Status-LED rot
Config Led_rot = Output

' L293D für Servo als Motor
Config Portb.1 = Output
Config Pan1 = Output 'LD293
Config Pan2 = Output

'1wire für Temp.-Messung
Config 1wire = Portc.0 ' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert

'Interrupts
Enable Interrupts
Enable Timer1

' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $GROUND#... permanent zu senden



'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------

Pwr_all = 0 ' bei Systemstart Peripherie auf OFF
Pwr_video = 0
Pwr_gps = 0

Led_rot = 1 ' Led_rot OFF

Pan1 = 0 'L293D OFF
Pan2 = 0

'LED blinken lassen
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0


'nach einer Sek. Pwr_all ON
Wait 1
Pwr_all = 1

'nach einer weiteren Sek. Pwr_gps ON
Wait 1
Pwr_gps = 1

'nach zweit weiteren Sek. Pwr_video ON
Wait 2
Pwr_video = 1
Wait 5 ' und nach 5 Sekunden Pwr_video wieder OFF
Pwr_video = 0


' Begrüßung




'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------

Do

'========== hier laufen Tests ab ==========================================

Quittierung = "quit-test"
Gpshoehe = "gpshigh"

'==========Temperaturmessung mit DS18B20Z 1Wire============================

1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800

1wreset
1wwrite &HCC
1wwrite &HBE


For X = 1 To 9
Temp(x) = 1wread()
Next


Celsius = Makeint(temp(1) , Temp(2))

T = Celsius / 16

Temperatur = Fusing(t , "##.#")


'==========Spannung LiPo 2S messen========================================

Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")

If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If


'==========Rx Prüfen auf Befehlseingänge==================================




'==========GPS-Auswertung (NL-504ETT)=====================================




'(

Inputbin cmd


Select Case Cmd

Case 50
Cmd = ""
Led_rot = 1
Wait 1
Led_rot = 0
Wait 1


End Select
')


Call Xbee ' kontinuierliches Senden der Parameter


Loop



End


'----------------Befehlsbibliothek "Commands"-----------------------------------

Commands:
Select Case Befehls_teilstring(2)

Case "50" ' Teilstring(2) auswerten auf "TAKEPHOTO"

Led_rot = 1
Wait 2
Led_rot = 0



End Select


Return



'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
'Print #1 , "LiPo-Saver!"
Quittierung = "" 'Quittierung löschen
Waitms 500

Pwr_all = 0 ' testweise Ausgabe PWR_all = 0 --> hier: LED an!

Disable Interrupts



Powersave ' sleep

Return


'----------------Sonstiges------------------------------------------------------


Sub Xbee

Print "$ground" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe


End Sub



und zum Empfangen:


'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m16def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64

$baud = 9600


'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Led_gruen Alias Portb.0
Led_lcd Alias Portb.1

Taster Alias Pind.6


'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------

'Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen



'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- Commands einlesen ----


Dim Quittierung As String * 21

'---- Command senden ----
Dim Cmd As Byte

'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5





'Dim für lesen
Dim Gelesen As Byte 'dollarzeichen einlesen

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

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





'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
Config Serialin = Buffered , Size = 100 ' konfig serial in

' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren

' LEDs
Config Led_gruen = Output
Config Led_lcd = Output

' Taster
Config Taster = Input

' LCD
Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2

Deflcdchar 0 , 32 , 32 , 21 , 14 , 4 , 4 , 4 , 4 ' replace [x] with number (0-7)

'Interrupts
Enable Interrupts

' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $KAPRIG#... permanent zu senden



'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------

Led_gruen = 1 ' Led-grün OFF
Led_lcd = 0 ' LCD-Beleuchtung ON




' Begrüßung
Wait 1

Cls
Cursor Off
Locate 1 , 1
Lcd "KaprigControlRxZ1"
Locate 2 , 1
Lcd "KaprigControlRxZ2"
Locate 3 , 1
Lcd "KaprigControlRxZ3"
Locate 4 , 1
Lcd "KaprigControlRxZ4"


Led_lcd = 1
Waitms 200
Led_lcd = 0


Led_gruen = 0
Wait 1
Led_gruen = 1
Wait 1
Led_gruen = 0
Wait 1
Led_gruen = 1
Wait 1
Led_gruen = 0
Cls


'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------



Do
Gelesen = Inkey() ' $ground#quit-test#7.1#24.6#gpshigh

Locate 1 , 1
Lcd Gelesen

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 1
End If





Locate 4 , 1
Lcd Chr(0)




If Taster = 0 Then
Cls
Led_gruen = 1
Led_lcd = 1
Powerdown
End If


Loop
End







'----------------Befehlsbibliothek "Commands"-----------------------------------

Commands:




Return



'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:

Return


'----------------Sonstiges------------------------------------------------------



Sub Xbee




End Sub

spelli2001
24.04.2012, 23:54
Ich habe alles noch mal überprüft und auch noch einen Max232 zweischengesetzt, aber es läuft nicht.

Ich hatte auch einmal kurz Teile hiervon ausprobiert: http://www.krasser-mann.com/projects/gps-tracker/,
und da konnte ich auch Teilstrings anzeigen... so ganz verstehe ich den Code aber nicht.

Beide AVR laufen mit 7,3728 MHz. Es werden definitiv Daten gesendet, allerdings gibt das Inkey nicht die 36 für $ aus, sondern eine dreistellige Ziffer, die augenscheinlich schnell von 0 nach oben hochläuft...

Wo kann der Bock hängen?

spelli2001
25.04.2012, 15:49
Hallo,

es lag am Quarzoszillator ... also das Teil mit vier Beinchen... sorry

Was wähle ich beim http://www.engbedded.com/fusecalc Fusecalculator aus, wenn ich einen o. g. Quarzoscillator nehmen will!?

Danke

da_miez3
25.04.2012, 16:46
Hey. Funktioniert die Ausgabe der einzelnen Daten jetzt wie gewollt?

Würde mich auch interessieren, was man da einstellt. Hab mir da seit Monaten gar keine Gedanken mehr drüber gemacht. Hab immer n 16Mhz Quarz an XTAL1 und XTAL2 mit zwei 22pF Kondensatoren an GND . Nehm dann CKSEL = 1111 SUT = 11 . Warum eigentlich? Es funktioniert jedenfalls.. Bei nem ext Quarzoszillator schließt du ihn ja nur an XTAL1 an. Hätte jetzt auf CKSEL=0111 SUT=00 gestellt. Aber machs mal lieber nicht ;)

spelli2001
26.04.2012, 17:19
Hallo, läuft jetzt! Danke für die Hilfe!

Bzgl. der Fuses muss ich nochmal die Datenblätter wälzen...

spelli2001
01.05.2012, 14:46
Hallo,

soweit bin ich zufrieden und meine Übertragung per XBee besteht..

Es sendet der "Luftbildsender" einen String: $GROUND#quit-test#7.5#24.4#gpshigh (quittierung / Spannung / Temperatur / GPS-Höhe)
Das funktioniert alles...


Die "Bodenstation" empfängt den o. g. String, teilt ihn auf und stellt die Werte auf einem LCD dar.
Gleichzeitig soll die "Bodenstation" Befehle an den "Luftbildsender" einen Befehl schicken können; in meinem Beispiel einen taster auswerten und daraufhin einen Befehl abschicken, woraufhin sich ein umgebauter Servo (L293D...) am "Luftbildsender" dreht...

Aber irgendwie ist das alles zu langsam! Bzw. dreht sich der Servo erst nach vielen Sekunden - die Sende/Empfangsroutine ist anscheinend zu träge...

Vielleicht mag ja jmd. über den Code rüberschauen:


Bodenstation (Atmega16):


'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m16def.dat"
$crystal = 7372800 '7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64

$baud = 9600


'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Led_gruen Alias Portb.0
Led_lcd Alias Portb.1

Taster Alias Pind.6


'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------

'Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen



'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- Commands einlesen ----


Dim Quittierung As String * 21

'---- Command senden ----
Dim Cmd As String * 11

'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5


'Dim für lesen
Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
Dim Teildaten(14) As String * 20 ' Array mit den extrahierten Daten
Dim Anzahl As Byte
Dim Datenstring As String * 40
Dim Datenkopf As String * 7

Dim Lcd_command As String * 20
Dim Lcd_voltage As String * 20
Dim Lcd_temperatur As String * 20
Dim Lcd_gps As String * 20

Dim Connect As Byte


'---- LCd Menü ----



'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
Config Serialin = Buffered , Size = 100 ' konfig serial in

' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren

' LEDs
Config Led_gruen = Output
Config Led_lcd = Output

' Taster
Config Taster = Input

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

Deflcdchar 0 , 32 , 32 , 21 , 14 , 4 , 4 , 4 , 4 ' Link-Zeichen
Deflcdchar 1 , 32 , 14 , 31 , 31 , 31 , 31 , 31 , 31 ' battery-full
Deflcdchar 2 , 32 , 14 , 31 , 17 , 17 , 31 , 31 , 31 ' battery-half
Deflcdchar 3 , 32 , 14 , 31 , 17 , 17 , 17 , 17 , 31 ' battery empty



'Interrupts
Enable Interrupts

' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $KAPRIG#... permanent zu senden



'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------

Led_gruen = 1 ' Led-grün OFF
Led_lcd = 0 ' LCD-Beleuchtung ON
Connect = 0



' Begrüßung
Wait 1

Cls
Cursor Off
Locate 1 , 1
Lcd "KaprigControlRxZ1"
Locate 2 , 1
Lcd "KaprigControlRxZ2"
Locate 3 , 1
Lcd "KaprigControlRxZ3"
Locate 4 , 1
Lcd "KaprigControlRxZ4"


Led_lcd = 1
Waitms 200
Led_lcd = 0


Led_gruen = 0
Waitms 100
Led_gruen = 1
Waitms 100
Led_gruen = 0
Waitms 100
Led_gruen = 1




'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------
Cls


Do



'========== hier laufen Tests ab ==========================================


If Taster = 0 Then
Led_lcd = 1

Cmd = "foto"
Locate 1 , 10 'test für sende cmd
Lcd Cmd

Elseif Taster = 1 Then
Led_lcd = 0

Cmd = ""
Locate 1 , 10 'test für sende cmd
Lcd " "

End If





'==========Rx Prüfen auf Befehlseingänge==================================

Dollarzeicheneingang = Inkey()

If Dollarzeicheneingang = 36 Then
Gosub Link

Input Datenstring Noecho '36 ist das Dollarzeichen


Else
Gosub No_link

End If

Datenkopf = Mid(datenstring , 1 , 6)

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

Gosub Lcd_anzeigen

End If ' --> $GROUND#quit-test#7.5#24.4#gpshigh


'==========Menüstruktur=========================== ========================













'==========Spannung LiPo 2S messen========================================
'(
Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")

If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If
')

'==========Rx Prüfen auf Befehlseingänge==================================


Call Xbee ' kontinuierliches Senden der Parameter


Loop

'Eop:
'Close #2

End



'----------------LCD Anzeigen---------------------------------------------------

Lcd_anzeigen:


Lcd_command = Teildaten(2)
Lcd_voltage = Teildaten(3)
Lcd_temperatur = Teildaten(4)
Lcd_gps = Teildaten(5)

Locate 2 , 1
Lcd "command:" ; Lcd_command

Locate 3 , 1
Lcd "Voltage:" ; Lcd_voltage ; "Volt"

Locate 4 , 1
Lcd "Temp.:" ; Lcd_temperatur ; Chr(223) ; "C"

Locate 4 , 14
Lcd Lcd_gps



Return




'----------------Befehlsbibliothek "Commands"-----------------------------------

Commands:



Return



'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:

Return


'----------------XBee Link------------------------------------------------------

Link:
Connect = 1

Led_gruen = 0

Locate 1 , 1
Lcd Chr(0)

Return


'----------------XBee NO Link---------------------------------------------------

No_link:

Connect = 0

Led_gruen = 1

Locate 1 , 1
Lcd "_"

Lcd_command = " "
Lcd_voltage = " "
Lcd_temperatur = " "
Lcd_gps = " "

Return


'----------------Sonstiges------------------------------------------------------


Sub Xbee

Print "$KAPRIG" ; "#" ; Cmd


End Sub





Und der Code vom Luftbildsender (Atmega8):


'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m8def.dat"
$crystal = 7372800 ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
$hwstack = 64
$swstack = 64
$framesize = 64

$baud = 9600


'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Pwr_all Alias Portd.2 'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portd.3
Pwr_video Alias Portd.4

Led_rot Alias Portc.5

Pan1 Alias Portb.0 ' für L293 D
Pan2 Alias Portd.7



'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------

Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen



'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- Betriebsspannung messen ----
Dim Spannung As Word
Dim Zellspannung_orig As Single
Dim Zellspannung As String * 5

'---- Commands ----
Dim Quittierung As String * 21
Dim Gpshoehe As String * 10

'---- Command empfangen ----
Dim Cmd As Byte

'---- GPS-String einlesen ----


'---- Temperaturmessung ----
Dim Temp(9) As Byte
Dim X As Byte
Dim Celsius As Integer
Dim T As Single
Dim Temperatur As String * 5

'---- PWM für A293D ----
Dim A As Byte


'Dim für lesen
Dim Dollarzeicheneingang As Byte 'Beginn des Datenstrings mit Dollarzeichen
Dim Teildaten(3) As String * 10 ' Array mit den extrahierten Daten
Dim Anzahl As Byte
Dim Datenstring As String * 40
Dim Datenkopf As String * 7


'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------

'---- CONFIG ----

' RS232 Hardware
'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 100 ' konfig serial in
'Open "com1:" For Binary As #1
'Open "COMB.7:9600,8,N,1" For Input As #2 'PB.7 = RxD SoftUART / GPS

' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren

' Timer für PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

' schaltbare Ausgänge
Config Pwr_all = Output ' GPS- und Video-Modul sowie 5 Volt Versorgung hierfür abschalten
Config Pwr_gps = Output
Config Pwr_video = Output

' Status-LED rot
Config Led_rot = Output

' L293D für Servo als Motor
Config Portb.1 = Output
Config Pan1 = Output 'LD293
Config Pan2 = Output

'1wire für Temp.-Messung
Config 1wire = Portc.0 ' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert

'Interrupts
Enable Interrupts
Enable Timer1

' sonstige
Start Adc
Declare Sub Xbee ' Senderoutine, um $GROUND#... permanent zu senden



'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------

Pwr_all = 0 ' bei Systemstart Peripherie auf OFF
Pwr_video = 0
Pwr_gps = 0

Led_rot = 1 ' Led_rot OFF

Pan1 = 0 'L293D OFF
Pan2 = 0

'LED blinken lassen
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0
Led_rot = 1
Waitms 100
Led_rot = 0
Waitms 100
Led_rot = 1
Waitms 100
Led_rot = 0


'nach einer Sek. Pwr_all ON
Wait 1
Pwr_all = 1

'nach einer weiteren Sek. Pwr_gps ON
Wait 1
Pwr_gps = 1

'nach zweit weiteren Sek. Pwr_video ON
Wait 2
Pwr_video = 1
Wait 5 ' und nach 5 Sekunden Pwr_video wieder OFF
Pwr_video = 0


' Begrüßung




'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------

Do

'========== hier laufen Tests ab ==========================================

Quittierung = "123"
Gpshoehe = "gpshigh"







'==========Temperaturmessung mit DS18B20Z 1Wire============================

1wreset
1wwrite &HCC
1wwrite &H44
Waitms 800

1wreset
1wwrite &HCC
1wwrite &HBE


For X = 1 To 9
Temp(x) = 1wread()
Next


Celsius = Makeint(temp(1) , Temp(2))

T = Celsius / 16

Temperatur = Fusing(t , "##.#")


'==========Spannung LiPo 2S messen========================================

Spannung = Getadc(3) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig * 2
Zellspannung = Fusing(zellspannung_orig , "#.#")

If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
Gosub Lipo_saver_off
End If


'==========Rx Prüfen auf Befehlseingänge==================================

Dollarzeicheneingang = Inkey()

If Dollarzeicheneingang = 36 Then

Input Datenstring Noecho '36 ist das Dollarzeichen
Gosub Link
Dollarzeicheneingang = 0

Else
Gosub No_link

End If


Datenkopf = Mid(datenstring , 1 , 6)

If Datenkopf = "KAPRIG" Then
Anzahl = Split(datenstring , Teildaten(1) , "#") '# Trennzeichen der Daten
Datenstring = ""
Gosub Commands

End If
' --> $KAPRIG#foto






Call Xbee ' kontinuierliches Senden der Parameter


Loop



End


'----------------Befehlsbibliothek "Commands"-----------------------------------

Commands:

If Teildaten(2) = "foto" Then

A = 160
Compare1a = A
Pan1 = 0
Pan2 = 1
Waitms 70
Pan1 = 0
Pan2 = 0

End If


Return



'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------

Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
'Print #1 , "LiPo-Saver!"
Quittierung = "" 'Quittierung löschen
Waitms 500

Pwr_all = 0 ' testweise Ausgabe PWR_all = 0 --> hier: LED an!

Disable Interrupts



Powersave ' sleep

Return


'----------------Sonstiges------------------------------------------------------



Link:

Led_rot = 1

Return



No_link:

Led_rot = 0

Return



Sub Xbee

Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe


End Sub