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