Sensore di rotazione di Arduino. Tachimetro. Un esempio di funzionamento con una fotoresistenza e un display LCD HD44780 su Arduino. Circuito di interruzione del raggio IR

Il modulo sensore velocità motore è progettato principalmente per rilevare la velocità di rotazione dell'albero del motore elettrico. Questo modulo, insieme ad un microcontrollore, può determinare, oltre alla velocità, il numero di impulsi e la posizione dell'albero.



Tipicamente i sensori misurano una quantità registrando determinati eventi, quindi il numero di eventi è legato al periodo di tempo in cui si sono verificati.

La sezione che somma gli impulsi che arrivano in ingresso può essere elettromeccanica oppure elettronica integrata o a microprocessore. Un certo numero di impulsi elettromeccanici si possono trovare nella vostra abitazione come interruttore per l'illuminazione domestica. In precedenza, i topi utilizzavano codificatori ottici per contare i movimenti in base agli impulsi ricevuti.

In molti casi è sufficiente un semplice divisore di tensione. Per contare la velocità del motore, dobbiamo collegare l'encoder rotativo al rotore. Nell'immagine il motore è dotato di un disco che alterna parti nere e parti trasparenti. Sensore a infrarossi la prossimità rileva quando entra in contatto con una superficie nera e quando la superficie è trasparente.


Quindi in questo caso viene misurata la velocità: qui gli eventi significano impulsi ricevuti come risultato del funzionamento di un sensore ottico durante la rotazione di un disco con fessure. Il sensore è costituito da un LED e un fototransistor, che rileva la presenza o l'assenza di luce dal LED.


Schema


Il circuito presentato può essere utilizzato per inviare impulsi registrati a un microcontrollore. La base dello schema è sensore ottico OS25B10 (OC1) con LED e uscita fototransistor.

In questo modo si creano degli impulsi luminosi che attraverso il sensore di prossimità diventano impulsi elettrici. Se conti gli impulsi puoi calcolare posizione angolare disco e quindi il rotore. Avendo fatto esempio pratico, possiamo supporre che il disco abbia 36 frammenti neri e 36 trasparenti. Ciò significa che per ogni asse completo dell'asse motore la fotocellula genera 36 impulsi elettrici. Se durante un intervallo di tempo di 1 secondo di 360 impulsi il motore fa 10 giri al minuto in un secondo.

In questo modo conosciamo la velocità, ma non la direzione in cui si muove il motore. Per saperlo dobbiamo avere due fotocellule posizionate in due posizioni diverse. Quando si ruota il pin dell'encoder vengono generati due segnali elettrici in quadratura, per questo vengono definiti perché sfalsati di 90° elettrici. Questi due impulsi forniscono la velocità di rotazione del perno nonché la direzione calcolata “vedendo” quale dei due impulsi viene prima dell'altro.


Il successivo è il doppio comparatore IC LM393 (IC1), configurato come un semplice trigger Schmitt. LED verde(LED1) indica la presenza di tensione applicata al circuito e il LED rosso (LED2) monitora l'uscita del modulo sensore velocità motore. Raccomandato tensione operativa modulo è compreso tra 4,5 e 5,5 V.



In alcuni casi non è necessario calcolare la velocità, ma solo la quantità di rotazione del perno dell'encoder. Esistono almeno due modi per determinare il numero di impulsi prodotti dall'encoder. Decodifica lo stato che cambia nel tempo ed estrae informazioni. . Se possibile, è meglio utilizzare un circuito antirimbalzo, che elimina i falsi contatti che possono far sì che l'encoder conteggi impulsi errati. Il diagramma dell'immagine seguente presenta due versioni con un errore.

Vengono utilizzati solo condensatori. Ad ogni rotazione dell'encoder i segnali elettrici cambiano in base al senso di rotazione. Le frecce indicano i cambiamenti del segnale. Il programma utilizza i pin 2 e 4 per calcolare i clic dell'encoder e il pin 3 per rilevare l'attivazione del pulsante. Ogni volta che l'encoder ruota, il programma invia un aggiornamento generale dei click effettuati sulla porta seriale. Ogni volta che si preme un pulsante, questo viene scritto sulla porta seriale del "pulsante premuto" e il numero totale di scatti viene azzerato.


