Macchinetta funzione quando vuole

Ciao a tutti,
sto cercando di controllare una macchinetta in modo da fargli seguire la luce di una torcia con 2 fotoresistori. Può sembrare un progetto difficile, ma è semplice. Il problema è il seguente: il Servo, in ottima “salute” non vuole fare ciò che voglio. Rimane fermo, nonostante abbia aggiunto per sicurezza dei delay dopo myservo.write(gradi). La direzione la decide ed anche bene, mi stampa tutto sulla porta seriale, ma nell’effettiva il Servo ozia. Credendo si tratti di un calo di tensione, alimentando solo il Servo da un alimentatore AC-to-DC a 5V le cose non cambiano.
La direzione la sceglie, quindi lo sketch va bene, il circuito è perfetto, per i cali di tensione è fornito di molti condensatori.Cosa è a questo punto? Sotto consiglio ho realizzato uno sketch di prova che muove solo il Servo senza fare altro. A mio malgrado, ciò non ha cambiato nulla; il circuito è OK, lo sketch pare essere apposto, chiedo per questo un urgente consiglio. Ho inoltre usato un BC338 per gestire in modo primitivo i cali di tensione, cosa che si è rivelata utile con il LED al pin 5 per segnalare il calo.
Qui ho riposto tutto il materiale, compreso un programmino ad hoc in Visual Basic per vedere nel completo dettaglio ciò che la macchinetta fa. C’è lo schema, lo sketch ed il programma in VB.NET. Li ho messi in Drive causa il peso superiore al Mb concesso dal sito:

Google Drive - Macchinetta con Arduino

Lo sketch è il seguente:

#include <Servo.h>

Servo myservo;

byte state = 1; //the state
unsigned int lum[2]; //analogIn; 1 -> sx A0, 2 -> dx A1
//int ledlum[2]; //1 dx rosso 6, 2 sx verde 10
unsigned int substraction = 0;
byte sdx = 1;
unsigned int freq = 40;
byte istate = 0;

void setup() {
  myservo.attach(9); //servo
  pinMode(13, INPUT); //button1 - state 0-1
  pinMode(11, OUTPUT); //motor
  pinMode(10, OUTPUT); //green led
  pinMode(7, INPUT); //tilt
  pinMode(6, OUTPUT); //red led
  pinMode(12, INPUT); //switch ON sensor
  pinMode(5, OUTPUT); //Power controller transistor
  pinMode(8, OUTPUT); //speaker
  digitalWrite(11, LOW);
  digitalWrite(5, LOW);
  Serial.begin(11520);
  Serial.println("ON!");
  digitalWrite(6, HIGH);
  digitalWrite(10, HIGH);
  delay(2);
  scatti();
}

void loop() {
  if (state == 1) {
    //stato pulsante on-off
    if (digitalRead(13) == HIGH) {
      delay(10);
      if (digitalRead(13) == HIGH) {
        off(0);
      }
    } else if (digitalRead(7) == LOW) {
      delay(10);
      if (digitalRead(7) == LOW) {
        off(1);
      }
    }
    /*DIREZIONE*/
    Mmove();
    //audio part
    freq = random(40, 6000);
    tone(8, freq, random(1, 200));
    Serial.print("Speaker freq.: ");
    Serial.println(freq);
  } else {
    digitalWrite(6, HIGH);
    delay(600);
    digitalWrite(6, LOW);
    delay(500);
  }
}

/*end loop, others voids:*/

void Mmove() {
  istate = digitalRead(12);
  if (istate == HIGH) {
    if (readVolts() < 4) {
      while(readVolts() > 4) {
        digitalWrite(5, HIGH);
        delay(490);
        digitalWrite(5, LOW);
        delay(10);
        Serial.println("Current down!");
        Serial.println(readVolts());
      }
    }
    lum[1] = analogRead(A0);
    Serial.print("sx: ");
    Serial.println(lum[1]);
    lum[2] = analogRead(A1);
    Serial.print("dx: ");
    Serial.println(lum[2]);
    if ((lum[1] > 600) || (lum[2] > 600)) {
      Serial.println("Motor ON");
      analogWrite(11, 255);
      delay(2);
      dir_sterzo();
    } else {
      analogWrite(11, 0);
      Serial.println("Motor OFF");
      Serial.println("Substraction: -");
      delay(10);
    }
  } else {
    Serial.println("Switch off, motor, servo and other functions are disabled.");
    analogWrite(11, 0);
    Serial.println("Motor OFF");
  }
}

