Servo's aansluiten op Arduino. Arduino SG90, MG995 servodrives: aansluitschema en besturing
Zoals reeds vermeld is een servoaandrijving een nauwkeurige performer die, wanneer hij de waarde van een regelparameter als invoer ontvangt, ernaar streeft een waarde aan de uitgang van de actuator te creëren en te behouden.
In dit artikel zullen we kijken naar wat stuurpulsen zijn, en hoe je servo's het beste op Arduino kunt aansluiten.
Gebruikte componenten (kopen in China):
. Controlebord
. Draden aansluiten
Handig voor het controleren van servoaandrijvingen
We hebben in dit artikel al gesproken over hoe ingangspulsen worden omgezet in motorbesturingssignalen. Je kunt lezen over de motorbesturingssignalen zelf en hun verschillen in verschillende soorten servo's. In dit artikel zullen we het direct hebben over stuurpulsen, en er zullen voorbeelden worden gegeven van hoe je deze op Arduino kunt genereren.
Het stuursignaal bestaat uit pulsen met de benodigde breedte, die met een bepaalde frequentie worden verzonden. Voor de servo's die we overwegen zal de pulszendfrequentie bijna altijd ongeveer 50 Hz zijn (dit is ongeveer 1 keer per 20 ms), en de pulsbreedte zal variëren van 544 µs tot 2400 µs.
Zoals op de afbeelding te zien is, zal een puls met een breedte van 544 microseconden de uitgaande as in de 0°-positie zetten, 1520 microseconden komt overeen met een hoek van 90° en 2400 microseconden komt overeen met 180°.
Door de breedte van de pulsen binnen deze grenzen te veranderen, kunnen we de rotatiehoek van de uitgaande as nauwkeurig instellen, maar daarover later meer. In deze fase van het artikel wil ik het hebben over hoe je een servodrive op Arduino aansluit.
Om verbinding te maken met de controller worden 3 draden uit de servoaandrijving getrokken, gekrompen met een standaard 3-pins connector met een steek van 2,54 mm. Draadkleuren kunnen variëren. Bruin of zwart is aarde (GND), rood is voeding positief (VTG), oranje of wit is stuursignaal (SIG).
Servo's aansluiten op Arduino
Oude Arduino's uitgerust met Mega 8 hebben slechts drie PWM-uitgangen (digitaal 9,10,11), terwijl Arduino's uitgerust met Mega 168 of 328 er 6 hebben (digitaal 3,5,6,9,10,11). De Arduino MEGA-familie heeft maar liefst 14 PWM-pinnen aan boord.
Koop in Rusland
Ik kwam de populaire, goedkope SG90-servoaandrijving tegen. En ik besloot het te besturen, maar zonder microcontroller. In dit artikel schets ik de gedachtegang van de ontwikkelaar bij het implementeren van een van de oplossingsopties.
Voor iedereen die geïnteresseerd is, zie cat.
Idee
U moet de servoaandrijving besturen, maar zonder microcontroller.Kennis
Iedereen weet dat ervaring en kennis helpen bij het creëren en vinden van oplossingen. Op de pagina's van Giktayms staan veel voorbeelden van het gebruik van een servoaandrijving met controllers. Ze vertellen gedetailleerd over het servo-aandrijfbesturingssysteem. Laten we deze ervaring van andere ontwikkelaars gebruiken als de kennis die we nodig hebben om het probleem op te lossen. De SG90-servoaandrijving wordt bestuurd door een PWM-signaal, waarvan de parameters de positie van de rotor bepalen. De PWM-periode bedraagt ongeveer 20 mS, de duur van het stuursignaal bedraagt 500 tot 2100 μS.Taak
Idee en kennis leiden tot een probleem dat moet worden opgelost. Laten we een taak formuleren om het idee te implementeren. Dit is zoiets als een technische specificatie. Het lijkt erop dat alles eenvoudig is: je moet een pulsgenerator met een variabele werkcyclus nemen, de voeding op de servoaandrijving aansluiten en een stuursignaal vanaf de generator sturen. We merken vooral op dat de vereisten veranderingen in de werkcyclus omvatten, dat wil zeggen dat er bedieningselementen of een gebruikersinterface moeten zijn.Uitvoering
Dit is waar de pijn van creativiteit begint: wat moet je krijgen en waar kun je het krijgen? U kunt een kant-en-klare laboratoriumpulsgenerator vinden, bijvoorbeeld G5-54 met knoppen en knoppen, de benodigde parameters instellen en de generator aansluiten op een servoaandrijving. Dit is echter omslachtig en niet iedereen heeft deze luxe. Daarom proberen ontwikkelaars, vertrouwend op hun ervaring en kennis, verlangen (idee-taak) en mogelijkheden (materieel en creatief) te combineren om de taak uit te voeren. Materiële mogelijkheden zijn die ‘pad’: ‘Hoeveel en wat wil ik uitgeven aan de uitvoering van het idee?’ Creatieve mogelijkheden zijn: “Laat me eens kijken wat ik al heb.” Dit zijn niet noodzakelijkerwijs materiële bezittingen, maar ervaring en kennis van eerdere ontwikkelingen die kunnen worden aangepast voor implementatie. Het zou ook een goed idee zijn om te zoeken (Google) of iemand iets soortgelijks al heeft geïmplementeerd. Om de oplossingsopties te verminderen, moet u zelf aanvullende vereisten toevoegen die de verbeeldingskracht van de implementatie beperken. Laten we bijvoorbeeld nog een voorwaarde aan de vereisten toevoegen, laat het een materiële beperking zijn, de implementatie moet dat wel zijn goedkoop.Zoek naar alternatieven
Via internet gaan we op zoek naar de mogelijkheden die het NETWERK biedt. Laten we beginnen met zoeken: "rechthoekige pulsgenerator met variabele werkcyclus." We zullen veel opties krijgen, zowel met behulp van geïntegreerde timers NE555 (binnenlands analoog van KR1006VI1) als op logica-chips. Uit alle variatie heb ik gekozen voor een invertergenerator met een Schmitt-trigger aan de ingang. Ten eerste is het de eenvoudigste, ten tweede vereist het een minimum aan onderdelen en het meest interessante is dat het een enkel logisch element van de zes gebruikt, als je bijvoorbeeld een 74HC14-chip gebruikt.Het circuit van zo'n generator ziet er als volgt uit:
Een beetje theorie
De theorie zegt dat de frequentie van zo'n generator f = 1/T = 1/(0,8*R*C) is. Om de vereiste frequentie te verkrijgen, moet u de waarde selecteren van een van de elementen die de frequentie instellen. Omdat het logische element is gemaakt met behulp van CMOS-technologie, heeft het een hoge ingangsweerstand, zodat elementen kunnen worden gebruikt die kleine bedrijfsstromen instellen. Laten we capaciteit C1 kiezen uit een aantal gemeenschappelijke waarden, bijvoorbeeld 0,47 µF. Om vervolgens de vereiste frequentie (50 Hz) te verkrijgen, moet de weerstand ongeveer 53 kOhm zijn, maar zo'n weerstand bestaat niet in de standaardserie, dus kiezen we 51 kOhm.Aan de uitgang van zo'n generator wordt een signaal gegenereerd dat dicht bij een blokgolf ligt, dus we moeten het circuit zo aanpassen dat het aan de vereisten van de taak voldoet. Om een instelbare pulsduur aan de uitgang te verkrijgen, is het noodzakelijk om de wijze van opladen van de condensator te veranderen van een hoog niveau aan de uitgang, namelijk het verkorten van de oplaadtijd. Om dit te doen, voegen we nog twee elementen aan het circuit toe: een diode en een variabele weerstand. Elke schakeldiode met laag vermogen is voldoende.
Het diagram zal dan de volgende vorm aannemen:
Het lijkt erop: dat is alles, het probleem is opgelost, maar in de uiterste posities van de variabele weerstand is het gedrag van de servoaandrijving onstabiel. Dit komt door het feit dat de waarde van de pulsduur in de uiterste posities van de variabele weerstand niet overeenkomt met de vereiste waarden. Persoonlijk houd ik ook niet van het gebruik van een variabele weerstand, daarom wil ik de besturingsinterface veranderen door bijvoorbeeld een nieuwe “wens” toe te voegen aan de technische specificatie, zodat de duty-cycle verandert afhankelijk van de verlichting. Daar bestaat een eenvoudige en goedkope oplossing voor: gebruik als regelelement een GL55xx-fotoresistor (gebruikt in Arduino-projecten), waarvan de weerstand over een groot bereik varieert.
Dan begint het plezier. Er zijn geen rekenformules voor het verkrijgen van weerstandswaarden die de vereiste pulsduur opleveren, daarom bepalen we op intuïtieniveau (experimenteel met behulp van een variabele weerstand) de weerstandswaarden waarbij de vereiste pulsduurwaarden zijn ingesteld. Vervolgens veranderen we het circuit zodat wanneer de weerstand van de fotoresistor verandert, de totale weerstand verandert, waarbij de vereiste waarden voor de pulsduur worden ingesteld.
Het uiteindelijke schema heeft de volgende vorm:
Uitleg voor het uiteindelijke diagram
Condensator C1 met een nominale waarde van 0,47 μF bepaalt de oplaadtijd. Weerstand R1 met een nominale waarde van 51 kOhm stelt de hoofdpulsherhalingsfrequentie in op ongeveer 50 Hz. De combinatie van weerstanden R2-R4 in totaal zal variëren in het bereik van 2,5 kOhm tot 24 kOhm, afhankelijk van de verlichting. Samen met diode D1 zullen deze weerstanden de oplaadtijd van condensator C1 beïnvloeden onder invloed van een positieve puls aan de uitgang van het logische element, waardoor de duur ervan wordt bepaald.Resultaat
Door deze generator aan te sluiten op de stuuringang van de servoaandrijving, kunnen we deze besturen door de verlichting van de fotoweerstand te veranderen. In de video kun je zien wat er van kwam:is een aandrijving waarvan de as in een bepaalde positie kan bewegen of een bepaalde rotatiesnelheid kan handhaven. Met andere woorden: de servo-as kan worden aangestuurd door deze bijvoorbeeld een stand in graden of een bepaald toerental te geven.
Ze worden op verschillende gebieden gebruikt, bijvoorbeeld in de robotica helpen ze verschillende bewegingen van robots te simuleren. Servo-aandrijvingen– een effectieve oplossing voor het verplaatsen van mechanismen in de ruimte.
In deze les leren we hoe we moeten managen servo-aandrijving.
Voor de les hebben we nodig:
Verbinding maken met Arduino
Een servoaandrijving kan worden aangesloten op een Arduino-programmeerbare controller om een breed scala aan robotica-doelen te bereiken. De verbinding wordt gemaakt via kabels die uit de servo komen. Meestal zijn er drie kabels: rood; bruin of zwart; geel, oranje of wit.
De servoaandrijving is via PWM-pinnen met het Arduino-bord verbonden. We hebben in de les al besproken wat PWM (PWM) is: Een LED op Arduino soepel inschakelen met behulp van PWM (PWM)
Laten we de les nemen: een knop en een LED op een Arduino-bord aansluiten op het circuit als basis, een servoaandrijving toevoegen en dit is wat we zouden moeten krijgen.
Laten we de code veranderen:
#erbij betrekken
#erbij betrekken
We hebben nog niet met bibliotheken gewerkt. Een bibliotheek is een klasse die functies bevat die we in ons programma kunnen gebruiken. Met de bibliotheek kunt u de hoeveelheid geschreven code en de snelheid van de applicatieontwikkeling verminderen.
Zoals je begrijpt verbindt de bovenstaande regel onze Servo.h-bibliotheek, waarna we alle functies van deze bibliotheek kunnen gebruiken.
Servo-servo; // declareer een servovariabele van het type "servo"
Door een variabele te declareren, hebben we deze nodig om met de bibliotheek te werken.
Servo.attach(5); // bind de servo aan analoge uitgang 5
Servobibliotheekfunctie.
Servo.schrijven(180); //stel de as in op 180
Met deze functie kunnen we de servo naar een bepaalde hoek draaien.
Volgende les:IR-afstandsbediening. LED aan/uit zetten.
Naast de controller en sensoren zijn actuatoren zonder uitzondering een belangrijk onderdeel van alle robots. Ze draaien de wielen van de robot, waardoor deze door de ruimte kan bewegen, en activeren krachtige manipulatoren , waarmee hij voorwerpen vastpakt.
In deze tutorial gaan we werken met zo'n actuator genaamd servo-aandrijving(of servo). In tegenstelling tot een conventionele elektromotor is een servoaandrijving een complex componentapparaat dat bestaat uit een gelijkstroommotor, een tandwielreductor, een potentiometer en een elektronisch circuit. Dit alles zorgt ervoor dat de servoaandrijving de as strikt onder een bepaalde hoek kan draaien en vasthouden. Met dergelijke schijven kunt u bijvoorbeeld de volgende eenvoudige manipulator maken:
1. Verbinding met Arduino
Zoals hierboven vermeld, staat de servoaandrijving dus bekend om zijn vermogen om onder een bepaalde hoek te roteren. Hoe gaan we hem deze hoek laten zien? Ik stel voor om hiervoor een variabele weerstand, ook wel potentiometer genoemd, te gebruiken. We zullen de potentiometerknop draaien en de controller zal de servo opdracht geven om naar de juiste hoek te draaien.
De potentiometer heeft slechts drie aansluitingen. We zullen de extremen verbinden met +5V en aarde, en de centrale met de analoge ingang A0.
De SG90-servo heeft ook drie contacten. Ze zijn meestal als volgt gekleurd:
- bruin - aarde;
- rood - voeding +5V;
- oranje (of geel) - signaal.
We sluiten de signaaldraad aan op digitale uitgang nr. 8. Als resultaat krijgen we het volgende diagram:
Handiger is het om beide apparaten via een breadboard op Arduino Uno aan te sluiten:
2. Programma
Laten we nu een eenvoudig programma schrijven dat alle elementen van ons apparaat met strikte logica verbindt. Het enige wat we van de controller nodig hebben is:
- lees de waarden van de potentiometer in het bereik van 0 tot 1023;
- converteer het resulterende getal naar een hoek van 0 tot 180 graden;
- breng de resulterende hoek over naar de servoaandrijving.
Om een programma te schrijven gebruiken we onze . We gebruiken de servoaandrijfeenheid, de leeseenheid van de analoge poort en de functie om het ene waardebereik naar het andere toe te wijzen.
Door in de designer op de knop “Arduino” te klikken, openen we een pagina met de broncode van het programma voor de Arduino IDE:
#erbij betrekken
Zoals uit het programma blijkt, hebben we de bibliotheek gebruikt om de servoaandrijving te besturen Servo. Deze bibliotheek heeft verschillende functies die voor ons nuttig zijn:
- Attach(pin_number) — servo-initialisatie;
- write(angle) - draai de servo onder een bepaalde hoek;
- read() - Haalt de huidige servohoek op.
Om de reeks getallen 0 - 1023 toe te wijzen aan de reeks 0 - 180, gebruikte de constructor de functie kaart. Dezelfde bewerking kan worden uitgevoerd met behulp van de uitdrukking:
int hoek = (waarde / 1023,0) * 180;
Laad het programma op de Arduino Uno en kijk wat er gebeurt!
Nu weet u wat een servoaandrijving is en kunt u deze eenvoudig bedienen. Vooruit! Op weg naar de creatie van robotarmen en lopende spinrobots!
Ik denk dat iedereen zich kan voorstellen wat een elektromotor is, nietwaar? - onthoud dan een soort fan. Wat is het karakteristieke kenmerk? Dat klopt, zet spanning aan en hij draait, verwijder de spanning en hij draait niet. Een servoaandrijving is ook een motor, maar in tegenstelling tot andere, zal hij, voor zover u hem zegt te draaien, draaien en stoppen. Zolang het stuursignaal behouden blijft, zal de servo zijn positie fixeren. Je kunt hem zelfs met je handen draaien, hij keert nog steeds terug naar de aangegeven positie.
De hoek waarover de servo draait, wordt bepaald door de pulsbreedte. Het is de moeite waard om een kleine subtiliteit te verduidelijken, servo's zijn er in verschillende typen. Er zijn er die constant in een bepaalde richting draaien, terwijl de pulsbreedte alleen de rotatiesnelheid beïnvloedt. Er zijn multi-turn exemplaren. Degenen die verder zullen worden besproken, zijn duidelijk aangegeven op de website van de fabrikant, met vermelding van de rotatiehoek. Houd er daarom rekening mee dat als de servo geen duidelijke markeringen heeft, het kan blijken dat hij domweg constant draait. Laat u niet verwarren, de opschriften 0,20 sec/60° betekenen de rotatiesnelheid, ze houden op geen enkele manier verband met de maximale rotatiehoek.
Laten we verder gaan met de theorie. We stellen ons een microcontroller voor met een weerstand R aangesloten op de ADC-ingang en een bepaalde motor die draait met behulp van een PWM PWM-signaal. Laten we zeggen dat het ADC-signaalniveau rechtstreeks is verbonden met de PWM-uitgang, en als we de weerstand draaien, verandert de snelheid. Wanneer de ADC-spanning 0 wordt, stopt de motor.
Overweeg nu optie 2. De weerstandshandgreep is op de motoras gemonteerd, zodat wanneer de motor draait, deze de weerstand van de weerstand verandert, en dus de spanning die aan de ADC-ingang wordt geleverd. Als er bovendien een andere signaalbron is, vergelijkt de microcontroller de spanning aan de ingangen en als deze groter is, draait deze in de ene richting, als deze kleiner is, dan in de andere. Vroeg of laat zullen de spanningen nivelleren en zal de motor stoppen. Daarom bevat de servo alles wat is getekend: een weerstand, een microcontroller, een motor. Uiteraard moeten we een extern signaal geven om te kunnen controleren.
Typische ingewanden zien er als volgt uit:
De foto laat zien dat de weerstand en de motor met elkaar verbonden zijn via een aantal tandwielen, dus als je naar binnen klimt, wees er dan op voorbereid dat al dit spul op je afkomt. Onderaanzicht
Meestal varieert de pulsbreedte van 1100 µs tot 1900 µs, met een periode van 20 ms, maar de cijfers kunnen aanzienlijk verschillen. Voorbeeld uit de datasheet:
Besturingssysteem: +Pulsbreedteregeling 1520usec Neutraal
Vereiste puls: 3-5 volt piek-piek blokgolf
Bedrijfsspanning: 4,8 volt
Bedrijfssnelheid (6V): 0,20 sec/60 graden bij nullast
Bedrijfshoek: 45 graden. één zijpuls die 400usec aflegt
Continue rotatie Aanpasbaar: Nee
Richting: tegen de klok in / pulsreizen 1520-1900usec
Vanaf hier is duidelijk te zien dat het gemiddelde punt 1520 µs is, om zo'n servo 45 graden te draaien, moet je al een puls van 1900 µs toepassen, dienovereenkomstig worden de resterende hoeken proportioneel berekend. Om met -45 graden te roteren moet je een puls van 1100 µs toepassen. Die. bereik 90 graden. Het is ook duidelijk dat dit apparaat niet is ontworpen voor continue rotatie, wat goed is.
Laten we verder gaan met oefenen. Er is een Futaba S3152-patiënt die heen en weer moet draaien.
Je kunt dit ding ook testen in Proteus. De gebruikelijke verbinding verloopt via drie draden: rood +5V, zwart - aarde, wit - bediening.
In de nieuwste versies van CAVR is er veel lekkers verschenen in Codewizard, zo kun je bij papegaaien cijfers invoeren en de periode en impuls in seconden zien. Eigenlijk is de snelle pwm top ICR-modus belangrijk voor ons. Deze modus is opmerkelijk omdat ICR de periode specificeert, en OCR de pulsbreedte specificeert.
De periode wordt heel eenvoudig berekend:
ICR = (Timerfrequentie/50Hz)-1
Vervolgens kan de benodigde pulsbreedte eenvoudig worden berekend met behulp van de verhouding:
20 ms = ICR
?ms = OCR
Als gevolg hiervan kunt u het als volgt herschrijven:
OCR = (x*ICR)/20; waarbij x de vereiste pulsduur is. U hebt bijvoorbeeld een pulsduur van 1 ms nodig, wat betekent OCR= (1*9C3)/20=0x7C.
Dat is alles. Nu gaan we uit van het feit dat het neutrale punt = 1524 μs of OCR1 = (1.524 * 9C3)/20 = 0xBE en, afhankelijk van waar we heen moeten, herberekenen we de OCR. Een eenvoudig voorbeeld: verander naar -45, dan 0 en dan +45.
#erbij betrekken |
#erbij betrekken Het bleek zo: Voor stm32 zal ik een voorbeeld geven van een opstelling die naar mijn mening nog eenvoudiger is. Voorbeeld voor stm32f103, PA1-poot, klok 72 MHz. TIM_SETUP.TIM_CounterMode = TIM_CounterMode_Up; TIM_SETUP.TIM_Periode = 4096; TIM_SETUP.TIM_Prescaler = 351; //De PA1-poot instellen voor een alternatieve functie GPIO_InitTypeDef PORT_SETUP; PORT_SETUP.GPIO_Modus = GPIO_Mode_AF_PP; PORT_SETUP.GPIO_Pin = GPIO_Pin_1; PORT_SETUP.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, & POORT_SETUP) ; //de timer instellen TIM_TimeBaseInitTypeDef TIM_SETUP;