analogRead 3 potenziometri

//definizioni ingressi analogici pot
#define KpPin  A0
#define KiPin  A1
#define KdPin  A2

// Variabili PID
double Kp2 = 0;
double Ki2 = 0;
double Kd2 = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Kp2 = map(analogRead(KpPin), 0, 1023, 0, 1000) * 0.01;//lettura ok, uscita scrive  Kp2
  Ki2 = map(analogRead(KiPin), 0, 1023, 0, 1000) * 0.01;//lettura ok. uscita scrive  Ki2 e Kd2
  Kd2 = map(analogRead(KdPin), 0, 1023, 0, 1000) * 0.01;// non scrive nulla

  //stampa su serialmonitor valori
  Serial.print("P = ");
  Serial.print(Kp2);
  Serial.print("\t I = ");
  Serial.print(Ki2);
  Serial.print("\t D = ");
  Serial.println(Kd2);

  delay(100);//delay
}

Buonasera a tutti e anche buon 2021.
Sono arenato su un problema alquanto banale ma che, purtroppo, non riesco a risolvere.
Ho estratto parte del codice che servirebbe a cambiare le variabili di un controllo PID attraverso la lettura di 3 potenziometri. I collegamenti sono come da schema allegato. Perchè quando uso solo due potenziometri (KpPid e KiPid) le letture e di conseguenza i valori su Kp2 e Ki2 variano correlati allo spostamento del relativo potenziometro e invece con tre collegati KiPid scrive sulla variabile Ki2 e Kd2.
Cosa mi sta sfuggendo?

Prima di fare una lettura se un ponte analogico, fanne una a vuoto
E magari tra le due un piccolo delay

//definizioni ingressi analogici pot
#define KpPin  A0
#define KiPin  A1
#define KdPin  A2

// Variabili PID
double Kp2 = 0;
double Ki2 = 0;
double Kd2 = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  analogRead (A0);
  delay(10);
  Kp2 = map(analogRead(KpPin), 0, 1023, 0, 1000) * 0.01;//lettura ok, uscita scrive  Kp2
  delay(10);
  analogRead (A1);
  delay(10);
  Ki2 = map(analogRead(KiPin), 0, 1023, 0, 1000) * 0.01;//lettura ok. uscita scrive  Ki2 e Kd2
  delay(10);
  analogRead (A2);
  delay(10);
  Kd2 = map(analogRead(KdPin), 0, 1023, 0, 1000) * 0.01;// non scrive nulla
  delay(10);


  //stampa su serialmonitor valori
  Serial.print("P = ");
  Serial.print(Kp2);
  Serial.print("\t I = ");
  Serial.print(Ki2);
  Serial.print("\t D = ");
  Serial.println(Kd2);

  delay(100);//delay
}

Ho goggolato un pò e ho visto diverse soluzioni.
Tra queste una utilizzava un pin analogico messo a gnd tra una lettura e l'altra.
Altri dicevano che in questa condizione la lettura precedente rimane l' attuale anche se cambia il PIN.
Alla fine credo che se leggi troppo, aumenta la confusione.
Comunque sia non e' cambiato nulla.
Ho ricontrollato i collegamenti, ricontrollato i potenziometri..... cambiati.....
Il codice non mi sembra sbagliato.
Quasi quasi.... provo a cambiare il micro.

>sunnybyte: cortesemente, per evitare un bug del forum, leggi QUI. Grazie :slight_smile:

Guglielmo

P.S.: Intanto ho sistemato io il tuo post sopra :wink:

Grazie Guglielmo, non sono molto esperto di Forum.
Un po' per volta imparo pero'.

sunnybyte:
Altri dicevano che in questa condizione la lettura precedente rimane l' attuale anche se cambia il PIN

La doppia lettura dell'analogico (quando ci sono più ingressi analogici da leggere in sequenza) è l'unico caso in cui finora trovo comodo il comma operator:

in1 = (analogRead(PIN_IN1), analogRead(PIN_IN1));
in2 = (analogRead(PIN_IN2), analogRead(PIN_IN2));
in3 = (analogRead(PIN_IN3), analogRead(PIN_IN3));

Il codice non mi sembra sbagliato.

Neppure a me, da l'impressione di un qualche problema hardware.

Grazie Claudio_FF,
tra i vari tentativi, ho gia' provato anche quello delle virgole.
Una domanda.... non è che usando i pin A4 ed A5 per sensore I2C qualosa si infastidisce?
E' piu' un dubbio in quanto con un POT solo non capita nulla invece, con 3 POT, si.
Anche se si infastidiscono solo A1 ed A2.
Per mè e' un mistero........

Non mi risulta che usare l’ i2c dia fastidio ad A0…A3.

Risolto....
Si vede che a capodanno il micro che usavo......avrà preso qualche BOTTO :slight_smile: :slight_smile: :).
Sostituito con un altro e tutto funza.
CHE STRESS..... :o :o :o :o
Grazie a tutti per il tempo dedicato ed i consigli.
Alla prossima.