Ciao, ho un problema con un progetto che sto facendo per scuola: sto costruendo un veicolo in grado di muoversi autonomamente o essere telecomandato. Esso consiste in: una macchina telecomanda privata elettronica sulla quale ho messo le mie componenti, controllata da arduino MEGA2560 con scheda motori di adafruit (afmotor shield) e xbee per comunicare. Mentre per il controllo uso arduino diecimila at168 ( non sono sicuro della versione poiché faceva parte di un kit proposto da un università ma con pochi dettagli tecnici sulla scheda) con un xbee e un joystick tipo Playstation ( solo il controller per pollice). Il problema sorge quando passo dalla modalità telecomandata a quella manuale: il servomotore, che uso per orientare un sensore di distanza a ultrasuoni, non si muove più: sento ancora la resistenza che va se provo a spostarmi manualmente ma non sembra più ubbidire quando richiamo servo.write(90). Ora sono su cellulare ma vi invio il link del forum internazionale dove ho messo il codice.
Grazie mille in anticipo, cordiali saluti, propilot
la parte di codice è la seguente:
void loop() // questa è la funzione principale, simile al task main() di NXT. Il suo funzionamento è comparabile a quello di un ciclo while(true)
{
spia=leggiseriale();
motor.setSpeed(data[3]);//serialcom[3]);//viene impostata la velocità di default inviata dalla stazione di terra
if(spia==0)/*se la modalità scelta dall'utente è quella automatica si avvia la prima parte della funzione main, altrimenti la seconda*/
{
Serial.print("funzione avanti"); //test per eventuali bug
distFD=ping(); //viene aggiornata la distanza avanti
while(distFD>30)//&&(emerg==0)) //questa funzione fa andare avanti la macchina fintanto che la distanza è maggiore di 30 centimetri
//emerg ha problemi, di conseguenza lo elimino dalla funzione, eventualmente posso collegarlo al tasto reset.
{
Serial.print(distFD); //test della funzione ping
//tempodopo=millis(); //millis misura il tempo passato dall'inizio dell'esecuzione del programma (si attiva subito dopo che viene eseguito il bootloader)
//if(tempodopo-tempoprima>1000) //se tra un intervllo di tempo e quello precedente è passato un secondo viene fatto il controllo della direzione di casa
//{
//cercacasa(); //si esegue la scansione a infrarossi
//tempoprima=tempodopo; //il vecchio intervallo di tempo viene sostituito dal tempo attuale
//}
distFD=ping(); //viene aggiornata la distanza avanti
Serial.print(srange.read());//test seriale per bug
spia=leggiseriale();//controllo della modalità inviata dal telecomando
if(spia==1){break;}//se il telecomando segnala l'ordine comando via radio si esce dalla fuunzione
Serial.print("AVANTI A TUTTA \n");
motor.run(FORWARD);
delay(10);
}
Serial.print("fuori"); //test di uscita dalla funzione attuale
motor.run(RELEASE); //frenata dei motori
direzione();//viene scelta la direzione di marcia
}
if(spia==1)//!!!IL PROBLEMA SORGE ENTRANDO IN QUESTA PARTE DI CODICE!!!la macchina riceve l'ordine di passare alla modalità telecomandata
{
while(spia==1)//viene mantenuta questa modalità fintanto che spia ha come valore 1
{
percentualech1=data[1];
percentualech2=data[2];
//percentualech1=map(percentualech1,0,255,0,100);
//percentualech2=map(percentualech2,0,255,0,100);
if((percentualech2>138)&&(percentualech2<256))
{
motor.run(BACKWARD);
percentualech2=map(percentualech2,128,255,0,255);
motor.setSpeed(percentualech2);
}
else if((percentualech2<118)&&(percentualech2>-1))
{
motor.run(FORWARD);
percentualech2=map(percentualech2,128,0,0,255);
motor.setSpeed(percentualech2);
}
else
{
motor.run(RELEASE);
}
if((percentualech1>-1)&&(percentualech1<256))
{
percentualech1=map(percentualech1,0,255,410,570);
resetdirezione(percentualech1);
}
/*if(percentualech1>138)
{
percentualech1=map(percentualech1,128,255,490,570);
resetdirezione(percentualech1);
}
else if(percentualech1<118)
{
percentualech1=map(percentualech1,0,128,490,570);
resetdirezione(percentualech1);
}
else
{
resetdirezione(490);
}*/
spia=leggiseriale();
}
//motorrot.setSpeed(200);
motor.setSpeed(serialcom[3]);
}
Serial.print(srange.read());
delay(1000);
srange.detach();
srange.attach(9);
}