PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Fernsteuerung



Hunter2
22.02.2009, 22:08
Hallo. Ich habe meinen CCRP5 mal wieder ausgegraben, und wollte nun das mit der IR fernbedienung zum laufen bekommen.
Ich habe eine RC5-Fernbedienung gefunden, und der Roboter kann auch den Kanal/ Befehl auslesen. Das habe ich mit der Beispeilsoftware gemacht.
Nun gibt er mir aber bei allen tasten den gleichen befehl aus. Meine Stereoanlage kann aber die Befehle der Fernbedienung verstehen, und reagiert so wie sie soll.
Wenn ich im Remote-control programm den Befehl ändere, dann reagiert er auch, aber eben nur der eine Befehl, da ich die anderen nicht kenne.

Wo kann ich osftwarefragen bezueglich Robotern am besten reinstellen? Auch in dieses Forum, denn um diesen einen roboter geht es.

Edblum
23.02.2009, 08:22
Moin,

Mann muß herausfinden welche Tasten deine Fernbedienung, welche Wert geben. Dass kann am Besten via RS232. Bau dir ein separates Programm, mit denen du diese Wert zum PC sendet.

In Bascom geht dass so:

Getrc5(address , Command)
Print address, Command

Wie es in andere Compiler geht, kann ich leider nicht zeigen, aber vilt hilft dieser Beispiel.

Gruss

Edblum

Hunter2
23.02.2009, 12:44
Hardware?
Ich habe da einen IR-fernbedienungsempfänger für PC, der geht auf USB. Kann man den auch auslesen?
Oder mittels IRda?

Dirk
23.02.2009, 17:13
Hallo Hunter2,

sagst du noch kurz, ob du den CCRP5 ...
a) solo hast, d.h. ohne sonstige Teile
b) mit Erweiterungsplatine und LCD
c) mit b und der C-Control II
... hast?

Dann gibt es für alle 3 Varianten Möglichkeiten, die IR-Codes anzuzeigen.

Gruß Dirk

Hunter2
23.02.2009, 17:40
noch ohne alles.
Ich will dem aber irgendwann mithilfe der erweitzerungsplatine und der C-Control 2 und dem LCD noch Ultraschallsensoren verpassen, die nach vorne und zur seite gehen, und noch taster, wenn alles fehlschlägt, denn ich habe heute ausserdem feststellen müssen, dass das Infrarot warn system schwarze gegenstände so gut wie gar nicht sieht, und über dem Boden blind zu sein scheint.
Ausserdem wirdes anscheinend durch sonne total blind.

Dirk
23.02.2009, 18:05
Hallo Hunter2,

hier ein Programm, das mit den LEDs die IR-Codes binär ausgibt. Man muss ein bißchen rechnen, aber das geht nach etwas Übung.
Stör dich nicht an dem vielen Text am Anfang. Wenn du das alles kennst: Einfach Löschen!


'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'IIIIIIIIII ROBBY RP5 - LED-Binärausgabe-IR-Code IIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIII
'PROGRAMM ZUR 4-BIT-BINÄRAUSGABE EINES IR-CODES MIT 4 LEDS

' Programm-Name: LED-Binärausgabe-IR-Code_RP5.bas
' Hardware: Robby RP5 OHNE Erweiterungsplatine,
' IR-Fernbedienung
' Treiber: P5DRIV.S19

'----------------------------------------------------------------------
' FUNKTION DES PROGRAMMS
'----------------------------------------------------------------------
' Das Programm wartet auf Empfang eines IR-Codes von einer Fernsteuerung
' RC5 oder REC 80.
' Wenn ein gültiger Code empfangen wird, wird dies mit einem Beep bestätigt,
' dann blinkt LED1 kurz, die 4 LEDs zeigen die unteren 4 Bits der Adresse,
' es blinkt LED2, die 4 LEDs zeigen die Bits 5-8 der Adresse (ADR).
' Ein doppelter Beep zeigt an, dass jetzt der Befehlsteil (CMD) kommt. Die
' Anzeige erfolgt wie bei der Adresse als Low- und High-Nibble.
' Binär-Dezimal-Tabelle (4-Bit):
' WERT: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
' LED1-> 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
' LED2-> 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
' LED3-> 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
' LED4-> 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
'
' Der Dezimal-WERT kann in der 1. Zeile abgelesen werden, wenn
' man die zutreffende LED-Kombination aussucht (1->an, 0->aus).
' Der Wert des 2. Nibbles (high) kann genauso abgelesen werden,
' muss aber noch mit 16 multipliziert und zum 1. Nibble addiert
' werden, um den ganzen 8-Bit-Dezimalwert zu erhalten.
'
' Empfängt der Roboter keinen gültigen Code, so stellen Sie versuchsweise
' auf REC80 Format um (die entsprechende Anweisung ist bei der Initialisierung
' auskommentiert).
' Denken Sie auch daran, dass RC5 ein Toggle-Bit hat, das bei jeder Betätigung
' der Taste umgeschalten wird. Sie bekommen daher evtl. zwei verschiedene Werte
' für die Adresse.

