Salve a tutti, come progetto per la maturità stiamo facendo una mano robotica con arduino, sensori di flessione e servomotori. Abbiamo un problema per quanto riguarda la mappatura dei sensori. Infatti, quando andiamo a piegare il sensore di flessione, quest'ultimo non fa girare il servo in maniera completa. Abbiamo un alimentazione da 0-5V per il circuito, ed il sensore ha una range da 2.2V a 3.2 V con una resistenza da 22K.
map(val, 0, 1023, 0, 179); questi equivale ad un range da 0-5V, come facciamo a mappare per 2.2V e 3.2V?
Grazie, di seguito vi posto il programma:
#include <Servo.h>
//Istanza degli oggetti:
Servo myservo_pollice; //Istanza per motore pollice
Servo myservo_indice; //Istanza per motore indice
Servo myservo_medio; //Istanza per motore medio
Servo myservo_anulare; //Istanza per motore anulare
Servo myservo_mignolo; //Istanza per motore mignolo
//dichiarazione delle variabili:
int pollice;
int indice;
int medio;
int anulare;
int mignolo;
//Variabile di autoritenuta del bottone
int button = 0;
//Dichiarazione flag per conservare il numero Random
int flag = 0;
//Variabile di delay
unsigned long int timing = 0;
//Variabile contentente il numero randomico
int RadNumber;
//Funzioni per il posizionamento della mano:
void Carta(void);
void Sasso(void);
void Forbici(void);
void setup()
{
Serial.begin(9600);
//indicazione locazione servo motori
myservo_pollice.attach(11); //l’oggetto myservo_pollice è sul piedino 11
myservo_indice.attach(10); //l’oggetto myservo_indice è sul piedino 10
myservo_medio.attach(9); //l’oggetto myservo_medio è sul piedino 9
myservo_anulare.attach(6); //l’oggetto myservo_anulare è sul piedino 6
myservo_mignolo.attach(5); //l’oggetto myservo_mignolo è sul piedino 5
}
void loop()
{
//Mappatura corrispondente alla proporzione tra il range(0-1024) e il range (0-180)
pollice = map(analogRead(A0), 348, 853, 0, 179);
indice = map(analogRead(A1), 0, 1023, 0, 179);
medio = map(analogRead(A2), 0, 1023, 0, 179);
anulare = map(analogRead(A3), 0, 1023, 0, 179);
mignolo = map(analogRead(A4), 0, 1023, 0, 179);
//ritardo
delay(1);
//verifica pressione del pulsante
if ((digitalRead(7) == LOW)&&(flag == 0))
{
//generazione di un numero random da 0 a 2
RadNumber = random(3);
//autoritenuta
button = 1;
flag = 1;
}
if (button == 1)
{
//indicazione del valore random all'interno del monitor seriale
Serial.println(RadNumber);
//verifica del valore randomico e posiziomento corrispondente della mano
if(RadNumber == 0)
{
Carta();
}
if(RadNumber == 1)
{
Sasso();
}
if(RadNumber == 2)
{
Forbici();
}
}
else
{
//Posizionamento dei servo motori sulla basee dei valori letti dai sensori
myservo_pollice.write(pollice);
myservo_indice.write(indice);
myservo_medio.write(medio);
myservo_anulare.write(anulare);
myservo_mignolo.write(mignolo);
}
//Durata posizionamento della mano
if ((millis() >= timing + 5000) && (button == 1))
{
timing = millis();
//termine dell'autoritenuta
button = 0;
//Reset del valore randomico
flag = 0;
}
}
//Stati possibili delle mani
void Carta(void)
{
myservo_pollice.write(1);
myservo_indice.write(1);
myservo_medio.write(1);
myservo_anulare.write(1);
myservo_mignolo.write(1);
}
void Sasso(void)
{
myservo_pollice.write(179);
myservo_indice.write(179);
myservo_medio.write(179);
myservo_anulare.write(179);
myservo_mignolo.write(179);
}
void Forbici(void)
{
myservo_pollice.write(179);
myservo_indice.write(1);
myservo_medio.write(1);
myservo_anulare.write(179);
myservo_mignolo.write(179);
}