problema ingressi analogici.

Buongiorno
vorrei capire se ho distrutto gli ingressi analogici.

Ho eseguito il circuito con un potenziometro su +5 e ingressi A0.

ho letto la tensione tramite il codice e tutto funziona.

il problema è che se leggo la tensione su A1 oppure A2 ecc trova la stessa tensione che su A0.

do ve ho sbagliato? ho distrutto gli ingressi analogici?

posseggo la scheda originale arduino UNO REV3..

Nel caso posso sostituire solo L ATMEL oppure si è danneggiata la scheda?

grazie

Dalla tua descrizione deduco che stai leggendo la tensione su A1 e A2 senza averci collegato niente. In tal caso è normale, la tensione su A0 produce disturbi sugli altri ingressi, che hanno un'impedenza molto alta e "captano" facilmente di tutto.

Collegaci un altro potenziometro, o mettili a GND o VCC e ripeti la misura, vedrai che sarà corretta.

Gli ingressi analogici sono ad alta impedenza e ... possono fare cose strane se lasciati NON collegati, quindi, mai leggere ad un ingresso analogico non collegato perché si leggono valori che non hanno senso.

In ogni caso, e se ne è parlato più volte qui sul forum, nel passaggio da un canale all'altro è sempre bene fare una lettura a vuoto sul nuovo canale, scartando la lettura.

Guglielmo

P.S.: mi sono sovrapposto a SukkoPera :slight_smile:

Grazie ragazzi, non ci avevo pensato... stasera provo...in ogni caso mi confermate che posso applicare una tensione inferiore a 5v senza interporre Nessuna resistenza?

Certo!

purtroppo non funziona....

dato un ingresso tramite potenziometro su A0 leggo 2.55V..(es 1/2 corsa)....nel momento in cui inserisco 4V su A5 le letture si sballano e leggo correttamente 4V su A5 ma invece A0 non rimane a 2.55 ma sale fino a . 4V

bah...
non saprei nemmeno cosa cercare

proverò a cambiare il micro

grazie

... puoi fare uno schema di collegamenti? .... perché mi sembra strano ... ::slight_smile:

Guglielmo

P.S.: Basta anche un disegno ben fatto a mano e poi fotografato ed allegato :wink:

e magari allegare il programma che stai eseguendo ? :slight_smile:
magari stai sbagliando a leggerli :slight_smile:

MD

PS: utilizza l'apposito tag </> per allegare il codice

Ecco il tutto
grazie per l interessamento..

allego codice schema e foto ...le connessioni in foto sono come da schema..

int pitch; //velocita
int roll; //direzione

int destra;
int sinistra;

const int CH_ONE = 6; //D7
const int CH_TWO = 7; //B5

int pinDirA=12;
int pinDirB=13;
 
int pinPwmA=3;
int pinPwmB=11;

int velocita_A ;
int velocita_B ;
 
int BUZZ = 0; 
unsigned long previousMillis = 0; 
unsigned long interval = 200; 

  
void setup()
{
  ///parte del ricevitore
  Serial.begin(115200);
 
 ///parte della motorshield
 
 // definisco i pin che vanno alla motorshield
   pinMode( pinDirA,OUTPUT );
   pinMode( pinPwmA,OUTPUT );
   pinMode( pinDirB,OUTPUT );
   pinMode( pinPwmB,OUTPUT );

//imposto i pin che vanno alla motorshield
   
  velocita_A =0;
  velocita_B =0;
  digitalWrite( pinDirA,LOW );  ///motore   A
  digitalWrite( pinDirB,HIGH );  /// motore B

//buzzer
 pinMode( 8,OUTPUT );

}


void loop()
{



//leggo tensione batteria delle due celle LIPO

int cella0 = analogRead(A0);
float voltage0 = cella0 * (5.0 / 1023.0);

int cella1 = analogRead(A5);
float voltage1 = cella1 * (5.0 / 1023.0);


Serial.print(voltage0);
Serial.print("---");
Serial.println(voltage1);


if (voltage0  > 3.7 and voltage1  > 3.7 ) // batt carica
    { 
     digitalWrite(8, LOW);// buzzer disabilitato
    }


if (voltage0  < 3.7 or voltage1  < 3.7 ) //primo allarme batt scarica
    {
     
    unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis; 
    BUZZ ^= 1;
    digitalWrite(8, BUZZ); //buzzer alternato

    }
   }
    
if (voltage0  < 3.4 or voltage1  < 3.4 ) //secondo allarme
    {
      //blocca motori
     }


    
//leggo valori stick TARANIS

pitch = pulseIn(CH_ONE, HIGH, 30000); // leggo la velocita
roll = pulseIn(CH_TWO, HIGH, 30000); // leggo la direzione

/*
Serial.print(pitch);
Serial.print(" ");
Serial.print (roll);
Serial.print(" ");
Serial.print(velocita_A);
Serial.print(" ");
Serial.println(velocita_B);
*/
    
