În acest tutorial vom dezvolta un circuit folosind senzorul de forță, Arduino Uno și un servomotor. Acesta va fi un sistem servo de control în care poziția arborelui servo este determinată de greutatea prezentă pe senzorul de forță. Înainte de a merge mai departe, să vorbim despre servo și alte componente.
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, de asemenea, utilizate în unele imprimante și aparate de fax.
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.
Așa cum se arată în figura de mai jos, pentru ca arborele să fie deplasat la ceasul de 9o, RATIUNEA DE PORNIRE 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 SERVO MOTOR prin variația raportului de sarcină al semnalului PWM generat de UNO.
Acum să vorbim despre senzorul de forță sau senzorul de greutate.
Pentru a interfața un senzor FORCE cu ARDUINO UNO, vom folosi caracteristica ADC (conversie analogică la digitală) pe 8 biți în arduno uno.
Un senzor FORCE este un traductor care își schimbă rezistența atunci când se aplică presiune pe suprafață. Senzorul FORCE este disponibil în diferite dimensiuni și forme.
Vom folosi una dintre versiunile mai ieftine, deoarece nu avem nevoie de multă acuratețe aici. FSR400 este unul dintre cei mai ieftini senzori de forță de pe piață. Imaginea FSR400 este prezentată în figura de mai jos.
Acum este important să rețineți că FSR 400 este sensibil pe lungime, forța sau greutatea ar trebui să fie concentrate pe labirint pe mijlocul ochiului senzorului, așa cum se arată în figură.
Dacă forța este aplicată în momente greșite, dispozitivul se poate deteriora permanent.
Un alt lucru important de știut este că senzorul poate conduce curenți de gamă mare. Așadar, rețineți curenții de conducere în timpul instalării. De asemenea, senzorul are o limită de forță care este de 10 Newton. Deci, putem aplica doar 1 kg de greutate. Dacă s-au aplicat greutăți mai mari de 1 kg, senzorul ar putea prezenta unele abateri. Dacă a crescut mai mult de 3 kg. senzorul se poate deteriora permanent.
Așa cum am spus mai devreme, acest senzor este utilizat pentru a simți schimbările de presiune. Deci, atunci când greutatea este aplicată deasupra senzorului FORCE, rezistența se schimbă drastic. Rezistența FS400 la greutate este prezentată în graficul de mai jos:
Așa cum se arată în figura de mai sus, rezistența dintre cele două contacte ale senzorului scade odată cu greutatea sau conductanța dintre cele două contacte ale senzorului crește.
Rezistența unui conductor pur este dată de:
Unde, p- Rezistivitatea conductorului
l = Lungimea conductorului
A = Zona conductorului.
Acum, luați în considerare un conductor cu rezistența „R”, dacă se aplică o presiune deasupra conductorului, zona de pe conductor scade și lungimea conductorului crește ca urmare a presiunii. Deci, prin formulă, rezistența conductorului ar trebui să crească, deoarece rezistența R este invers proporțională cu aria și, de asemenea, direct proporțională cu lungimea l.
Deci, cu acest lucru pentru un conductor sub presiune sau greutate, rezistența conductorului crește. Dar această schimbare este mică în comparație cu rezistența generală. Pentru o schimbare considerabilă, mulți conductori sunt strânși împreună.
Aceasta se întâmplă în interiorul senzorilor de forță arătați în figura de mai sus. Privind atent se pot vedea multe linii în interiorul senzorului. Fiecare dintre aceste linii reprezintă un conductor. Sensibilitatea senzorului este în număr de conductori.
Dar, în acest caz, rezistența va scădea odată cu presiunea, deoarece materialul folosit aici nu este un conductor pur. FSR aici sunt dispozitive robuste cu film gros din polimer (PTF). Deci, acestea nu sunt dispozitive cu material conductor pur. Acestea sunt alcătuite dintr-un material care prezintă o scădere a rezistenței cu creșterea forței aplicate pe suprafața senzorului.
Acest material prezintă caracteristicile prezentate în graficul FSR.
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 ca schimbare de tensiune.
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 FORCE 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.
Acum, când forța este aplicată pe SENZORUL DE FORȚĂ, tensiunea la capătul divizorului modifică acest pin, conectat la canalul ADC al UNO, vom obține o valoare digitală diferită de ADC a UNO, ori de câte ori forța asupra senzorului se schimbă.
Această valoare digitală ADC este potrivită cu raportul de funcționare al semnalului PWM, deci avem controlul poziției SERVO în raport cu forța aplicată pe senzor.
Componente
Hardware: UNO, sursă de alimentare (5v), condensator 1000uF, condensator 100nF (3 bucăți), rezistor 100KΩ, SERVO MOTOR (SG 90), rezistor 220Ω, senzor de forță FSR400.
Software: Atmel studio 6.2 sau aurdino noaptea.
Diagrama circuitului și explicația de lucru
Diagrama circuitului de control al motorului servo cu senzor de forță este prezentată în figura de mai jos.
Tensiunea pe senzor nu este complet liniară; va fi unul zgomotos. Pentru a filtra zgomotul, un condensator este plasat 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. După conversie, vom lua acea valoare digitală (reprezentând greutatea) și o vom raporta la valoarea PWM și vom furniza acest semnal PWM motorului SERVO.
Deci, cu greutatea, avem o valoare PWM care își schimbă raportul de funcționare în funcție de valoarea digitală. Cu cât valoarea digitală este mai mare, raportul de sarcină al PWM este mai mare. Deci, cu un semnal PWM de raport de sarcină mai ridicat, arborele servo ar trebui să ajungă la dreapta sau la stânga conform figurii furnizate în introducere.
Dacă greutatea este mai mică, vom avea un raport de funcționare PWM mai mic și, conform figurii din introducere, servo-ul ar trebui să ajungă în extrema dreaptă.
Cu aceasta avem un control al poziției SERVO prin greutate sau forță.
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 ADC Arduino Uno 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 ”.
PWM al UNO poate fi realizat la oricare dintre pinii simbolizați ca „~” pe placa PCB. Există șase canale PWM în UNO. Vom folosi PIN3 pentru scopul nostru.
analogWrite (3, VALUE); |
Din condițiile de mai sus putem obține direct semnalul PWM la pinul corespunzător. Primul parametru dintre paranteze este pentru alegerea numărului pin al semnalului PWM. Al doilea parametru este pentru raportul de scriere.
Valoarea PWM a Arduino Uno poate fi modificată de la 0 la 255. Cu „0” cel mai mic la „255” cel mai mare. Având 255 ca raport de taxă, vom obține 5V la PIN3. Dacă raportul de taxă este dat 125, vom obține 2,5V la PIN3.
Acum să vorbim despre controlul servomotorului, Arduino 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. Puteți afla mai multe despre controlul servomotorului cu arduino aici.
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. Prin urmare, avem un semnal PWM al cărui raport de sarcină se modifică liniar cu GREUTATE sau FORȚĂ. Dat fiind servomotorului, putem controla servomotorul prin senzorul de forță.