Les 86: Beheer posisie van 'n servomotor deur potensiometer te gebruik
Stel jou voor dat jy 'n eenvoudige knop draai en 'n meganiese arm presies elke beweging volg. Dit is die magie van die kombinasie van 'n potentiometer met 'n servo motor. Hierdie projek, deel van die Arduino Stap-vir-Stap Kursus deur Robojax, demonstreer 'n fundamentele en ongelooflik nuttige konsep in elektronika: die vertaling van 'n analoog inset in presiese fisiese beweging. Jy sal leer hoe om 'n veranderlike spanning van 'n potentiometer te lees, daardie waarde na 'n reeks hoeke te karteer, en 'n servo motor te beveel om na daardie presiese posisie te roteer. Dit is jou poort na die bou van intuïtiewe en interaktiewe projekte waar handmatige beheer outomatisering ontmoet.

Die toepassings vir hierdie vaardigheid is wyd en prakties. Hier is net 'n paar idees om jou te inspireer:
- Robotis-armbeheer: Gebruik 'n potentiometer om elke gewrig van 'n robotis-arm handmatig te posisioneer vir presiese optel-en-plaas-operasies.
- Kamera-pan-en-tilt-stelsel: Bou 'n afstandbeheerde kameramontuur vir tydverloop of toesig, wat glad pan en kantel met 'n draai aan 'n knop.
- Analoog-meter-replika: Skep 'n fisiese paneelbordmeter (soos 'n snelheidsmeter of temperatuurknoppie) wat beweeg op grond van sensor data, met die potentiometer wat as 'n handmatige oorskrywing of kalibrasie-instrument dien.
- Interaktiewe kunsinstallasies: Skep kinetiese beeldhouwerke wat op kyker-insette reageer, waar die draai van 'n knop die posisie van bewegende dele verander.
- Modelvoertuig-stuur: Beheer die stuurook van 'n modelmotor of -boot op afstand, wat 'n meer intuïtiewe en analoog gevoel bied as digitale knoppies.
Hierdie gids is gebaseer op die video-tutoriaal Les 86: Beheer posisie van 'n servo motor met behulp van potentiometer deur Robojax (in video by 00:00). Dit neem jou deur die hele proses, van die verstaan van die bedrading tot die verduideliking van die kode wat dit alles laat werk. Kom ons begin.
Hardeware en Komponente
Om saam met hierdie projek te volg, sal jy die volgende komponente nodig hê:
- 'n Arduino-bord (bv. Uno, Nano)
- 'n Standaard servo motor (bv. SG90 of MG996R)
- 'n Potentiometer (veranderlike weerstand, tipies 10kΩ)
- Springdrade
- 'n Broodbord (opsioneel, vir makliker verbindings)
Verstaan die Bedrading
Die bedrading vir hierdie projek is eenvoudig. Die sleutel is om die korrekte krag- en seinverbindings vir beide die servo en die potentiometer te verskaf. Die servo is 'n krag-honger toestel, so dit kry sy krag direk van die Arduino se 5V-pen. Die potentiometer dien as 'n spanningsverdeler, en ons lees die spanning by sy loper (die middelste pen) om sy posisie te bepaal. (in video by 01:05)
Een slim truuk wat hierdie projek gebruik, is die skep van 'n bykomende 5V-bron op 'n digitale pen om die potentiometer van krag te voorsien, aangesien sommige Arduino-borde slegs een toegewyde 5V-pen het. Dit word in die kode gedoen deur 'n digitale pen (pen 8) op HOOG te stel, wat 5V uitset. (in video by 00:39)
Hier is die bedradingdiagram wat in die video genoem word:
Kom ons breek die verbindings af:
- Servo Motor:
- Krag (Rooi draad) → Arduino 5V-pen
- Grond (Bruin/Swart draad) → Arduino GND-pen
- Sein (Oranje/Geel draad) → Arduino pen 3 ('n PWM-geskikte pen)
- Potentiometer:
- Linkerpen → Arduino GND-pen
- Middelste pen (Loper) → Arduino analoog pen A0
- Regterpen → Arduino pen 8 (gedefinieer as VCC2 in die kode)
Kode-verduideliking
Die kode vir hierdie projek is elegant eenvoudig. Dit gebruik 'n paar sleutel Arduino-funksies om die potentiometer te lees en die servo te beheer. Kom ons fokus op die gebruikerskonfigureerbare dele wat jy vir jou eie projekte kan aanpas. (in video by 03:00)
Boonop in die skets sal jy die penne definieer en die servo-objek skep. Dit is die primêre veranderlikes wat jy sal verander op grond van jou bedrading:
#include <Servo.h>
Servo myservo; // skep servo-objek om 'n servo te beheer
int potpin = A0; // analoog pen gebruik om die potentiometer te verbind
int servoPin = 3; // definieer 'n digitale pen (met PWM) vir servo. Kan slegs pen 3, 5, 6, 9, 10, 11 gebruik
int VCC2 = 8;// definieer ekstra VCC vir potentiometer
int val; // veranderlike om die waarde van die analoog pen te lees
Hier is wat elke deel doen:
- Servo myservo;: Hierdie lyn skep 'n objek genaamd
myservowat ons sal gebruik om ons spesifieke servo motor te beheer. Jy kan dit hernoem, maar jy moet dieselfde naam later in die kode gebruik. - int potpin = A0;: Dit definieer watter analoog pen die potentiometer se loper aan gekoppel is. As jy die draad na 'n ander analoog pen skuif, moet jy hierdie nommer opdateer.
- int servoPin = 3;: Dit stel die digitale pen vir die servo se seindraad. Dit is noodsaaklik om 'n PWM-geskikte pen te gebruik (gewoonlik dié wat met 'n '~' op die bord gemerk is). Die kommentaar lys die geldige penne vir die meeste Arduinos.
- int VCC2 = 8;: Dit is die pen wat ons as 'n sekondêre 5V-bron vir die potentiometer gebruik. As jy 'n bord met veelvuldige 5V-penne het, kan jy dit direk verbind en hierdie deel van die kode verwyder.
In die setup()-funksie initialiseer die kode die servo en stel die ekstra kragpen op. Die myservo.attach(servoPin)-funksie is noodsaaklik omdat dit vir die Arduino sê watter pen aan die servo se sein-draad gekoppel is.
void setup() {
Serial.begin(9600); // stel serieel op
myservo.attach(servoPin); // koppel die servo op pen 3 aan die servo-objek
pinMode(VCC2, OUTPUT);// stel pen 8 as uitset
digitalWrite(VCC2, HIGH);// stel pen 8 HOOG sodat dit as 5V-pen optree
}
Die kernlogika is in die loop()-funksie. Dit lees die potensiometer se waarde, skaal dit na 'n hoek, en beveel die servo om te beweeg. Die twee kritieke funksies hier is analogRead() en map(). (in video by 04:27)
void loop() {
val = analogRead(potpin); // lees die waarde van die potensiometer (waarde tussen 0 en 1023)
val = map(val, 0, 1023, 0, 180); // skaal dit om met die servo te gebruik (waarde tussen 0 en 180)
myservo.write(val); // stel die servo-posisie volgens die geskaalde waarde
Serial.print(val);
Serial.println();
delay(50); // wag vir die servo om daar te kom
}
Hier is hoe dit werk:
- analogRead(potpin): Hierdie funksie lees die spanning van die potensiometer se sleepkontak en gee 'n waarde terug tussen 0 (0V) en 1023 (5V).
- map(val, 0, 1023, 0, 180): Dit is die sleutel tot die hele projek. Dit neem die rou waarde van die potensiometer (0 tot 1023) en skakel dit proporsioneel om na 'n servo-hoek (0 tot 180 grade). Byvoorbeeld, as die potensiometer 511 lees (ongeveer die helfte), sal die
map()-funksie 90 teruggee, wat die servo na sy middelposisie beweeg. - myservo.write(val): Hierdie funksie neem die berekende hoek (nou gestoor in
val) en sê vir die servo om na daardie posisie te draai. - delay(50): Dit voeg 'n klein pouse by die einde van elke lus. Dit beheer die opdateringstempo. 'n Groter vertraging (soos 200ms) laat die servo in stappe beweeg, terwyl 'n kleiner vertraging (soos 50ms) die beweging baie glad maak. Jy kan dit aanpas om die reaksievermoë te verander. (in video by 07:26)
Lewende Projekdemonstrasie
In die video kan jy die projek in aksie sien. Soos die potensiometer-knop gedraai word, volg die servo-motor se arm sy posisie proporsioneel. Die serieel-monitor druk die huidige hoek, wat bevestig dat die kartering korrek werk. Wanneer die potensiometer op sy minimum posisie is, is die servo op 0 grade. Soos jy die knop na sy maksimum draai, draai die servo glad na 180 grade. (in video by 06:33)
Hierdie intydse terugvoerlus demonstreer die naatlose integrasie van 'n analoog sensor met 'n digitale aktuator, wat 'n responsiewe en intuïtiewe beheerstelsel skep.
Hoofstukke
- [00:00] Inleiding en Projekoorsig
- [01:05] Skematiese en Bedradingsdiagram
- [02:07] Fisiese Bedradingsdemonstrasie
- [03:00] Kodeverduideliking
- [06:33] Lewende Demonstrasie en Toetsing
- [07:26] Aanpassing van Servo-reaksiespoed
/*
* Lesson 88: Controlling Servo motor a with Potentiometer
* 📚⬇️ Download and resource page https://robojax.com/RJT763
watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on Jan 01, 2019 in Ajax, Ontario, Canada
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
delay(50); // waits for the servo to get there
}
Goedere wat jy dalk nodig het
-
Amazon
-
Amazon
-
eBay
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Hulpbronne en verwysings
Lêers📁
Ander lêers
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB