Servomotore smette di funzionare

propilot01:
Lo so ma era su quello internazionale e mi hanno consigliato di andare a postarlo su quello italiano (via messaggio privato). ...

Forse anche perché tutti i commenti nel sketch li hai fatti in italino.
Ciao Uwe

Ciao, finalmente posso caricare tutti i dati. Ho già provveduto a cancellare l'altro post e ora metto qui dati e foto. I dettagli generali sono già presenti sopra. In merito ai commenti ho una precisazione da fare: ogni tanto angolature e commenti non coincidono perchè a causa di come è fatto e montato il servo i gradi che metto come input in arduino sono sfasati di 5° nella realtà ( e i commenti si riferiscono a questa). Spero i dati siano sufficienti, se caso carico ogni altro elemento necessario. Il problema sorge quando si passa dalla modalità automatica (2° parte del codice in void loop) alla modalità manuale. Quindi il servomotore funziona solo se uso fin da subito la modalità automatica.

ctrl_xbee_usbcom_send_finale.ino (1023 Bytes)

ctrl_robot_HC_SR04_test_serialmov_v1_7_4_2_sus.ino (12.2 KB)

Allora, due consigli: senza creare nuovi post, vai in modifica di quello precedente (pulsante modify in alto...) elimina le foto e ricaricale con una risoluzione massima di 800x600, altrimenti ci vuole un mese per caricarle. lo sketch a cui fai riferimento (errore tra manuale e automatico), mettilo in forma testuale nel post tra i tag code e /code, altrimenti non è apribile da pate di chi non ha le lib che hai usato. Devi rendere la vita facile al Forum :wink:

