Problema microservo SG90

Salve a tutti,sto avendo problemi a pilotare questo servo,non riesco a capire se è il servo che da problemi o il codice ,in quanto se vado a usare tinkercad per simulare sembra che tutto funzioni,una volta montato il tutto nella realtà, il codice sembra andare fino alla rotazione iniziale,successivamente ,nella seconda rotazione appena arriva a 0 comincia a girare come una trottola, e non si ferma più quando poi nessuno glielo ha detto,posto il codice per sicurezza,ringrazio tutti quanti per l'aiuto

#include <Keypad.h>
#include <Servo.h>

Servo myservo;  // crea l'oggetto di tipo Servo, myservo sarà l'oggetto su cui opererai
int pos = 0;//serve per posizione del servo

int pinPIR    = 13;       // Pin PIR

char *code[] = {"1234", "2345", "6789"};//password accettabili
const byte ROWS = 4; //quattro righe
const byte COLS = 4; //quattro colonne
char keyInsert[4];
// Queste variabili servono come verifica del corretto inserimento del codice
int i = 0;
int j = 0;
int s = 0;
int x = 0;
char Keys[ROWS][COLS] = //creo la matrice dei tasti della tastiera.
{
  {'1', '2', '3', 'A'} ,
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte colPins[4] = {5, 4, 3, 2}; // Pin a cui sono connesse le colonne
byte rowPins[4] = {9, 8, 7, 6}; // Pin a cui sono connesse le righe

Keypad keypad = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);


void setup()
{
  pinMode(pinPIR, INPUT);
  Serial.begin(9600);
  myservo.attach(11);//assegna al pin 11 il servo


  Serial.println("Insert PIN");
}

void loop()
{


  char key = keypad.getKey();//prende il valore dal keypad quando immesso
  int valPIR = digitalRead(pinPIR);//legge il pin del sensore PIR


  if (key != NO_KEY && j <= 4) { //codice che permette l'inserimento del nostro valore numerico da tastiera

    //Serial.print("*");//permette di non far vedere il codice sul seriale
    Serial.print(key);
    keyInsert[j] = key;
    j++;
  }
  if (j == 4) //if eseguito dopo che tutti i numeri sono stati inseriti
  {
    j = 0; //reimposto il contatore a 0 così quando esce dal ciclo posso reimmettere un nuovo codice
    Serial.println();//usato per spaziare,va a capo quando così da avere cosa pulita sul codice
    Serial.println("Verifyng the code...");
    delay(1000);
    for (i = 0; i <= 2; i++) //gli apici sono da 0 a 2 perchè ho 3 codici,nella realtà potremmo inserirne da 0 a n-1
      //dove n è il numero di codici
    {
      for (s = 0; s <= 3; s++) //il codice numerico è formato da 4 cifre,anche qui come prima da 0 a n-1
      {
        if (code[i][s] == keyInsert[s])
        {
          Serial.println(s);//per vedere se entra nel ciclo,permette di vedere se le cifre del codice sono giuste una ad una
          x++;//contatore che indica il numero di cifre esatte per un determinato codice
        }
        else {
          Serial.println("schifo");//la cifra non va bene
          x = 0; //azzero il contatore in quanto quel codice i-esimo è errato
          break;//forzo l'uscita dal ciclo for per quel codice numerico e passo quindi a verificare il successivo
        }
      }
      if (x == 4) {
        break; //se esce dal ciclo for sovrastante e il codice è corretto interrompi il for generale perchè la porta deve aprirsi
      }
    }

    if (x == 4) //se alla fine dei cicli for x=4 vuol dire che il codice era corretto quindi puoi entrare
    {
      Serial.println("puoi entrare,fai un passo in avanti");//messaggio conferma entrata
      if (valPIR == HIGH) //controlla se c'è qualcuno davanti alla porta che si muove,se si valore HIGH fa entrare
      {
        Serial.println("Movimento rilevato la porta si apre!");
        for (pos = 0; pos <= 180; pos++) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
          //esso rappresenta l'apertura della nostra porta
        {
          myservo.write(pos);  // con il metodo write() passi all'oggetto myservo la posizione che deve raggiungere,
          // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
          delay(15);   // imposta un ritardo di 15 millesimi di secondo per ogni ciclo del for.
          // Più sarà alto il ritardo più il servo sarà lento.
        }
        delay(1000);
        valPIR = LOW; //imposta il valore LOW perchè l'utente è passato per la porta dopo quel secondo

      }
      if (valPIR == LOW) //quando non c'è nessuno davanti alla porta
      {
        Serial.println("La porta si chiude!");
        if (pos != 0)
        {
          for (pos = 180; pos >= 0; pos--) // imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo
          {
            myservo.write(pos);  // con il metodo write() passi all'oggetto myservo la posizione che deve raggiungere,
            // il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°
            delay(15);   // imposta un ritardo di 15 millesimi di secondo per ogni ciclo del for.
            // Più sarà alto il ritardo più il servo sarà lento.
          }
          x = 0; //azzera il codice così da poterne inserire un'altro
          Serial.println();
          Serial.println("Insert PIN");
        }
      }

    }
    else //nel caso x!=4 non fa entrare perchè vuol dire che non hai immesso nessuno dei codici correttamento
    {
      Serial.println("non puoi entrare");
      Serial.println();
      Serial.println("Insert PIN");
      x = 0;
    }
  }
  if (key == '#') { //if necessario a pulire tutto quanto per reimmettere nuovo codice
    //se premo #azzera tutto
    x = 0;
    i = 0;
    j = 0;
    Serial.println();
    Serial.println("Insert PIN");
  }
}

aggiungo inoltre in cosa consiste il progettino in questione,si tratta di simulare l'apertura/chiusura porta con arduino,c'è un codice da immettere e l'arduino dice ok il codice è corretto/sbagliato,nel caso sia corretto,se c'è una persona davanti vista attraverso un PIR ,il servo viene azionato e poi ricomincia il tutto

ok credo di aver risolto,mi è venuto in mente di aumentare dove finiva la corsa della rotazione da 0 l'ho messa a 10 e sembra arrestarsi in maniera corretta,rimango comunque curioso del perchè avveniva tale stranezza

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.