• No results found

EEPROM-toegangs-commando’s om onze robot een vooraf vast-gelegd pad te laten vol-gen. Door gebruik te maken van een piëzo-zoemer weten we waar we in het programma zijn. Ook zullen we een mobiele temperatuur-logger aan u voorstel-len als extra project, om te leren omgaan met synchrone seriële communicatie.

42

Chuck Schoeffler, Ph. D., Ken Gracey en Russ Miller

BASIC Stamp

programmeercursus

Servo

Piezo Speaker

P3 P12

Vin

VSS

VSS

Servo

P15

990050 - 3 - 11

Vin

VDD

VSS

10k 10k

3300µF

deel 3: programmeren in BASIC

Opgelet:

Bij de Postbus121-rubriek is een belangrijke correctie betreffende de

BASIC-Stamp-experimenteer-print opgenomen.

13

Figuur 13. Zo worden de servo’s en de piëzozoe-mer aangesloten.

Onderdelenlijst

1 complete robot (met Elektuur-experimenteerprint)

1 piëzozoemer 1 3300 µF condensator

2 10-kΩ-weerstanden (optioneel in deze schakeling)

MICROPROCESSOR

hebben, zijn vermeld in de onderde-lenlijst. Het schema, waarop de pro-grammatuur in deze aflevering betrek-king heeft, is te zien in figuur 13.

H

O E E E N S E R V O E I G E N L I J K W E R K T Servo’s zijn ‘closed loop’ mechanismen;

inwendig wordt de actuele positie voortdurend vergeleken met de gewenste positie. Die gewenste positie is afkomstig van het BASIC Stamp puls-out-commando en de actuele positie van de servo (afkomstig van een inwen-dige potentiometer die mechanisch is verbonden met de uitgaande as). Als er tussen die twee signalen een klein ver-schil is, laat de elektronica in de servo de as draaien om het verschil op te heffen.

We hebben de servo’s al aangepast (de potentiometer losgekoppeld van de uitgaande as) en de potentiometer zodanig ingesteld dat de servo stilstaat als de BASIC Stamp een puls van 1500 µs stuurt. Een pulsout-waarde van 750 geeft 1500 µs (het commando werkt in eenheden van twee microseconden).

Een waarde groter dan 750 laat de servo met de klok meedraaien en een waarde kleiner dan 750 tegen de klok in. Een waarde dichtbij 750, bijv. 760, laat de servo heel langzaam draaien. In figuur 14 is te zien hoe zo’n pulstrein voor een servo eruit ziet.

Door gebruik te maken van een for-next-lus kunnen we zien wat de ser-vosnelheid bij verschillende pulstijden is. Zet de robot op een doosje of iets dergelijks, zodat de wielen vrij kun-nen draaien, en laad het programma van listing 1 in de BASIC Stamp. In figuur 14 is de relatie tussen de puls-tijd en het toerental van de Futaba S-148 servo te zien.

G

E L U I D A L S F E E D B A C K Het BASIC Stamp commando freqout kan worden gebruikt om de robot uit te breiden met geluidsreacties. Net als alle andere PBASIC-commando’s is gebruik van de juiste syntax belangrijk om het commando te laten werken.

Laad onderstaande code in de BASIC Stamp en luister naar het geluid:

freqout 12,750,2000

‘750 ms 2000 Hz toon op P12 Voor een meer ‘robotachtig’ geluid kan het voorbeeld in listing 2 worden uit-geprobeerd.

Deze routine begint met het declareren van Hz als een woordvariabele, een getal tussen 0 en 65.535. De lus wordt viermaal doorlopen en wekt daarbij gelijktijdig twee frequenties op P12 op.

De eerste frequentie neemt toe van 1 tot 4000 Hz terwijl de tweede frequen-tie daalt van 4000 tot 1 Hz. Dit soort geluiden kan overal in de program-ma’s worden opgenomen.

G

O T O

-

C O M M A N D O Normaal gesproken wordt door PBA-SIC het programma regel na regel uit-gevoerd. Het goto-commando maakt dat de BASIC Stamp een sprong maakt naar een - met naam genoemde - plaats elders in het programma. De sprong kan zowel naar voren als naar achteren zijn ten opzichte van de huidige plaats.

De syntax is heel eenvoudig:

goto vooruit ‘spring naar de vooruit-routine

G

O S U B

,

H E T

B R O E R T J E V A N

G

O T O Evenals het goto-commando zorgt het commando gosub (Goto Subroutine) ervoor dat een sprong wordt gemaakt naar een andere plaats in het pro-gramma. Het grote verschil is dat nu de regel direct na de gosub wordt ont-houden, m.a.w. het programma kan automatisch terugkeren naar de plaats waar het vandaan kwam. Dit maakt het mogelijk om delen van het pro-gramma meer dan één keer te gebrui-ken. Het vol-5V

20 ms 1500 µs 20 ms 1500 µs 20 ms

0V

990050 - 3 - 12

14

Figuur 14. Pulstrein voor de aansturing van een servo, in dit geval met 1500 µs voor een neutrale stand.

