Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Arduino Encoder


Messaggi consigliati

Inserito:

Restando in tema arduino, ho realizzato un circuito sempre per esercitazione :smile:

Ho usato due sensori tcst 1103 per la lettura di una ruota da me costruita con 6 denti.

Il conteggio deve essere positivo e negativo ho la lettura sul seriale del pc. Posto alcune foto ed il codice programma

int canaleA=6;
int canaleB=9;
int contatore=0;
boolean avanti;
boolean indietro;
boolean memoriaA;
boolean memoriaB;
boolean direzione;
void setup() {
Serial.begin(9600);
pinMode(6,INPUT);
pinMode(9,INPUT);
}
void loop() {
canaleA=digitalRead(6);
canaleB=digitalRead(9);
Serial.print(contatore);
Serial.print(" Avanti ");
Serial.print(avanti);
Serial.print(" indietro ");
Serial.println(indietro);
if (canaleB==1 && canaleA==1){
direzione=1;
memoriaA=0;
memoriaB=0;}
if(canaleA==0 && direzione==1){
indietro=1;
avanti=0;
direzione=0;}
if(canaleB==0 && direzione==1){
avanti=1;
indietro=0;
direzione=0;}
if (canaleB==0 && avanti==1 && memoriaA==0){
contatore=contatore+1;
memoriaA=1;}
if (canaleA==0 && indietro==1 && memoriaB==0){
contatore=contatore-1;
memoriaB=1;}
}
Nel caso in cui dovessi utilizzare questo sistema per gestire velocità e non posizione fino a quanti impulsi al secondo riesce a contare arduino? con questo programma di esempio, altrimenti utilizzando interrupt a che velocità arriva?

7da465a946b5cab7bb1a9234f5b518c6.jpg


4735b5b401cfbcb73289a9804b782acb.jpg


f0fa4b4586fece80e7f23f4fc2d67d14.jpg


81875b3ba478f972b074e9d7d0e72c8c.jpg


Inserita: (modificato)

Jago sei un produttore di idee ed invenzioni inesauribile

Bravo , mi piaci !!! in senso tecnologico si intende.....

Be quello che hai realizzato viene spesso usato al posto di encoder professionale .Viene usato sulle rulliere di movimentazione per esempio

comunque puoi fare tutto con un sensore solo , quello che discrimina e' la direzione , due sensori = costo di progetto over budget , bocciato !!!

:smile:

Quello che non capisco è ...

boolean avanti;

..................

