Problemi su pin analogico

Salve a tutti

Spero che qualcuno mi possa aiutare perché io ho finito le idee

Usando un ARDUINO UNO R3 Ho fatto un divisore per tornio con due motori, uno per il mandrino dove metto il pezzo da lavorare ed uno per la fresa montata sulla torretta portautensili

Essendo a corto di pin liberi ho fatto una semplice interfaccia con una serie di resistenze per utilizzare un solo pin analogico al posto degli 8 digitali per il tastierino 4x4

E qui nasce il problema

Finché sono connesso al pc tramite usb funziona tutto perfettamente perché la differenza tra valore minimo e valore massimo di ogni tasto che leggo sul pin analogico è al massimo 7 ed i valori dei tasti sono tutti diversi tra di loro

Se stacco la usb i range di valori per ogni tasto aumentano notevolmente ( da 20 a 40 invece di 7 ) con la conseguenza che i valori di alcuni tasti si sovrappongono

l'alimentazione a 12 v è ricavata con un trasformatore un ponte e un condensatore che mi forniscono una tensione di circa 20 v non stabilizzata che viene utilizzata da un convertitore dc-dc regolato a 12 v e 1 a

i 5 v li ricavo con un 7805 dai 12 v

il massimo che sono riuscito a supporre è che l'alimentazione introduce interferenze ma non sono convinto visto che attaccando anche la usb il problema sparisce

Grazie anticipate

Andrea

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

Se la tensione di alimentazione cambia, anche di poco, i valori che ottieni sul pin analogico cambiano anchessi.
Uno schema di collegamento aiuterebbe come anche il codice per capire il problema.

grazie per la risposta
mi spiego meglio
il problema non è il valore che cambia, ma la differenza tra valore minimo e valore massimo
ho notato che cambia anche solo mettendo il tester per vedere la tensione
allora ho fatto un programmino che mi fa vedere sul display il valore minimo ed il valore massimo per ogni tasto
collegato alla seriale la differenza massima è 7, ad esempio il tasto 4 va da 928 a 935
alimentato esternamente la differenza su molti tasti arriva ad oltre 30 ed i valori si accavallano rendendo impossibile capire quale tasto è premuto

poichè ai 5v di arduino va collegato oltre al tastierino un relè e due driver per i motori, l'assorbimento è alto e dopo poco tempo arduino va in protezione
allora ho messo un 7805 ed con i 5v alimento la mia scheda
prendendo i +5 da arduino per il tastierino la cosa migliora di poco, purtroppo i valori di alcuni tasti si accavallano ancora
spero di essermi spiegato
grazie di nuovo

mi sono scordato di dire come è fatta l'interfaccia per il tastierino
sui 4 fili delle righe ci sono i seguenti valori
0 100k 200k 300k
sui 4 fili delle colonne
0 400k 800k 1,3m
in più c'è una resistemza da 1m tra il pin e la massa

Se hai 1024 punti e li vuoi dividere su 7 tasti (più la condizione "nessun tasto"), 1024/8 = 128. Quindi, anche se ti cambia il valore di 30 passi, non lo vedo un gran problema.
Poi è normale che se sei "tirato" con l'alimentazione, ogni cosa che ti si accende va ad abbassarla e di conseguenza cambia tutto.
Cosa significa "l'assorbimento è alto" ? L'assorbimento è giusto, è il tuo alimentatore che non lo sopporta.
Quindi fai un bell'alimentatore, adatto al tuo assorbimento, distanzia bene i valori dei tuoi tasti analogici e non avrai più problemi.

Secondo me i valori che hai adottato sono troppo alti di un ordine di grandezza

Inoltre sono mal distribuiti

Siccome il circuito che usi non è un potenziometro, ma un reostato in serie ad una resistenza fissa la risposta non è lineare
L'ideale è una serie di intervalli costanti, coi tuoi valori non lo sono
Devi ricalcolare i 16 partitori
O meglio usare uno specchio di corrente

non è il mio alimentatore che non lo sopporta, è arduino
con l'alimentazione esterna va benissimo

c'è solo una cosa che non capisco
se ho sbagliato l'interfaccia perchè attaccato alla seriale funziona
prova 1
hardware collegato alla usb e software caricato
funziona perfettamente
prova 2
hardware collegato alla usb e alimentazione esterna , stesso software
funziona perfettamente
prova 3
hardware collegato alla alimentazione esterna , stesso software
non funziona più bene, i range sono sballati
dove sta il problema?
le mie conoscenze di elettronica non arrivano a tanto

Come 7 tasti
Da 0 a 9 sono 10 più ABCD e * e # fa 16

Opss... scusa, non avevo capito che tastierino avevi messo

Sarebbe utile vedere il programma, almeno la parte interessata

