Område 2 · lektion 9
Servot och den mekaniska strukturen
Det här är passet där bygget slutar vara elektronik och börjar vara mekatronik. Ett servo är billigt att programmera – tre rader – och dyrt att bygga fäste till. Den obalansen är själva lärdomen.
Mål
- Du kan koppla in ett servo, ge det en vinkel med
Servo.h, och säga vad de tre sladdarna gör. - Du kan räkna ut hur tungt ditt servo orkar lyfta på en arm av en viss längd, och välja armlängd med det som grund.
- Du kan bedöma om servot får sin ström från rätt håll, och känna igen symtomen när det inte gör det.
- Du kan bygga ett fäste som håller kvar servot när armen tar i.
Genomgång
Vad ett servo är
Ett modellservo är fyra saker i en liten låda: en likströmsmotor, en växellåda som växlar ner den, en vridpotentiometer som mäter var utaxeln faktiskt står, och en liten krets som jämför det uppmätta läget med det du bett om och kör motorn tills de stämmer.
Det sista är hela poängen. Du säger inte "snurra" utan "stå på 90 grader", och servot håller sedan det läget av egen kraft. Trycker du på armen trycker den emot. Det är därför ett servo passar till en spak, en lucka eller en ventil, och därför det inte passar till ett hjul – ett vanligt modellservo kan bara vrida sig ungefär ett halvt varv.
De tre sladdarna, i den ordning de nästan alltid sitter:
| Färg | Vad | Kopplas till |
|---|---|---|
| Brun eller svart | GND, nollan | GND – alltid, och alltid gemensam med kortets GND |
| Röd | Matning, 4,8–6 V | 5 V, eller ett eget batteri (se nedan) |
| Orange eller gul | Styrsignal | En digital pinne, till exempel D9 |
Styrsladden bär nästan ingen ström alls – den bär bara information. All kraft kommer från den röda sladden. Det är den skillnaden hela avsnittet om strömbehov nedan handlar om.
Styrsignalen: en puls var tjugonde millisekund
Servot vill ha en kort puls med jämna mellanrum. Pulsens bredd säger vilken vinkel det ska stå på.
- Pulsen upprepas var 20:e millisekund. Det är 1 / 0,020 = 50 gånger i sekunden, alltså 50 Hz.
- Pulsbredden styr vinkeln: ungefär 1,0 ms betyder ena ytterläget, 1,5 ms mitten, och 2,0 ms andra ytterläget.
- Vid 1,5 ms är signalen hög 1,5 av 20 ms, alltså 7,5 procent av tiden. Resten ligger den still.
- Hela vinkelområdet på 180 grader ryms i den enda millisekund som skiljer 1,0 från 2,0 ms. En grad motsvarar alltså 1000 / 180 ≈ 5,6 mikrosekunder – och det är därför pulsen måste vara exakt på mikrosekunden, vilket är precis vad biblioteket sköter åt dig.
Servo.h och write() – tre rader kod
Du behöver aldrig göra pulserna själv. Biblioteket Servo.h
följer med Arduino-miljön och gör dem i bakgrunden.
#include <Servo.h>
Servo spakservo;
void setup() {
spakservo.attach(9);
spakservo.write(90);
}
void loop() {
}
De tre raderna som gör jobbet:
#include <Servo.h>hämtar in biblioteket. Raden hör överst i filen och avslutas inte med semikolon – den är ingen sats utan en instruktion till kompilatorn.Servo spakservo;skapar ett servo-objekt. Namnet väljer du. Har du två servon behöver du två rader och två namn.spakservo.attach(9);talar om vilken pinne styrsladden sitter på. Hör hemma isetup().spakservo.write(90);ger en vinkel i hela grader, 0 till 180. Servot åker dit och stannar där tills du säger något annat.
Servo.h tar pinne 9 och 10 med sig
På ett Uno-kort använder biblioteket kortets Timer1 för att räkna ut
pulserna. Samma timer sköter analogWrite() på pinnarna 9 och
10, så så länge ett servo är anslutet fungerar inte
analogWrite() på D9 och D10. Det gäller även om
servot råkar sitta på en helt annan pinne. Vanliga
digitalWrite() påverkas inte. Det här är ett klassiskt tyst
fel: en lysdiod som ska dimras på pinne 9 lyser bara helt eller inte alls,
och koden ser rätt ut. Vi använder analogWrite() först i
område 5 – lägg raden på minnet tills dess.
Strömbehovet, och varför kortet startar om
Servot i kitet är av typen SG90. Ur databladet, med reservation för att olika tillverkare anger olika värden:
| Storhet | SG90, typiskt |
|---|---|
| Matningsspänning | 4,8–6 V |
| Ström i vila, obelastad | några milliampere |
| Ström under rörelse | storleksordningen 100–250 mA |
| Ström när axeln hålls fast | flera hundra mA, uppåt 700 mA |
| Vridmoment vid stopp | omkring 1,8 kg·cm |
| Vinkelområde | ungefär 0–180° |
Ställ de talen mot vad kortet kan lämna. Med kortet matat från USB är hela budgeten 500 mA – det är vad en vanlig USB-port ger, och kortet har dessutom en självåterställande säkring på samma nivå. Kortet självt drar några tiotals milliampere, säg 50 mA. Kvar blir
500 mA − 50 mA = 450 mA
Ett obelastat servo som rör sig lugnt håller sig under det. Ett servo som drar en spak som tar emot, eller som körs mot ett ändläge, gör det inte. Då sjunker spänningen på kortets 5 V, och när den sjunker tillräckligt startar kortet om.
Brownout ser ut som ett kodfel Symtomen är att servot rycker till och stannar, att seriemonitorn tappar förbindelsen och börjar om från början, eller att lysdioder blinkar till i takt med rörelsen. Det ser ut som att programmet startar om – och det gör det också, men inte för att koden är fel. Det är matningen som dyker. Du kommer att leta i koden i en timme om ingen sagt det här till dig. Testet är enkelt: ta bort belastningen från armen. Om felet försvinner var det aldrig i koden.
Botemedlet är att låta servot ta sin ström någon annanstans ifrån än kortets 5 V-pinne:
- Fyra AA-batterier i serie ger 4 × 1,5 = 6,0 V med alkaliska celler, eller 4 × 1,2 = 4,8 V med laddningsbara. Båda ligger inom servots 4,8–6 V.
- En USB-powerbank med 5 V duger också, och de flesta lämnar en ampere eller mer.
- GND måste kopplas ihop. Batteriets minuspol, servots bruna sladd och kortets GND ska sitta i samma punkt. Utan gemensam nolla har styrsignalen ingenting att mätas mot, och servot antingen står stilla eller rycker slumpmässigt. Det här är det enskilt vanligaste felet när ett servo får egen matning.
- Den röda sladden kopplas till batteriets pluspol, inte till kortets 5 V. Koppla aldrig ihop batteriets plus med kortets 5 V – två spänningskällor mot varandra är en dålig idé.
Armen är en hävstång
Nu lämnar vi elektroniken. Det servot faktiskt levererar är ett vridmoment – en vridande verkan kring axeln. Momentet är kraften gånger avståndet ut till där kraften verkar:
M = F · r
- r är hävarmen: avståndet från utaxelns mitt till den punkt där lasten sitter. Inte armens hela längd, om lasten sitter en bit in.
- F är kraften armen kan lämna där. Den är inte konstant – den beror på hur långt ut du mäter.
- Momentet M är det servot är märkt med, och det är samma tal oavsett vilken arm du sätter på.
Servotillverkare anger moment i den udda enheten kg·cm, som betyder just vad den ser ut att betyda: hur många kilo servot orkar hålla på en centimeters arm. SG90:ans 1,8 kg·cm blir alltså
r = 1 cm → F = 1,8 / 1 = 1,8 kg
r = 4 cm → F = 1,8 / 4 = 0,45 kg = 450 g
r = 8 cm → F = 1,8 / 8 = 0,225 kg = 225 g
Dubbla armen, halva lasten. Vill du hellre räkna i SI-enheter blir 1,8 kg på en centimeter
F = 1,8 · 9,82 = 17,7 N
M = F · r = 17,7 N · 0,01 m = 0,18 N·m
Vad får du i utbyte för en längre arm? Rörelse. En arm som svänger 90 grader ritar en fjärdedels cirkel, och båglängden blir
r = 4 cm → 2π · 4 / 4 = 6,28 cm
r = 8 cm → 2π · 8 / 4 = 12,57 cm
Det är hela avvägningen, och den är rak: dubbel arm ger dubbel rörelse och halv kraft. Att välja armlängd är alltså ett konstruktionsbeslut med ett tal bakom sig, inte en fråga om vad som råkade ligga i lådan. Skriv ner det talet i dokumentationen – det är precis sådana motiverade val C-nivån efterfrågar.
Fästet: att bygga något som håller
Ett servo som inte sitter fast flyttar sig självt i stället för lasten. Newtons tredje lag går inte att förhandla med: den kraft armen lämnar på lasten får servohuset tillbaka åt andra hållet. Sitter huset löst är det huset som rör sig.
- Skruva, limma inte. SG90 har två hål i flänsarna, och de finns där av en anledning. Smältlim håller ett par dagar och släpper sedan mitt under redovisningen.
- Fästet ska inte fjädra. Trä, plywood eller en bit plast duger. Kartong gör det inte – armen rör sig och underlaget rör sig lika mycket åt andra hållet, och rörelsen ut blir hälften av vad du räknat.
- Hornet ska sitta fast på axeln. Den lilla skruven som följer med servot är inte extra. Utan den glider hornet på splinesen efter några dussin rörelser och nolläget vandrar.
- Bygg in ändlägen i mekaniken, inte bara i koden. Kör servot mot något som tar emot står det och drar full ström, blir varmt och kan gå sönder. Se till att spaken har fritt att röra sig hela vägen mellan de vinklar din kod använder, och prova gränserna med handen innan du kör.
- Dragavlasta sladdarna. En sladd som spänns när armen går ut lossnar förr eller senare, och felet ser då ut som ett kodfel eftersom det bara händer i ett av lägena.
I industrin och i vardagen
I industrin: en reglerventil i en processanläggning öppnas och stängs av ett ställdon som gör exakt det ditt servo gör – tar emot ett önskat läge, mäter var det verkligen står och kör tills de stämmer. Skalan är en annan. Ställdonet på en större ventil arbetar med vridmoment i storleksordningen tiotals till hundratals newtonmeter, mot ditt servos 0,18 N·m, alltså hundratals gånger mer. Styrsignalen är dessutom inte en puls utan en ström mellan 4 och 20 mA, där 4 mA betyder helt stängd och 20 mA helt öppen. Att skalan börjar på 4 och inte 0 är medvetet: en avbruten sladd ger 0 mA, vilket är skiljbart från ett giltigt "stängd". En puls som uteblir kan ditt servo inte skilja från en puls som säger noll grader.
I vardagen: skrivaren på skolan gör samma sak med betydligt högre precision. Skrivhuvudet ska stanna på rätt ställe med tiondels millimeters noggrannhet, annars syns skarvarna i utskriften. Ditt servo styrs i hela grader, och en grad på en 4 cm arm är
2π · 40 mm / 360 = 251 mm / 360 ≈ 0,7 mm
alltså ungefär sju gånger grövre än skrivarens. Det är inte ett fel i servot utan en följd av vad det kostar: skrivaren har en optisk skala att läsa av, ditt servo har en potentiometer.
Prova själv
- Koppla in servot – brun till GND, röd till 5 V, orange till D9 – och
ladda upp exemplet med
write(90). Notera var armen hamnar. Det är ditt nolläge att räkna vinklar från. - Skriv en sketch som växlar mellan 20 och 110 grader med en sekunds mellanrum. Håll lätt emot med fingret medan den går. Känn att den trycker tillbaka – det är återkopplingen du känner.
- Mät strömmen. Bryt den röda sladden och koppla in multimetern i serie, precis som du lärde dig i område 1. Läs av i vila och under rörelse. Använd mätarens 10 A-uttag, inte milliampere-uttaget: ett servo som tar i kan dra mer än de 200 mA det uttaget ofta är säkrat för, och då bränner du en säkring i stället för att få ett mätvärde.
- Sätt fast en arm – en glasspinne, en bit plast – och mät hur lång den är från axelns mitt. Räkna ut hur många gram servot orkar hålla längst ut, med 1,8 kg·cm som utgångspunkt. Testa sedan med något du vägt. Stämmer det, och åt vilket håll skiljer det? Ge servot egen matning innan du hänger på lasten. Med servot på kortets 5 V är det brownout du mäter och inte moment – se avsnittet om strömbehov ovan.
- Skruva fast servot i en bit trä eller plywood. Kör sekvensen igen och jämför hur mycket armen rör sig nu mot när servot låg löst på bordet.
Kontrollfrågor
Vad betyder det att servot är lägesstyrt och inte hastighetsstyrt?
Du anger var det ska stå, inte hur fort det ska snurra.
write(90) betyder "ställ dig på 90 grader och håll kvar",
och servot väljer själv hur det tar sig dit. Vill du styra hastigheten
får du skicka en följd av vinklar med pauser emellan.
Ditt servo ska hålla 300 g längst ut på armen. Hur lång får armen vara, med 1,8 kg·cm att röra sig med?
r = M / F = 1,8 kg·cm / 0,300 kg = 6 cm. Men 6 cm är gränsen där servot precis orkar och står och drar full ström. Välj kortare – 4 cm ger 1,8 / 4 = 0,45 kg = 450 g att hålla, alltså femtio procents marginal på 300 g.
Kortet startar om varje gång servot rör sig. Var letar du först?
I strömförsörjningen, inte i koden. Servot drar mer än vad som blir över av USB-portens 500 mA, spänningen dyker och kortet startar om. Ta bort belastningen från armen och se om felet försvinner. Gör det det: ge servot egen matning, med gemensam GND.
Du gav servot ett eget batteri och nu står det bara och rycker. Vad glömde du?
Att koppla ihop batteriets minuspol med kortets GND. Utan gemensam nolla har servot ingen referens att mäta styrpulsen mot, och pulsen betyder ingenting. Det är en sladd, och det är det vanligaste felet i hela det här bygget.
Varför slutar en dimrad lysdiod på pinne 9 att gå att dimra när du lägger till ett servo?
Servo-biblioteket tar Timer1 i anspråk, och det är samma timer som
analogWrite() använder på pinne 9 och 10. Lysdioden går då
bara att tända och släcka, inte att dimra. Flytta den till en annan
PWM-pinne, till exempel 3, 5, 6 eller 11.
Hur många grader per millisekund pulsbredd, och varför spelar det roll för dig?
180 grader ryms i den millisekund som skiljer 1,0 från 2,0 ms, alltså
180 grader per millisekund, eller omvänt 1000 / 180 ≈ 5,6 mikrosekunder
per grad. Det spelar roll därför att det förklarar varför du inte kan
göra pulserna med delay(): delay() räknar i
hela millisekunder och kan inte träffa en grad. Biblioteket gör det åt
dig, och det är skälet att det finns.
Vanliga fel
- Servot matas från kortets 5 V och kortet startar om. Brownout. Spänningen dyker när servot drar ström, kortet startar om, och det ser exakt ut som ett kodfel – programmet börjar ju om från början. Ett obelastat servo brukar gå på kortets 5 V med liten marginal; ett belastat gör det inte, och två gör det aldrig. Ge servot egen matning.
- Gemensam GND saknas. Servot står stilla eller rycker slumpmässigt så fort det fått egen matning. En sladd löser det.
attach()glömd. Ingenting händer alls, och koden kompilerar. Samma sorts fel som en glömdpinMode().- Vinkel utanför 0–180.
write(200)ger inte 200 grader utan 180 – biblioteket klipper värdet tyst, utan varning och utan skillnad motwrite(180). Du tror att servot fastnat. Tal från 544 och uppåt tolkas dessutom inte som grader alls utan som en pulsbredd i mikrosekunder. Håll dig inom 0–180. - Servot brummar och blir varmt i ett läge. Det står mot ett mekaniskt stopp och drar full ström för att nå en vinkel det inte kommer till. Ändra vinkeln i koden eller ta bort det som är i vägen. Låt det inte stå så.
- Sladdarna sitter i fel ordning. Brun, röd, orange är vanligast men inte lag. Får servot 5 V på styrsladden kan det ta skada. Kontrollera mot servots eget datablad innan du kopplar in, inte efteråt.
- Hornet lossnar och nolläget vandrar. Skruven i mitten är inte valfri. Utan den glider hornet ett tandsteg i taget och spaken hamnar snett efter en stund.
- Servot skruvat i kartong. Fästet fjädrar, och armen rör sig mycket mindre än beräkningen sa. Felet ser ut som att servot är för svagt, men servot gör precis vad det ska.
- Lysdioden på pinne 9 går inte att dimra. Servo-biblioteket har tagit timern. Flytta lysdioden.
Vidare
Kapitlet Bibliotek i språkreferensen hör till den här guiden. Där står receptet i fyra steg, och den lärdom som gäller varje bibliotek du möter senare i kursen: det kan ta hårdvara med sig.
Nu har du alla fyra delarna: kortet, språket, ingången och ställdonet. Nästa steg är bygge 1 – knapp, styrenhet, spak, ditt första bedömda mekatroniska system.