← Kursens material Servot och den mekaniska strukturen · område 2 Område 2

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

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ärgVadKopplas till
Brun eller svartGND, nollanGND – alltid, och alltid gemensam med kortets GND
RödMatning, 4,8–6 V5 V, eller ett eget batteri (se nedan)
Orange eller gulStyrsignalEn 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å.

Servots styrsignal ritad som en fyrkantvåg över tiden. Signalen ligger låg, går hög under en smal puls, och går låg igen tills nästa puls börjar. En klammer över pulsen är märkt 1,5 millisekunder och en klammer under, från pulsens början till nästa puls början, är märkt 20 millisekunder. HIGH LOW 1,5 ms 20 ms

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:

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:

StorhetSG90, typiskt
Matningsspänning4,8–6 V
Ström i vila, obelastadnågra milliampere
Ström under rörelsestorleksordningen 100–250 mA
Ström när axeln hålls fastflera hundra mA, uppåt 700 mA
Vridmoment vid stoppomkring 1,8 kg·cm
Vinkelområdeungefä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:

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

Ett servo med en arm, sett från sidan. Servot är en rektangel till vänster. Ur dess högra kant sticker utaxeln, ritad som en liten cirkel. Från axeln går en rak arm åt höger till ett hål i änden. En pil rakt uppåt vid armens ände är märkt F. En måttlinje under armen, från axeln till änden, är märkt r. servo F r

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.

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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

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.