Problema di lettura oscillante di potenziometri

Salve a tutti, è da poco che finalmente sono entrato nel mondo di ardupino (nello specifico Arduino Nano con atmega328), arrivo dalla vecchissima parallax bs2 e sono davvero contento del passaggio!

Come primo progetto saporito ho intenzione di creare una macchinina radiocomandata partendo da una vecchia macchina giocattolo.

La trasmissione via etere è affidata a due moduli nrf24l01 che attualmente vengono utilizzati ad una via, ovvero tx->rx.

Attualmente sto avendo serissimi problemi con il radiopromando, esso è ricavato da un radiocomando di un vecchio aereo, dal quale ho tolto tutto tranne che le due resistenze variabili che fanno da stick.
Queste resistenze sono da 24kΩ, ma che vengono sfruttate solo in parte, ovvero hanno un'escursione di circa 10kΩ (7-17, o giù di lì), ma tutto questo ha importanza relativà.

Il funzionamento della trasmissione è codesto:
1-radiocomando legge valore resistenze
2-radiocomando elabora e crea delle percentuali (da 100 a -100, con 0 al centro)
3-radiocomando invia
4-ricevitore riceve ed in base alla percentuale manda un segnale PWM al ponte H e controlla o sterzo o velocità e marcia.

Una cazzata direte! E invece no, ovvero è semplicissimo ma io ho un grosso problema con le resistenze in quanto non riesco ad avere valori fissi!!!
Il mio programma nei primi secondi registra i valori massimi, medi e minimi e da lì capisce come elaborare la matematica relativa al calcolo percentuale, ma non riesco mai ad avere dei valori fissi, i dati ottenuti da analogread sono sempre ballerini e spesso sballano anche di 30 unità!
Il collegamento dei potenziometri in ardupino è quello classico descritto nella guida ufficiale, ovvero questa:
https://www.arduino.cc/en/tutorial/potentiometer
ovviamente essendo due potenziometri sono collegati in parallelo a +5v e GND direttamente sull'uscita fornita dalla scheda.
Il codice in realtà è molto semplice poichè ho questi problemi anche facendo un semplice debug del tipo:

x=analogRead(1);
y=analogRead(2);
Serial.print(x);
Serial.print(y);

Quale potrebbe essere il problema? Ardupino non riesce ad alimentare a sufficienza le resistenze e il modulo nrf24l01? Mi sto davvero scervellando per capire come risolvere, ho provato anche a pulire le resistenze ma nada!
Ho anche cercato in giro e molti consigliano lo smoothing, il problema è che il tutto deve essere molto reattivo, non posso sprecare troppo tempo per raccogliere i valori poichè il tutto si trasformerebbe nel lag più totale!
A questo punto penso che dovrò agire sicuramente lato hardware, ma come?

Un grazie di cuore immenso e caloroso a chiunque partecipi alla discussione!

Buona sera,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

gpb01:
Buona sera,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Fatto! Ho anche aggiustato la discussione per renderla più leggibile! Dovrebbe essere abbastanza chiara attualmente, ma se non lo è ditemelo e risolverò!

24kΩ sono un po' tantini ...
... come ben specificato nel datasheet, sarebbe bene che l'oggetto collegato all'ingresso analogico abbia un'impedenza NON superiore ai 10kΩ affinché il ADC abbia sufficiente corrente per caricare il condensatore del sample-and-hold in tempi abbastanza brevi, altrimenti .. le letture possono appunto essere poco precise.

Quindi ... comincerei con l'abbassare tali valori e vedere che succede ... ::slight_smile:

Guglielmo

Ho provato ha tarare il range dello stick, ed ora ho da circa 2kΩ a 7kΩ massimi, e a quanto pare era già in un range inferiore ai 10kΩ. E' possibile che ardupino non riesca a gestirmi due potenziometri? Perchè l'altro stick funziona a dovere.

Ho inoltre provveduto persino a smontare e pulire il potenziometro incriminato, senza risultati. Persino da tester noto alcune oscillazioni: è proprio la resistenza da buttare? O posso ovviare a ciò modificando qualcosa?

Potrebbe essere il problema delle letture dell'ADC? Prova a effettuare due letture consecutive e scarta la prima per verificare se a questo punto la lettura è corretta e stabile
Una cosa del tipo

x=analogRead(1);
x=analogRead(1);
y=analogRead(2);
y=analogRead(2);
Serial.print(x);
Serial.print(y);

Devi campionare!