'----------------------------------------------------------------------
'ACHTUNG:
' Der erste Schritt in der Initialisierung Ihres Programms sollte immer die Zeile

' REV_L=on:REV_R=on:SYS PLM_SLOW

' enthalten. Diese Zeile initialisiert die Ports für die Richtungsumschaltung
' des Antriebs und die PLM Frequenz. Initialisieren Sie die Ports auch, wenn der
' Antrieb nicht benutzt werden soll!

' DER BETRIEB DER MOTOREN OHNE DIESE INITIALISIERUNG FÜHRT UNWEIGERLICH ZUR
' ZERSTÖRUNG DER ANTRIEBSELEKTRONIK !!
'----------------------------------------------------------------------
'RESOURCEN:
' Sie finden hier sämtliche Systemroutinen, die zum Betrieb des Roboters
' notwendig sind.

' Folgende SYSTEMROUTINEN sind relevant:
'
' SYSTEM:
' SYS PLM_SLOW ;PLM-Frequenz für Antrieb setzen
' SYS SYSTEM ;System-Hauptroutine
' SYS COMNAV ;ACS/IR-COMM-Hauptroutine

' POWER:
' gosub SUBSYS_PWR_ON ;Schaltet die Subsysteme EIN/AUS
' gosub SUBSYS_PWR_OFF

' AUSGABE:
' gosub LEDxON ;zum Ein-/Ausschalten der LEDx (x = 1..4)
' gosub LEDxOFF
' gosub LEDSON ;schaltet alle 4 LEDs EIN/AUS
' gosub LEDSOFF

' ACS:
' gosub NO_ACS_INT ;Interruptbetrieb abgeschaltet
' gosub ACS_INT_200 ;Interruptbetrieb eingeschaltet
' SYS ACS_HI ;ACS HI POWER (SEHBEREICH ca. 30cm)
' SYS ACS_LO ;ACS LO POWER (SEHBEREICH ca. 10cm)
' SYS ACS_MAX ;ACS MAX POWER (SEHBEREICH ca. 50cm)
' SYS COMNAV_STATUS ;Abfrage des ACS

' ANTRIEB:
' SYS REVR ;Kette rückwärts laufen lassen R/L
' SYS RERL
' SYS FWDR ;Kette vorwärts laufen lassen R/L
' SYS FWDL
' SYS ROTR ;Auf der Stelle nach R/L drehen
' SYS ROTL
' SYS REV ;Rückwärts
' SYS FWD ;Vorwärts

' WEGSTRECKENZÄHLER:
' gosub CLR_DISTANCE ;Wegstreckenzähler löschen
' gosub L_DISTANCE ;Wegstreckenzähler lesen LINKS/RECHTS
' gosub R_DISTANCE

' IR-KOMMUNIKATION:
' gosub GET_IRDATA ;liefert empfangene IR-Daten in HBYTE und LBYTE
' (jeweils FF wenn nichts empfangen wurde)
' gosub SEND_IRDATA ;Sendet die Daten in HBBYTE und LBYTE
' gosub REC80 ;Stellt das Format ein
' gosub REC80_INT ;Aktiviert den Interruptbetrieb mit REC80 Format
' gosub RC5 ;Stellt das Format ein
' gosub RC5_INT ;Aktiviert den Interruptbetrieb mit RC5 Format
' SYS COMNAV_STATUS ;Abfrage des IRCOMM
' gosub ADDRESSED_MODE_ON ;IR-Kommunikation, adressierter Betrieb
' gosub ADDRESSED_MODE_OFF
' gosub WAIT_PING ;Auf Ping warten
' gosub SET_ADDRESS ;Die Adresse, welche der Roboter haben soll, wird
' in LBYTE übergeben
' gosub GET_ADDRESSED_DATA ;Empfängt einen Rahmen und isoliert die TX-Adresse
' gosub SEND_ADDRESSED_DATA ;Formatiert HBYTE entsprechend der Vereinbarung
' RX/TX-Adresse und sendet den Rahmen

