PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe zum Thema: Sensoren Programmieren



Peter Pan
07.01.2007, 12:05
Hi

Ich habe mir gestern einen Robby RP5 gekauft und schon etwas herumprobiert.
Jetzt wollte ich das der Roboter richtung Licht fährt aber auch hindernissen ausweichen kann.
Dummerweise behindern sich die beiden Sensoren gegenseitig. Der Lichtsensor will geradeaus und der ACS ausweichen.

HELP!Könnte mir bitte jemand helfen!!!HELP!

Gruß
Peter Pan

oratus sum
07.01.2007, 13:16
Wie meinst du, dasss sie sich behindern? Es kann sein, dass die Lichtsensoren die Infrarot strahlen irgendwie erkennen aber bei dir ist es ja umgekehrt das die Lichtsensoren weiter fahren wollen und ACS nicht!

Versucht mal die ACS auf LOW zu setzen:

SYS ACS_LO

Dirk
07.01.2007, 20:08
Hallo Peter Pan,


Dummerweise behindern sich die beiden Sensoren gegenseitig. Der Lichtsensor will geradeaus und der ACS ausweichen.

Wenn das so ist, dann ist das kein Problem der Hardware, sondern ein Problem deiner Programmierung.

Also müßtest du dein Prog hier posten und beschreiben, was du genau machen willst.

Gruß Dirk

Peter Pan
07.01.2007, 20:36
Hi

Also ich wollte das der bot auf eine Lichtquelle zufährt, aber trotzdem hindernissen ausweichen kann.


'--------------------------------------------------------
'---- 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]
'
'--------------------------------------------------------
'---- SENSORS ----
'--------------------------------------------------------
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 GP byte[6]
define MAXLIGHT byte[7]
define GP1 byte[8]
'
'-------------------- 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 --------------------------
gosub SUBSYS_PWR_ON
beep 368,10,0:pause 50
'
'--------- SYSTEM OPERATION MODE (NO INTERRUPT) ---------
gosub NO_ACS_INT:beep 368,10,0:SYS ACS_LO
'
'--------------------- ANTRIEB --------------------------
REV_L=on:REV_R=on:SYS PLM_SLOW
'
'
'
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIII
'III Programm III
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIII
'

#loop
pause 5:SYS COMNAV_STATUS
if ACSL_F=on then gosub LED4ON else gosub LED4OFF
if ACSR_F=on then gosub LED1ON else gosub LED1OFF
if (ACSL_F and ACSR_F)=on then goto rotate
if ACSL_F=on then goto move_right
if ACSR_F=on then goto move_left
'
if (LIGHT_L-LIGHT_R) >10 then goto rotleft_fast
if (LIGHT_R-LIGHT_L)>10 then goto rotright_fast
if (LIGHT_L-LIGHT_R) >2 then goto rotleft
if (LIGHT_R-LIGHT_L)>2 then goto rotright
SYS FWDR:SYS FWDL:SPEED_L=100:SPEED_R=100:goto loop
'
#rotleft
SYS ROTL:SPEED_L=100:SPEED_R=100:goto loop
#rotleft_fast
SYS ROTL:SPEED_L=150:SPEED_R=150:goto loop
#rotright
SYS ROTR:SPEED_L=100:SPEED_R=100:goto loop
#rotright_fast
SYS ROTR:SPEED_L=150:SPEED_R=150:goto loop
'
#move_right
SPEED_R=100:SPEED_L=255:goto loop
#move_left
SPEED_L=100:SPEED_R=255:goto loop
#rotate
SPEED_L=150:SPEED_R=150:SYS ROTR:goto loop
'
'
'
'---------------------------------------------------------
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIII
'---------------------------------------------------------
'
'IIIIIIIIIIIIIIIIIIIIII LED DRIVER IIIIIIIIIIIIIIIIIIIIIII
'
#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
#EXTPORT_WRITE
SYS SYSTEM:pulse STROBE:RETURN
'
'IIIIIIIIIII SYSTEMROUTINEN COMM/NAV SYSTEM IIIIIIIIIIII

#GET_IRDATA
SUBCMD=1:sys COMNAV:return
#SEND_IRDATA
SUBCMD=0:sys COMNAV: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
'
'IIIIIIIIIIIIIII SYSTEMROUTINEN SYSTEM IIIIIIIIIIIIIIIII

#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"


Und noch mal danke für die schnellen antworten!!!

Peter Pan
21.01.2007, 10:10
Hallo

Ich will ja nicht unhöflich sein aber könnte mir bitte jemand weiter helefn...
Das wäre sehr nett!!!

sidvicious
01.02.2007, 19:48
hallo,

also ich habe dein listing nur kurz durchgeschaut... sorry für die flüchtigkeit

ich glaube der fehler liegt bei deiner lichtberechnung...

die beiden helligkeitssensoren liefern werte zwischen 0 und 255...


die formel müsste etwa so aussehen:

if light(r)>light(l) then goto rotate left
if light(l)>light(r) then goto rotate right

also wenn der rechte sensor mehr licht sieht soll er nach links drehen
und wenn der linke mehr licht sieht soll er nach rechts drehen...

viel glück weiterhin - nur briefe gibt man auf ;-)

Jon
01.02.2007, 19:58
if light(r)>light(l) then goto rotate left
if light(l)>light(r) then goto rotate right

also wenn der rechte sensor mehr licht sieht soll er nach links drehen
und wenn der linke mehr licht sieht soll er nach rechts drehen...
Genau andersrum.
Peter Pan will, dass der Bot zum hellsten Punkt fährt.
Aber sonst sollte es so stimmen. Es fehlt hat die Rotationsgeschwindigkeit, rotierst du aber zu schnell, so ist die Ausrichtung relativ ungenau. Deswegen würde ich mir eher mehr Zeit lassen, als ungenau zu fahren.

jon

sidvicious
01.02.2007, 20:18
ja ja die flüchtigkeit....

du hast recht... asche auf mein haupt...

der interessante teil der geschichte sollte halt sein das die sensorwerte nicht abgezogen werden sollten like this:

if (LIGHT_L-LIGHT_R) >10 then goto rotleft_fast
if (LIGHT_R-LIGHT_L)>10 then goto rotright_fast
if (LIGHT_L-LIGHT_R) >2 then goto rotleft
if (LIGHT_R-LIGHT_L)>2 then goto rotright

sondern einfach nur verglichen werden sollten.
deine anregung mit der rotationsgeschwindigkeit ist natürlich auch sehr interessant.