Code:
'#############################################################################
'
' KAPRIG Control RX
' -------------------------------------
'
' Stand: 10.09.2012, ATmega8
'
'
' Volt Temp.Höhe
' Sendesyntax to GROUND: $GROUND#quittierung#7,4#23,1#64
'
' Sendesyntax to KAPRIG: $KAPRIG#cmd
'
'
' system command function
' --------------------------------------------------------------
'
' KAPRIG 0 all off -> power down
'
' KAPRIG 1 video_5,8 GHz on
' KAPRIG 2 video_5,8 GHz off / BIT 2 | BIT1 | BIT0
' KAPRIG a CH1 - 5740 MHz 0 0 0
' KAPRIG b CH2 - 5760 MHz 0 0 1
' KAPRIG c CH3 - 5780 MHz 0 1 0
' KAPRIG d CH4 - 5800 MHz 0 1 1
' KAPRIG e CH5 - 5820 MHz 1 0 0
' KAPRIG f CH6 - 5840 MHz 1 0 1
' KAPRIG g CH7 - 5860 MHz 1 1 0
' KAPRIG h CH7 - 5860 MHz 1 1 1
'
' KAPRIG 3 gps on
' KAPRIG 4 gps off
' KAPRIG 5 pan links
' KAPRIG 6 pan rechts
' KAPRIG 7 pan speed 1
' KAPRIG 8 pan speed 2
' KAPRIG 9 pan speed 3
' KAPRIG i pan speed 4
' KAPRIG j pan speed 5
'
' KAPRIG + tilt up
' KAPRIG - tilt down
' KAPRIG k photo mode, shutter 1x photo
' KAPRIG l photo mode, shutter 2x photo, 1 Sek. Abstand
' KAPRIG m photo mode, shutter 3x photo, 1 Sek. Abstand
' KAPRIG n photo mode, shutter 4x photo, 1 Sek. Abstand
' KAPRIG o photo mode, shutter 5x photo, 1 Sek. Abstand
' KAPRIG p photo mode, shutter alle 2 Sek.
'
' KAPRIG q zoom in
' KAPRIG r zoom out
'
' KAPRIG s video mode, video start
' KAPRIG t video mode, video stop
'
' KAPRIG x LEDs ON
'
'#############################################################################
'-----------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'-----------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000 ' 16 Mhz Quarz
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 9600
'-----------------------------------------------------------------------------
' Definition von Ressourcen
'-----------------------------------------------------------------------------
Pwr_all Alias Portc.0 'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)
Pwr_gps Alias Portb.3
Pwr_video Alias Portb.0
Bit0 Alias Portd.7
Bit1 Alias Portd.6
Bit2 Alias Portd.5
5v_usb Alias Portc.2
Led_rot Alias Portc.3
Led_gruen Alias Portc.4
Led_blau Alias Portb.5
Led_weiss Alias Portb.4
Pan_a Alias Portc.5 ' für L293 D
Pan_b Alias Portd.2
'-----------------------------------------------------------------------------
' Definition von Konstanten
'-----------------------------------------------------------------------------
Const Adc_multi = 0.0048828125 ' = 5.0 / 1024.0 -> ADC auflösen
Const Timer2vorgabe = 99 ' 10ms 6=16ms
'-----------------------------------------------------------------------------
' 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 * 14
Dim Gpshoehe As String * 13
'---- Command empfangen xxx----
Dim Cmd As Byte
'Dim für GPS einlesen
Dim Gelesen As Byte 'eingelesenes Zeichen
Dim Teilstring(14) As String * 12
Dim Anzahl2 As Byte
Dim Gpsdaten As String * 98
Dim Header As String * 6
'Dim Stunde As Byte
Dim Tempstring As String * 2
'---- Temperaturmessung ----
Dim Temp(9) As Byte
Dim X As Byte
Dim Celsius As Integer
Dim T As Single
Dim Temperatur As String * 5
'---- Zähler etc. ----
Dim Zaehler_1wire As Byte
Dim Zaehler_xbee As Byte
Dim Zaehler_cam As Byte
Dim Chdk As Byte
Dim Zaehler_lipo As Byte
Dim Zaehler_quittierung As Byte
Dim Quittierung_flag As Bit
Dim Zaehler_pwm As Byte
Dim Zaehler_pwm_flag As Bit
'--- Servo ---
Dim 16ms_flag As Bit
Dim Servo As Word
Dim 16ms As Byte
'---- PWM für A293D ----
Dim A As Integer
Dim Zaehler_sec1 As Byte
Dim Zaehler_sec2 As Byte
'-----------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'-----------------------------------------------------------------------------
'---- CONFIG ----
' RS232 Hardware
Config Serialin = Buffered , Size = 1 ' konfig serial in
Open "COMD.4:9600,8,N,1" For Input As #1 'PD.4 = RxD SoftUART / GPS
' ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'ADC Wandler definieren
' Timer0 für 1wire
' Timer1 für PWM
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8
' Timer2 für Servosteuerung
Config Timer2 = Timer , Prescale = 1024
' 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
Config Bit0 = Output
Config Bit1 = Output
Config Bit2 = Output
Config 5v_usb = Output
' Status-LED rot
Config Led_rot = Output
Config Led_gruen = Output
Config Led_blau = Output
Config Led_weiss = Output
' L293D für Servo als Motor
Config Portb.1 = Output
Config Pan_a = Output 'LD293
Config Pan_b = Output
' Servo PIN
Config Portb.2 = Output
'1wire für Temp.-Messung
Config 1wire = Portd.3 ' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von Bascom durch Software realisiert
'Interrupts
On Timer2 Timer2_irq
Enable Interrupts
Enable Timer1
Enable Timer2
' sonstige
Start Adc
'Declare Sub Xbee ' Senderoutine, um $GROUND#... permanent zu senden
'-----------------------------------------------------------------------------
' Init
'-----------------------------------------------------------------------------
Pwr_all = 1 ' bei Systemstart Peripherie (Relais) auf ON
Led_gruen = 0 ' Led_gruen ON für Betriebszustand
Pwr_video = 0 ' Video OFF
Bit0 = 1 ' damit der Video Tx kein GND erhält, BITs für die Kanäle auf "1"
Bit1 = 1
Bit2 = 1
Pwr_gps = 0 ' GPS OFF
Led_rot = 1 ' Led_rot OFF
Led_blau = 1 ' Led_blau OFF
Led_weiss = 1 ' Led_weiss OFF
Pan_a = 0 ' L293D OFF
Pan_b = 0
A = 150 ' Anfangsgeschwindigkeit für PWM L293D
' Befehlsparameter für "getusb_power" -> CHDK
Chdk = 0
5v_usb = 0 ' Kamera Auslöser für "get_usb_power" OFF
Zaehler_1wire = 0 ' alle 16ms Zaehler auf 0
Zaehler_xbee = 0
Zaehler_cam = 0
Zaehler_lipo = 0
Zaehler_quittierung = 0
Zaehler_pwm = 0
Zaehler_pwm_flag = 1 ' zaehler_pwm_flag auf 1, damit grds. PWM/L293D nur Impuls macht
Quittierung_flag = 1 ' quittierung_flag auf 1, damit grds. Quittierung geleert wird
'Servo = 375 ' Servo Mittelstellung
16ms_flag = 0
Wait 1
Pwr_gps = 1 'nach einer weiteren Sek. Pwr_gps ON
'-----------------------------------------------------------------------------
' Hauptprogramm
'-----------------------------------------------------------------------------
Do
'========== hier laufen Tests ab ==========================================
'==========Temperaturmessung mit DS18B20Z 1Wire============================
1wreset
1wwrite &HCC
1wwrite &H44
If Zaehler_1wire = 38 Then
Zaehler_1wire = 0
Gosub 1wire_temp
End If
'==========Spannung LiPo 2S messen=========================================
Spannung = Getadc(1) ' Zelle messen und berechnen
Zellspannung_orig = Spannung * Adc_multi
Zellspannung_orig = Zellspannung_orig / 0.3333
Zellspannung = Fusing(zellspannung_orig , "#.#")
If Zellspannung_orig <= 6.4 Then ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
If Zaehler_lipo > 63 Then
Gosub Lipo_saver_off
End If
Elseif Zellspannung_orig > 6.4 Then
Zaehler_lipo = 0
End If
'==========Rx Prüfen auf GPS Eingang GPGGA=================================
Gelesen = Inkey(#1)
If Gelesen = 36 Then Input #1 , Gpsdaten Noecho '36 = $
Header = Mid(gpsdaten , 1 , 5)
If Header = "GPGGA" Then
Anzahl2 = Split(gpsdaten , Teilstring(1) , ",")
Gpsdaten = ""
Gpshoehe = Teilstring(10)
End If
'==========Rx Prüfen auf Befehlseingänge===================================
If Ischarwaiting() = 1 Then
Cmd = Inkey()
End If
'==========BEFEHLE Auswerten===============================================
Select Case Cmd
'----------ALL Power OFF---------------------------------------------------
Case "0"
Clear Serialin
Cmd = ""
Quittierung = "!!!ALL OFF!!!"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Gosub Lipo_saver_off
'----------ALL LEDs ON-----------------------------------------------------
Case "x"
Clear Serialin
Cmd = ""
Quittierung = "all LEDs ON"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Led_rot = 0
Led_blau = 0
Led_weiss = 0
Waitms 1000
Led_rot = 1
Led_blau = 1
Led_weiss = 1
'----------Photo Mode------------------------------------------------------
Case "k"
Clear Serialin
Cmd = ""
Quittierung = "1 Photo"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
' Übergabe von "Chdk"-Modus <1> für Zeit-Steuerung "get_usb_power" für CHDK
Chdk = 1
Case "l"
Clear Serialin
Cmd = ""
Quittierung = "2 Photo"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 2
Case "m"
Clear Serialin
Cmd = ""
Quittierung = "3 Photo"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 3
Case "n"
Clear Serialin
Cmd = ""
Quittierung = "4 Photo"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 4
Case "o"
Clear Serialin
Cmd = ""
Quittierung = "5 Photo"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 5
Case "p"
Clear Serialin
Cmd = ""
Quittierung = "sec-Photo"
'Zaehler_quittierung = 0
Quittierung_flag = 0
Gosub Xbee
Chdk = 6
Case "q" ' weitere Funktionen CHDK / Canon!
Clear Serialin
Cmd = ""
Quittierung = "zoom in"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 7
Case "r" ' weitere Funktionen CHDK / Canon!
Clear Serialin
Cmd = ""
Quittierung = "zoom out"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Chdk = 8
'----------Video On / OFF--------------------------------------------------
Case "1" ' Video ON
Clear Serialin
Cmd = ""
Quittierung = "Video ON"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Pwr_video = 1
Case "2" ' Video OFF
Clear Serialin
Cmd = ""
Quittierung = "Video OFF"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Pwr_video = 0
Bit2 = 1
Bit1 = 1
Bit0 = 1
' Bit2 | Bit1 | Bit0
Case "a" ' BIT: 0 0 0
Clear Serialin ' CH1 5740 MHz
Cmd = ""
Quittierung = "CH1 : 5740MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 0
Bit1 = 0
Bit0 = 0
Case "b" ' BIT: 0 0 1
Clear Serialin ' CH2 5760 MHz
Cmd = ""
Quittierung = "CH2 : 5760MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 0
Bit1 = 0
Bit0 = 1
Case "c" ' BIT: 0 1 0
Clear Serialin ' CH3 5780 MHz
Cmd = ""
Quittierung = "CH3 : 5780MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 0
Bit1 = 1
Bit0 = 0
Case "d" ' BIT: 0 1 1
Clear Serialin ' CH4 5800 MHz
Cmd = ""
Quittierung = "CH4 : 5800MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 0
Bit1 = 1
Bit0 = 1
Case "e" ' BIT: 1 0 0
Clear Serialin ' CH5 5820 MHz
Cmd = ""
Quittierung = "CH5 : 5820MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 1
Bit1 = 0
Bit0 = 0
Case "f" ' BIT: 1 0 1
Clear Serialin ' CH6 5840 MHz
Cmd = ""
Quittierung = "CH6 : 5840MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 1
Bit1 = 0
Bit0 = 1
Case "g" ' BIT: 1 1 0
Clear Serialin ' CH7 5860 MHz
Cmd = ""
Quittierung = "CH7 : 5860MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 1
Bit1 = 1
Bit0 = 0
Case "h" ' BIT: 1 1 1
Clear Serialin ' CH7 5860 MHz
Cmd = ""
Quittierung = "CH7 : 5860MHz"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Bit2 = 1
Bit1 = 1
Bit0 = 1
'----------GPS ON / OFF---------------------------------------------------
Case "3" ' GPS ON
Clear Serialin
Cmd = ""
Quittierung = "GPS ON"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Pwr_gps = 1
Case "4" ' GPS OFF
Clear Serialin
Cmd = ""
Quittierung = "GPS OFF"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Pwr_gps = 0
'----------PAN 360°-------------------------------------------------------
Case "5" ' Motor PAN 360° links
Clear Serialin
Cmd = ""
Quittierung = "PAN links"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Compare1a = A
Pan_a = 1
Pan_b = 0
Zaehler_pwm_flag = 1
Zaehler_pwm = 0
Case "6" ' Motor PAN 360° rechts
Clear Serialin
Cmd = ""
Quittierung = "PAN rechts"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Compare1a = A
Pan_a = 0
Pan_b = 1
Zaehler_pwm_flag = 1
Zaehler_pwm = 0
Case "7" ' Motor PAN 360° Speed 1
Clear Serialin
Cmd = ""
Quittierung = "PAN Speed 1"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
A = 160
Case "8" ' Motor PAN 360° Speed 2
Clear Serialin
Cmd = ""
Quittierung = "PAN Speed 2"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
A = 180
Case "9" ' Motor PAN 360° Speed 3
Clear Serialin
Cmd = ""
Quittierung = "PAN Speed 3"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
A = 200
Case "i" ' Motor PAN 360° Speed 4
Clear Serialin
Cmd = ""
Quittierung = "PAN Speed 4"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
A = 220
Case "j" ' Motor PAN 360° Speed 5
Clear Serialin
Cmd = ""
Quittierung = "PAN Speed 5"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
A = 240
'----------PAN Photo TOUR--------------------------------------------------
Case "X" ' Motor PAN 360° links
Clear Serialin
Cmd = ""
Quittierung = "Photo Tour"
'Zaehler_quittierung = 0
Quittierung_flag = 0
Gosub Xbee
A = 160
Compare1a = A
Pan_a = 1
Pan_b = 0
Zaehler_pwm_flag = 0
'Zaehler_pwm = 0 ' PWM/L293D läuft nun permanent
Chdk = 6
'----------TILT------------------------------------------------------------
Case "+" 'And Servo >= 1500 ' Motor TILT 90° hoch
Clear Serialin
Cmd = ""
Quittierung = "S1 hoch"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Servo = Servo - 30
Case "-" 'And Servo <= 4400 ' Motor TILT 90° runter
Clear Serialin
Cmd = ""
Quittierung = "S1 runter"
Zaehler_quittierung = 0
Quittierung_flag = 1
Gosub Xbee
Servo = Servo + 30
Case Else
If Zaehler_pwm_flag = 1 Then ' PWM / L293D nur abschalten, wenn zaehler_pwm_flag = 1
If Zaehler_pwm > 16 Then ' wenn PWM für 256ms auf L293D
Pan_a = 0
Pan_b = 0
End If
End If
'Chdk = 0
End Select
' --- Befehle für get_usb_power -> CHDK --- === --- === --- === --- === --- ===
Select Case Chdk
Case "0" ' do nothing im Bezug auf Canon CHDK!
Case "1" ' 1 FOTO
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 2 Then ' wenn Zaehler_cam größer 2 bzw. 32ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "2" ' 2 FOTOS, 1 Sek. Abstand
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 4 Then ' wenn Zaehler_cam größer 4 bzw. 64ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "3" ' 3 FOTOS, 1 Sek. Abstand
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 6 Then ' wenn Zaehler_cam größer 6 bzw. 96ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "4" ' 4 FOTOS, 1 Sek. Abstand
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 8 Then ' wenn Zaehler_cam größer 8 bzw. 128ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "5" ' 5 FOTOS, 1 Sek. Abstand
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 10 Then ' wenn Zaehler_cam größer 10 bzw. 160ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "6" ' immer Fotos jede Sekunde eines!
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 12 Then ' wenn Zaehler_cam größer 12 bzw. 192ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "7" ' ZOOM IN
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 14 Then ' wenn Zaehler_cam größer 14 bzw. 224ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
Case "8" ' ZOOM OUT
5v_usb = 0 ' 5V USB auf HIGH
Zaehler_cam = 0 ' Zaehler_cam auf 0 um im 16ms Takt hochzuzählen!
If Zaehler_cam > 16 Then ' wenn Zaehler_cam größer 16 bzw. 256ms, dann...
5v_usb = 1 ' 5V USB auf Low
End If
End Select
' --- sonstiges ---
If Zaehler_quittierung = 250 Then ' Quittierung nach 2 Sek. leeren
If Quittierung_flag = 1 Then
Quittierung = " connected! " ' kontinuierliches Senden der Parameter
End If
End If
If Zaehler_xbee = 32 Then ' alle 500ms Senden der Parameter
Zaehler_xbee = 0
Gosub Xbee ' kontinuierliches Senden der Parameter
End If
If 16ms_flag = 1 Then 'alle 16ms Impuls an Servo TILT 90°
Pulseout Portb , 2 , 5000
16ms_flag = 0
End If
Loop
End
'----------------Timer2 "10ms" für Servosteuerung-------------------------------
Timer2_irq: ' Interrupts pro Sek. (Frequ.): 62,5
' Interrupt alle 16000 us / 16 ms
Incr Zaehler_1wire ' Zaehler für 1wire-Abfrage
Incr Zaehler_xbee ' Zaehler zum Senden XBee
Incr Zaehler_lipo ' Zaehler um LiPo nach 1 Sekunde Abzuschalten
Incr Zaehler_cam ' Zaehler für CHDK Abschaltung "get_usb_power"
Incr Zaehler_quittierung ' Zaehler für Leeren der Quittierung
Incr Zaehler_pwm ' Zaehler für Dauer PWM
Incr Zaehler_sec1
Incr Zaehler_sec2
Incr 16ms
16ms_flag = 1
Timer2 = Timer2vorgabe
Return
'----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------
Lipo_saver_off:
Quittierung = "LiPo-Saver!" ' Quittierung an Bodenstation
Gosub Xbee
Waitms 500
Pwr_video = 0
Pwr_gps = 0
Led_rot = 1
Led_gruen = 1
Led_blau = 1
Led_weiss = 1
Pwr_all = 0 ' pwr_all off
Powerdown
Return
'----------------sonstiges------------------------------------------------------
1wire_temp:
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 , "##.#")
Return
Xbee:
Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
Return
Lesezeichen