În acest tutorial vom dezvolta un circuit folosind senzorul FLEX, Arduino Uno și un motor Servo. Acest proiect este un sistem servo de control în care poziția arborelui servo este determinată de flexia sau îndoirea sau abaterea senzorului FLEX.
Să vorbim mai întâi un pic despre servomotoare. Servomotorele sunt utilizate acolo unde este nevoie de mișcare sau poziție precisă a arborelui. Acestea nu sunt propuse pentru aplicații de mare viteză. Acestea sunt propuse pentru aplicarea cu viteză redusă, cuplu mediu și poziție precisă. Aceste motoare sunt folosite la mașinile cu brațe robotizate, comenzile de zbor și sistemele de control. Servomotorele sunt utilizate în sistemele încorporate, cum ar fi distribuitoarele automate etc.
Servomotorele sunt disponibile la diferite forme și dimensiuni. Un servomotor va avea în principal fire, unul este pentru tensiune pozitivă, altul este pentru masă și ultimul este pentru setarea poziției. Firul roșu este conectat la alimentare, firul negru este conectat la masă și firul GALBEN este conectat la semnal.
Un servomotor este o combinație de motor DC, sistem de control al poziției, angrenaje. Poziția arborelui motorului de curent continuu este ajustată de electronica de comandă din servo, pe baza raportului de funcționare al semnalului PWM al pinului SIGNAL.
Pur și simplu, electronica de control reglează poziția arborelui controlând motorul de curent continuu. Aceste date privind poziția arborelui sunt trimise prin știftul SIGNAL. Datele de poziție către comandă trebuie trimise sub formă de semnal PWM prin pinul de semnal al servomotorului.
Frecvența semnalului PWM (Pulse Width Modulated) poate varia în funcție de tipul de servomotor. Important este aici RATIUNEA DE DEBIT a semnalului PWM. Pe baza acestei RATIUNI DE DEBIT, electronica de control reglează arborele. Pentru ca arborele să fie deplasat la ceasul de 9o, RATIUNEA DE PORNIT trebuie să fie 1 / 18.ie. 1 mili secundă din „timp ON” și 17 mili secundă din „timp OFF” într-un semnal de 18 ms.
Pentru ca arborele să fie deplasat la ceasul de 12o, timpul de pornire al semnalului trebuie să fie de 1,5 ms, iar timpul de OPRIRE să fie de 16,5 ms. Acest raport este decodat de sistemul de control în servo și ajustează poziția pe baza acestuia.
Acest PWM aici este generat prin utilizarea ARDUINO UNO. Deci, deocamdată știm asta, putem controla arborele servomotorului variind raportul de sarcină al semnalului PWM generat de Arduino Uno. UNO are o funcție specială care ne permite să oferim poziția SERVO fără a deranja semnalul PWM. Cu toate acestea, este important să cunoașteți relația PWM relație de serviciu - poziție servo. Vom vorbi mai multe despre asta în descriere.
Acum să vorbim despre FLEX SENSOR. Pentru a interfața un senzor FLEX cu ARDUINO UNO, vom folosi funcția ADC de 8 biți (Conversie analogică la digitală) pentru a face treaba. Un senzor FLEX este un traductor care își schimbă rezistența la schimbarea formei sale. Un senzor FLEX are o lungime de 2,2 inci sau o lungime a degetului. Este prezentat în figură.
Senzorul flexibil este un traductor care își schimbă rezistența atunci când suprafața liniară este îndoită. De aici și numele senzor flex. Pur și simplu, rezistența terminalului senzorului crește atunci când este îndoită. Acest lucru este prezentat în figura de mai jos.
Această schimbare a rezistenței nu poate face nimic decât dacă le putem citi. Controlerul la îndemână poate citi doar șansele de tensiune și nimic mai puțin, pentru aceasta vom folosi circuitul divizor de tensiune, cu care putem obține schimbarea rezistenței pe măsură ce schimbarea tensiunii.
Divizorul de tensiune este un circuit rezistiv și este prezentat în figură. În această rețea rezistivă avem o rezistență constantă și altă rezistență variabilă. Așa cum se arată în figură, R1 este o rezistență constantă, iar R2 este un senzor FLEX care acționează ca o rezistență.
Punctul mediu al ramurii este luat la măsurare. Cu schimbarea R2, avem schimbări la Vout. Deci, cu aceasta avem o tensiune care se schimbă cu greutatea.
Acum, un lucru important de remarcat aici este că intrarea luată de controler pentru conversia ADC este de până la 50µAmp. Acest efect de încărcare al divizorului de tensiune bazat pe rezistență este important deoarece curentul extras din Vout al divizorului de tensiune crește procentul de eroare crește, deocamdată nu trebuie să ne facem griji cu privire la efectul de încărcare.
FLEX SENSOR atunci când este îndoit, rezistența acestuia se schimbă. Cu acest traductor conectat la un circuit divizor de tensiune, vom avea o tensiune schimbătoare cu FLEX pe traductor. Această tensiune variabilă este FED la unul dintre canalele ADC, vom avea o valoare digitală referitoare la FLEX.
Vom potrivi această valoare digitală cu poziția servo, cu aceasta vom avea servo control prin flex.
Componente
Hardware: Arduino Uno , sursă de alimentare (5v), condensator 1000 uF, condensator 100nF (3 bucăți), rezistor 100KΩ, SERVO MOTOR (SG 90), rezistor 220Ω, senzor FLEX.
Software: Atmel studio 6.2 sau Aurdino noaptea.
Diagrama și explicația circuitului
Diagrama circuitului de control al motorului servo de senzor FLEX este prezentat în figura de mai jos.
Tensiunea pe senzor nu este complet liniară; va fi unul zgomotos. Pentru a filtra zgomotul, condensatorii sunt așezați pe fiecare rezistor din circuitul divizor așa cum se arată în figură.
Aici vom lua tensiunea furnizată de divizor (tensiunea care reprezintă greutatea liniar) și o vom alimenta într-unul dintre canalele ADC ale Arduino UNO. Vom folosi A0 pentru asta. După inițializarea ADC, vom avea valoare digitală reprezentând senzorul îndoit. Vom lua această valoare și o vom asorta cu poziția servo.
Pentru ca acest lucru să se întâmple, trebuie să stabilim câteva instrucțiuni în program și vom vorbi despre ele în detaliu mai jos.
ARDUINO are șase canale ADC, așa cum se arată în figură. În acestea, oricare dintre ele sau toate pot fi utilizate ca intrări pentru tensiunea analogică. UNO ADC are o rezoluție de 10 biți (deci valorile întregi de la (0- (2 ^ 10) 1023)). Aceasta înseamnă că va mapa tensiunile de intrare între 0 și 5 volți în valori între 0 și 1023. Deci, pentru fiecare (5/1024 = 4,9mV) pe unitate.
Aici vom folosi A0 al UNO.
Trebuie să știm câteva lucruri.
|
În primul rând, canalele UNO ADC au o valoare de referință implicită de 5V. Aceasta înseamnă că putem oferi o tensiune maximă de intrare de 5V pentru conversia ADC la orice canal de intrare. Deoarece unii senzori furnizează tensiuni de la 0-2,5V, cu o referință de 5V obținem o precizie mai mică, deci avem o instrucțiune care ne permite să schimbăm această valoare de referință. Deci, pentru schimbarea valorii de referință pe care o avem („analogReference ();”) Deocamdată o lăsăm ca.
În mod implicit, obținem rezoluția maximă ADC a plăcii, care este de 10 biți, această rezoluție poate fi modificată folosind instrucțiuni („analogReadResolution (biți);”). Această modificare a rezoluției poate fi utilă în unele cazuri. Deocamdată o lăsăm așa.
Acum, dacă condițiile de mai sus sunt setate la valorile implicite, putem citi valoarea de la ADC a canalului '0' apelând direct funcția „analogRead (pin);”, aici „pin” reprezintă pinul unde am conectat semnalul analogic, în acest caz acesta ar fi „A0”.
Valoarea din ADC poate fi luată într-un număr întreg ca „int SENSORVALUE = analogRead (A0); ”, Prin această instrucțiune, valoarea după ce ADC este stocată în întregul„ SENSORVALUE ”.
Acum să vorbim despre SERVO, UNO are o caracteristică care ne permite să controlăm poziția servo oferind doar valoarea gradului. Spuneți dacă vrem ca servo să fie la 30, putem reprezenta direct valoarea din program. Fișierul antet SERVO se ocupă de toate calculele raportului de taxe intern.
#include
Servo servo; servo.attach (3); servo.write (grade); |
Prima declarație reprezintă fișierul antet pentru controlul SERVO MOTOR.
A doua afirmație este denumirea servo; îl lăsăm ca servo în sine.
A treia afirmație afirmă unde este conectat pinul de semnal servo; acesta trebuie să fie un pin PWM. Aici folosim PIN3.
A patra afirmație oferă comenzi pentru poziționarea servomotorului și este în grade. Dacă i se dă 30, servomotorul se rotește cu 30 de grade.
Acum sg90 se poate deplasa de la 0-180 grade, avem rezultatul ADC 0-1024
Deci ADC este de aproximativ șase ori poziția SERVO. Deci, împărțind rezultatul ADC la 6, vom obține poziția aproximativă a mâinii SERVO.
Cu aceasta vom avea valoarea poziției servo alimentată la servomotor, care este proporțională cu flexiunea sau îndoirea. Când acest senzor flex montat pe mănușă, putem controla poziția servo prin mișcarea mâinii.