In sostanza i segnali analogici sono soggetti a interferenze di vario genere. Per eliminare le quali si adottano numerosi accorgimenti (es. segnali differenziali), ma che complicano notevolmente il circuito.

Il più semplice e banale accorgimento è quello di impiegare collegamenti tra il segnale del sensore (sorgente) e l’ingresso fisico del microcontrollore, i più corti possibile (<10cm) e possibilmente twistati con un cavo di massa.

Senza questi accorgimenti il segnale è giocoforza ballerino, ma si può mitigare gli effetti delle interferenze campionando un certo numero di valori, sommarli, e poi dividerli per ottenere una media pesata.

Fai una roba così:

uint16_t campione_attuale;
uint16_t somma_campioni;
uint16_t valore_campionato;

setup…

loop()

for(i=1; i<32; i++;) // ciclo di 32 letture
{
campione_attuale = analogRead(A0);
somma_campioni =+ campione attuale; // somma dei 32 valori letti
}

valore_campionato = somma_campioni >> 5; // divisione per 32 e valore medio (*)

(*) Operazione di shift a destra dei bit di 5 posizioni, che equivale ad una divisione per 32.
E perchè 32 campioni? E poi una divisione per 32?

  1. per avere sempre un numero intero
  2. i microcontrollori senza un DSP engine sono LENTISSIMI a fare divisioni, specie se reiterate in un ciclo
    però sono abbastanza veloci a spostare i bit, ed uno spostamento a destra di 5 posizioni del numero totale, equivale ad una divisione per 32. Questo trucco funziona solo per divisioni con divisore potenza di 2 (quindi 2, 4, 8, 16, ecc.) e 32 valori sono un numero di campioni sufficiente per estrapolarne un valore sensato

Il codice non è appositamente ottimizzato per favorire la leggibilità!

Volendo si può esagerare scartando due valori, rispettivamente il più basso ed il più alto della serie, ovvero quelli che con maggiore probabilità hanno sofferto di interferenze.

Naturalmente, con un filo di collegamento lungo un kilometro, nessun accorgimento software potra evitare all’ingresso analogico di ricevere anche i segnali in modulazione di ampiezza (AM) delle trasmissioni radio del Vaticano… :grin:

Alla fine il problema erano proprio le resistenze, che probabilmente con il tempo si sono danneggiate e quindi sono diventate imprecise ed inutilizzabili, ho perciò provveduto a sostituirle con estrema soddisfazione.

Trovo comunque molto interessante la questione del campionamento e ne prenderò nota per i progetti futuri! Grazie!

Ora mi trovo davanti all'ultimo quesito, per cui non aprirò un nuovo treadh.
Piloto il motore dell'auto con un ponte H formato da 4 darlington PNP ed NPN, rispettivamente BDW93C e BDW94C, leggendo il datasheet hanno bisogno di quasi 0.2A caduno sulla base, che in termini pratici (usandoli ovviamente 2 a 2) si trasformano in ben 400 mA, corrente che brucerebbe il mio povero Ardupino. Ho quindi pensato di usare altri due transistor più piccoli e meno esigenti per pilotare le due uscite: è corretto proseguire in questo modo o magari mi sto facendo problemi che non esistono?

I transistor per i ponti ad H non si usano più da almeno 20 anni (forse a scuola...).

A parte la necessità - come anche hai intuito tu - di un ulteriore stadio pilota, consumano una discreta potenza anche usati in zona di saturazione.

Buttaci 4 Power Mosfet logic level, e li puoi pilotare direttamente con Arduino!

BaBBuino:
I transistor per i ponti ad H non si usano più da almeno 20 anni (forse a scuola...).

A parte la necessità - come anche hai intuito tu - di un ulteriore stadio pilota, consumano una discreta potenza anche usati in zona di saturazione.

Buttaci 4 Power Mosfet logic level, e li puoi pilotare direttamente con Arduino!

Sì è sicuramente obsoleto, ma avevo questi pezzi in giro e volevo usarli!
Ho risolto però usando un relè per fare l'inversione di marcia e un transistor per la velocità.
Sono praticamente giunto alla fine, ho solo un problema: il servomotore! Non capisco perchè da 90 a 180 gradi si muove bene, ovvero fa tutta l'escursione grado per grado, invece da 90 in giù NIENTE! Si blocca in un punto e non pare muoversi grado per grado, fa un solo movimento e rimane su quello! Non so se mi sono spiegato bene.