' TELEMETRIE:
' SYS SEND_TLM ;Sendet die Werte in HBYTE und LBYTE
' gosub GET_TLM ;Empfängt TLM Werte und verteilt sie auf HBYTE u. LBYTE
' SYS SEND_SYSSTAT ;Sendet SYSTEMSTATUS (CH0)
' SYS SEND_SPEEDL ;Sendet die Werte der PLM D/A-Wandler
' SYS SEND_SPEEDR

'--------------------------
'------ I/O PORTS ---------
'--------------------------
'- INTERFACE LCD/EXTPORT --
define sdio port[1]
define sclio port[3]
define strobe port[4]
'-- INTERFACE COM/NAV -----
define DATALINE port[1]
define CLOCKLINE port[2]
'---- FREIE PORTS ---------
define FREIP7 port[7]
define FREIP8 port[8]
define FREIP9 port[9]
define FREIP10 port[10]
define FREIP11 port[11]
define FREIP12 port[12]
define FREIP13 port[13]
define FREIP14 port[14]
define FREIP15 port[15]
define FREIP16 port[16]
'--------------------------
'------ SENSORS ---------
'--------------------------
define FREIAD8 ad[8] 'freier A/D-Wandler
define LIGHT_L ad[7]
define LIGHT_R ad[6]
define SYS_VOLTS ad[3]
define CHRG_CURRENT ad[2]
define SYS_CURRENT ad[1]
define MIC ad[4]
define TOUCH ad[5]
'---------------------------
'------ DRIVE -------------
'---------------------------
define SPEED_L da[1]
define SPEED_R da[2]
define REV_L port[6]
define REV_R port[5]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
'--- INTERFACE BUFFER ----
define LBYTE byte[1]
define HBYTE byte[2]
define SUBCMD byte[3]
'---- OPERATION DATA ------
define EXTPORT byte[4]
define LED1_F bit[29]
define LED2_F bit[30]
define LED3_F bit[31]
define LED4_F bit[32]
define SYSTEM_STATUS byte[5]
define ACSL_F bit[33]
define ACSR_F bit[34]
define IR_F bit[35]
'--------------------------
'---- USER MEMORY -------
'--------------------------
define DEVICEADDRESS byte[6]
'User Memory ab BYTE[7] frei!
define WERT byte[7]
'--- SYSTEMROUTINEN -----------
define PLM_SLOW &H01C4
define SYSTEM &H01C9
define COMNAV &H0154
'- ERWEITERTE SYSTEM ROUTINEN -
define REVR &H0101 'ANTRIEB RECHTS RÜCKWÄRTS
define REVL &H0106 'ANTRIEB LINKS RÜCKWÄRTS
define FWDR &H010B 'ANTRIEG RECHTS VORWÄRTS
define FWDL &H0110 'ANTRIEB LINKS VORWÄRTS
define ROTR &H0115 'RECHTS DREHEN
define ROTL &H0119 'LINKS DREHEN
define REV &H011D 'RÜCKWÄRTS
define FWD &H0121 'VORWÄRTS
define COMNAV_STATUS &H0125 'UPDATED ALLE FLAGS IM STATUS-REGISTER
define ACS_LO &H01E1 'ACS POWER LO
define ACS_HI &H01E9 '
define ACS_MAX &H01F1 '
define SEND_TLM &H014A 'SENDET TELEMETRIE (CH=HBYTE,DATEN=LBYTE)
define SEND_SPEEDR &H0134 'SENDET TLM KANAL 8,PLM RECHTS
define SEND_SPEEDL &H013A 'SENDET TLM KANAL 7,PLM LINKS
define SEND_SYSSTAT &H0144 'SENDET TLM KANAL 0,SYSTEM STATUS
'(FLAGS für ACS, FWD/REV, ACS_LO/HI/MAX)
'---------- INIT---------------
' Freie Ports initialisieren:
FREIP7=off:FREIP8=off:FREIP9=off:FREIP10=off
FREIP11=off:FREIP12=off:FREIP13=off:FREIP14=off
FREIP15=off:FREIP16=off
' Subsysteme einschalten:
gosub SUBSYS_PWR_ON