Argh! io mi sto perdendo, scusatemi tantissimo ma tra cose di scuola e questo problema sto impazzendo. Mi sono letto le regole che avete appena postato. ora so cosa fare per il prossimo post! in merito al mio problema avrei un ipotesi: se io blocco void loop() un po a lungo (faccio eseguire a lungo un ciclo while all'interno di loop) potrei creare dei problemi? potrebbe essere che mi si bloccano alcune parti perchè eseguo una sola volta void loop? Appena ci entro il codice fa partire un ciclo while, di conseguenza blocco l'esecuzione di loop() che si riattiva solo quando passo dalla manuale (seconda parte del codice) alla modalità automatica (finisce la manuale, finisco il codice in void loop e quello riparte dall'inizio, momento in cui sorge il problema). Per le immagini, come ieri, aspetto di essere a casa e poi le ricarico.
Comunque ho provato a cercare una possibile soluzione ovunque: forum, google, altri forum,...
Grazie mille di tutto, e scusatemi per aver creato tutti questi problemi!!!

la void loop si esegue automaticamente all'infinito, semmai io proverei ad invertire la situazione facendo partire prima una modalità e poi l'altra e viceversa (magari invertendo temporaneamente i codici del while

Ciao!
Ho provato ancora un po di cose: invertire il codice, togliere i while e tenere gli if (spia==0,1) ma il problema persiste, tornando sempre nello stesso momento. A questo punto è più che confermato che si tratta della parte di codice "automatica" che causa l'errore. Che voi sappiate la funzione map può causare problemi di questo genere? perchè sembra essere l'unica funzione che compare solo in questa parte di codice e non nelle altre.

Ora sono in vacanza 2 settimane e provo un po a vedere che succede.

Buona serata Pro

Ciao,
innanzitutto buon natale e buone feste a tutti. Mi è venuta un idea ma volevo consultarono prima con voi. :slight_smile: è accertato che l errore compare solo dopo la seconda esecuzione del codice, quindi, anche a costo di essere un po' grezzo e brutale, potrei usare il watchdog per reset tare la scheda riavviando la macchina così che non entra in errore?

Buone feste,

Pro

il WD è uno strumento potente ma anche pericoloso; visto che hai identificato nel software il problema non capisco perché tu non debba cercare di risolvere il problema software; ci vuole un po' di pazienza, ma secondo me devi semplificare al massimo le funzioni al passaggio e poi implementarle nuovamente in modo sequenziale così capisci dove sta il problema.

Tu usi una funzione leggiseriale() per leggere il valore da assegnare alla variabile spia.
Ma tale funzione come comunica? Sulla seriale normale? Come? Wireless?
Perché vedo anche che tu usi la seriale come debug. Non è che forse si danno noia le due trasmissioni? Hai provato a togliere tutti gli if ed i while ed a mandare il robot solo in modalità manuale?

Il fatto è che non so più dove guardare: da quello che vedo io non c'è niente che possa fare interferenza :S non so veramente più cosa fare. Comunque oggi provo di nuovo a eliminare la parte del codice che fa interferenza e aggiungere mano a mano le funzioni :slight_smile: . Avevo pensato al WD come possibile soluzione ma se mi dici così, eviterò di usarlo
Per la seriale: la serial3 comunica usando un xbee serie 1, mentre la serial usa la normale USB leggiseriale legge i dati dall' xBee (s3). Avevo pensato alla possibilità che creassero problemi ma non ho pensato a togliere quella di debug. In ogni caso entrambe le modalità funzionano ( sempre, l unico problema è che il servo è immobile) :slight_smile:

Scusa, ma dici di usare 2 seriali. Se usi un Arduino Diecimila con Atmega168, la seriale hardware è una sola, per cui l'altra dev'essere sicuramente di tipo software.
Ora, che tipo di seriale software usi? Se usi una vecchia versione, essa è bloccante in ricezione. Forse i problemi potrebbero nascere da questo.

Inoltre, l'Atmega168 ha 1024 byte di memoria. Potrebbe essere che hai esaurito la Ram libera? Hai fatto un controllo per verificare l'occupazione di memoria del tuo sketch?

Il problema è sulla scheda della macchina: una arduino MEGA2560 R3. Comunque sull'altra scheda uso una porta software fatta con softwareserial. A proposito dell errore della macchina: ho isolato il problema: sembra proprio essere causato dalla funzione map()ho cancellato tutto il codice e mantenendo ogni pezzo singolarmente l unico che sembra dare errore è quello di map nella parte di codice con spia==1

propilot01:
Il problema è sulla scheda della macchina: una arduino MEGA2560 R3.

Avevo capito l'inverso, che cioè sulla macchina ci fosse la Diecimila.

Comunque sull'altra scheda uso una porta software fatta con softwareserial. A proposito dell errore della macchina: ho isolato il problema: sembra proprio essere causato dalla funzione map()ho cancellato tutto il codice e mantenendo ogni pezzo singolarmente l unico che sembra dare errore è quello di map nella parte di codice con spia==1

Prova ad usare una variabile tampone invece che assegnare il risultato di map alla stessa variabile che passi alla funzione.
Potrebbe essere un problema di valori fuori range? Sei certo delle conversioni che effettui, che non ti portino ad avere situazioni in cui il servo non si muove perché il codice dice di non muoverlo?

Effettivamente potrebbe essere un ottima idea quella di usare un altra variabile, e per la variabile fuori range ho usato un if con la condizione che il numero preso in considerazione sia nel range corretto. Il problema maggiore rimane nel fatto che il servo si muove in base a un numero pre impostato e non in base a una variabile (uso servo.write(45) e non p.es servo.write(variabile) ). Ciò che mietete più in crisi è che la funzione che crea problemi non tocca minimamente il servo, e oltretutto se provo a muoversi manualmente non si sposta, indicando il fatto che è attivo :slight_smile:

lato "servo" non posso aiutarti, non ho mai usato dei servo e quindi non so come si pilotino con l'Arduino.
Sul resto ti consiglio di fare delle prove.
Anche mettere un po' di Serial.print di debug non è male, per stampare i vari punti del programma dove passa l'elaborazione ed i valori delle variabili per capire che strada prende il flusso del programma.

Buondì :slight_smile:
Ho lavorato ancora un po' al problema. Ho eliminato la funzione map che creava problemi semplificando un po' il codice e ho provato anche ad usare un altro servomotore. Ora il problema non sorge più passando da una modalità all altra ma salta fuori semplicemente dopo un po' di tempo, senza che eventi particolari avvengano nel frattempo. Da quel che avevo visto il flusso sembra seguire il corso giusto e non si blocca mai. Mi domando se non sia un qualche problema della scheda, magari è rotta :S

p.s arduino ha il multitasking?

Buona giornata,

Pro

Hai dato un'occhiata al LeOS?

Da quello che ho letto, sembra un problema di memoria non correttamente gestita, tipo scrittura fuori indice di un array.
Controlla se l'hai fatta fuori dal vaso. :smiley:

Ciao.

Ciao, grazie a tutti per le risposte, leOS è alquanto interessante, penso che lo userò presto. In merito al vasino...la stavo facendo fuori alla grande, ora capisco anche che parte del codice causava il problema :slight_smile: se il pacchetto dati non aveva il delimitatore finale si attaccava a quello seguente e io finivo per mettere 8 dati in un array da 4 :slight_smile: ho fatto un po' di modifiche e per ora sembra andare tutto bene :slight_smile: grazie mille ancora a tutti!!!

Buona giornata,

Pro