Pagina 1 van 1

HELP! Basic stamp, ik kan er niks mee

Geplaatst: di 28 nov 2006, 23:43
door hansr
Ik ben bezig met een projectje om een basic stamp te gebruiken om 2 servomotoren aan te sturen. dit is geen probleem en dit werkt ook al.

Wat ik nu wil bereiken is het volgende:

Ik wil met een philips (RC5) afstandsbediening een opdracht geven en de basicstamp moet dit verwerken. dit klinkt makkelijk maar ik kom er niet uit!

Wat wil ik weten?

Uit het philips protocol komt naar voren dat er eerst een startbit komt. Dan volgt er een togglebit om vervolgens een reeks van 5 bitjes te sturen waar de machinecode in zit. de laatste bitstroom van 6 bitjes bevat de werkelijke instructie.

Ik zou graag willen weten hoe ik de bitstroom opvang in een geheugen of register en hoe ik de voor mij relevante informatie verwerk zodat ik handelingen aan de opdrachten kan koppelen.

nu heb ik het volgende programma gevonden wat iets doet met de rc5 code:

' ==============================================================================
'
' File...... IRB RC-5 Control.BS2
' Purpose... Simple RC-5 Control Demonstration
' Author.... Parallax
' E-mail.... stamptech@parallaxinc.com
' Started...
' Updated... 25 NOV 2002
'
' {$STAMP BS2}
' {$PBASIC 2.5}
'
' ==============================================================================


' ------------------------------------------------------------------------------
' Program Description
' ------------------------------------------------------------------------------

' This program uses the Parallax IR Buddy to receive and decode RC-5 commands
' from a multi-function remote control. Numbers 1 - 4 are converted into pin
' controls. LEDs are used to display the state of each control pin.
'
' This program is system code sensitive, allowing the same remote to indepen-
' dently control multiple projects without interference.
'
' Remote #1 toggles pin 0
' Remote #2 toggles pin 1
' Remote #3 toggles pin 2
' Remote #4 toggles pin 3
'
' Note that repeated keys are ignored to prevent possible problems from rapid
' toggling of the device connected to the IO control pin.


' ------------------------------------------------------------------------------
' Revision History
' ------------------------------------------------------------------------------


' ------------------------------------------------------------------------------
' I/O Definitions
' ------------------------------------------------------------------------------

IRbSIO PIN 15 ' IR Buddy serial I/O

Ports VAR OUTA ' LED / device control pins
Port1 PIN 0
Port2 PIN 1
Port3 PIN 2
Port4 PIN 3


' ------------------------------------------------------------------------------
' Constants
' ------------------------------------------------------------------------------

IRbRc5Rx CON $72 ' RC5 protocol RX

IRb96 CON 84 + $8000 ' 9600 baud, open
IRb48 CON 188 + $8000 ' 4800 baud, open
IRb24 CON 396 + $8000 ' 2400 baud, open
IRbBaud CON IRb96

BufEnd CON 254 ' end of buffer
System CON 0 ' system code for this Stamp

LedOn CON 1
LedOff CON 0
AllOn CON %1111
AllOff CON %0000

Mute CON 13 ' "Mute" key on Philips remote


' ------------------------------------------------------------------------------
' Variables
' ------------------------------------------------------------------------------

buffer VAR Byte(8) ' RC-5 RX buffer
idx VAR Nib ' loop counter
sysCode VAR Byte ' received system code
cmdCode VAR Byte ' received command code


' ------------------------------------------------------------------------------
' EEPROM Data
' ------------------------------------------------------------------------------


' ------------------------------------------------------------------------------
' Initialization
' ------------------------------------------------------------------------------

Setup:
Ports = AllOff ' all outputs off
DIRA = %1111 ' all ports are outputs

GOSUB IR_Buddy_Reset


' ------------------------------------------------------------------------------
' Program Code
' ------------------------------------------------------------------------------

Main:
DO
SEROUT IRbSIO, IRbBaud, [IRbRc5Rx, 10] ' start RC-5 RX
SERIN IRbSIO, IRbBaud, [STR buffer\8\255] ' get data
GOSUB Process_Commands
PAUSE 500 ' give IR Buddy time to work
LOOP