beep 368,10,0:pause 50
gosub LEDSOFF 'Alle LEDs auf Robby aus
' ACS initialisieren:
'gosub NO_ACS_INT:beep 368,10,0:SYS ACS_HI 'Kein Interrupt, Power HI
'------------ ANTRIEB -------------------------
REV_L=on:REV_R=on:SYS PLM_SLOW
'----------------------------------------------------------------------
' Hier ggf. weitere Initialisierungs-Befehle!!!
'------- IR-FORMAT EINSTELLEN----------------
'gosub REC80
gosub RC5

'----------------------------------------------------------------------
' PROGRAMM:
#LOOP
gosub GET_IRDATA
if LBYTE and HBYTE = &HFF then goto LOOP
WERT = HBYTE 'Adresse (ADR)
Beep 368,50,0: pause 100
gosub LED_LONIBBLE
gosub LED_HINIBBLE
gosub LEDSOFF
Beep 368,25,0: pause 5: Beep 368,25,0
WERT = LBYTE 'Befehl (CMD)
gosub LED_LONIBBLE
gosub LED_HINIBBLE
gosub LEDSOFF
goto LOOP

'----------------------------------------------------------------------
' UNTERPROGRAMME:

'IIIIIIIIIIIIII Binärausgabe mit den 4 LEDs IIIIIIIIIIIIIII
'Die Variable WERT muss als BYTE oder WORD definiert sein.
'Ausgabe 1. Nibble (low):
#LED_LONIBBLE
gosub LEDSOFF: gosub LED1FLASH: gosub LED1FLASH
gosub LED1FLASH: gosub LED1FLASH: gosub LED1FLASH
if (WERT and &B1) <> 0 then gosub LED1ON
if (WERT and &B10) <> 0 then gosub LED2ON
if (WERT and &B100) <> 0 then gosub LED3ON
if (WERT and &B1000) <> 0 then gosub LED4ON
pause 100: return

'Ausgabe 2. Nibble (high):
#LED_HINIBBLE
gosub LEDSOFF: gosub LED2FLASH: gosub LED2FLASH
gosub LED2FLASH: gosub LED2FLASH: gosub LED2FLASH
if (WERT and &B10000) <> 0 then gosub LED1ON
if (WERT and &B100000) <> 0 then gosub LED2ON
if (WERT and &B1000000) <> 0 then gosub LED3ON
if (WERT and &B10000000) <> 0 then gosub LED4ON
pause 100: return

#LED1FLASH
gosub LED1ON: pause 5: gosub LED1OFF: pause 5: return
#LED2FLASH
gosub LED2ON: pause 5: gosub LED2OFF: pause 5: return

'Binär-Dezimal-Tabelle (4-Bit):
' WERT: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
' LED1-> 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
' LED2-> 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
' LED3-> 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
' LED4-> 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
'
' Der Dezimal-WERT kann in der 1. Zeile abgelesen werden, wenn
' man die zutreffende LED-Kombination aussucht (1->an, 0->aus).
' Der Wert des 2. Nibbles (high) kann genauso abgelesen werden,
' muss aber noch mit 16 multipliziert und zum 1. Nibble addiert
' werden, um den ganzen 8-Bit-Dezimalwert zu erhalten.

'----------------------------------------------------------------------

'IIIIIIIIIII LED DRIVER IIIIIIIIIIIIIIIII
#LED1ON
LED1_F=on:goto EXTPORT_WRITE
#LED1OFF
LED1_F=off :goto EXTPORT_WRITE
#LED2ON
LED2_F=on:goto EXTPORT_WRITE
#LED2OFF
LED2_F=off:goto EXTPORT_WRITE
#LED3ON
LED3_F=on:goto EXTPORT_WRITE
#LED3OFF
LED3_F=off:goto EXTPORT_WRITE
#LED4ON
LED4_F=on:goto EXTPORT_WRITE
#LED4OFF
LED4_F=off:goto EXTPORT_WRITE
#LEDSOFF
EXTPORT=EXTPORT and &H0F:goto EXTPORT_WRITE
#LEDSON
EXTPORT=EXTPORT or &HF0
#EXTPORT_WRITE
LBYTE=EXTPORT:SYS SYSTEM:RETURN