Il problema è CHIARAMENTE dell'alimentazione esterna. Se colleghi ANCHE la USB non fai altro che dare più potenza e stabilità al tuo alimentatore che, chiaramente, è inadatto. Può darsi che abbia abbastanza corrente, che gli Ampere siano sufficienti, ma l'uscita è "sporca", poco filtrata (bisognerebbe sapere che tipo di alimentatore è). L'alimentazione via USB è sicuramente più filtrata perché deriva da uno switching che deve alimentare una motherboard e diverse periferiche "delicate". L'uso delle analogiche, che tu hai usato giustamente per risparmiare 8 ingressi digitali, implica che l'alimentazione debba essere migliore; nessun problema perché è tutto risolvibile. Puoi provare con un bel condensatore elettrolitico all'uscita dell'alimentatore (e così magari tagliamo qualche disturbo) e poi, via via, si cercano altre strade.

cancellato perchè non postato correttamente

anche io penso sia questo il problema, ma le mie conoscenze di elettronica sono molto limitate
l'alimentazione è fatta così
un trasformatore recuperato da una stampante
un ponte di diodi con una uscita circa 14v in cc
questa uscita va ad un convertitore dc-dc regolabile in tensione e corrente
regolato per una uscita di 12V 1A
su questa uscita c'è un elettrolitico da 2200 microfarad
controllata l'uscita è stabile
con o senza elettrolitico non cambia nulla
con questi 12v alimento i motori, il Vin di arduino ed un 7805 che mi fornisce 5v con cui alimento relè e driver motori
il tastierino usa il pin 5V di arduino
usando i 5v del 7805 la situazione peggiora

@anfias : In conformità al REGOLAMENTO, fosse anche per una sola riga, il codice va racchiuso negli appositi tag ... :roll_eyes:

... cortesemente, quindi, edita il tuo post più sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Grazie. :slight_smile:

Guglielmo

Scusa ma non ho capito

Se uso il segno di matita mi fa modificare il post, non mi fa aggiungere il codice

Comunque grazie per il crtl T, non lo sapevo

// questo programma visualizza sul display il valore letto sul pin A1
// il tasto premuto ed il valore minimo ed il valore massimo per ogni tasto
// ogni 20 letture ripulisce contatori e schermo

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int pinkey  = A1;
int val = 0;
char keyd;
int valmax = 0;
int valmin = 1024;
int conta = 0;

void setup() {

  pinMode(pinkey, INPUT);
  lcd.begin();
  lcd.backlight();

}

void loop()
{
  keyd = ' ';
  val = analogRead(pinkey);
  delay(400);
  conta++;

  if (conta > 20 )
  {
    valmax = 0;
    valmin = 1024;
    conta = 0;
    lcd.clear();
  }

  if (val > valmax)
  {
    valmax = val;
  }

  if (val < valmin)
  {
    valmin = val;
  }

  if (val > 1020) {
    keyd = '1';
  }

  if (val > 719) {
    if (val < 736) {
      keyd = '2';
    }
  }

  if (val > 554) {
    if (val < 571) {
      keyd = '3';
    }
  }

  if (val > 924) {
    if (val < 941) {
      keyd = '4';
    }
  }

  if (val > 669) {
    if (val < 691) {
      keyd = '5';
    }
  }

  if (val > 524) {
    if (val < 546) {
      keyd = '6';
    }
  }

  if (val > 839) {
    if (val < 861) {
      keyd = '7';
    }
  }

  if (val > 619) {
    if (val < 651) {
      keyd = '8';
    }
  }

  if (val > 504) {
    if (val < 521) {
      keyd = '9';
    }
  }

  if (val > 579) {
    if (val < 611) {
      keyd = '0';
    }
  }

  if (val > 769) {
    if (val < 796) {
      keyd = 'N';
    }
  }

  if (val > 474) {
    if (val < 496) {
      keyd = 'S';
    }
  }

  if (val > 429) {
    if (val < 441) {
      keyd = 'A';
    }
  }

  if (val > 414) {
    if (val < 426) {
      keyd = 'B';
    }
  }

  if (val > 399) {
    if (val < 411) {
      keyd = 'C';
    }
  }

  if (val > 364) {
    if (val < 396) {
      keyd = 'D';
    }
  }

  visualizza();

}

void visualizza()
{
  lcd.setCursor(0, 0);
  lcd.print("    ");
  lcd.setCursor(0, 0);
  lcd.print(String(val));
  lcd.setCursor(5, 0);
  lcd.print("    ");
  lcd.setCursor(5, 0);
  lcd.print(String(valmin));
  lcd.setCursor(10, 0);
  lcd.print("    ");
  lcd.setCursor(10, 0);
  lcd.print(String(valmax));
  lcd.setCursor(0, 1);
  lcd.print("    ");
  lcd.setCursor(0, 1);
  lcd.print(keyd);
  lcd.setCursor(10, 1);
  lcd.print("    ");
  lcd.setCursor(10, 1);
  lcd.print(String(conta));
  delay(100);
}

Non mi corrispondono i calcoli

Come hai ottenuto quei valori?

Comunque togli quella inutile pinMode
Eradica gli oggetti String
E ripensa a quella complicata catena di if()

... scusa eh, ma se puoi modificare il post, allora puoi: cancellare il vecchio codice, incollare il nuovo ben formattato e poi selezionarlo tuttoi ed usare il bottone </> per marcarlo come codice ... :roll_eyes:

Guglielmo