END

' ------------------------------------------------------------------------------
' Subroutines
' ------------------------------------------------------------------------------

Process_Commands:
FOR idx = 0 TO 6 STEP 2
sysCode = buffer(idx) ' extract system code
IF (sysCode = System) THEN ' system valid, check command
cmdCode = buffer(idx + 1) ' extract command
SELECT cmdCode ' compare with good values
CASE 1 TO 4 ' numbers 1 - 4
TOGGLE (cmdCode - 1)

CASE Mute ' "Mute" button
Ports = AllOff
ENDSELECT
ENDIF
NEXT
RETURN


' Reset the IR Buddy. This code is useful for clearing data from the RX
' buffer and prepping to switch modes. Timing specific; do not change.

IR_Buddy_Reset:
LOW IRbSIO ' signal reset
PAUSE 5
INPUT IRbSIO ' release reset signal
PAUSE 50 ' allow time for reset actions
RETURN




Bovenstaand programma vangt dus wel iets op alleen het moet nog verwerkt worden zodat er ook een handeling aan de opdracht wordt gekoppeld. Zou iemand dit programma kunnen verduidelijken wat het nu precies doet?

Al vast bedankt voor de moeite! en ik bied een taartje voor de gene met het verlossende antwoord!

Geplaatst: di 28 nov 2006, 23:50
door KT88
Nofi, maar volgens mij kun je dit beter eens gaan vragen op http://www.circuitsonline.net .
Daar zitten de electronica-en programmernerds (dat mag ik zeggen, ja) voor wie dit gesneden koek is.

Hier zullen er ook wel zijn die dit weten, maar de relatie met audio is wat onduidelijk vrees ik.

In ieder geval succes met je project.

Geplaatst: wo 29 nov 2006, 9:11
door Fixation
pff basic... tsja daar ben ik ook niet zo geweldig in.. geef mij maar C.

maar als ik er zo even gauw naar kijk:

zit er een IR-ontvanger aangesloten op een seriele poort. de code stuurt eerst een startcommando uit (SEROUT), daarna wordt de data dus het toggle bit en commando opgeslagen in een buffer.

onder het kopje subroutines wordt de data dan verwerkt. Eerst wordt gekeken of de systeem code klopt, dus dat de code echt voor jouw bedoeld is.

sysCode = buffer(idx) ' extract system code
IF (sysCode = System) THEN ' system valid, check command


als dat zo is wordt gekeken of he commando wat je ontvangen hebt geldig is.

cmdCode = buffer(idx + 1) ' extract command
SELECT cmdCode ' compare with good values


dan wordt er op basis van de cmdCode gekozen tussen 1 van de 4 mogelijkheden in de CASE statement.

is dan de waarde van cmdCode gelijk aan de waarde van Case wordt er op deze manier code uitgevoerd die bij dat commando hoort.

CASE Mute ' "Mute" button
Ports = AllOff
ENDSELECT
ENDIF
NEXT
RETURN



voor de rest zijn het puur initalisaties en resets van buffers

Als er nog vragen zijn wil ik het een en ander nog wel wat verduidelijken zo goed ik kan.

groetjes Fix

Geplaatst: wo 29 nov 2006, 11:22
door hansr
Okey Fixation!

Bedankt in ieder geval voor uw antwoord!

Ik ben er al achter dat ik met dit programma niks kan. Ik zie dat er iets op een seriele poort aangesloten zit van de pc en dit is niet de bedoeling.

Wat ik wil doen is dat ik een infraroodsensor op een ingang van de basic stamp aansluit en dat ik dan met de basic stamp de rc5 code decodeer. De code die wordt opgevangen moet vervolgens verwerkt worden zodat er een motor begint te draaien in een bepaalde richting, zodat het geheel in een bepaalde richting kan rijden. De motors laten draaien lukt al.

Waar ik mee zit is het opvangen van het rc5 signaal en de verwerking hiervan. Zou iemand mij hierin opweg kunnen helpen?

Ik zal ook eens even een kijkje nemen op circuitsonline.nl.

Bedankt voor zover voor jullie hulp! Als iemand nog een idee heeft hoor ik het graag!