Serial.print(avanti); :(

non dovrebbe essere

avanti=true; ?

Puoi fare con un sensore invece che due e devi leggerlo sul fronte di salita .

Per cui ....

boolean mem;

................................

if(direzione==avanti )

{

if (canaleA==true && mem==false)

{

// fai quello ceh devi fare

}

}

mem=canaleA ;

Se vuoi fare una cosa professionale devi prendere un encoder incrementale con due seganli , A e B e valutarli all'interno di un interrupt su evento esterno (il segnale A o B) e all'interno della funzione di handler in base alla direzione e a quale segnale e' attivo e quello non attivo fai i tuoi incrementi i decrementi .Ricorda che i segnali dell'encoder devono essere ben "squadrati" per cui puo essere che devi usare prima di leggerli un flip flop

La velocità di arduino , essendoci il boot loader precaritcato che le sue porcherie , non e' tra i piu' veloci ,pero' sotto interrupt e' sicurmante accettabile .

Fai 4 conti sulla velocità angolare che dovrà raggiungere il tuo albero al quale hai collegato il tuo encoder , poi dividi per la risoluzione cioe 6 dentini e calcoli ogni quanto tempo ti arriva un segnale

Noi col pizzamicro e microchip avevamo progettato una scheda encoder e qua i meriti vanno tutti a livio .Io avevo collegato l'encoder incrementale ad un trapano e lo facevo girare a tutta birra e poi vedevo il conteggio sul display , pero' per capire se perdi qualche impulso bisogna collegarsi con l'oscilloscopio e fare 4 conti

Modificato: da walterword
Inserita:

scusami ma con un solo sensore partendo da fermo come fai a sapere quando devi incrementare o decrementare il contatore?

Puoi fare con un sensore invece che due e devi leggerlo sul fronte di salita

si pero se è uno solo lo leggo sul fronte di salita sia con la ruota che gira a dx che a sx quindi non posso sapere dove sto andando avanti o indietro?

l'interno della funzione di handler in base alla direzione e a quale segnale e' attivo e quello non attivo fai i tuoi incrementi i decrementi

scusa che significa funzione di handler? :whistling::smile:

Inserita:

handler significa gestore del interrupt in questo caso .

comunque si tratta di gestire l'interrupt in generale

con un solo sensore hai sempre la direzione no?

Da che parte stai pilotando se avanti o indietro lo sai o sbaglio ?

Inserita:

Da che parte stai pilotando se avanti o indietro lo sai o sbaglio ?

con due sensori so se sto andando in avanti e viceversa, con un uno solo non credo si possa fare

Inserita:

se hai un comando per muovere l'attuatore , avanti o indietro o una valvola o un motore non so ...

Se sai quale comando stai pilotando , se invece i comandi non dipendno dal tuo sistema e tu leggi solamente la rotazione dell'albero allora fallo con due sensori e interrupt

Inserita:
Jago sei un produttore di idee ed invenzioni inesauribile

Walter non è Jago ma Roberto e si occupa professionalmente di motori elettrici. :smile:

Tornando al problema del conteggio impulsi.

Se decidi di non usare alcuna interfaccia esterna l'unica via sicura è la solita:

  1. Fissi uno dei 2 canali come clock e lo connetti ad un ingresso di interruzione (interrupt esterno).
  2. L'altro canale lo connetti all'altro ingresso di interrupt e lo consideri indicatore di direzione.
  3. Fai che entrambi i canali attivino l'interrupt sul fronte di salita.
  4. Quando scatta l'interrupt de clock verifichi se il flag della direzione era alto; se è così significa che è arrivato prima il canale di direzione, quindi conti all'indietro. Come azione deconti il contatore e resetti il flag di direzione. Se il flag era basso significa che stai procedendo avanti; verifichi se è alto il flag di conteggio. Se è alto l'impulso è falso (disturbo o vibrazione sul posto), altrimenti è valido e alzi il flag di conteggio avanti.
  5. Quando scatta l'interrupt di direzione ripeti le verifiche e le operazioni del punto 4. Se il fronte è arrivato con il flag di conteggio alto incrementi il contatore e abbassi il flag; in caso contrario fai la verifica che l'impulso sia valikdo e alzi il flag di direzione.

Ovviamente il limite di frequanza non è molto alto perchè oltre al tempo per servire i 2 interrupts devi anche avanzare tempo di CPU per fare le altre operazioni. Diciamo che con quarzo da 16 MHz potrai contare 5 kHz di frequneza massima avendo anche tempo per le elaborazioni di contorno.

Se invece ti fai un cirquitino esterno per rilevare la direzione e usi il clock esterno di TM1 puoi salire di molto nella requenza massima, però la gestione di questo timer con clock esterno va fatta all'esterno dell'ambiente di arduino.

Inserita:

Diciamo che con quarzo da 16 MHz potrai contare 5 kHz di frequneza massima avendo anche tempo per le elaborazioni di contorno.

Buon 2015 a tutti, Livio come si fa a calcolare che con un quarzo da 16mhz posso contare massimo 5khz? c è una formula?

Comunque proverò il tuo consiglio, ma inizio solo con il conteggio con una sola direzione, poi dopo implemento il flag per la direzione vediamo cosa combino... :P

Inserita:

La formula ci sarebbe, però bisogna scivere il programma in asm, contare le istruzioni e moltiplicrle per i cicli di clock necessari ad eseguire ogni istruzione. Così individui il tempo massimo necesario per eseguire il ciclo pessimo. A questo punto sai che, anche non eseguendo altre istruzioni, non potrai contare impulsi più velocit di questi.

Io sono andato un po' a spanne ed un po' ad esperienza. Ho calcolato che con 5kHz, ovvero 0.2 ms, ti avanzerebbe il tempo per eseguire una 30 di istruzione asm, oltre alla routine di servizio interrupt, tra un impulso e l'altro.

Ripeto è una stima di esperienza, perchè ipotizzo 20 - 25 istruzioni asm paer servire la routine.

In una sola direzione, ti basta un interrupt per contare, però non filtri eventuali disturbi. Per effettuare il filtraggio devi usare ambedue i canali, ed a questo punto la direzionalità è automantica.

Inserita:

Un metodo empirico per calcolare la durata di un interrupt potrebbe essere quello di commutare un'uscita come prima istruzione dell'interrupt e ricommutare la stessa uscita come ultima istruzione Con l'oscilloscopio puoi calcolare l'intervallo di tempo tra i due fronti che corrisponde al tempo di esecuzione dell'interrupt.

Non so se il debug di arduino lo permette ma di solito in un ambiente di debug c'è un contatore dei cicli di clock metti due breakpoint inzio/fine procedura interrupt leggi il contatore quando il programma si ferma sui breakpoint e per differenza ti calcoli il numero di cicli necessari a eseguire la procedura.

Inserita:
Con l'oscilloscopio puoi calcolare l'intervallo di tempo tra i due fronti che corrisponde al tempo di esecuzione dell'interrup

Eè quello che uso anch'io. Poi con l'oscilloscopio che dispone di alcune funzioni matematiche ottengo anche tempo medio minimo e massimo.

Non so se il debug di arduino

Questo, a mio parere, è il punto debole del sistema. Almeno per chi come me è abutuato ad ambienti un po' più professionali, come MPLAB e ICD di microchip, non parliamo poi dei sofisticatissimi sistemi di sviluppo che costano svariate migliai di euro.

per debaggare bisogna farsi tutto, non è possiible mettere punti di stop o altro, o eseguire la traccia del percorso. Non è nemmeno possibile rivedere illistato asm una volta compilato lo sketcj.

Inserita:

per debuggare Arduino , per quello che so io , ci sono metodi che non fanno parte del pacchetto gratuito

Io lo programmo con Atmel studio oppur evisual studio + visual micro che e' un plug in che permette l'interfacciamento con arduino , ma con arduino ide installato ovviamente .

Per debuggare c'e' una licenza da 19 euro da agganciare a visual micro ed e' anche buono come debug , appena riesco lo prendo

Livio continui a fare paragoni tra arudino e microchip , sono due cose "diverse" o non propriamente uguali nate per scopi diversi .

Se la piattaforma hw/sw arduino non compensa le proprie necessità si puo' sempre programmare , tramite atmel studio , il micro nudo e crudo , in asm o gnu cc totalmente integrati e gratuiti .Ma chiaramente e' un'altra cosa ....

Inserita:
Livio continui a fare paragoni tra arudino e microchip , sono due cose "diverse" o non propriamente uguali nate per scopi diversi

Walter perchè non leggi con attenzione quello che scrivo?

Non faccio paragoni ma constatazion!.

Arduino è nata come scheda di sviluppa come ed è indimpendente dal micro usato, tant'è che ci sono arduino compatibili con micro Microchip, TI, Intel, etc.

L'ambiente "arduino" ha tools di sviluppo poverissimi, praticamente inesistenti. Però nessuno ti vieta che, disponendo di un emulatore per Atmel, tu possa usare un altro ambiente. Che costi 19€ o 19.000€ in questa sede ha poca importanza, perchè si sta parlando di cose differenti.

Qui si parla di arduino così come è! E' una bella macchinetta per fare giochini e divertirsi. Se si vuole affrontare il tutto in modo professionale allora non basta più o quasi.

Per debuggare c'e' una licenza da 19 euro da agganciare a visual micro....

Se la provi fai conoscere le tue impressioni, sarebbero sicuramente interessanti per tutti.

Inserita:

con arduino si possono realzizare migliaia e migliaia di progetti

poi l facile , ripeto , e' sempre relativo

Inserita:

Arduino lo vedo adatto a coloro che hanno poca dimestichezza col saldatore, visto che altro non è che una scheda con un Micro e qualche accessorio.

Dal punto di vista software uno sketch è scritto in un linguaggio semplificato ma molto somigliante al C.

Una volta che uno inizia a realizzare qualche programma, a meno che non abbia fatto solo copia/incolla, potrebbe azzardare a scrivere qualcosa in C, usando L'IDE ufficiale Atmel, di conseguenza avrebbe la possibilità di eseguire il debug.

L'Atmel AVR studio è gratuito, con tanto di compilatore C e debugger professionale. Usa il motore di Microsoft visual studio. I tool necessari per interfacciarsi col Micro si trovano on line per pochi euro.

Per la cronaca, visto che prima si parlava di calcolare i tempi, le istruzioni della serie Atmel AVR sono tutte singolo ciclo (una istruzione per ogni ciclo di clock), paragonato ad un pic, a parità di quarzo un Atmel AVR è 4 volte più veloce di un PIC, escludendo ovviamente i PIC dotati di moltiplicatore interno.

Inviato dall'app. Mobile di PLC Forum da GT-I9300

Inserita:

infatti usando Atmel Studio (visual studio powered) + visual micro si ha un ambiente piu che profesisonale da usare con arduino

Il linguaggio e' un subset del c++ , sto scrivendo delle librerie abbastanza impegnative e lo conosco benino ; comunque si possono invocare api e funzioni a basso livello come un pic anche con arduino

La potenzialità di arduino , secondo me , e' il fatto che dispone di molte librerie per getire I/O come lcd , I2C ,servo motori ect e il fatto di non dover ognivolta saldare ma disporre di schedine e fili con terminale dupont lo rendono veloce ed appagante .

Arduino mega possiede una quantita ram sufficiente per fare molte cose , e anche diverse uart. Arduino Due e' un arm per cui ....acquistati dal venditore giusto , i prezzi sono veramente ridicoli paragonati al fatto di dover ricercare materiali , ordinarli , gestirli , saldarli ect ect

Inserita:
La potenzialità di arduino , secondo me , e' il fatto che dispone di molte librerie per getire I/O come lcd , I2C ,servo motori ect e il fatto di non dover ognivolta saldare ma disporre di schedine e fili con terminale dupont lo rendono veloce ed appagante .

Sono d'accordo per la prima parte, mentre per la seconda parte quella relativa allo Hw, praticamente ogni micro ha le sue schede similari, anche a prezzi di molto inferiori.

Anche per le cortex TI, ad esempio, si hanno ambienti simili e perfino compatibili Sw con Arduino. Microghip da sempre fornisce schede di sviluppo per le sue CPU, così come STM e Freescale, tanto per indicarne alcuni tra i più diffusi.

La vera forza di arduino sono le librerie e le applicazioni liberamente reperibili. E' successo qualche cosa di simile a quello che è successo anni fa con Windows: si sono scritti valanghe di applicativi per questo ambiente per cui si è instaurato una spirale virtuosa: molti applicativi esistenti di libero accesso invogliano molti programamtori a scriverne di nuovi.

Il tallone d'Achille della scheda è che è stata progettata come scheda di sviluppo Sw, quindi per ambiente protetto come il laboratorio, oppure per usi hobbystici in ambiente protetto.

Nei mesi scorsi ho voluto realizzare un dispositivo di automazione domestica con arduino. Ho dovuto curare particolarmente le alimentazioni, compreso un filtro di rete professionale e robusto filtraggio sulle alimentazioni; ingressi ed uscite separate galvanicamente. Ovviamente ho usato un adattatore per poter usare morsettiere a vite. Sta funzionando senza problemi da circa un mese, però son convinto che se lo sottoponessi ai test di qualificazione EMC non li supererebbe.

Sicuramente arduino è un ottimo attrezzo per chi si accosta al mondo della programamzione dei microcontrollori. E' anche un ottimo attrezzo per sviluppare applicazioni professionali.

Ad esempio l'applicazione realizzata da Jago, di cui si discute in altra discussione, si basa si su arduino, ma lo Hw è stato progettato ad hoc.

Inserita: (modificato)

e' chiaro che l'hw va progettato ad hoc .

Se vogliamo parlare di qualificazione EMC nessuna scheda menzionata supera l'esame , specialmente quelle saldate in casa :D

Arduino è nato per avvicinare i più ostici all'elettronica -informatica fornendo libri , documenti , tante schedine preconfezionate e tante librerie

Per produrre qualcosa di professionale bisogna progettare hw e schede in un certo modo , questo e' chiaro

Quali problemi avevi nella domotica ? La tensione di rete ? La massa ? cosa?

Modificato: da walterword
Inserita:
Quali problemi avevi nella domotica ? La tensione di rete ? La massa ? cosa?

Quelli tipici: inserimento-disinserimento di un carico sulla medesima linea ed il micro 3 volte su 5 si impalla.

Ovviamente i filtraggi pesanti e una buona terra hanno risolto il problema, problema che peraltro avevo ipotizzato prima di iniziare.

Ho scelto arduino proprio per non svilupparmi il circuito stampato, con tutto il traffico connesso all'acido et. Poi forarmi tutti i pin s dei circuiti integrati senza disallineamenti è qausi impossibile. Far fare un cs in 4-5 esemplari mi costava più della scheda arduino completa, per cui ho fatto la prova, prova che tutto sommato è stata positiva.

Inserita:

Bene , bravo .

comunque ripeto , se organizziamo qualcosa tipo schede base per "domotica" intese come una serie di schede I/O , qualcosa di analogico ect , poca roba ma utile da poter usare con diversi micro credo che non sarebbe male .

Facciamo una colletta e stampiamo i pcb poi al limite ognuno si monta i componenti da se per stare sul low cost .

Tipo uno stado alimentatore , ingressi e/o uscite digitali , acquisizione temperature con un chip dedicato e multiplexer e poco altro

Inserita:

cosa intendi per filtraggi pesanti ? Condensatori , induttori sulla linea 230V e sulle uscite dei regolatori 5V ?

Inserita:

Walter rileggi quello che ho scritto prima, li è indicato dove e come ho filtrato.

Inserita:

Ho dovuto curare particolarmente le alimentazioni, compreso un filtro di rete professionale e robusto filtraggio sulle alimentazioni ....

Il filtro di rete professionali che di solito si mette nei quadri industriali consiste in una rete di induttori ....o no ?

I filtri delle alimentazioni sono quelli che si mettono in entrata ed uscita sugli stadi regolatori o sbaglio ?

Ho capito bene ?

Inserita:

Il filtro di rete professionali che di solito si mette nei quadri industriali consiste in una rete di induttori ....o no ?

I filtri delle alimentazioni sono quelli che si mettono in entrata ed uscita sugli stadi regolatori o sbaglio ?

Ho capito bene ?

<il filtro di rete è un filtro quindi è costituito da induttanze e capacità. Ne esistono di differenti topologie circuitali, quello che ho scelto ha gli induttori accoppiati sul medesimo nucleo, come fossero gli avvolgimenti di un trasformatore differenziale.

I filtri sono costituiti da gruppi LC o RC in serie all'alimentazione. Nel mio caso ho usato celle L-C-L-C in configurazione "T".a doppia "L" rovesciata.

Inserita:

quindi secondo te usare per esempio alimentatori switching per alimentare le schede I/O e le parti intelligenti non è sufficiente ?

Ok per l'optoisolamento degli I/O , questo e' indiscutibile

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...