Geachte Forumlezers,

In Elektuur magazine november 2004 stond een artikel over de Bluetooth afstandsbediening met een PDA.
De schakeling uit deze magazine heb ik gebouwd en getest.... werkt oke!

Het hart van deze schakeling is een Basic Stamp van Parallax.
Ik heb gekozen voor de BS2 versie.

Op de elektuur website heb ik de Gratis software 040186-11.zip gedownload. Ik zag dat deze software paket geschreven is voor de Bs2p versie.

De "Robot" FXP-bestand en de "Robot Runtime" Basic Stamp source code zijn gescheven voor de BS2p en kan ik dus niet in de mijn Bs2 programmeren.

Nu is mijn vraag:

- Wat moet ik aan de "Robot" FXP-bestand en de "Robot Runtime" Basic Stamp source code veranderen zodat ik het in mijn Basic Stamp 2 kan programmeren......?

- Heeft misschien iemand de 2 file`s kant en klaar voor mij liggen, zodat ik ze meteen in de BS2 kan programmeren?

Alvast heel erg bedankt!

vriendelijke groet,

A. van Dusschoten

ik zou dat emailadres weghalen. spamgevaar.
heb je zelf ook een texteditor voor de broncode? (waarschijnlijk BASIC?) en dan opslaan als.....

Je vindt de mensen van Hogent toch overal...
Zou je niet beter je code zelf herschrijven? Een groot deel van je programma blijft toch hetzelfde denk ik als er natuurlijk geen gebruik gemaakt wordt van I²C (is enkel compatibel met BS2P en niet met BS2), dan zal een grotere aanpassing nodig zijn.
groeten

ik denk dat de kans groot is dat er een probleem komt in de kloksnelheid. kan de BS2 dat wel aan?

Heel erg bedankt voor het mee denken allemaal!
Ik heb zelf niet zo heel erg veel verstand van Basic Stamps en wat het verschil er tussen is....

In de onderdelenlijst van het artikel over de Bluetooth afstandsbediening met een PDA,
(Elektuur magazine november 2004) stond IC1 = Basic stamp (parallax BS2, BS2sx, BS2e of BS2p) gebruikt konden worden. Wij hebben destijds gekozen voor de BS2 versie.

We zijn nu aan het achterhalen of de BS2 de programma`s wel aan kan of het wat met de kloksnelheid te maken heeft wat MAH ook al denkt.

Weet iemand een manier hoe je kan zien of de kloksnelheid inderdaad te traag is.

vriendelijke groet

A.Dusschoten

Probeer het bestand voor de grap eens te openen in pbasic (down te loaden op www.parallax.com), misschien staat er commentaar bij?

Anders kan je gewoon proberen om het programma te hernoemen van .bsp naar .bs2, misschien dat het zo werkt, aangezien het intepreter IC`s zijn, als er geen BSP commando`s gebruikt worden.

Anders even de source posten als datr mag (?) dan kunnen wij misschien helpen...

