Electronics Projects: How to Program a Servo in PBASIC

To create motion in your electronics project, you can add a very useful device, called a servo, which lets you control mechanical motion with a BASIC Stamp program. A servo is a special type of motor that is designed to rotate to a particular position and hold that position until told to rotate to a different position. Hobby servos are frequently used in radio-controlled vehicles, but there are many other uses for servos.

The BASIC Stamp Activity Kit comes with a servo that you can use to learn how to write programs that control servos. You can also purchase servos directly from Parallax or from most hobby stores.

The easiest way to control a servo from a BASIC Stamp microcontroller is to use the PULSOUT command. This command sends a pulse of any duration you specify to an I/O pin of your choosing. The syntax of this command is as follows:

PULSOUT pin, duration

You specify the duration in units of two microseconds. A microsecond is one-millionth of a second. There are one thousand microseconds in a millisecond. Thus, to send a 1.5 ms pulse with the PULSOUT command, you must specify 750 as the duration, like this:

PULSOUT 0,750

Here, a 1.5 ms pulse is sent to pin 0.

Here are the PULSOUT duration values you should use for a typical hobby servo for various angles.

Angle

Duration

Angle

Duration

0

250

95

778

5

278

100

806

10

306

105

833

15

333

110

861

20

361

115

889

25

389

120

917

30

417

125

944

35

444

130

972

40

472

135

1000

45

500

140

1028

50

528

145

1056

55

556

150

1083

60

583

155

1111

65

611

160

1139

70

639

165

1167

75

667

170

1194

80

694

175

1222

85

722

180

1250

90

750

For example, to move the servo on pin 0 to 75°, use this command:

PULSOUT 0,667

Remember that to hold its position, a servo needs a constant stream of pulses approximately 20 ms apart. Thus, PULSOUT commands are usually contained in either DO loops or FOR-NEXT loops. For example, here’s a bit of code that keeps the servo on pin 0 at 45° indefinitely:

DO
PULSOUT 0,500
PAUSE 20
LOOP

Here is complete program that moves the servo to 45° when SW1 (a pushbutton on pin 14) is pressed and 135° when SW2 (a pushbutton on pin 10) is pressed.

' Servo Control Program
' Doug Lowe
' July 15, 2011
'
' This program moves a servo to one of two when SW1 is pressed
' and returns the servo to center position when SW2 is pressed.
' {$STAMP BS2}
' {$PBASIC 2.5}
Servo PIN 0
SW1 PIN 14
SW2 PIN 10
Position VAR Word
Position = 500
DO
IF SW1 = 1 THEN
Position = 500
ENDIF
IF SW2 = 1 THEN
Position = 1000
ENDIF
PULSOUT Servo, Position
PAUSE 20
LOOP