'IIIIII SYSTEMROUTINEN COMM/NAV SYSTEM IIIII
#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV:return
#GET_TLM
SUBCMD=1:sys COMNAV:LBYTE= LBYTE or (HBYTE shl 6)
HBYTE= HBYTE shr 2:return
#RC5
SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFC
HBYTE=00:SUBCMD=2:sys COMNAV:return
#RC5_INT
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE and &HFE)or 2
HBYTE=00:SUBCMD=2:sys COMNAV:return
#REC80
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H01)and&HFD
HBYTE=00:SUBCMD=2:sys COMNAV:return
#REC80_INT
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H03)
HBYTE=00:SUBCMD=2:sys COMNAV:return
#ADDRESSED_MODE_ON
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H10)
HBYTE=00:SUBCMD=2:sys COMNAV:return
#ADDRESSED_MODE_OFF
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE and &HEF)
HBYTE=00:SUBCMD=2:sys COMNAV:return
#WAIT_PING
SUBCMD=8:sys COMNAV:return
#SET_ADDRESS
SUBCMD=4:sys COMNAV:LBYTE= (HBYTE or &H10)
HBYTE=00:SUBCMD=2:sys COMNAV
LBYTE=DEVICEADDRESS:SUBCMD=5:sys COMNAV:return
#GET_ADDRESSED_DATA
SUBCMD=1:sys COMNAV:HBYTE=HBYTE and &H7:return
#SEND_ADDRESSED_DATA
HBYTE=(HBYTE shl 3)or DEVICEADDRESS:SUBCMD=0:sys COMNAV:return

'IIIIII SYSTEMROUTINEN SYSTEM IIIIIIIIIIII
#NO_ACS_INT
SUBCMD=4:sys COMNAV:LBYTE= HBYTE and &HFB
HBYTE=00:SUBCMD=2:sys COMNAV:return
#ACS_INT_200
SUBCMD=4:sys COMNAV:LBYTE= HBYTE or &H04
HBYTE=50:SUBCMD=2:sys COMNAV:return
#SUBSYS_PWR_ON
sdio=on:sclio=on:strobe=off:EXTPORT=(EXTPORT and &HFE)or 8
sys SYSTEM:return
#SUBSYS_PWR_OFF
EXTPORT=(EXTPORT and &HF7)or 1:sys SYSTEM
deact sdio:deact sclio:return


#CLR_DISTANCE
SUBCMD=3:sys COMNAV:return
#L_DISTANCE
SUBCMD=6:sys COMNAV:return
#R_DISTANCE
SUBCMD=7:sys COMNAV:return
'---------COM/NAV GERÄTEREIBER -------------
syscode "p5driv.s19"

Gruß Dirk

Hunter2
23.02.2009, 19:29
Wollte es auf den Roboter übertragen, aber der Compiler findet den "p5driv.s19" nicht. Fehlt mir eine Datei oder ein Update? Ich habe bisher seit der Installation keine Updates heruntergeldaen, verwende also immer noch die Version von 12/2003.

Dirk
23.02.2009, 19:44
der Compiler findet den "p5driv.s19" nicht
Der ist auf der CCRP5-CD dabei. Sonst schreib mir deine mailadresse per PN, dann schicke ich den!

Wenn du andere Programme kompilieren kannst, probier 'mal, die Zeile syscode "p5driv.s19" auszukommentieren oder zu löschen.
Wenn der Treiber noch in deinem CCRP5 gespeichert ist, müßte alles klappen.

Gruß Dirk

Hunter2
23.02.2009, 19:55
was hiesst hier kompilieren. ich klicke dann immer auf "an Gerät senden" und dann klappt es.

Dirk
23.02.2009, 20:00
Bei meiner IDE V1.33 muss man zuerst "Compilieren" (Ctrl+F9) und dann "In C-Control-Unit übertragen" (F12).

Gruß Dirk

Hunter2
24.02.2009, 09:45
dann ist bei mir aus. Dann muss ich die datei immer erst wieder neu öffnen, denn dann geht er in so ein komisches fenster, bei dem er nicht wieder zurückkommt.
Fehlt mir da ein Update?

Dirk
24.02.2009, 19:15
Dann muss ich die datei immer erst wieder neu öffnen, denn dann geht er in so ein komisches fenster, bei dem er nicht wieder zurückkommt.
Sag mal: Wie hast du denn vor dem "wieder ausgraben" deines CCRP5 eigene Programme geschrieben und in den CCRP5 geladen? Oder gehst du damit jetzt ganz neu um?

Gruß Dirk

Hunter2
25.02.2009, 06:27
Einfach. .bas-Datei oeffnen, auf Geraet uebertragen klicken, fertig.