Aiuto per compilare uno sketch per Arduino

#71
Buonasera, Mamo, dopo tanto tempo mi faccio risentire di nuovo in questa discussione per un nuovo progetto modificando il vecchio schetch (prova 10). In pratica ho modificato il programma per controllare due motoriduttori cc, (sicuramente avrai già capito di cosa parlo)uno per il movimento lineare e l'altro per il movimento pano. Ho utilizzato il motorshieldFE perchè può controllare separatamente i due motori.
Dopo molti tentativi, sono arrivato ad un punto fermo. Non riesco a scrivere in maniera corretta sullo scheth le funzioni di comando ( movimento..attesa...direzione) del secondo motore che vorrei gestire sul display( Lcd) , anche se da "Arduino" facendo "verifica" va bene.
Ti prego.. se vuoi, di dare un occhiata allo schema( che allego) che ho ampliato e farmi capire dove sbaglio. (la programazzione non fà per me)
Grazie per la gentilezza.
Saverio
 

Allegati

Mamo

Donatore generoso
#72
Ciao Saverio,
Esattamente cosa non funziona?
Non avendo la tua configurazione hardware non posso provare e quindi non riesco a capire.
Lo sketch sembra corretto.
Che Arduino hai?
Hai verificato se i piedini usati hanno la possibilità del PWM?
Sicuro che lo shield non utilizzi qualche pin?
 
#73
Ciao Mamo,
incomincio con descriverti l'hardware : Arduino Uno e il driver MotorShield FE ( può lavorare con due motori cc o con uno stepper fino a 2A) Allego foto
Il motorshieldFE ha due controlli Pwm e cioè ( vedi foto) Pwm A e Pwm B insieme alle relative Dir ( DirA e DIrB) e va collegato a cascata su Arduino.
Ho sistemato un controller con Lcd (classico 2 righe) e tre inter. del tipo normalmente aperto. Cambio pagina, (A0) più (A1) meno (A2) che gestiscono le funzioni per il movimento dei due motori.
Quello che non funziona da controller è il motore B... anche se vedo il testo sull'Lcd. Forse è meglio che ti preparo un piccolo video. Per domani ti posto la clip.


..Sicuro che lo shield non utilizzi qualche pin?.. Questa domanda non l'ho capito
I pin di Arduino li ho quasi utilizzati tutti, rimane solo il "10"

Ti allego una configurazione base di prova dello Shield per due motori cc..da qui ho avuto lo spunto per questo nuovo progetto. A domani per la clip
 

Allegati

Mamo

Donatore generoso
#74
Nello sketch, non vedo come inizializzi le variabili.
Quanto vale movb?
Prova momentaneamente a cambiare la riga del delay(movb) e mettere un valore 10.
Altra prova che farei, e invertire i motori per verificare il loro funzionamento.
Altra prova, inverti i pin pwma e pwmb così verifichi se dipende dalla scheda o dal programma.
Con lo sketch di prova (a proposito, la prossima volta avverti che lo hai zippato e poi hai cambiato l'estensione, se no è un po' dura aprirlo) i motori funzionano?
 