if (pitch > 1470 && pitch < 1530) //centro stick pitch
    {
      velocita_A =0;
      velocita_B =0;
      
    }

if (pitch > 1530 ) //avanti
    {
      velocita_A =((pitch-1500)/1.9);
      velocita_B =((pitch-1500)/1.9);
     digitalWrite( pinDirA,LOW );  ///motore   A
     digitalWrite( pinDirB,HIGH );  /// motore B
     
         
    }

if ( pitch < 1470) //indietro
    {
      velocita_A =((1500-pitch)/2.1);
      velocita_B =((1500-pitch)/2.1);
     digitalWrite( pinDirA,HIGH );  ///motore   A
     digitalWrite( pinDirB,LOW );  /// motore B
    }


if (roll > 1520) //giro a destra quindi rallento la velocità della ruota destra se vado avanti
    {
      velocita_A=velocita_A-((roll-1500)*0.25);
    }

if (roll < 1470) //giro a destra quindi rallento la velocità della ruota destra se vado avanti
    {
      velocita_B=velocita_B-((1500-roll)*0.25);        
    }

if (velocita_A<0 ) //correzione valori negativi
    {
       velocita_A=0;  
    }
if (velocita_A>255 ) //correzione valori maggiori di 255
    {
       velocita_A=255; 
    }

if (velocita_B<0 ) //correzione valori negativi
    {
       velocita_B=0;  
    }
if (velocita_B>255 ) //correzione valori maggiori di 255
    {
       velocita_B=255;  
    }
    
//imposto velocita motori A e B
analogWrite( pinPwmA,velocita_A);
analogWrite( pinPwmB,velocita_B );

  
}//fine loop con tanti saluti

mi sembra che però abbia omesso delle informazioni.

il codice muove una RC col mio radiocomando FRSKY...

La parte di lettura sui pin analogici deve leggere le tensioni delle lipo che non scenda sotto i 3.5V (le celle variano da 3.3 a 4.2V)

la parte di potenziometro in questo momento simula l' abbassamento delle tensioni..

Grazie

Sbaglio o mancano le letture a vuoto?
Quelle che si dovrebbero scartare?

Premesso che se chiedo uno "schema" NON voglio una foto, ma uno schema dei colegamenti (le foto dicono sempre poco), comunque ... se quello che vedo è giusto, NON funzionerà MAI ... NON puoi misurare in questo modo la tensione con cui alimenti anche il circuito ... dato che Arduino usa quella tensione come riferimento avrai sempre un valore vicino al massimo anche a batteria completamnete scarica!

Si può misurare il valore della batteria cpn cui si alimenta il circuito, ma il codice è completamnete diverso e sfrutta alcune particolarità interne della MCU.

Quindi cortesmente, come ti ho chiesto, metti lo schema e non la foto del circuito e poi vediamo di capire il da farsi ...

Guglielmo

Standardoil:
Sbaglio o mancano le letture a vuoto?
Quelle che si dovrebbero scartare?

Si hai ragione non le ho ancora implementate, mi informo tramite ricerca e aggiorno il codice

Ma che ricerca serve per una cosa del genere? Perché non usate mai il vostro cervello? :confused:

Certo che se per fare una lettura della quale non usi il valore devi fare una ricerca su internet....
Per Guglielmo,invece
Io credo che lo schema sia comunque adatto, visto che lui misura sì il 5 volt, ma da un partitore,, e vero comunque che farebbe meglio a mettere anche il potenziometro alimentato dalla pila

gpb01:
Premesso che se chiedo uno "schema" NON voglio una foto, ma uno schema dei colegamenti (le foto dicono sempre poco), comunque ... se quello che vedo è giusto, NON funzionerà MAI ... NON puoi misurare in questo modo la tensione con cui alimenti anche il circuito ... dato che Arduino usa quella tensione come riferimento avrai sempre un valore vicino al massimo anche a batteria completamnete scarica!

Si può misurare il valore della batteria cpn cui si alimenta il circuito, ma il codice è completamnete diverso e sfrutta alcune particolarità interne della MCU.

Quindi cortesmente, come ti ho chiesto, metti lo schema e non la foto del circuito e poi vediamo di capire il da farsi ...

Guglielmo

1° se controlli il mio post oltre alla foto ho allegato anche lo schema fatto con Fritzing, quindi non capisco che fastidio ti dia la cosa.