Si noti che il resistore R1 (180 ohm) viene utilizzato qui per limitare la corrente operativa del LED all'interno del sensore ottico OS25B10 (OC1). Se necessario, puoi modificarne il valore per il tuo prototipo. Puoi anche regolare il valore del resistore R2 (10 kOhm) per ottenere la tensione richiesta per il tuo circuito. Il resistore R7 (10KΩ) è un resistore pull-up opzionale.

Vista dall'alto di un codificatore rotativo con un'associazione tra il nome del pin e la sua posizione. Vista laterale dal lato encoder. E chi non vorrebbe usare Arduino come lui? Esistono circuiti integrati che fungono da contaimpulsi. Puoi vedere circuito elettrico, che può essere utilizzato anche con un encoder in quadratura.

Segnali elettrici dell'encoder rotativo

Il sensore rotante ruota in senso orario con un movimento lento. Tutti i segnali sono in logica positiva. Il sensore rotante ruota in senso orario con movimento rapido. Contemporaneamente, come nel caso precedente, si hanno 15 variazioni di segnale, che corrispondono al numero di frame dell'encoder reale.


Disco codificatore


Un disco codificatore posizionato nello slot del sensore divide il sensore ottico in modo che vi sia un LED su un lato del disco e un fototransistor sull'altro lato. Se il percorso del raggio luminoso proveniente dal LED non è bloccato dal disco, il fototransistor passerà corrente, altrimenti verrà chiuso.

In questo articolo mostrerò come utilizzare un normale LED e una fotoresistenza per creare un contagiri, un misuratore della velocità di rotazione del motore. E per renderlo più interessante, i dati ricevuti verranno visualizzati sul display LCD, avevo appena in giro un modulo HD44780, può visualizzare i dati su due righe di 16 colonne.

Come funziona una fotoresistenza?

Una fotoresistenza è un semiconduttore che cambia la sua resistenza a seconda della quantità di luce che lo colpisce. Più luce c'è, minore è la resistenza. Questa capacità ci aiuterà nell'implementazione del contagiri. Utilizzeremo un LED per illuminare la fotoresistenza da una breve distanza - 1,5-2 centimetri. E con l'aiuto di Arduino monitoreremo quale tensione passa attraverso la fotoresistenza; se la tensione diminuisce, significa che qualcosa sta bloccando la luce. Se metti una lama sull'albero del motore e la costringi a ruotare tra il LED e la fotoresistenza, puoi scoprire quanto spesso la lama blocca la luce. E poi spetta al tecnico effettuare un paio di dozzine di misurazioni, calcolare la media aritmetica per una misurazione più accurata e convertire questi dati nel numero di giri al minuto.
Durante il primo test, si è scoperto che il motore su cui ho testato ruota a una velocità di quasi 12mila giri al minuto. Mi è subito venuto in mente il pensiero che ci fosse un errore nei calcoli da qualche parte o che arduino non elaborasse correttamente i dati della fotoresistenza. Ho dovuto rallentare il motore utilizzando il potenziometro e anche i dati hanno iniziato a rallentare. I giri scesero a due, e poi a mille al minuto. Tutto ha funzionato ed è stato calcolato correttamente. Ma con l'aumento massimo dei giri, sono risultati gli stessi 12mila, ho dovuto cercare la scheda tecnica del motore e si è scoperto che la sua velocità di rotazione normale è di 11,5 -12,5mila giri. Cioè, tutto funziona correttamente. Non avrei mai pensato che un motore così piccolo potesse ruotare a una tale velocità.
Di seguito sono riportate due fotografie, una mostra come si trovano il LED e la fotoresistenza, e nella seconda è stato aggiunto un motore, la cui velocità di rotazione verrà misurata.


Trasmissione dei dati al display LCD HD44780 utilizzando Arduino

Per lavorare con il display HD44780 è molto comodo utilizzare il modulo di interfaccia I2C. Esistono moduli e display LCD venduti separatamente, ma spesso saldati insieme come set. Consiglio di utilizzare quelli già assemblati tra loro, perché se vi connettete senza I2C, dovrete collegare il display utilizzando 16 fili, quando tramite I2C il loro numero si riduce a 4, di cui due di alimentazione. E gli altri due fili sono collegati ai pin A4 e A5 di Arduino.
Per rendere più comodo e comodo il controllo dell'output dei dati sul display, è possibile utilizzare la libreria LiquidCrystal_I2C.
Di seguito è riportato uno schema per collegare il display, nonché un LED con una fotoresistenza all'arduino.


