Hallo zusammen,
Ich kämpfe zur Zeit mit den Tücken einer „Infrarot-Kanone“ für Modellflugzeuge (indoor).
Den Aufbau habe ich mir so vorgestellt:
Ein Attiny45 (da klein und leicht), eine IR Diode (LD 274-3) und ein IR Empfänger (TSOP34836), das ganze angeschlossen zwischen RC-Empfänger und Motor-Regler. Optional ein weiterer Anschluss zwischen RC-Empänger und Attiny für den Trigger (zunächst aber ohne Trigger, nur mit „Dauerfeuer“).
Wie soll das ganze funktionieren:
1. Im normalen Flug wird das RC-Throttle-Signal (Gas) durch den Attiny „durchgeschleift“.
2. Die IR-LED „feuert“ ständig. (Optional: Die IR-LED feuert erst, wenn an der Fernsteuerung ein Schalter/Taster betätigt wird).
3. Wird der IR-Empfänger von einem passenden Infrarot-Signal „getroffen“ soll der Motor für eine bestimmte Zeit ausgehen bzw. stottern (unterbrechen des bis dahin durchgeschleiften Gas-Kanals).
Ich habe bis jetzt noch nichts mit IR-Übertragungen gemacht (nur viel gelesen). Das RC5 Protokoll scheidet aber aus, da es viel zu lang ist. Mir schwebt im Moment ein sehr kurzes individuelles Protokoll vor. Meine Gedanken gehen in Richtung „3-Bit-Protokoll“. Ein Start-Bit und 2 Kommand-Bits. Damit sollten 4 verschiedene IR-Befehle übertragbar sein. Mit den unterschiedlichen Befehlen könnte man später mit mehreren Flugmodellen auf ein einzelnes Bodenziel schießen, mit anschließender Trefferauswertung. Auch ein „Team-Deathmatch“ z.B. zwei gegen zwei wäre denkbar, bei dem man sogar in der Software „friendly fire“ ausschließen könnte.
Im folgenden Code habe ich versucht, die IR-Übertragung zu realisieren. Leider klappt das nur mit mäßigem Erfolg. IR-LED und TSOP stehen sich gegenüber. Die Kontroll-LED sollte eigentlich durchgehend leuchten, flackert aber die ganze Zeit. Wird die optische Verbindung zwischen IR-LED und TSOP unterbrochen, geht die Kontroll-LED wie gewünscht aus.
Ich habe es nicht geschafft, eine halbwegs verlässliche Datenübertragung herzustellen.
Bin langsam am verzweifeln und für alle Ideen offen
mfg
Robert
Hier noch ein paar Infos, wo ich meine Inspiration her habe:
http://www.youtube.com/watch?v=TQp0mS8dtpg
oder einfach nach „20100117 IAC-ASO 52“ suchen.
Ab 1:36 geht’s los mit dem IR-Stuff, ab 2:51 Minuten sieht man „Luftkämpfe“
Meine Modelle werden allerdings etwas größer sein
PS: Wenn ich die Sendepause im Code nicht ausklammere, leuchtet die Kontroll-LED gar nicht.
Code:
'===============================================================================
'IR Kanone V 01
'
'IR-LED an Pin 5 (PB0, OCR0A)
'TSOP34836 an Pin 7 (PB2, INT0)
'
'
'
'
'
'Pin 6 (PB1 Test-LED)
'===============================================================================
$regfile = "attiny45.dat"
$crystal = 8000000 'FuseBit CKDIV8 deaktivieren
$hwstack = 40
$swstack = 40
$framesize = 50
'-------------------------------------------------------------------------------------------------
'Timer konfigurieren
'-------------------------------------------------------------------------------------------------
Tccr1 = &B00000111 'Timer1 als Zeitbasis für Datenempfang starten (Prescale 64) (geht beim Attiny45 nicht mit "Config"!)
'Enable Timer1 (wird erst in der ISR enabled!!!)
On Timer1 Daten_sammeln
Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'Timer0 erzeugt 36kHz IR-Trägerfrequenz, Clear Timer setzt Timer bei Erreichen des Comparewertes auf 0 zurueck
Ocr0a = 110
'-------------------------------------------------------------------------------------------------
'Interrupt-Service-Routinen konfigurieren und freigeben
'-------------------------------------------------------------------------------------------------
Config Int0 = Rising 'bei steigende Flanke an PB2/INT0 (Ir_data_in) Int0 auslösen und in die Subroutine springen
Enable Int0
On Int0 Ir_data_start
Enable Interrupts
'-------------------------------------------------------------------------------------------------------------
'Variablen definieren
'-------------------------------------------------------------------------------------------------------------
Dim Ir_befehl As Byte 'es steht einer von 4 möglichen Sendebefehlen zur Verfügung
Dim Level As Byte
Dim Ir_data As Byte 'zusammensetzen des IR Befehl
Dim Ir_data_fertig As Byte 'fertig empfangener IR Befehl
'-------------------------------------------------------------------------------------------------------------
'Ein- und Ausgang festlegen
'-------------------------------------------------------------------------------------------------------------
Ddrb = &B00010011 'PB0, PB1 und PB4 werden Ausgänge, restlicher PortB bleibt Eingang
'======================================================
'Hauptprogramm
'======================================================
Do
Ir_befehl = &B00000101
' |||
' ||Zweites Befehlsbit
' ||
' |Erstes Befehlsbit
' |
' Startbit
'Alternative Befehle:
'Ir_befehl = &B00000100
'Ir_befehl = &B00000110
'Ir_befehl = &B00000111
'Startbit senden (immer 1)
Ddrb.0 = Ir_befehl.2 ' 36 kHz Carrier on
Waitus 500
Ddrb.0 = 0 ' 36 kHz Carrier off
Waitus 500
'Erstes Befehlsbit senden
Ddrb.0 = Ir_befehl.1
Waitus 500
Ddrb.0 = 0
Waitus 500
'Zweites Befehlsbit senden
Ddrb.0 = Ir_befehl.0
Waitus 500
Ddrb.0 = 0
Waitus 500
'(
'Sendepause einlegen
Ddrb.0 = 0
Waitus 2000
')
If Ir_data_fertig = &B00000101 Then 'Test LED soll leuchten, wenn der richtige Code empfangen wurde
Portb.1 = 1
Else
Portb.1 = 0
End If
Loop
End
'-------------------------------------------------------------------------------------------------------------
'ISR IR Daten empfangen
'-------------------------------------------------------------------------------------------------------------
Ir_data_start:
Ir_data = &B00000001
Timer1 = 155 ' nach rund 808 us den Timer Interrupt auslösen
Enable Timer1
Disable Int0 ' weiter Interrupts durch INT0 unterbinden
Return
Daten_sammeln:
Shift Ir_data , Left
Level = Not Pinb.2 'TSOP gibt invertierte Daten aus, deshalb nochmal inventieren
Ir_data = Ir_data + Level 'eben gelesenes Bit zugeben
Timer1 = 131 ' nach rund 1000us den Timer Interrupt auslösen '
If Ir_data < &B00000100 Then
nop
Else
Disable Timer1 'weitere Interrupts durch Timer1 unterbinden
Set Gifr.intf0 'Interruptflag vom INT0 löschen
Enable Int0
Ir_data_fertig = Ir_data
End If
Return
Lesezeichen