[Risolto] Problema con LED RGB, potenziometri e servo-motore collegati tra loro

Salve, sono nuovo del forum e di Arduino e magari sto già sbagliando, ma ormai ho cominciato:
Ho comprato Arduino Starter Kit (dunque ho Arduino UNO) ed ho fatto i primi progetti senza problemi, allora ho cominciato ad “incrociarli” tra loro e ancora bene. Sono incappato in un “errore” quando ho usato il LED RGB con tre potenziometri: grazie ai tre potenziometri potevo scegliere l’intensità dei tre colori, solo che non andava il verde (cioè, azionando il verde ottenevo tutti e tre i colori insieme, anziché quello e basta, come succedeva per gli altri due) e non sono riuscito a spiegarmi perché (in rete non ho trovato nulla), ho comunque voluto aggiungere un servo-motore al progetto, per farlo muovere a seconda dell’intensità dei colori. Ho scritto il programma e non mi dava errori, ma tradotto in pratica ottengo che il servomotore si muove solo al comando di un potenziometro (che regola il rosso); il secondo potenziometro (per il blu) risulta come danneggiato nel funzionamento (o non va, o lo fa in ritardo); dal terzo potenziometro (per il verde) non ottengo alcuna risposta. Questo è lo sketch (allego anche il progetto in fritzing):

#include <Servo.h>;
Servo servo; //inizializzazione del servo-motore

const int greenLEDpin = 9; //inizia l'inizializzazione del LED RGB
const int blueLEDpin = 10;
const int redLEDpin = 11;
int greenValue = 0;
int blueValue = 0;
int redValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;
int redSensorValue = 0; //terminata inizializzazione del LED RGB

const int potPin0 = A0; //inizia l'inizializzazione dei tre potenziometri
const int potPin1 = A1;
const int potPin2 = A2;
int potVal0;
int potVal1;
int potVal2;
int angle0;
int angle1;
int angle2; //terminata inizializzazione dei tre potenziometri

void setup() {
  servo.attach(8);
  Serial.begin(9600);
  pinMode (greenLEDpin, OUTPUT);
  pinMode (blueLEDpin, OUTPUT);
  pinMode (redLEDpin, OUTPUT);
}

void loop() {
  potVal0 = analogRead(potPin0);
  angle0 = map(potVal0, 0, 1023, 0, 179);
  greenSensorValue = analogRead(potVal0);
  delay(5);
  greenValue = greenSensorValue/4;
  analogWrite(greenLEDpin, greenValue);
  Serial.print("Green Value: ");
  Serial.print(greenValue);
  Serial.print(" Angle: ");
  Serial.println(angle0); //primo potenziometro e LED verde
  
  potVal1 = analogRead(potPin1);
  angle1 = map(potVal1, 0, 1023, 0, 179);
  blueSensorValue = analogRead(potVal1);
  delay(5);
  blueValue = blueSensorValue/4;
  analogWrite(blueLEDpin, blueValue);
  Serial.print("\t Blue Value: ");
  Serial.print(blueValue);
  Serial.print(" Angle: ");
  Serial.println(angle1); //secondo potenziometro e LED blu
  
  potVal2 = analogRead(potPin2);
  angle2 = map(potVal2, 0, 1023, 0, 179);
  redSensorValue = analogRead(potVal2);
  delay(5);
  redValue = redSensorValue/4;
  analogWrite(redLEDpin, redValue);
  Serial.print("\t Red Value: ");
  Serial.print(redValue);
  Serial.print(" Angle: ");
  Serial.println(angle2); //terzo potenziometro e LED rosso
  
  if (redValue > 0 && greenValue == 0 && blueValue == 0){
    servo.write(angle2);
    }
   else if (redValue == 0 && greenValue > 0 && blueValue == 0){
    servo.write(angle0);
    }
   else if (redValue == 0 && greenValue == 0 && blueValue > 0){
    servo.write(angle1);
    }
   else if (redValue != 0 && greenValue != 0 && blueValue != 0){
    servo.write(0);
    }
    }

Grazie in anticipo e scusate per eventuali parti inutili nella descrizione del problema

Ho risolto tutto, grazie a coloro che mi hanno aiutato a capire quale era il problema, non avevo considerato che:
-la libreria “servo” spegne i pin PMW 9 e 10;
-nel codice c’erano svariati punti che andavano aggiustati, anche per una migliore comunicazione col monitor seriale.

potVal0 = analogRead(potPin0);
...
greenSensorValue = analogRead(potVal0);

Da quale pin stai leggendo?

if (redValue > 0 && greenValue == 0 && blueValue == 0){
    servo.write(angle2);
    }
   else if (redValue == 0 && greenValue > 0 && blueValue == 0){
    servo.write(angle0);
    }
   else if (redValue == 0 && greenValue == 0 && blueValue > 0){
    servo.write(angle1);
    }
   else if (redValue != 0 && greenValue != 0 && blueValue != 0){
    servo.write(0);
    }

Gli if non coprono tutte le possibilitá. cosa deve succedere se 2 potenziometri sono diversi da 0?

Ciao Uwe

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento se non lo hai già fatto: Regolamento Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

uwefed: potVal0 = analogRead(potPin0); ... greenSensorValue = analogRead(potVal0);

Da quale pin stai leggendo?

if (redValue > 0 && greenValue == 0 && blueValue == 0){
    servo.write(angle2);
    }
   else if (redValue == 0 && greenValue > 0 && blueValue == 0){
    servo.write(angle0);
    }
   else if (redValue == 0 && greenValue == 0 && blueValue > 0){
    servo.write(angle1);
    }
   else if (redValue != 0 && greenValue != 0 && blueValue != 0){
    servo.write(0);
    }

Gli if non coprono tutte le possibilitá. cosa deve succedere se 2 potenziometri sono diversi da 0?

Ciao Uwe

1) Sta leggendo dal pin analogico di Arduino A0;

2) Mh, giusto. Tuttavia, anche cambiando queste impostazioni per il servomotore, in che modo risolverebbe il problema legato al LED RGB?

Servo library

This library allows an Arduino board to control RC (hobby) servo motors. Servos have integrated gears and a shaft that can be precisely controlled. Standard servos allow the shaft to be positioned at various angles, usually between 0 and 180 degrees. Continuous rotation servos allow the rotation of the shaft to be set to various speeds.

The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.

David_Inginiar: 1) Sta leggendo dal pin analogico di Arduino A0;

2) Mh, giusto. Tuttavia, anche cambiando queste impostazioni per il servomotore, in che modo risolverebbe il problema legato al LED RGB?

No, non stai leggendo il pin A0 ma stai leggendo un pin che dipende dal valore che leggi dalla entrata analogica (secondo analogRead(potVal0) ) percui casuale.

Ciao Uwe

uwefed: No, non stai leggendo il pin A0 ma stai leggendo un pin che dipende dal valore che leggi dalla entrata analogica (secondo analogRead(potVal0) ) percui casuale.

Ciao Uwe

Ok, grazie per i consigli, ho aggiustato ed ora va come avevo previsto. :D