Cosa è stato utilizzato nel progetto:

  • Arduino (ho usato arduinouno, ma puoi usarne un altro). L'ho comprato qui: arduino uno
  • 1 resistori con una resistenza di 300 Ohm. L'ho comprato qui:
  • 1 resistori con una resistenza di 10 kOhm. L'ho comprato qui: un set di resistenze da 700 pz. Da 10 ohm a 1 megaohm
  • 1 LED. L'ho comprato qui: 100 LED, 10 colori diversi
  • Display LCD Hd44780 con modulo I2C. L'ho comprato qui: display LCD Hd44780 con modulo I2C
  • Fotoresistore. L'ho comprato qui: Fotoresistori, 20 pz.

Schizzo di un contagiri su arduino

Di seguito è riportato uno schizzo con commenti dettagliati e puoi anche scaricarlo sul tuo computer: download.

// librerie con cui lavorare Display LCD tramite I2C #include #includere // visualizza l'inizializzazione. // GND - terra // VVC - 5+ volt // SDA - pin A4 // SCL - pin A5 // 16 colonne e 2 righe LiquidCrystal_I2C lcd(0x27,16,2); const int pinFoto = A0; // porta per la lettura dei dati dalla fotoresistenza int light = 0; // variabile per la memorizzazione dei dati dalla fotoresistenza int numTurn = 0; // numero dell'iterazione del controllo della rotazione int valArray; // array per la memorizzazione dei dati dalla fotoresistenza, necessario per la configurazione iniziale int maxLight = 1024; // soglia alla quale assumeremo che il LED sia chiuso int sum = -1; // somma del numero di giri int count_zamer = 20; // numero di iterazioni dopo le quali verrà calcolato il valore della velocità media unsigned long lastMillis = 0; // variabile per memorizzare l'ora del precedente spegnimento del LED bool work = true; // flag che viene alzato dopo l'apertura del LED void setup() ( Serial.begin(9600); pinMode(pinPhoto, INPUT); // aspettiamo che il LED si riscaldi delay(1000); // ogni 10 millisecondi contiamo il valore dalla fotoresistenza, 100 volte for(int i = 0; i< 100; i++){ valArray[i] = analogRead(pinPhoto); delay(10); } // выбераем минимальное значение с фоторезистора for(int i = 0; i< 100; i++){ if(maxLight >valArray[i]) maxLight = valArray[i];< maxLight && work){ // опускаем флаг, чтобы не считать, пока светодиод перекрыт work = false; // если первая итерация, то не считаем ее, чтобы начать отсчет времени if(sum == -1){ // записываем время старта lastMillis = millis(); sum = 0; }else{ unsigned long currentMillis = millis(); // записываем в sum количество миллисекунд между оборотами sum += (currentMillis - lastMillis); numTurn++; // считаем 20 раз, для большей точности if(numTurn == count_zamer){ float sredSpeed = 0; numTurn = 0; // берем среднее и высчитываем количество оборотов для минуты sredSpeed = 60000 / ((float)sum / (float)count_zamer); // оборотов в минуту Serial.print("speed: "); Serial.println(sredSpeed); sum = -1; // вывод данных на LCD дисплей lcd.clear(); lcd.setCursor(0, 0); lcd.print("S"); lcd.setCursor(1, 0); lcd.print("P"); lcd.setCursor(2, 0); lcd.print("E"); lcd.setCursor(3, 0); lcd.print("E"); lcd.setCursor(4, 0); lcd.print("D"); lcd.setCursor(5, 0); lcd.print(":"); // преобразовываем числовое значение в строку // и по одному символу выводим не дисплей char string_turn = ""; sprintf(string_turn,"%d", (int)sredSpeed); char *current = string_turn; int count_numbers = 0; while (*current != "\0") { lcd.setCursor(6+count_numbers, 0); lcd.print(*current); count_numbers++; current++; } lcd.setCursor(count_numbers+7, 0); lcd.print("r"); lcd.setCursor(count_numbers+8, 0); lcd.print("/"); lcd.setCursor(count_numbers+9, 0); lcd.print("m"); lcd.setCursor(count_numbers+10, 0); lcd.print("i"); lcd.setCursor(count_numbers+11, 0); lcd.print("n"); } lastMillis = currentMillis; } } // если светодиод не загорожен if(light >) // abbassa leggermente la soglia maxLight -= 10;

Serial.println(maxLight);

ritardo(500);