2° ovviamente l hardware sarà alimentato correttamente (adesso è collegato all' USB per poter leggere il monitor seriale), ovviamente in questo frangente non è la batteria lipo che alimenta il circuito, però le masse sono collegate.

3° prima di scrivere ho controllato altri post su voltmetri costruiti con arduino (tramite partitori e non ) e ho spulciato vari codici.
Quindi non capisco perché se funziona a loro NON deve funzionare mai a me.

4° Sono qui per imparare, il forum serve a questo, mi sembra che ho chiesto tutto molto gentilmente, non si può dire lo stesso della tua risposta, se non hai voglia non sei obbligato a rispondere.

5° Stammi bene

CUT-LAEF:
1° se controlli il mio post oltre alla foto ho allegato anche lo schema fatto con Fritzing, quindi non capisco che fastidio ti dia la cosa.

... vero, questo è stato un mio errore, avendo letto come nome del file "Untitled Sketch 2_bb" ho erroneamente pensato che si trattasse di una immagine del codice (come tanti mettono) e non l'ho guardato, mi scuso ... detto questo, ripeto, quello schema li NON funzionerà mai per fare quello che vuoi fare tu, e ti ho anche spiegato il perché.

Attento, NON è un problema di collegamenti, è proprio un errore di "concetto" ... prova a ragionarci sopra.

Guglielmo

In ogni caso, e se ne è parlato più volte qui sul forum, nel passaggio da un canale all'altro è sempre bene fare una lettura a vuoto sul nuovo canale, scartando la lettura

Ma che ricerca serve per una cosa del genere? Perché non usate mai il vostro cervello?

Certo che se per fare una lettura della quale non usi il valore devi fare una ricerca su internet....

A me non risulta che quando si fa analogRead su canali diversi in successione si debbano mettere delle letture a vuoto, a patto naturalmente di pilotare i pin analogici in modo adeguato.

Vedo invece che per voi la cosa e' ovvia e ben nota ...

Per favore mi potete illuminare?
Grazie


@CUT-LAEF

Da quanti ohm e' il potenziometro che stai usando?
Prova a sostituirlo con un partitore formato da 2 resistenze da 1K, e dimmi se cambia qualcosa.

Ciao
Marco

Si deve descrivere un po il funzionamento delle entrate ADC.

Il convertitore ADC é abbastanza lento usa un metodo suzessivo ; nel migliore dei modi gli serve 13 Clock per la conversione. Questo significa che per quel tempo la tensione da digitalizzare deve rimanere costante. Questo criterio viene usato con un condensatore Sample and Hold (S&H) che viene caricato per un certo tempo con la tensione da misurare. Nel tempo di campionamento il condensatore deve essere caricato alla tensione della tensione analogica da misurare. Se il circuito che fornisce la tensione analogica ha una resistenza troppo alta (sopra ca 10kOhm) il condensatore S&H non viene caricato/scaricato del tutto nel tempo disponibile e la tensione di questo condensatore non é quella della tensione da misurare.

Il controller del Arduino (ATmega328 nel modello UNO) ha un unico convertitore ADC. per avere piú entrate analogiche ha un Multiplexer analogico che seleziona una delle 6/8 entrate, la tensione di alimentazione e un sensore di temperatura interno.

Adesso arrivo ai Tuoi errori:

Misuri una potenziometro e trovi la stessa tensione su entrate analogiche liberi:
Dopo la misura delle tensione il condensatroe S%H é caricato sulla tensione di misura del potenziometro. Una misura di un piedino non collegato non carica ne scarica il condensatore S&H e percui rileggi la tensione del potenziometro.

Leggi la tensione della batteria anche sul potenziometro
Suppongo che la resistenza del potenziometro é molto piú alta di 10kOhm. Il condensatore S&S é caricato con la tensione della batteria. Nel tempo di sample il condensatore non viene scaricato perché il potenziometro ha un valore di resistenza troppo alto e non puó dare la corrente necessaria per caricare/scaricare il condensatore S&H.
soluzioni:

  • usare un potenziometro con una resistenza piú piccola (< 10 kOhm)
  • mettere un condensatore da 0,1µF tra entrata analogica e massa. Il potenziometro lentamente carica il condensatore e nel tempo di sample la corrente che serve per caricare/scaricare il condensatore S&H non viene dal potenziometro ma dal condensatore esterno.
  • fare piú misure e scartare le prime. Una lettura ripetuta dello stesso pin aumenta il tempo di carica/scarica e l' ultima misura da il valore giusto.
  • usare un Operazionale in configurazione Inseguitore di tensione. L' impedenza di entrata é molto alta (secondo il modello di amplificatore anche nel range dei GOhm) L' impedenza di uscita é bassa, normalmente gli amplificatori operazionali possono dare fino 20mA. Se lo alimenti con i 5V di Arduino devi scegliere un modello Rail to Rail per riuscire di avere l' uscita tutto il range di tensione.

Ciao Uwe

>Sulimarco: ... ti aggiungo un paio di letture interessanti ... QUESTO post e QUEST'ALTRO ... vecchiotti, ma sempre attuali :slight_smile:

Per non sbagliare, visto i circuiti che normalmente fanno gli utenti, buttare via la prima lettura è la strada più semplice ed indolore ... :smiley:

Sulimarco:
... a patto naturalmente di pilotare i pin analogici in modo adeguato ...

... appunto, quasi MAI :smiley: :smiley: :smiley:

Guglielmo