Search Code

Somo la 86: Dhibiti nafasi ya motor ya servo kwa kutumia potentiometer

Somo la 86: Dhibiti nafasi ya motor ya servo kwa kutumia potentiometer

Fikiria kugeuza kifundo rahisi na kuona mkono wa kiufundi ukifuata kila harakati yako kwa usahihi. Huo ni uchawi wa kuchanganya potentiometer na motor ya servo. Mradi huu, sehemu ya Kozi ya Arduino Hatua kwa Hatua ya Robojax, unaonyesha dhana ya msingi na muhimu sana katika umeme: kubadilisha pembejeo ya analogi kuwa mwendo halisi wa kimwili. Utajifunza jinsi ya kusoma voltage inayobadilika kutoka kwa potentiometer, kuramisha thamani hiyo kwa anuwai ya pembe, na kuamuru motor ya servo kuzunguka hadi nafasi hiyo hasa. Hii ni njia yako ya kujenga miradi ya kuvutia na ya mwingiliano ambapo udhibiti wa mikono unakutana na otomatiki.

Matumizi ya ujuzi huu ni makubwa na ya vitendo. Hapa kuna mawazo machache ya kukupa msukumo:

  • Udhibiti wa Mkono wa Roboti: Tumia potentiometer kuweka kila kiungo cha mkono wa roboti kwa usahihi kwa shughuli za kuchukua na kuweka.
  • Mfumo wa Kupiga Picha na Kuinamisha Kamera: Jenga mlima wa kamera unaodhibitiwa kwa mbali kwa muda wa muda au ufuatiliaji, ukisogeza vizuri na kuinamisha kwa kugeuza kifundo.
  • Nakala ya Gauge ya Analogi: Unda gauge halisi ya dashibodi (kama speedometer au kifundo cha joto) inayosonga kulingana na data ya sensor, na potentiometer ikitumika kama zana ya kurekebisha kwa mkono au kusawazisha.
  • Ufungaji wa Sanaa wa Mwingiliano: Unda sanamu za kinetic zinazojibu pembejeo za mtazamaji, ambapo kugeuza kifundo kunabadilisha nafasi ya sehemu zinazosonga.
  • Uendeshaji wa Gari la Mfano: Dhibiti pembe ya uendeshaji wa gari la mfano au mashua kwa mbali, ukitoa hisia ya analogi na ya asili zaidi kuliko vifungo vya dijiti.

Mwongozo huu unatokana na mafunzo ya video Lesson 86: Control position of a servo motor using potentiometer na Robojax (katika video saa 00:00). Inakuelekeza katika mchakato mzima, kuanzia kuelewa wiring hadi kuelezea msimbo unaofanya yote kufanya kazi. Tuanze.

Vifaa na Vipengele

Ili kufuata mradi huu, utahitaji vipengele vifuatavyo:

  • Bodi ya Arduino (k.m., Uno, Nano)
  • Motor ya kawaida ya servo (k.m., SG90 au MG996R)
  • Potentiometer (kipinga kinachobadilika, kawaida 10kΩ)
  • Waya za jumper
  • Breadboard (hiari, kwa miunganisho rahisi)

Kuelewa Wiring

Wiring ya mradi huu ni rahisi. Jambo muhimu ni kutoa miunganisho sahihi ya nguvu na ishara kwa servo na potentiometer. Servo ni kifaa kinachotumia nguvu nyingi, kwa hivyo hupata nguvu yake moja kwa moja kutoka kwa pini ya 5V ya Arduino. Potentiometer hufanya kama mgawanyiko wa voltage, na tunasoma voltage kwenye wiper yake (pini ya katikati) kuamua nafasi yake. (katika video saa 01:05)

Ujanja mmoja wa mradi huu ni kuunda chanzo cha ziada cha 5V kwenye pini ya dijiti kuwezesha potentiometer, kwani baadhi ya bodi za Arduino zina pini moja tu ya 5V. Hii inafanywa katika msimbo kwa kuweka pini ya dijiti (pini 8) kuwa HIGH, ambayo hutoa 5V. (katika video saa 00:39)

Hapa kuna mchoro wa wiring uliotajwa kwenye video:

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot

Hebu tuchambue miunganisho:

  • Motor ya Servo:
    • Nguvu (Waya nyekundu) → Pini ya 5V ya Arduino
    • Ardhi (Waya ya kahawia/nyeusi) → Pini ya GND ya Arduino
    • Ishara (Waya ya machungwa/njano) → Pini ya 3 ya Arduino (pini inayoweza PWM)
  • Potentiometer:
    • Pini ya Kushoto → Pini ya GND ya Arduino
    • Pini ya Kati (Wiper) → Pini ya analogi A0 ya Arduino
    • Pini ya Kulia → Pini ya 8 ya Arduino (inayofafanuliwa kama VCC2 katika msimbo)

Maelezo ya Msimbo

Msimbo wa mradi huu ni rahisi kwa uzuri. Unatumia kazi kadhaa muhimu za Arduino kusoma potentiometer na kudhibiti servo. Hebu tuzingatie sehemu zinazoweza kubadilishwa na mtumiaji ambazo unaweza kurekebisha kwa miradi yako mwenyewe. (katika video saa 03:00)

Juu ya sketch, utafafanua pini na kuunda kitu cha servo. Hizi ndizo vigezo vya msingi utakavyobadilisha kulingana na wiring yako:

#include <Servo.h>

Servo myservo;  // unda kitu cha servo kudhibiti servo

