In questo tutorial svilupperemo un circuito utilizzando il sensore di forza, Arduino Uno e un servomotore. Sarà un sistema di servocontrollo dove la posizione del servoalbero è determinata dal peso presente sul sensore di forza. Prima di andare avanti parliamo del servo e di altri componenti.
I servomotori vengono utilizzati laddove è necessario un movimento o una posizione precisa dell'albero. Questi non sono proposti per applicazioni ad alta velocità. Questi sono proposti per applicazioni a bassa velocità, coppia media e posizione precisa. Questi motori sono utilizzati in macchine a braccio robotico, controlli di volo e sistemi di controllo. I servomotori sono utilizzati anche in alcune stampanti e fax.
I servomotori sono disponibili in diverse forme e dimensioni. Un servomotore avrà principalmente fili lì, uno è per la tensione positiva, un altro è per la massa e l'ultimo è per l'impostazione della posizione. Il filo ROSSO è collegato all'alimentazione, il filo nero è collegato a terra e il filo GIALLO è collegato al segnale.
Un servomotore è una combinazione di motore CC, sistema di controllo della posizione, ingranaggi. La posizione dell'albero del motore DC è regolata dall'elettronica di controllo nel servo, in base al rapporto di lavoro del segnale PWM sul pin SIGNAL. In parole semplici, l'elettronica di controllo regola la posizione dell'albero controllando il motore CC. Questi dati relativi alla posizione dell'albero vengono inviati tramite il pin SIGNAL. I dati di posizione al controllo devono essere inviati sotto forma di segnale PWM attraverso il pin di segnale del servomotore.
La frequenza del segnale PWM (Pulse Width Modulated) può variare in base al tipo di servomotore. La cosa importante qui è il DUTY RATIO del segnale PWM. In base a questo DUTY RATION l'elettronica di controllo regola l'albero.
Come mostrato nella figura sotto, per spostare l'albero a 9o il RAPPORTO DI ACCENSIONE deve essere 1 / 18.ie. 1 milione di secondo di "tempo ON" e 17 milioni di secondo di "tempo OFF" in un segnale di 18 ms.
Affinché l'albero possa essere spostato a 12o, il tempo di attivazione del segnale deve essere di 1,5 ms e il tempo di disattivazione deve essere di 16,5 ms.
Questo rapporto viene decodificato dal sistema di controllo in servo e regola la posizione in base ad esso.
Questo PWM qui è generato utilizzando ARDUINO UNO.
Quindi per ora sappiamo che possiamo controllare l'albero del SERVOMOTORE variando il rapporto di lavoro del segnale PWM generato da UNO.
Ora parliamo di sensore di forza o sensore di peso.
Per interfacciare un sensore FORCE con ARDUINO UNO, utilizzeremo la funzionalità ADC (conversione da analogico a digitale) a 8 bit in arduno uno.
Un sensore FORCE è un trasduttore che cambia la sua resistenza quando viene applicata pressione sulla superficie. Il sensore FORCE è disponibile in diverse dimensioni e forme.
Utilizzeremo una delle versioni più economiche perché non abbiamo bisogno di molta precisione qui. FSR400 è uno dei sensori di forza più economici sul mercato. L'immagine dell'FSR400 è mostrata nella figura sottostante.
Ora è importante notare che l'FSR 400 è sensibile lungo la lunghezza, la forza o il peso dovrebbero essere concentrati sul labirinto al centro dell'occhio del sensore, come mostrato in figura.
Se la forza viene applicata in momenti sbagliati, il dispositivo potrebbe danneggiarsi permanentemente.
Un'altra cosa importante da sapere è che il sensore può pilotare correnti di alta gamma. Quindi tieni presente le correnti di guida durante l'installazione. Inoltre il sensore ha un limite di forza che è di 10 Newton. Quindi possiamo applicare solo 1Kg di peso. Se si applicano pesi superiori a 1Kg il sensore potrebbe mostrare delle deviazioni. Se è aumentato di oltre 3 kg. il sensore potrebbe danneggiarsi in modo permanente.
Come detto in precedenza, questo sensore viene utilizzato per rilevare i cambiamenti di pressione. Quindi, quando il peso viene applicato sopra il sensore FORCE, la resistenza viene modificata drasticamente. La resistenza di FS400 rispetto al peso è mostrata nel grafico sottostante:
Come mostrato nella figura sopra, la resistenza tra i due contatti del sensore diminuisce con il peso o la conduttanza tra due contatti del sensore aumenta.
La resistenza di un conduttore puro è data da:
Dove, p- Resistività del conduttore
l = Lunghezza del conduttore
A = Area del conduttore.
Consideriamo ora un conduttore con resistenza "R", se viene applicata una certa pressione sopra il conduttore, l'area sul conduttore diminuisce e la lunghezza del conduttore aumenta a causa della pressione. Quindi per formula la resistenza del conduttore dovrebbe aumentare, poiché la resistenza R è inversamente proporzionale all'area e anche direttamente proporzionale alla lunghezza l.
Quindi con questo per un conduttore sotto pressione o peso la resistenza del conduttore aumenta. Ma questo cambiamento è piccolo rispetto alla resistenza complessiva. Per un cambiamento considerevole molti conduttori sono impilati insieme.
Questo è ciò che accade all'interno dei sensori di forza mostrati nella figura sopra. Guardando da vicino si possono vedere molte linee all'interno del sensore. Ciascuna di queste linee rappresenta un conduttore. La sensibilità del sensore è nei numeri dei conduttori.
Ma in questo caso la resistenza diminuirà con la pressione perché il materiale utilizzato qui non è un conduttore puro. Gli FSR qui sono robusti dispositivi a film spesso polimerico (PTF). Quindi questi non sono dispositivi di materiale conduttore puro. Questi sono costituiti da un materiale che mostra una diminuzione della resistenza con l'aumento della forza applicata alla superficie del sensore.
Questo materiale mostra le caratteristiche come mostrato nel grafico di FSR.
Questo cambiamento nella resistenza non può fare bene a meno che non possiamo leggerli. Il controller a portata di mano può solo leggere le possibilità in tensione e niente di meno, per questo useremo il circuito del divisore di tensione, con questo possiamo derivare la variazione di resistenza come variazione di tensione.
Il partitore di tensione è un circuito resistivo ed è mostrato in figura. In questa rete resistiva abbiamo una resistenza costante e l'altra resistenza variabile. Come mostrato in figura, R1 qui è una resistenza costante e R2 è il sensore FORZA che funge da resistenza.
Il punto medio del ramo viene preso per la misurazione. Con la modifica di R2, abbiamo la modifica a Vout. Quindi con questo abbiamo una tensione che cambia con il peso.
La cosa importante da notare qui è che l'input preso dal controller per la conversione ADC è di appena 50µAmp. Questo effetto di carico del partitore di tensione basato sulla resistenza è importante poiché la corrente assorbita da Vout del partitore di tensione aumenta la percentuale di errore aumenta, per ora non dobbiamo preoccuparci dell'effetto di carico.
Ora, quando la forza viene applicata sul FORCE SENSOR, la tensione all'estremità del divisore cambia questo pin quando è collegato al canale ADC di UNO, otterremo un valore digitale diverso da ADC di UNO, ogni volta che la forza sul sensore cambia.
Questo valore digitale ADC è abbinato al rapporto di lavoro del segnale PWM, quindi abbiamo il controllo della posizione SERVO in relazione alla forza applicata sul sensore.
Componenti
Hardware: UNO, alimentatore (5v), condensatore 1000uF, condensatore 100nF (3 pezzi), resistenza 100KΩ, SERVOMOTORE (SG 90), resistenza 220Ω, sensore di forza FSR400.
Software: Atmel studio 6.2 o aurdino nightly.
Schema del circuito e spiegazione del funzionamento
Lo schema del circuito per il controllo del servomotore tramite sensore di forza è mostrato nella figura sottostante.
La tensione ai capi del sensore non è completamente lineare; sarà rumoroso. Per filtrare il rumore, un condensatore viene posizionato su ciascun resistore nel circuito divisore come mostrato in figura.
Qui prenderemo la tensione fornita dal divisore (tensione che rappresenta il peso in modo lineare) e la inseriremo in uno dei canali ADC di Arduino Uno. Dopo la conversione prenderemo quel valore digitale (che rappresenta il peso) e lo metteremo in relazione con il valore PWM e forniremo questo segnale PWM al motore SERVO.
Quindi con il peso abbiamo un valore PWM che cambia il suo rapporto di lavoro a seconda del valore digitale. Maggiore è il valore digitale, maggiore è il rapporto di lavoro del PWM. Quindi, con un segnale PWM con rapporto di lavoro più elevato, l'albero del servo dovrebbe raggiungere l'estrema destra o l'estrema sinistra come da figura fornita nell'introduzione.
Se il peso è inferiore, avremo un duty ratio PWM inferiore e come da figura in introduzione il servo dovrebbe raggiungere l'estrema destra.
Con questo abbiamo un controllo di posizione SERVO tramite PESO o FORZA.
Affinché ciò avvenga occorre stabilire alcune istruzioni in programma e ne parleremo in dettaglio di seguito.
ARDUINO ha sei canali ADC, come mostrato in figura. In questi uno o tutti possono essere utilizzati come ingressi per la tensione analogica. L'ADC UNO ha una risoluzione di 10 bit (quindi i valori interi da (0- (2 ^ 10) 1023)). Ciò significa che mapperà le tensioni di ingresso tra 0 e 5 volt in valori interi compresi tra 0 e 1023. Quindi per ogni (5/1024 = 4,9 mV) per unità.
Qui useremo A0 di UNO. Dobbiamo sapere alcune cose.
|
Innanzitutto i canali ADC di Arduino Uno hanno un valore di riferimento predefinito di 5V. Ciò significa che possiamo fornire una tensione di ingresso massima di 5 V per la conversione ADC su qualsiasi canale di ingresso. Poiché alcuni sensori forniscono tensioni da 0-2,5 V, con un riferimento di 5 V otteniamo una minore precisione, quindi abbiamo un'istruzione che ci consente di modificare questo valore di riferimento. Quindi per cambiare il valore di riferimento abbiamo (“analogReference ();”) Per ora lo lasciamo come.
Come impostazione predefinita, otteniamo la massima risoluzione dell'ADC della scheda che è 10 bit, questa risoluzione può essere modificata utilizzando l'istruzione ("analogReadResolution (bits);"). Questa modifica alla risoluzione può tornare utile in alcuni casi. Per ora lo lasciamo come.
Ora se le condizioni di cui sopra sono impostate come predefinite, possiamo leggere il valore dall'ADC del canale '0' chiamando direttamente la funzione "analogRead (pin);", qui "pin" rappresenta il pin dove abbiamo collegato il segnale analogico, in questo caso esso sarebbe "A0". Il valore di ADC può essere preso come intero come “int SENSORVALUE = analogRead (A0); ", Con questa istruzione il valore dopo l'ADC viene memorizzato nell'intero" SENSORVALUE ".
Il PWM di UNO può essere ottenuto su uno qualsiasi dei pin contrassegnati come "~" sulla scheda PCB. Ci sono sei canali PWM in UNO. Utilizzeremo il PIN3 per il nostro scopo.
analogWrite (3, VALUE); |
Dalla condizione di cui sopra possiamo ottenere direttamente il segnale PWM sul pin corrispondente. Il primo parametro tra parentesi è per la scelta del numero di pin del segnale PWM. Il secondo parametro è per il rapporto di lavoro di scrittura.
Il valore PWM di Arduino Uno può essere modificato da 0 a 255. Con "0" come minimo, "255" come massimo. Con 255 come rapporto di lavoro avremo 5V a PIN3. Se il rapporto di servizio è di 125, otterremo 2,5 V a PIN3.
Parliamo ora del controllo del servomotore, Arduino Uno ha una funzionalità che ci permette di controllare la posizione del servo semplicemente fornendo il valore dei gradi. Diciamo che se vogliamo che il servo sia a 30, possiamo rappresentare direttamente il valore nel programma. Il file di intestazione SERVO si occupa internamente di tutti i calcoli del rapporto di servizio. Puoi saperne di più sul controllo del servomotore con arduino qui.
Ora l'SG90 può spostarsi da 0-180 gradi, abbiamo risultato ADC 0-1024.
Quindi ADC è circa sei volte la POSIZIONE SERVO. Quindi diviso il risultato dell'ADC per 6 otterremo la posizione approssimativa della lancetta SERVO. Quindi abbiamo un segnale PWM il cui rapporto di lavoro cambia linearmente con PESO o FORZA. Dato questo al servomotore, possiamo controllare il servomotore tramite il sensore di forza.