Hans

Geplaatst: wo 29 nov 2006, 13:04
door Fixation
weet je dat zeker dat die aangesloten is op de seriele poort van een pc??? ik zie dat namelijk nergens staan in de code hoor.

Wat ik uitlegde is het opvangen van het RC5 signaal :roll:

sysCode = buffer(idx) ' extract system code
IF (sysCode = System) THEN ' system valid, check command
cmdCode = buffer(idx + 1) ' extract command
SELECT cmdCode ' compare with good values


hier wordt toch echt de opgeslagen rc5-code uit elkaar gehaalt en geanalyseerd.

buffer is je complete RC5-code ( dus start+ toggle + 5 bits machinecode + 6 bits instructie)

cmdCode is van je RC5 code de laatste bitjes (werkelijke instructie)

je kan met dit stukje code prima RC5 ontvangen en verwerken.

even klein voorbeeldje in C, ik ken de basic syntax niet

CODE: Selecteer alles

# define left     0x01
# define right   0x02
# speed_up     0x03
# speed_up     0x04

//als je dan in je main loop de rc5 code analyseert. kan je met een switch
// statement op basis van verschillende codes verschillende verwerkingen
// hebben. vb:

Switch ( cmdCode) { 
        
        case:  left
            zet hier het stukje code om naar links te gaan
            break;
        
        case: right
            zet hier het stukje code om naar rechts te gaan
            break;
        
        case: speed_up
            zet hier het stukje code om sneller te gaan
            break;

        case: speed_down
            zet hier het stukje code om langzamer te gaan
            break;

// let op syntax zal wel niet helemaal kloppen.. 

snap je een beetje wat ik hier probeer te doen?

p.s. waar komt de code vandaan dan zal ik daar eens naar kijken.

Geplaatst: wo 29 nov 2006, 13:31
door hansr
volgens mij geeft u eerst een definitie aan de ontvangen code's.
vervolgens worden de codes gekoppeld aan een functie, in dit geval vooruit achteruit etc. zodat wanneer er een code wordt gedetecteerd de bijbehorende functie begint te starten als ik het goed heb?

Geplaatst: wo 29 nov 2006, 13:59
door Fixation
jeps klopt helemaal....

elke knop op een afstandsbediening zal een andere code hebben. wat de code van die knoppen van jou afstandsbediening zijn weet ik helaas niet.

ik weet niet of je daar al iets voor hebt gevonden? wat je bijvoorbeeld kan doen is een lcd-tje er aan kunnen hangen en dan de waarde van cmdCode naar je lcdtje sturen. zo zal je wanneer je een knop indrukt de waarde op je lcdtje ziet.

over de defines:
door gebruik te maken van definities wordt het geheel overzichtelijker.

er had ook kunnen staan:

CODE: Selecteer alles

case: 0x01
              doe iets leuks
  
de compiler vervangt al die definities toch door getallen.

volgens mij kan je nou wel stukje verder komen?

Geplaatst: wo 29 nov 2006, 14:11
door hansr
Fixation eerst bedankt! Ik denk dat ik de struktuur van de basictaal voor deze basicstamp een beetje begin te snappen. Ik ga eens even een weekendje stoeien met het programmeren om te zien of ik er uitkom. Als het lukt zou het leuk zijn en anders kom ik gewoon weer vragen!

Ik hou jullie in iedergeval op de hoogte van de vorderingen!

in ieder geval bedankt tot nu toe!

Geplaatst: wo 06 dec 2006, 23:20
door Fixation
ben stiekem toch wel beetje benieuwd of het gelukt is met je code???

Geplaatst: do 07 dec 2006, 18:41
door hansr
Beste fixation & anderen,

Ben er wel iets verder mee gekomen maar het werkt nog niet helemaal. I.v.m sinterklaas drukte en alle bijbaantjes die een student :P heeft bleef er dit weekend niet veel tijd over. Hier toch even het stuk code wat ik tot nu toe heb! ben er nog mee bezig maar omdat dit eigenlijk mijn eerste keer is dat ik echt programmeer, is dit allemaal even wennen en uitproberen. Gelukkig is dit nog redelijk toegankelijk en het hoeft ook niet in 1 week klaar gelukkig.

DE CODE:


' {$STAMP BS2}
' ------------------------------------------------------------------------------
' Program Description
' ------------------------------------------------------------------------------

' This program decodes RC-5 commands from a philips remote control.
'
' Note that repeated keys are ignored to prevent possible problems from rapid
' toggling of the device connected to the IO control pin.


'-------------------------------------------------------------------------------
' I/O Definitions
' ------------------------------------------------------------------------------


ports VAR OUTA 'led and device controlpins
Port1 CON 1 'SERVOMOTOR LEFT
Port2 CON 2 'SERVOMOTOR RIGHT



' ------------------------------------------------------------------------------
' Constants
' ------------------------------------------------------------------------------

IRbRc5Rx CON $72 ' RC5 protocol RX

IRb96 CON 84 + $8000 ' 9600 baud, open
IRb48 CON 188 + $8000 ' 4800 baud, open
IRb24 CON 396 + $8000 ' 2400 baud, open
IRbBaud CON IRb96

BufEnd CON 254 ' end of buffer
System CON 0 ' system code for this Stamp

ALLon CON %1111
ALLoff CON %0000

right_wheel CON 3 'right servomotor
left_wheel CON 15 'left servomotor

IRSENSE CON 0 ' IR sensor input

' ------------------------------------------------------------------------------
' Variables
' ------------------------------------------------------------------------------

buffer VAR Byte(8) ' RC-5 RX buffer
idx VAR Nib ' loop counter
sysCode VAR Byte ' received system code
cmdCode VAR Byte ' received command code
x VAR Byte
value VAR Byte

' ------------------------------------------------------------------------------
' EEPROM Data
' ------------------------------------------------------------------------------


' ------------------------------------------------------------------------------
' Initialization
' ------------------------------------------------------------------------------

Setup:
Ports = AllOff ' all outputs off
DIRA = %1111 ' all ports are outputs

GOSUB IR_Buffer_Reset


' ------------------------------------------------------------------------------
' Program Code
' ------------------------------------------------------------------------------

top:

GOSUB read_ir
IF value=1 THEN forward
IF value=7 THEN back
IF value=3 THEN left
IF value=5 THEN right

forward:
GOSUB go_forward
GOTO top

back:
GOSUB go_reverse
GOTO top

left:
GOSUB go_left
GOSUB go_left
GOTO top

right:
GOSUB go_right
GOSUB go_right
GOTO top

read_ir:
DO
SEROUT IRSENSE, IRbBaud, [IRbRc5Rx, 10] ' start RC-5 RX
SERIN IRSENSE, IRbBaud, [STR buffer\8\255] ' get data
GOSUB Process_Commands
PAUSE 500 ' give IR sensor time to work
LOOP
END

go_forward
FOR x=1 TO 20
PULSOUT left_wheel,650
PULSOUT right_wheel,850
PAUSE 20
NEXT
RETURN

go_reverse
FOR x=1 TO 20
PULSOUT left_wheel,850
PULSOUT right_wheel,650
PAUSE 20
NEXT
RETURN

go_left
FOR x=1 TO 10
PULSOUT left_wheel,650
PULSOUT right_wheel,650
PAUSE 20
NEXT
RETURN

go_right
FOR x=1 TO 10
PULSOUT left_wheel,850
PULSOUT right_wheel,850
PAUSE 20
NEXT
RETURN

' ------------------------------------------------------------------------------
' Subroutines
' ------------------------------------------------------------------------------

Process_Commands:
FOR idx = 0 TO 6 STEP 2
sysCode = buffer(idx) ' extract system code
IF (sysCode = System) THEN top' system valid, check command
cmdCode = buffer(idx + 1) ' extract command

SELECT:
TOGGLE (cmdCode - 1)

'--------------------------------------------------------------------------------
' Reset the IR buffer.
'--------------------------------------------------------------------------------
IR_buffer_Reset:
LOW IRSENSE ' signal reset
PAUSE 5
INPUT IRSENSE ' release reset signal
PAUSE 50 ' allow time for reset actions
RETURN