400 -50.0 -40.0 -30.0 -20.0 -10.0 0.0 10.0 20.0 30.0 40.0 50.0

500 600 700 800 900 1000 1100 1200

Pulse Out Value (µs)

Rotational Speed (RPM)

990050 - 3 - 13

15

Figuur 15. Toerental van de Futaba S-148 servo als functie van de pulsbreedte.

‘Program Listing 1

left_servo con 15

right_servo con 3

x var word pause 2000 start:

for x = 650 to 850 ‘begin of routine

pulsout left_servo,x ‘pulse width of 1500 us pulsout right_servo,1500-x ‘pulse width of 1500 us

pause 20 ‘pause for 20 ms

next

‘Program Listing 2 Hz var word

for Hz = 1 to 4000 step 1000 freqout 12,70,Hz,4000-Hz

‘generate two 70 ms tones on P12 next

gende voorbeeld illustreert het gebruik van het gosub-commando:

gosub right pause 1000 gosub right return right:

for x=1 to 18

pulsout left_servo,650 pulsout right_servo,650 pause 20

next return

In dit voorbeeld wordt de right-routine tweemaal uitgevoerd met er tussenin een pauze van een seconde. Gosub-commando’s mogen vier niveau’s diep worden ‘genest’. Na iedere return gaat het programma terug naar de instructie die direct volgt op de meest recente gosub.

B

E W E G I N G E N M E T H E T D A T A

-

C O M M A N D O O P S L A A N I N E E N

E E P R O M

De BASIC Stamp heeft een 2 Kbyte grote EEPROM die wordt gebruikt voor het opslaan van de programma’s

44

Elektuur 11/99

16

Figuur 16. EEPROM

memory map. ‘Program Listing 3

‘Boe-Bot Program for Roaming and Sound

‘Define Variables and Constants

‘————————————————————————————-x var word ‘loop counter for pulsout

position var word ‘EEPROM address counter direction var word ‘value stored in EEPROM

Hz var word ‘frequency variable

right_servo con 3 ‘right servo on P3 left_servo con 15 ‘left servo on P15

speed con 40 ‘added or subtracted value

‘————————————————————————————-‘Programmed Movement Patterns

‘————————————————————————————-data ‘FRFRFRBBTFE’ ‘store movements

‘————————————————————————————-‘Main Program

‘————————————————————————————-position=0 ‘start at EEPROM cell 0

move: ‘main loop

read position,direction ‘read direction command position=position+1 ‘increment to next cell if direction=’E’ then quit ‘Decide which action to take if direction=’F’ then forward’by matching command letter if direction=’R’ then right

if direction=’L’ then left if direction=’B’ then backward if direction=’T’ then turn_around

goto move ‘repeat until E is seen

‘————————————————————————————-‘Sound Routines

‘————————————————————————————-(de programma-opslag loopt van adres 2047 naar beneden) en voor de opslag van data ofwel gegevens (dit gebeurt in omgekeerde richting, van adres 0 tot 2047). Als de data en het programma

‘botsen’, zal de broncode niet meer goed worden uitgevoerd.

Iedere plaats in EEPROM is een byte groot. Weliswaar is dat niet voldoende om een hoogcomplexe datalogger mee te realiseren, maar het biedt zeker vol-doende plaats om de gegevens voor onze programma’s in op te slaan.

Voor wat betreft opslag van data ver-schilt de EEPROM van de BASIC Stamp in meerdere aspecten van de RAM:

➧ EEPROM heeft meer tijd nodig om een waarde op te slaan, soms meer-dere milliseconden.

➧ EEPROM kan een beperkt aantal keren opnieuw worden beschreven (ongeveer 10 miljoen keer). RAM kan een oneindig aantal keren worden beschreven en gelezen.

➧ De primaire functie van de EEPROM is om programma’s in op te slaan;

data kunnen worden opgeslagen in de overgebleven lege ruimte.

Voor de communicatie met de EEPROM zijn er drie commando’s:

data, read en write. Data die in EEPROM wordt opgeslagen, lopen van de lin-kerbovenhoek (positie 0,0) naar rechts op de regel en als de regel vol is, weer forward_sound:

for Hz = 1 to 4000 step 1000 freqout 12,70,Hz,4000-Hz next

return back_sound:

for Hz = 4000 to 6000 step 1000 freqout 12,70,Hz,Hz-400 next

return right_sound:

freqout 8,800,2500 return

left_sound:

freqout 8,800,4500 return

‘————————————————————————————-‘Movements

‘————————————————————————————-forward:

gosub forward_sound for x=1 to 60

pulsout left_servo,750-speed pulsout right_servo,750+speed pause 20

next goto move backward:

gosub back_sound for x=1 to 60

pulsout left_servo,750+speed pulsout right_servo,750-speed pause 20

next goto move right:

gosub right_sound for x=1 to 18

pulsout left_servo,750-speed pulsout right_servo,750-speed pause 20

next goto move left:

gosub left_sound for x=1 to 18

pulsout left_servo,750+speed pulsout right_servo,750+speed pause 20

next goto move turn_around:

for x=1 to 30

pulsout left_servo,850 pulsout right_servo,850 pause 20

next goto move quit:

end