#75
Va bene, faccio le prove e poi ti aggiorno.
Con lo sketch di prova i motori funzionano secondo lo schema, e vanno bene.
:(Sicuramente ho commesso errori su come inizializzare le variabili (non so come fare). Intanto al prossimo aggiornamento ( come ti avevo detto) ti posto uno schema elettrico del controller e una clip di dimostrazione.
Un saluto....

:D per il testo zippato è l'unica soluzione da Mac. Ho fatto diverse prove, la prossima volta provo direttamente con estensione di arduino..
 
Ultima modifica:
#76
Ciao Mamo, intanto ti allego lo sketch modificato.In questo schema funziona solo l'uscita motorA e molto probabilmente il motor B non va perchè la sua variabile non comanda.Se leggi le righe dello schema dopo le funzioni di comando del MotA (movimento..direz..attesa.ecc) ci sono i comandi per Motor B (movB..direzB..attesaPan..ecc) che si leggono sull'lcd ma in pratica non si avvia il comando.

La cosa strana è che il comando per la direzione "1" (MotorA) funziona mentre si blocca se imposto la direzione "1" e sono convinto che il problema si trova nello schema.
Tu che ne pensi?
Grazie
 

Allegati

Mamo

Donatore generoso
#77
Hai provato a cambiare la pausa come ti avevo detto?
Alla riga 195 al posto di delay(Movimento); metti delay(300);
Stessa cosa alla riga 200
delay(MovimentoPan); falla diventare delay(300);
Con queste modifiche verifichi se dipende dalla inizializzazione delle variabili
Per il discorso che funziona solo se direzione è 1 dipende da come hai scritto il programma:
Ovviamente se i movimenti li metti dentro la condizione if (direzione) è giusto che vengano eseguite solo se quella condizione è vera
Dentro la condizione if (direzione) devi mettere solo le istruzioni per il cambio della direzione
Questa parte:
if (Direzione)
{
digitalWrite( pinDirA,HIGH ); //rotazione dei motori
digitalWrite( pinDirB,HIGH );

analogWrite( pinPwmA,255 );
delay(Movimento);
analogWrite( pinPwmA,0 );


analogWrite( pinPwmB,255 );
delay(MovimentoPan);
analogWrite( pinPwmB,0 );
}


deve diventare:
if (Direzione)
{
digitalWrite( pinDirA,HIGH ); //rotazione dei motori
digitalWrite( pinDirB,HIGH );
}
else
{

digitalWrite( pinDirA,LOW ); //rotazione dei motori
digitalWrite( pinDirB,LOW );

}

analogWrite( pinPwmA,255 );

delay(300);
analogWrite( pinPwmA,0 );

analogWrite( pinPwmB,255 );
delay(
300);
analogWrite( pinPwmB,0 );


Notare che la parentesi graffa, qui sopra è stata tolta
 
#78
Bene!! ho fatto le prove come tu mi hai indicato..e tutto funziona a meraviglia (ambedue i canali)..in pratica nello schema non ho inserito..
digitalWrite( pinDirA,LOW ); //rotazione dei motori
digitalWrite( pinDirB,LOW );

Adesso ..rimettendo

delay(Movimento); e.. delay(MovimentoPan);
riesco a controllare dal lcd solo il canale A, mentre il B è fermo. Questo significa che non sono inizializzate le variabili per il controllo MovimentoPan (canale B)
Ma a me pare tutto corretto…ma se non va!!!!!! questo significa che c'è qualcosa che non va!!!!!!
Voglio studiare.



 

Mamo

Donatore generoso
#79
Bene!! ho fatto le prove come tu mi hai indicato..e tutto funziona a meraviglia (ambedue i canali)..in pratica nello schema non ho inserito..
digitalWrite( pinDirA,LOW ); //rotazione dei motori
digitalWrite( pinDirB,LOW );

Questa parte la devi correggere come ti ho suggerito, altrimenti i motori gireranno sempre in un solo verso
Adesso ..rimettendo
delay(Movimento); e.. delay(MovimentoPan);
riesco a controllare dal lcd solo il canale A, mentre il B è fermo. Questo significa che non sono inizializzate le variabili per il controllo MovimentoPan (canale B)
Ma a me pare tutto corretto…ma se non va!!!!!! questo significa che c'è qualcosa che non va!!!!!!
Voglio studiare.
In pratica hai memorizzato nella eeprom un valore strano, che ad ogni accensione viene impostato.
Puoi procedere in questo modo
Dopo la riga LeggiConfigurazione (riga 129 circa), imposta nuovamente i due valori:
Movimento = 300;
MovimentoPan = 300;
Aggiungi anche
SalvaConfigurazione();

Fai l'upload e fai girare almeno una volta il programma, in questo modo sovrascrivi i valori nella eeprom.
Fatto questo, puoi cancellare le righe appena aggiunte.

In LeggiConfigurazione, modifica i valori di controllo, abbassando i valori limite e mettendo come valore di default, valori realistici
Per esempio:
if (Movimento>30000) Movimento=5000;
vuol dire che se hai inserito una durata del movimento maggiore di 30 secondi allora imposti un valore di 5 secondi.
Non conosco il tuo scopo, ma considerando che fai incrementare il valore di 10 ms al secondo, per incrementare il tempo di un secondo, devi premere 100 volte e per arrivare al limite di 30 secondi 3000 volte, non mi sembra realistico.
 
#80
a dire il vero la "memoria" non funziona, ogni volta devo reimpostare tutto…da menu lcd. Proverò comunque come mi hai scritto

…..
if (Movimento>30000) Movimento=5000;
vuol dire che se hai inserito una durata del movimento maggiore di 30 secondi allora imposti un valore di 5 secondi.

Non conosco il tuo scopo, ma considerando che fai incrementare il valore di 10 ms al secondo, per incrementare il tempo di un secondo, devi premere 100 volte e per arrivare al limite di 30 secondi 3000 volte, non mi sembra realistico.
…..

Lo scopo è gestire i motori non sul tempo ma sul movimento in mm o in cm sulla guida. Leggendo lo schema ( a proposito come fai a leggere le righe..a me no si vedono)

.. case 2:{Movimento=Movimento+10;}break;….

il movimento ( in questo caso motoreA) viene incrementato di +/- 10 ( 10 step da menu lcd) che corrisponde a circa ( ho misurato sulla guida) ad 1mm. Quindi
100 step= 1cm però devi anche considerare il rapporto del motoriduttore che usi.

Ciao
 

chi siamo

Time Lapse Italia è la community italiana dedicata alla fotografia time-lapse.

Impara la tecnica, condividi le tue esperienze e migliorati guardando i video più belli... gratuitamente ed in italiano!

© 2013-18 Time Lapse Italia - Creato da Marco Famà

invia il tuo video

Segui BENE tutte le istruzioni disponibili in questo breve tutorial e raggiungi la home-page di Time Lapse Italia
Alto