void dir_sterzo() {
  if (lum[1] > lum[2]) {
    substraction = lum[1] - lum[2];
    sdx = 0;
  } else {
    substraction = lum[2] - lum[1];
    sdx = 2;
  }
  Serial.print("Substraction: ");
  Serial.println(substraction);
  delay(1);
  if (substraction < 180) {
    delay(2);
    SM(90);
    delay(10);
    Serial.println("Servo: 90");
    delay(5);
  } else {
    if (sdx == 0) {
      delay(2);
      SM(125);
      delay(10);
      Serial.println("Servo: 125");
      delay(5);
    } else if (sdx == 2) {
      delay(2);
      SM(55);
      delay(10);
      Serial.println("Servo: 55");
      delay(5);
    }
  }
}

void SM(int pos) {
  myservo.write(pos);
}

void scatti() {
  myservo.write(55);
  delay(700);
  myservo.write(90);
  delay(700);
  myservo.write(125);
  delay(700);
  myservo.write(90);
  delay(10);
}

void off(byte because) {
  state = 0;
  digitalWrite(10, LOW);
  analogWrite(11, 0);
  Serial.println("Motor OFF");
  delay(5);
  SM(90);
  delay(10);
  Serial.print("OFF: ");
  if (because == 0) {
    Serial.println("BUTTON DOWN!");
    tone(8, 100);
  } else if (because == 1) {
    Serial.println("THE CAR IS FALL! REBOOT!");
    tone(8, 1000);
  }
  delay(2);
}

float readVolts() {
  return (analogRead(A2)*5.0)/1023.0;
}

La cartella condivisa è modificabile, qualora potesse servire.

Nell’effettiva il Servomotore si muove, anche se massimo una volta al minuto per motivi ignoti (quando si muove indica la direzione giusta, almeno questo).

Spero tanto che siate in grado di aiutarmi, ho cercato si riferirvi tutto il materiale possibile. Grazie in anticipo.

Ho dato un'occhiata rapida al listato. Tone e servo non vanno a braccetto. Per fare un test togli tutta la parte audio.

Grazie Pighixxx del tuo consiglio, Ho già provato precedentemente a rimuovere tutta la parte audio, LED e ciò che non era Servo e motore ruote, anche se le le cose non sono cambiate minimamente. E' quindi molto improbabile sia il tone(8, freq, durata) o un calo di tensione; in ogni caso riproverò tempo permittendo. Spero tanto siate in grado di aiutarmi quanto prima possibile, non riesco ancora a spiegarmi cosa interferisca con il Servo, che si muove quando vuole.

Ciao a tutti, Ho provato nuovamente a rimuovere tutti i tone() dallo sketch, anche se le cose non sono andate diversamente. Ricontrollando decine di volte il listato non sono ancora venuto alla causa del problema. L'oscilloscopio mi fa vedere chiaro e tondo che la frequenza che riceve il Servo rimane costante, cambia solo una volta ogni morte di papa; a mio malgrado il tempi finisce e dato che la mia intensione era portare il macchinetta all'esame di 3a media mi dovrei sbrigare. Cosa causerà questo errore irreversibile nell'invio dellla frequenza PPM con servo.write()? Grazie in anticipo.

XX21b: Sotto consiglio ho realizzato uno sketch di prova che muove solo il Servo senza fare altro. A mio malgrado, ciò non ha cambiato nulla; il circuito è OK

Quindi con sketch "semplice" ma con quel circuito il servo non si muove ? O il servo è rotto oppure il circuito non va. Non mi pare ci possano essere altre possibilità. Hai provato sketch pulito e semplice e il solo servo collegato (con alimentazione separata ma gnd in comune) ?

Ciao Nid69ita,

nid69ita:
Quindi con sketch “semplice” ma con quel circuito il servo non si muove ?

Cosa intendi per "semplice? Con solo Servo? Allora si, ci ho provato, rimuovendo LED, tone(), motore e tutto il resto, alimentando quest’ultimo da un alimentatore 5V DC e gnd comune, nella speranza che fare ciò cambiasse qualcosa, cosa non vera. Il Servo è assolutamente sano, con altri sketch funziona benissimo, come ad esempio questo per farlo muovere a scatti sx centro dx:

#include <Servo.h>
Servo s1;
int index = 0;
void setup() {
  s1.attach(9);
  pinMode(11, OUTPUT);
  digitalWrite(11, LOW);
}
void loop() {
  if (index == 0) {
    s1.write(65);
    index++;
  } else if (index == 1) {
    s1.write(90);
    index++;
  } else {
    s1.write(115);
    index = 0;
  }
  delay(700);
}

Il tutto montato nello stesso circuito della macchinetta, quindi non ci sono collegamenti difettosi.

Il circuito elettrico che uso lo trovi qui:
Google Drive
Il circuito è apposto, perché il Servo si muove, anche se massimo una volta ogni 2-3 minuti.
Ringrazio nuovamente e spero di risolvere il problema quanto prima possibile.