Artiekel in Robobits: Een Motorcontroller
Toen ik met mijn kleinzoons naar zo’n graafmachine stond te
kijken bekroop me de gedachte: "Wat zou het leuk zijn als ik
hydraulische cilinders
in een robot zou kunnen gebruiken, klein van omvang en met grote
kracht".
Omdat dat wel een illusie zal blijven, bedacht ik
dat een elektromotor die aan een M3 draadeind draait (als worm), het
meest haalbare alternatief is.
Een vlugge telling leerde dat er aan de graafmachine meer dan tien
cilinders zaten.
Om zoveel motoren met 1 PC of microcontroller te besturen zou er aardig
wat circuit moeten
worden gebouwd, zeker als je zoals ik meer wilt dan alleen uit,
linksom en rechtsom”.
Het kiezen tussen een stappenmotor en een elektromotor was voor mij
niet moeilijk.
Ik gebruikte ze beide bij het automatiseren van een freesmachine
waarover ik in de RoboBits nr 35 al schreef (zie ook:
www.henkzelf.nl/MijnFreesMach.htm).
Met een stappenmotor kun je wel precies sturen, maar bij eenzelfde
volume leveren ze veel minder vermogen dan een elektromotor en ze
verbruiken meer stroom. Verder: hoe hoger de gevraagde snelheid, hoe
kleiner wordt de kracht die ze kunnen leveren zonder stappen te
missen. Daar staat tegenover dat bij gebruik van een elektromotor een
hoeksensor en aardig wat
regelsoftware nodig is om die motor te sturen. Regelsoftware had ik
voor mijn freesmachine al eens gemaakt maar de daarbij gebruikte
hoeksensoren en microcontroller waren nogal duur. Met
die hardware kan ik maar 2 motoren tegelijk regelen per
microcontroller. Om meer dan 10
“cilinders” te kunnen besturen met een PC moet er
dus erg
op de kosten worden gelet en de PC moet eigenlijk niet belast worden
met het bijhouden van de positie en snelheid van de
“cilinders”.
Dus: Hoeksensoren zelf maken en meten en regelen met een heel
goedkope microcontroller. Tijdens mijn werk in de
bedrijfsmechanisatie heb ik het gebruik van PIC microcontrollers
altijd bestreden (en weten te voorkomen) maar ik ben, voor een klein
systeempje als dit, bekeerd door het boek van Bert van Dam:
“PIC
Microcontrollers en vooral door de gebruiksklare
ontwikkelomgeving die hij er bij levert. JAL 2.3 heeft ten opzichte
van C natuurlijk zijn beperkingen, maar deze zijn allemaal het gevolg
van de beperkte (goedkope) architectuur van kleine PICs. De makers
van deze ontwikkelomgeving hebben knap werk verricht en gezorgd dat U
zich geen zorgen hoeft te maken over de meeste onhebbelijkheden van
PICs (of moet ik zeggen: eigenschappen die PICs goedkoop maken). Ik
gebruik per motor
een printje met een 18 pins PIC 16f648a en als U wilt stuur ik het
schema en de software ( bijna 1000 regels source). Mail maar naar
henk@henkzelf.nl.
Maar voor U dit doet, lees even door want ik aarzel niet voor niets
om die gegevens direct op mijn website te zetten. Voor
nabouwen heeft U in ieder geval het spul van Bert van Dam nodig, of U
moet een oude
rot zijn met PIC en JAL.Het principe van
een hoeksensor is redelijk eenvoudig en al eens in RoboBits besproken
meen ik. Zie eventueel ook
http://en.wikipedia.org/wiki/Rotary_encoder
Simpel samengevat: Twee
lichtsluizen (A en B) zenden hun signaal naar de microcontroller. Het
licht in de sluizen wordt onderbroken door een schijf met sleuven die
aan de motor zit, en wel op zo’n manier dat de stand van de
signalen om en om veranderen als de motor draait. Bijvoorbeeld: A
naar 1, B naar 1, A naar 0, B naar 0, en dan weer A naar 1 enz. Met
deze signalen kan de microcomputer de draairichting bepalen en het
aantal signaalveranderingen tellen. Hij kan dus de verplaatsing van
af een beginstand bijhouden en niet de absolute positie meten. Dat is
echter geen bezwaar als een extra inputsignaal van de microcontroller
op een bepaalde stand van de “cilinder” van stand
verandert. We kunnen die positie dan als referentie gebruiken.
Aangezien een PIC ook timers heeft, kunnen we de tijd meten die de
motor gebruikt voor een aantal veranderingen van de signalen A en B.
Hiermee kunnen we de snelheid berekenen. De PIC heeft een PWM circuit
waarmee we het vermogen van de Motor kunnen regelen, en zo kan de
software de “cilinder” met een gewenste snelheid
naar een
gewenste positie sturen.
Het principe van een hoeksensor mag eenvoudig zijn,
het maken niet.
Er zijn er een aantal moeilijkheden te overwinnen. Je moet een schijf
met sleuven hebben en de lichtsluizen moeten dan ook nog precies zo
gemonteerd worden dat beide signalen even lang 1 als 0 zijn en dat
het ene signaal halverwege de 1 en de 0 van het andere signaal
verandert. Het eerste wordt beïnvloed door het veranderen van
afstand van de
lichtsluizen tot het midden van de schijf. Als de afstand tussen de
sleuven en de breedte van de sleuf niet gelijk zijn, dan krijg je het
nooit voor elkaar. Het
tweede wordt
beinvloed door het veranderen van de afstand tussen de
sensoren.
Deze laatste afstand is theoretisch 0.75 of 1,25 maal de
‘steek’
(afstand van het begin van de ene sleuf tot het begin van de volgende
sleuf). Hierbij mag je een geheel aantal keren de
‘steek’
optellen dus 1,75 2,25 2,75 3,25 3,75 of 4,25 maal werkt ook. Het
aantal sleuven in
de schijf is een kwart van het aantal stappen dat je per omwenteling
wilt. De omtrek van de cirkel waarop de sleuven zitten is dus de
‘steek’ afstand maal het aantal stappen. Om de
schijf
voor een aantal stappen klein te houden, moet
‘steek’ dus
ook klein zijn. Maar de sleuf moet natuurlijk wel breed genoeg zijn
om voldoende licht door te laten. Bij een sleufbreedte van 0, 8 mm is
de ‘steek’ 1,6 mm en een stap 0.4 mm. De afstand
tussen
de lichtsluizen moet dan toch minstens +/- 0,1 mm nauwkeurig zijn.
Als U nu de neiging
hebt om op te houden met lezen omdat U denkt: “Dat lukt me
toch
niet”, dan zou ik toch maar even doorlezen. Ik beschrijf
straks
hoe ook U hoeksensoren kunt maken voor € 1,20 per sensor aan
onderdelen, waardoor de totale kosten voor de onderdelen (excl. motor
en print) uitkomt rond € 10,- .De
meeste onderdelen
kocht ik via www.Voti.nl.
Voor een dubbele lichtsluis, IR-SENS-3, betaal je € 0.80.
FOTO 1
Voor de prototypes (zie
foto 1) kocht ik daar Copal motoren met vertraging bij Voti, (MOT-11,
(nu € 7.14). In latere versies ook sterkere en minder
sterkere motoren die bij CONRAD waren gekocht. Na het meten van de
afstand tussen de gevoelige punten van de IS-SENS-3 berekende ik de
maten van een schijf met 25 sleuven en maakte die met mijn
freesmachine. De schijf (los op foto
1) heeft flenzen aan elke kant van de schijf. In de ene past de as
van de motor. In de andere zit M3 draad om een stuk draadeind vast te
zetten. Aangezien 25 sleuven 100 stappen per omwenteling betekent, en
de spoed van M3 0.5 mm is, is de verplaatsing van een moer op het
draadeind, in theorie, te meten in stappen van 0,005 mm. Dit is
nauwkeuriger dan alle andere (mechanische) toleranties. Dat is
gewenst omdat een meetfout dan de tolerantie van het hele systeem
niet sterk beïnvloed. Ik
kreeg de prototypes
aan de gang maar heb maar een paar seconden gedacht om daarover in
RoboBits te schrijven.
De redenen daarvoor zijn:
- maar
enkelen van U zullen in staat zijn om zo’n schijf met sleuven
te maken.
- Het star koppelen van de as van de motor aan het draadeind was toch
niet
zo’n goed idee.Het draadeind apart lageren en aandrijven via
een tandwiel of flexibele koppeling is beter. En je hoeft natuurlijk
niet aan een draadeind te draaien. Aan een wiel draaien kan ook.
- Het printje met de elektronica vast aan de motor en de IR-SENS-3 is
niet
handig als je ook andere motoren wilt kunnen gebruiken. Ik gebruik nu
ook bij CONRAD gekochte RB35 motoren omdat die nog sterker zijn (maar
wel duur) en motortjes a €2,- van speelgoed kwaliteit.
- Het op
de juiste positie solderen van IR-SENS-3 in de print was een enorm
gepriegel en vereiste het gebruik van een twee kanaal oscilloscoop.
Ik
moest de IR-SENS-3
zelfs doorzagen om zo de twee lichtsluizen apart te kunnen
positioneren (soldeer laten vloeien en bijbuigen). Leuke ervaring
hierbij was dat je de IR-SENS-3 inderdaad kunt doorzagen en zo dus
twee lichtsluizen a € 0,40 krijgt.Afgezien
van deze
problemen was het resultaat toch zo inspirerend dat ik tijd stak in
verbeteringen. Zo heb ik de volgende oplossingen gevonden voor
bovenstaande problemen :
- Het gebruik van een tandwiel als code-schijf. De afstand van de
lichtsluizen tot het midden van de schijf wordt hierdoor nog kritischer
maar .. (zie volgende punten). Ik gebruik tandwielen uit een setje dat voor € 6,10 bij CONRAD
is te kopen (bestelnummer 297704-89) De 20 rode, met een boorgat van
2,9 mm, passen strak op de 3 mm as van de Copal motor, de witte boor ik
op voor gebruik met de RB35 motoren. Met tandwielen uit dit setje kun
je ook vertragingen voor de speelgoed motoren maken. Deze tandwielen
hebben 50 (en 10) tanden zodat het meten uitkomt op 200 stappen per
omwenteling.
- Ik maakte een ‘afstel’ programma voor
in de micro, dat
de motor laat draaien en dan op een PC scherm voortdurend laat zien:
hoeveel procent van een omwenteling elk lichtsluis signaal 1 is, en bij
hoeveel procent van het van het ene signaal het andere verandert. Er
moet dus met de lichtsluizen geschoven worden tot alle 3 waarden
ongeveer 50 aangeven. Zo heb je geen scoop nodig. Voor een algemene
indruk van de stand van de lichtsluizen werden een paar LEDjes op de
microcontroller aangesloten.
- Een(doorgezaagde) IR-SENS-3 wordt via
een IC-voetje
gemonteerd op aan apart stukje print met de zelfde lengte en breedte
als de IR-SENS-3. De lichtsluizen kunnen zo (al werkend) iets bewegen
in het voetje zonder contact verlies of kans op kortsluiting. Dit
geheel wordt met 2 M3 boutjes geklemd tussen de plaat waaraan de motor
vast zit en een extra plaatje. De M3 boutjes komen naast het IC-voetje
tussen de print en de ‘flappen’ aan de IR-SENS-3.
(zie foto 2) Met M3’s losjes aangedraaid kun je het geheel en
de lichtsluizen heel precies verschuiven door met een dunne
schroevendraaier in de spleten naast de M3’s te wrikken. Als
volgens het ‘afstel’ programma alles op
z’n plaats zit, draai je de M3’s echt vast. Hierbij
heb je er geen last van dat de lichtsluizen weer verschuiven zoals bij
de andere bevestigingsmethoden die ik probeerde.

FOTO 2
Over
het schema en de
software kan ik nog wel een paar RoboBits vol schrijven. Dat doe ik
alleen bij voldoende belangstelling. Hier volsta ik met het opnoemen
van de functionele eigenschappen.
Alle motorcontrollers worden bestuurd via commando’s die een
PC
(of microcomputer) via een enkele seriële interface verstuurt.
Naast 2 voedingsdraden lopen er maar 2 extra draden langs alle
printjes. Voor
het testen hoef je dus geen PC programma te kopen. Iedere terminal
emulator is bruikbaar (Hyperterminal van Windows of ‘Mini
Terminal’ die bij Bert’s boek is geleverd). Op
twee uitzonderingen na, hebben de commando’s de vorm van: 1
letter voor “Wie”, 1 letter voor
“Wat”, optioneel gevolgd door een getal, en een
<line-feed> karakter (type met de Enter toets.
Voorbeelden van enkele van de ~20 commando’s: snelheidsinstelling
op 500 stappen per seconde.
bg13000
betekent: Controller ‘b’ ga met
ingestelde snelheid naar positie 13000.
ap
betekent: Controller ‘a’ rapporteer je huidige positie.
bh
betekent: Controller ‘b’ halt,
dus stop ogenblikkelijk.
Op
alle commando’s uit bovenstaande voorbeelden wordt
ogenblikkelijk gereageerd ook tijdens het uitvoeren van een beweging.
Je kunt dus doel-positie en snelheid zelfs tijdens een beweging
aanpassen. Het bereik van het getal weermee je een positie opgeeft is
-32768 .. +32767
(een 16 bits getal). Het ‘speelveld’ is echter niet
beperkt, want je kunt het nulpunt (zelfs tijdens een beweging)
corrigeren.
De controller voor wie een commando bestemd is, bevestigt de
ontvangst met
het versturen van 1 letter (zijn eigen “Wie”
letter, of formeler gezegd: Controller ID). Alleen als via dat commando
gevraagd wordt om een antwoord, zoals bij bovenstaand voorbeeld
“ap” wordt dit gevolgd door dat antwoord afgesloten
met <return><line-feed>.
Uitzondering op al het bovenstaande zijn de
commando’s H en M. Deze
commando’s bestaan slechts uit 1 letter. Op deze
commando’s wordt door alle controllers gereageerd. Commando H
betekent: “Alle controllers: Halt” dus te gebruiken
als noodstop. Commando M betekent: “Memoriseer (opslaan in
geheugen) je huidige positie. Hierna kunnen de opgeslagen waarden bij
de verschillende controllers worden opgevraagd om te vergelijken. (b.v.
linker en rechter wiel, om als ze niet gelijk lopen de snelheid van een
van hen aan te passen). De controllers antwoorden niet bij ontvangst
van commando H of M want dan zouden ze door elkaar gaan praten.
De nauwkeurigheid van het positioneren is +/- 1 stap.
Het
gedrag tijdens het bewegen hangt af van: Motortype, wat de motor moet
bewegen, en uw eisen aan de beweging. Daarom kunt u de parameters voor
positie- en de PID snelheidsregeling instellen. Net als voor het
positioneren van de lichtsluizen is er software gemaakt voor het
experimenteren met deze parameters.
Zoals aan het begin van dit artikel is geschreven, het is nu aan u om
een mail te sturen naar
henk@henkzelf.nl
als u meer wilt weten of schema en software (source) wilt ontvangen.