View Full Version : PC Control of Stamp!

Bill Chennault
11-24-2006, 01:39 AM

All of my robot and many of my automation ideas include a PC controlling a Stamp. Despite asking in many ways and reading many threads and doing a lot of Internet searches, I could not find out how to do this seemingly simple task.

Perhaps, it is SO simple that everyone can do it and it is not worth mentioning. If so, forgive me . . . but when I did it I was sure excited!

The Stamp (in my case, the BS2pX), simply needs to be set up to listen to PIN 16, which forces it to use Sin for serial communications to your PC (or whatever). (Usually, Sin is used by Stamp's DEBUG.)

So, I wrote a program that used SERIN to listen for one of three ASCII characters, A, B, or C. "A" turns on an LED. "B" turns it off. "C" makes it blink 10 times.

On the PC side all you need is an MSCOMM control set to 9600,n,8,1. Then, send an "A", "B", or "C".

The code is almost too dumb to post. The hard part was getting straight in my head what the Stamp was supposed to do (in this case, just listen and react appropriately) and what the PC was supposed to do (in this case, I explained it above . . . just be read to send the appropriate character).

If you use the PC to open the serial port BEFORE the stamp does, when the Stamp is powered up and the program launched, you will get a "Stamp not found" type error message. So, just power the Stamp up first and run the Stamp program before running the PC program. By the way, I did this via USB which inserted itself on COM6.


You are what you write.

11-26-2006, 06:37 AM
Easy? Who the heck said it was easy?
The secret is setting up a handshake between the PC and the stamp. Use a time out so the programs dont hang.· The following code I modified from an MS Access program (VBA) that I wrote for servo animatronics.

Something like this :

On the Stamp side:
· idx VAR Byte
· DO
··· Redo:
··· DEBUG "!",CR
··· SERIN 16, $4054, 5000, Redo,[WAIT ("?"),DEC1 idx]

··· LOOKUP idx, (0, 1, 2), LEDPIN
····High LEDPIN
··· LOOKUP idx, (1, 2, 0), LEDPIN
··· Low LEDPIN
··· LOOKUP idx, (2, 0, 1), LEDPIN
··· Low LEDPIN

On The PC Side:
setup a global variable called "ready"and something like this on the mscomm side:

Private Sub MSComm1_OnComm()

Dim InBuff As String
Select Case MSComm1.CommEvent
··· Case comEvReceive
······ InBuff = MSComm1.Input
······ If InStr(InBuff, "!") > 0 Then ready= True
······ Debug.Print InBuff;
··· Case Is > 8
······ Debug.Print "ERROR!!!!"·
··· End Select
End Sub

Sub LEDon(LED As Integer) '0 , 1 or 2 for the·LEDs
··· Dim tmp As String
··· On Error GoTo OutaHere
··· Do While Not ready
··········· DoEvents
··· Loop
··· ready=false
··· If MSComm1.PortOpen = False Then GoTo OutaHere
··· tmp = "?"
··· MSComm1.Output = tmp
··· pause 10 ' this is a subroutine I do with·the Form timer and TimerInterval property
··· 'try a for next loop with DoEvents in the·center instead
··· tmp = Format(LED, "0") & vbCr
··· MSComm1.Output = tmp
··· Exit Sub
End Sub

Have Fun


Post Edited (TechnoRobbo) : 11/27/2006 1:55:28 AM GMT

11-27-2006, 08:55 AM
I noticed I hadn't changed the name of the flag to "ready" it was still called "capture" I changed it. And added the reset to the flag - all this occurs in the Form Timer in the actual program.

Have Fun


Post Edited (TechnoRobbo) : 11/28/2006 3:26:42 AM GMT

Bill Chennault
11-28-2006, 01:40 AM
TechnoRobbo (http://forums.parallax.com/member.php?u=46920)--

Ha! Your code is much more sophisticated than mine! I just wanted to "make it work" and it does. My code is virtually useless other than as a demonstration to myself that I can do it.


You are what you write.