In de Basic Stamp moeten 2 programma`s geladen worden.

In Flexipanel Disigner wordt een source code gegenereert waarmee de Flexipanel hardware geprogrammeerd kan worden. met de PC en de Basic stamp editor wordt dit onderdeel gedownload naar de stamp, waar het programma uitgevoerd kan worden.

Dit is het programma:

' Robot.bsp
'
' BS2p code for programming Elektor Robot control panel
'
' Created at 17:52:58 on 4/27/04
'
' Tx pin output from stamp to Rx pin on FlexiPanel: P2
' CTS pin input to Stamp from RTS pin on FlexiPanel: P6
' Rx pin input to Stamp from Tx pin on FlexiPanel: P4
' RTS pin output from Stamp to CTS pin on FlexiPanel: P8
'
' Data pin input to Stamp from Data pin on FlexiPanel: P12
'
'-------------------------------------------------------------------------------------------

' Initialization

'{$STAMP BS2p}

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

' Data

ROMData DATA $07, $00, $00, $00, $00, $00, $45, $6C, $65, $6B, $74, $6F, $72, $20, $52, $6F
DATA $62, $6F, $74, $00, $00, $00, $00, $03, $E6, $01, $0A, $00, $C4, $00, $00, $00
DATA $ED, $00, $29, $00, $04, $00, $04, $00, $00, $00, $10, $00, $01, $02, $01, $4E
DATA $01, $00, $00, $00, $F1, $00, $04, $00, $0A, $01, $19, $00, $01, $00, $01, $00
DATA $00, $00, $00, $00, $01, $02, $01, $47, $02, $00, $00, $00, $0B, $01, $05, $00
DATA $21, $01, $16, $00, $01, $00, $01, $00, $00, $00, $00, $00, $01, $02, $01, $47
DATA $03, $00, $00, $00, $22, $01, $06, $00, $39, $01, $17, $00, $01, $00, $01, $00
DATA $00, $00, $00, $00, $01, $02, $01, $47, $04, $00, $00, $00, $3A, $01, $07, $00
DATA $50, $01, $16, $00, $01, $00, $01, $00, $00, $00, $01, $00, $01, $02, $01, $47
DATA $05, $00, $00, $00, $51, $01, $08, $00, $6A, $01, $19, $00, $01, $00, $01, $00
DATA $00, $00, $00, $00, $01, $02, $01, $47, $06, $00, $00, $00, $6B, $01, $09, $00
DATA $E6, $01, $7B, $00, $94, $01, $00, $00, $00, $00, $55, $01, $01, $02, $01, $4D
DATA $07, $00, $01, $00, $04, $00, $00, $00, $5A, $66, $64, $6D, $07, $00, $00, $00
DATA $42, $65, $61, $72, $69, $6E, $67, $02, $00, $00, $00, $25, $25, $04, $00, $00
DATA $00, $01, $00, $00, $00, $04, $00, $00, $00, $FF, $FF, $FF, $FF, $00, $00, $00
DATA $00, $02, $00, $00, $00, $5A, $72, $07, $00, $00, $00, $46, $6F, $72, $77, $61
DATA $72, $64, $04, $00, $00, $00, $01, $00, $00, $00, $00, $02, $00, $00, $00, $5A
DATA $72, $04, $00, $00, $00, $4C, $65, $66, $74, $04, $00, $00, $00, $01, $00, $00
DATA $00, $00, $02, $00, $00, $00, $5A, $72, $05, $00, $00, $00, $52, $69, $67, $68
DATA $74, $04, $00, $00, $00, $01, $00, $00, $00, $00, $02, $00, $00, $00, $5A, $72
DATA $04, $00, $00, $00, $53, $74, $6F, $70, $04, $00, $00, $00, $01, $00, $00, $00
DATA $00, $02, $00, $00, $00, $5A, $72, $07, $00, $00, $00, $52, $65, $76, $65, $72
DATA $73, $65, $04, $00, $00, $00, $01, $00, $00, $00, $00, $0B, $00, $00, $00, $5A
DATA $6E, $4E, $66, $46, $61, $41, $64, $44, $6D, $4D, $0B, $00, $00, $00, $52, $6F
DATA $75, $74, $65, $20, $74, $72, $61, $63, $65, $04, $00, $00, $00, $64, $00, $00
DATA $00, $04, $00, $00, $00, $01, $00, $00, $00, $04, $00, $00, $00, $25, $25, $20
DATA $6D, $04, $00, $00, $00, $25, $25, $20, $6D, $0A, $00, $00, $00, $58, $20, $70
DATA $6F, $73, $69, $74, $69, $6F, $6E, $0B, $00, $00, $00, $59, $20, $70, $6F, $73
DATA $69, $74, $69, $6F, $6E, $00, $04, $00, $00, $00, $03, $00, $00, $00, $04, $00
DATA $00, $00, $03, $00, $00, $00, $04, $00, $00, $00, $FD, $FF, $FF, $FF, $04, $00
DATA $00, $00, $FD, $FF, $FF, $FF, $00, $03, $07, $00, $E0, $01, $0B, $00, $00, $03
DATA $07, $00, $50, $01, $00, $00, $00, $03, $00, $00, $00, $03, $03, $00, $00, $03
DATA $01, $00, $D0, $01, $04, $00, $00, $03, $01, $00, $C0, $01, $07, $00, $00, $03
DATA $02, $00, $E0, $01, $02, $00, $00, $03, $03, $00, $E0, $01, $04, $00, $00, $03
DATA $04, $00, $E0, $01, $06, $00, $00, $03, $05, $00, $E0, $01, $05, $00, $00, $03
DATA $06, $00, $E0, $01, $08, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00

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

' Variables

cdata VAR Byte
ack VAR Byte(3)
i VAR Word

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

' Start of code

' Initialize Serial Port

DIR2 = 1 ' Tx to FxP (SEROUT output from Stamp)
OUT2 = 1 ' Initialize Tx as high
DIR6 = 0 ' CTS from FxP (SEROUT flow control input to Stamp)
DIR4 = 0 ' Rx from FxP (SERIN input to Stamp)
DIR8 = 1 ' RTS to FxP (SERIN flow control output from Stamp)
OUT8 = 1 ' Initialize RTS as high
DIR12 = 0 ' Data from FxP (SERIN input to Stamp)

' Wait 50 ms for FxP to initialize; if you use pullup resistors on CTS/Rx this is not needed

PAUSE 50

' Program ROM

DEBUG "Programming ROM...", CR
SEROUT 2\6, 110, [$81, $24]
FOR i = 0 TO $23F
READ ROMData+i, cdata
SEROUT 2\6, 110, [cdata]
NEXT
DEBUG "Awaiting acknowledge...", CR
SERIN 4\8, 110, [STR ack\3]
DEBUG "Acknowledge: ", STR ack\3, CR

' Finished

STOP

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

' The following constants will be useful:

TxPin CON 2 ' Transmit pin (from stamp)
RxPin CON 4 ' Receive pin (to Stamp)
CTSPin CON 6 ' Transmit flow control pin (input to Stamp)
RTSPin CON 8 ' Receive flow control pin (output from Stamp)
DataPin VAR IN12 ' Data ready pin (input to Stamp)
BaudM CON 110 ' Baud mode

AckData CON $05 ' Acknowledge data signal (sends DataPin low again)
GetData CON $01 ' Get control data command
SetData CON $02 ' Set control data command
SetRow CON $06 ' Set a row of matrix data command
AddRow CON $07 ' Append a row of matrix data command
GetMod CON $03 ' Get modified control command
ShowMsg CON $04 ' Show message command
ID_Bearing CON $01 ' Bearing control ID
ID_Forward CON $02 ' Forward control ID
ID_Left CON $03 ' Left control ID
ID_Right CON $04 ' Right control ID
ID_Stop CON $05 ' Stop control ID
ID_Reverse CON $06 ' Reverse control ID
ID_Route_trace CON $07 ' Route_trace control ID

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

' Use the following sample code to set up the Stamp I/O
'
' DIR2 = 1 ' Tx to FleixPanel (SEROUT output from Stamp)
' OUT2 = 1 ' Initialize Tx as high
' DIR6 = 0 ' CTS from FleixPanel (SEROUT flow control input to Stamp)
' DIR4 = 0 ' Rx from FleixPanel (SERIN input to Stamp)
' DIR8 = 1 ' RTS to FleixPanel (SERIN flow control output from Stamp)
' OUT8 = 1 ' Initialize RTS as high
' DIR12 = 0 ' Data from FleixPanel (SERIN input to Stamp)

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

' Use the following sample code to read the value of the 'Bearing' number control:
'
' hiword VAR WORD
' loword VAR WORD
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Bearing]
' serin RxPin\RTSPin, BaudM, [loword.LOWBYTE, loword.HIGHBYTE, hiword.LOWBYTE, hiword.HIGHBYTE]

' Use the following sample code to set the value of the 'Bearing' number control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Bearing, loword.LOWBYTE, loword.HIGHBYTE, hiword.LOWBYTE, hiword.HIGHBYTE]

' Note that all four bytes must be read or written each time, even if you don't use them all

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

' Use the following sample code to read data from the 'Forward' latch control:
'
' cdata VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Forward]
' serin RxPin\RTSPin, BaudM, [cdata]

' Use the following sample code to switch on the 'Forward' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Forward, $FF]

' Use the following sample code to switch off the 'Forward' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Forward, $00]

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

' Use the following sample code to read data from the 'Left' latch control:
'
' cdata VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Left]
' serin RxPin\RTSPin, BaudM, [cdata]

' Use the following sample code to switch on the 'Left' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Left, $FF]

' Use the following sample code to switch off the 'Left' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Left, $00]

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

' Use the following sample code to read data from the 'Right' latch control:
'
' cdata VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Right]
' serin RxPin\RTSPin, BaudM, [cdata]

' Use the following sample code to switch on the 'Right' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Right, $FF]

' Use the following sample code to switch off the 'Right' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Right, $00]

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

' Use the following sample code to read data from the 'Stop' latch control:
'
' cdata VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Stop]
' serin RxPin\RTSPin, BaudM, [cdata]

' Use the following sample code to switch on the 'Stop' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Stop, $FF]

' Use the following sample code to switch off the 'Stop' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Stop, $00]

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

' Use the following sample code to read data from the 'Reverse' latch control:
'
' cdata VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetData, ID_Reverse]
' serin RxPin\RTSPin, BaudM, [cdata]

' Use the following sample code to switch on the 'Reverse' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Reverse, $FF]

' Use the following sample code to switch off the 'Reverse' latch control:
'
' serout TxPin\CTSPin, BaudM, [SetData, ID_Reverse, $00]

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

' Use the following sample code to set a row of data in 'Route_trace' matrix control:
'
' row VAR WORD ' 0 to 99
' ydata1 VAR WORD
' xdata VAR WORD
'
' serout TxPin\CTSPin, BaudM, [SetRow, ID_Route_trace, row.LOWBYTE, row.HIGHBYTE, ydata1.LOWBYTE, ydata1.HIGHBYTE, xdata.LOWBYTE, xdata.HIGHBYTE ]

' Use the following sample code to append a row of data in 'Route_trace' matrix control:
'
' serout TxPin\CTSPin, BaudM, [AddRow, ID_Route_trace, ydata1.LOWBYTE, ydata1.HIGHBYTE, xdata.LOWBYTE, xdata.HIGHBYTE ]

' Do not mix SetRow and AddRow calls. Just use one type for a particular control

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

' Use the following sample code to see if any controls have been modifed by client substituting for [] as appropriate
' (returns $00 if no controls have been modified, otherwise the ID of a modified control):
'
' modctl VAR BYTE
'
' serout TxPin\CTSPin, BaudM, [GetMod]
' serin RxPin\RTSPin, BaudM, [modctl]

' Use the following sample code to clear the data pin
'
' serout TxPin\CTSPin, BaudM, [AckData]

Als de gebruikersinterface in de flexipanel is geprogrammeerd, dan kan de runtime-programma erin worden gezet. Na het initialiseren zoekt het programma uit wat naar de motor gestuurd moet worden

dit is het programma:

Robot.bsp
'
' BS2p code for control Robot at runtime
'
'-------------------------------------------------------------------------------------------

'{$STAMP BS2p}
'{$PBASIC 2.5}

' Constants (code generated by FlexiPanel Designer)

TxPin CON 2 ' Transmit pin (from stamp)
RxPin CON 4 ' Receive pin (to Stamp)
CTSPin CON 6 ' Transmit flow control pin (input to Stamp)
RTSPin CON 8 ' Receive flow control pin (output from Stamp)
DataPin VAR IN12 ' Data ready pin (input to Stamp)
BaudM CON 110 ' Baud mode

AckData CON $05 ' Acknowledge data signal (sends DataPin low again)
GetData CON $01 ' Get control data command
SetData CON $02 ' Set control data command
SetRow CON $06 ' Set a row of matrix data command
AddRow CON $07 ' Append a row of matrix data command
GetMod CON $03 ' Get modified control command
ShowMsg CON $04 ' Show message command
ID_Bearing CON $01 ' Bearing control ID
ID_Forward CON $02 ' Forward control ID
ID_Left CON $03 ' Left control ID
ID_Right CON $04 ' Right control ID
ID_Stop CON $05 ' Stop control ID
ID_Reverse CON $06 ' Reverse control ID
ID_Route_trace CON $07 ' Route_trace control ID

' I2C Constants
CmpIn CON $C1
SerPt CON 0

' Motor control PWM constants - may need to be adjusted for different motors

rMax CON 2497
rMid CON 2025
rStop CON 1873
rMidZ CON 1700
rMaxZ CON 1249

lMax CON 1249
lMid CON 1700
lStop CON 1873
lMidZ CON 2025
lMaxZ CON 2497

lPort CON 14 ' Left motor PWM output pin
rPort CON 15 ' Right motor PWM output pin

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

' Variables used in program

brad VAR Byte ' Bearing in binary radians (0-255 is a full circle)
degs VAR Word ' Bearing in tenths of a degree (0-3599 full circle)
xloc VAR Word ' X position in mm
yloc VAR Word ' Y position in mm
bdata VAR Byte ' one byte utility variable
CmpCount VAR Byte ' counts down from when last log was taken
FwRvSp VAR Byte ' Current state: Forward/turn=1, Reverse=2, Stop=0

xloc = 0
yloc = 0
CmpCount = 50
DIR14 = 1 ' set motor controller as outputs
DIR15 = 1
FwRvSp = 0

' Initialize Serial Port

DIR2 = 1 ' Tx to FxP (SEROUT output from Stamp)
OUT2 = 1 ' Initialize Tx as high
DIR6 = 0 ' CTS from FxP (SEROUT flow control input to Stamp)
DIR4 = 0 ' Rx from FxP (SERIN input to Stamp)
DIR8 = 1 ' RTS to FxP (SERIN flow control output from Stamp)
OUT8 = 1 ' Initialize RTS as high
DIR12 = 0 ' Data from FxP (SERIN input to Stamp)

' The following code assumes both Basic Stamp and FlexiPanel module were powered up at the
' same time; it gives flexipanel sufficient time to send Data pin high indicating
' initialization and then waits for it to go low

PAUSE 50
Init: IF DataPin = 1 THEN Init

' Main program loop

ReadControls:
' Acknowledge data pin
SEROUT TxPin\CTSPin, BaudM, [AckData]

' test for forward
SEROUT TxPin\CTSPin, BaudM, [GetData, ID_Forward]
SERIN RxPin\RTSPin, BaudM, [bdata]
IF bdata = $FF THEN GoForward

' test for veer left
SEROUT TxPin\CTSPin, BaudM, [GetData, ID_Left]
SERIN RxPin\RTSPin, BaudM, [bdata]
IF bdata = $FF THEN VeerLeft

' test for veer right
SEROUT TxPin\CTSPin, BaudM, [GetData, ID_Right]
SERIN RxPin\RTSPin, BaudM, [bdata]
IF bdata = $FF THEN VeerRight

' test for reverse
SEROUT TxPin\CTSPin, BaudM, [GetData, ID_Reverse]
SERIN RxPin\RTSPin, BaudM, [bdata]
IF bdata = $FF THEN BackUp

' Must be in stopped state; wait, record compass, test for button presses
StopWait:
PAUSE 20
FwRvSp = 0
GOSUB CheckCompass
IF DataPin = 1 THEN ReadControls
GOTO StopWait

' In forward state; send forward pulses, record compass, test for button presses
GoForward:
PULSOUT lPort, lMax
PULSOUT rPort, rMax
PAUSE 20
FwRvSp = 1
GOSUB CheckCompass
IF DataPin = 1 THEN ReadControls
GOTO GoForward

' In veer left state; send veer left pulses, record compass, test for button presses
VeerLeft:
PULSOUT lPort, lMax
PULSOUT rPort, rMid
PAUSE 20
FwRvSp = 1
GOSUB CheckCompass
IF DataPin = 1 THEN ReadControls
GOTO VeerLeft

' In veer right state; send veer right pulses, record compass, test for button presses
VeerRight:
PULSOUT lPort, lMid
PULSOUT rPort, rMax
PAUSE 20
FwRvSp = 1
GOSUB CheckCompass
IF DataPin = 1 THEN ReadControls
GOTO VeerRight

' In reverse state; send veer right pulses, record compass, test for button presses
BackUp:
PULSOUT lPort, lMaxZ
PULSOUT rPort, rMaxZ
PAUSE 20
FwRvSp = 2
GOSUB CheckCompass
IF DataPin = 1 THEN ReadControls
GOTO BackUp

CheckCompass:
' only check every 50 pulses
CmpCount = CmpCount - 1
IF CmpCount > 0 THEN GoBack
CmpCount = 50

' Get compass direction in binary radians and in tenths of a degree
I2CIN SerPt, CmpIn, 1, [brad, degs.HIGHBYTE, degs.LOWBYTE]

' Send degrees value to bearing control (code generated by FlexiPanel Designer)
SEROUT TxPin\CTSPin, BaudM, [SetData, ID_Bearing, degs.LOWBYTE, degs.HIGHBYTE, 0, 0]

' Calculate position with Send binary radians value to bearing control
' (code generated by FlexiPanel Designer & cut'n'pasted)

IF FwRvSp = 1 THEN
xloc = xloc + COS( brad )
yloc = yloc + SIN( brad )
ELSEIF FwRvSp = 2 THEN
xloc = xloc - COS( brad )
yloc = yloc - SIN( brad )
ENDIF

' if moving, send to trace
IF NOT FwRvSp = 0 THEN
SEROUT TxPin\CTSPin, BaudM, [AddRow, ID_Route_trace, yloc.LOWBYTE, yloc.HIGHBYTE,
xloc.LOWBYTE, xloc.HIGHBYTE ]
ENDIF

' return to motor control
GoBack:
RETURN

Het enige verschil wij gaan het kompas niet toepassen!

vriendelijke groet,

A.dusschoten

Euhm, lastig om te zien zo, en vooral hoe het werkt. In een BS2 zou alles goed gaan tot hij bij het i2c gedeelte aankomt, maar dat is voor het compass, dus zou je moeten weg kunnen laten. Even later stuurt hij dat serieel weer uit, maar dat andere ding heeft het compass dus niet nodig? neem ik aan dat dat ook weggelaten kan worden of bijv. nulletjes versturen.

als het alleen maar er nar toe word verzonden kan je natuurlijk het er gewoon niet op aansluiten.