int potpin = A0;  // pini ya analogi inayotumika kuunganisha potentiometer
int servoPin = 3; // fafanua pini ya dijiti (yenye PWM) kwa servo. Unaweza kutumia pini 3, 5, 6, 9, 10, 11 pekee
int VCC2 = 8;// fafanua VCC ya ziada kwa potentiometer
int val;    // kigezo cha kusoma thamani kutoka kwa pini ya analogi

Hapa kuna kile kila sehemu inafanya:

  • Servo myservo;: Mstari huu unaunda kitu kinachoitwa myservo ambacho tutatumia kudhibiti motor yetu maalum ya servo. Unaweza kubadilisha jina, lakini lazima utumie jina lile lile baadaye katika msimbo.
  • int potpin = A0;: Hii inafafanua ni pini gani ya analogi ambayo wiper ya potentiometer imeunganishwa. Ukihamisha waya kwenye pini nyingine ya analogi, lazima usasishe nambari hii.
  • int servoPin = 3;: Hii inaweka pini ya dijiti kwa waya wa ishara ya servo. Ni muhimu kutumia pini inayoweza PWM (kawaida zile zilizo na alama ya '~' kwenye bodi). Maoni yanaorodhesha pini halali kwa Arduino nyingi.
  • int VCC2 = 8;: Hii ni pini tunayotumia kama chanzo cha pili cha 5V kwa potentiometer. Ikiwa una bodi yenye pini nyingi za 5V, unaweza kuiunganisha moja kwa moja na kuondoa sehemu hii ya msimbo.

Katika kazi ya setup(), msimbo huanzisha servo na kuweka pini ya ziada ya nguvu. Kazi ya myservo.attach(servoPin) ni muhimu kwani inaiambia Arduino ni pini gani imeunganishwa na waya wa ishara wa servo.

void setup() {
  Serial.begin(9600);          //  weka serial
  myservo.attach(servoPin);  // inaunganisha servo kwenye pini 3 kwenye kitu cha servo

  pinMode(VCC2, OUTPUT);// weka pini 8 kama pato
  digitalWrite(VCC2, HIGH);// weka pini 8 HIGH ili ifanye kazi kama pini ya 5V
}

Mantiki ya msingi iko katika kazi ya loop(). Inasoma thamani ya potentiometer, inaipima kwa pembe, na kuamuru servo kusonga. Kazi mbili muhimu hapa ni analogRead() na map(). (katika video saa 04:27)

void loop() {
  val = analogRead(potpin);            // inasoma thamani ya potentiometer (thamani kati ya 0 na 1023)
  val = map(val, 0, 1023, 0, 180);     // ipime ili itumike na servo (thamani kati ya 0 na 180)
  myservo.write(val);                  // inaweka nafasi ya servo kulingana na thamani iliyopimwa
  Serial.print(val);
  Serial.println();
  delay(50);                           // inasubiri servo kufika hapo
}

Hivi ndivyo inavyofanya kazi:

  • analogRead(potpin): Kazi hii inasoma voltage kutoka kwenye wiper ya potentiometer na inarudisha thamani kati ya 0 (0V) na 1023 (5V).
  • map(val, 0, 1023, 0, 180): Hii ndiyo ufunguo wa mradi mzima. Inachukua thamani ghafi kutoka potentiometer (0 hadi 1023) na kuibadilisha kwa uwiano kuwa pembe ya servo (0 hadi digrii 180). Kwa mfano, ikiwa potentiometer inasoma 511 (karibu nusu), kazi ya map() itarudisha 90, ikisogeza servo kwenye nafasi yake ya katikati.
  • myservo.write(val): Kazi hii inachukua pembe iliyohesabiwa (sasa imehifadhiwa katika val) na kuiambia servo kuzunguka hadi nafasi hiyo.
  • delay(50): Hii inaongeza pause ndogo mwishoni mwa kila kitanzi. Inadhibiti kiwango cha sasisho. Kuchelewa zaidi (kama 200ms) kunafanya servo kusonga kwa hatua, wakati kuchelewa kidogo (kama 50ms) kunafanya harakati kuwa laini sana. Unaweza kurekebisha hii kubadilisha uwezo wa kuitikia. (katika video saa 07:26)

Maonyesho ya Mradi wa Moja kwa Moja

Katika video, unaweza kuona mradi ukifanya kazi. Wakati kipini cha potentiometer kinapogeuzwa, mkono wa motor ya servo unafuata nafasi yake kwa uwiano. Kichapishaji cha serial kinachapisha pembe ya sasa, ikithibitisha kwamba uchoraji wa ramani unafanya kazi kwa usahihi. Wakati potentiometer iko kwenye nafasi yake ya chini, servo iko kwenye digrii 0. Unapogeuza kipini hadi kiwango cha juu, servo inazunguka vizuri hadi digrii 180. (katika video saa 06:33)

Kitanzi hiki cha maoni cha wakati halisi kinaonyesha ujumuishaji usio na mshono wa sensor ya analogi na actuator ya dijiti, na kuunda mfumo wa udhibiti unaoitikia na wenye angavu.

Sura

  • [00:00] Utangulizi na Muhtasari wa Mradi
  • [01:05] Mchoro na Mchoro wa Wiring
  • [02:07] Maonyesho ya Wiring ya Kimwili
  • [03:00] Maelezo ya Msimbo
  • [06:33] Maonyesho na Upimaji wa Moja kwa Moja
  • [07:26] Kurekebisha Kasi ya Kuitikia kwa Servo

Bilder

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Språk: C++
/*
 * 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
}
 

Resurser och referenser

Filer📁

Andra filer