Aiuto per compilare uno sketch per Arduino

Mamo

Donatore generoso
#81
a dire il vero la "memoria" non funziona, ogni volta devo reimpostare tutto…da menu lcd. Proverò comunque come mi hai scritto
Perchè quando hai modificato la funzione LeggiConfigurazione() hai cancellato la riga che legge i dati dalla eprom
eeprom_read_block((void*)&settings, (void*)0, sizeof(settings));
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)
Che per i motori a CC si traduce in tempo. Il numero di riga lo vedi in basso a sinistra.
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.
Guarda che stai usando motori CC che non puoi paragonare ai motori passo passo.
A seconda del carico, i motori CC si comportano in modo diverso. Se hai il motore che non è dimensionato correttamente per le tue inerzie/masse, quello che tari a vuoto potrebbe poi non coincidere con quello che avrai una volta che ci piazzi la macchina e relativo obiettivo.
 
#82
Hai ragione quando dici che i motori "si traduce in tempo" .. ma in pratica a me serve il controllo del movimento..che ho chiamato step per comodità. ( so dei motori pp, ho realizzato già un controller)

Ritornando alle prove effettuate come da tuoi consigli..la memoria continua ancora ad essere senza ricordo(?)Adesso così come è impostato lo sketch, i motori girano, ma.. mentre la A lo controllo da menu, la B (il Pano) si muove dopo la A ma per i fatti suoi.
Da menu il MovimentoPano ( sul display) sulle voci "
MovimentoPan..DirezionePan..AttesaPan" rimane scritto sotto alla riga "1000" cosa che non ho impostato e che non so da dove esce fuori e i comandi non rispondono.



 

Mamo

Donatore generoso
#83
Non ti offendere, ma mi sa che non sei molto pratico di programmazione :)
la riga
eeprom_read_block((void*)&settings, (void*)0, sizeof(settings));
la devi mettere all'inizio della funzione leggiconfigurazione.
Probabilmente l'hai messa alla fine, dopo che hai impostato i valori non ancora inizializzati.
Per il fatto che il Pan si muove solo dopo aver fatto il movimento A è normale e giusto per come hai fatto il programma:
Ti spiego brevemente:
analogWrite( pinPwmA,255 );//qua gli dici al motore A di partire
delay(Movimento);//qua gli dici di continuare per il tempo indicato da "movimento"
analogWrite( pinPwmA,0 );//qua gli dici di fermarsi
analogWrite( pinPwmB,255 );//qua gli dici al motore B di partire
delay(MovimentoPan);//gli dici di andare per un tot di tempo
analogWrite( pinPwmB,0 );//e poi fermarsi

Se vuoi farli andare contemporaneamente devi fare in questo modo
Per prima cosa ti devi calcolare la durata massima tra i due movimenti
Questo perchè devi suddividere la pausa in due momenti
Il primo dove andranno tutti e due i motori e il secondo dove ne andrà uno solo.
long pausa2=0;
long pausa1=MovimentoPan; // iniziamo con impostare pausa1
if (Movimento>MovimentoPan)
{
pausa2 = Movimento - MovimentoPan;
}
else
{
pausa1 = Movimento;
pausa2 = MovimentoPan - Movimento;
}
//ora facciamo partire i motori
analogWrite( pinPwmA,255 );//qua gli dici al motore A di partire
analogWrite( pinPwmB,255 );//qua gli dici al motore B di partire
delay(pausa1);//gli diciamo di andare per un tot di tempo
if (Movimento>MovimentoPan)//poichè Movimento è maggiore di MovimentoPan allora fermiamo il pan
{
analogWrite( pinPwmB,0 );//fermiamo il pan
delay(pausa2); // aspettiamo la differenza tra le durate dei due movimenti
analogWrite( pinPwmA,0 );//e fermiamo il motore A
}
else//altrimenti se il movimento del pan è maggiore del movimento
{
analogWrite( pinPwmA,0 );//fermiamo il motore A
delay(pausa2); // aspettiamo la differenza tra le durate dei due movimenti
analogWrite( pinPwmB,0 );//fermiamo il pan
}


Ciao
 
Ultima modifica:
#84
hahaha....tranquillo nessuna offesa, avevo già scritto che non sono bravo e che ho bisogno sempre dei tuoi consigli..
però fai paura!!! senza vedere lo sketch hai capito dove ho sbagliato:D . Pensa che ho comprato un paio di libri sulla programmazione "Arduino" e provo a studiare con interesse…ma è dura capire concetti "arduiniani"…..

ma.. un dubbio..su quale riga devo impostare ( long pausa2…ecc), dopo la riga 194 ?
e mettendo queste nuove impostazioni i comandi per MovimentoPan funzioneranno?



Nel pomeriggio provo con le tue nuove dritte:happy: Grazie ancora


Ciao
 
Ultima modifica:

Mamo

Donatore generoso
#85
però fai paura!!! senza vedere lo sketch hai capito dove ho sbagliato:D . Pensa che ho comprato un paio di libri sulla programmazione "Arduino" e provo a studiare con interesse…ma è dura capire concetti "arduiniani"…..
Beh la programmazione di Arduino è semplice. E' in pratica una forma ridotta del C++.
Ma anche senza saper programmare si poteva intuire dove era l'errore. E' questione di logica:
Se io voglio impostare una variabile con un valore precedentemente salvato, per logica devo prima recuperare il valore e poi impostare la variabile.
Mettendo quella riga alla fine, tu prima imposti la variabile con un valore a caso perchè non avevi ancora caricato il valore e poi carichi il valore ma non lo imposti.
Per questo, anche se c'era la riga, in pratica è come se non ci fosse, e il risultato non cambiava.
ma.. un dubbio..su quale riga devo impostare ( long pausa2…ecc), dopo la riga 194 ?
Devi sostituire le righe
analogWrite( pinPwmA,255 );
etc... fino a
analogWrite( pinPwmB,0 );

con la parte di listato che ti ho indicato
e mettendo queste nuove impostazioni i comandi per MovimentoPan funzioneranno?
Il funzionamento dovrebbe dipendere dalla impostazione iniziale delle variabili che fai se metti la lettura della eprom all'inizio e non alla fine.

Ciao
 
#86
Ciao Mamo, mi devi credere due giorni a controllare,:( ma i comandi (i bottoni A0 A1 e A2 ) sono impazziti, non rispondono come dovrebbero e vanno velocissimi ( appena tocchi il bottone) e in più i comandi per il MovimentoPan/DirezionePan/AttesaPan non vanno.
ho allegato lo sketch come ultima modifica…. non ci capisco più niente.:banghead:
quasi, quasi mi compro un nuovo controller!!!
 

Allegati

#87
aggiornamento: ..non pensare che non "studio"…
Ho risolto il problema dei comandi sullo sketch..ora i motori rispondono come da impostazione menu Lcd.:)
Quello che non capisco ancora..quando premo i bottoni il testo cambia velocissimo ..sembra.. ad un tocco leggerissimo che salta di due menu alla volta!!!
..mbhe!! continuerò ancora a leggere sui libri..intanto voglio augurarti buone feste e auguri di Buon Natale..un saluto
 

Mamo

Donatore generoso
#88
Ti posto un esempio :
All'inizio del programma crea tante variabili quanti sono i bottoni che devi controllare:
int UltimoStatoBottoneSX=0;
unsigned long TempoBottoneSX=0;
e una variabile comune per tutti i bottoni
unsigned long RitardoFiltraggio = 50; // Ritardo per filtraggio di falsi contatti. Se è il caso aumentarlo


poi all'interno della funzione loop:
int LetturaBottoneSX = digitalRead(MettiQuiilPinDeTuoBottone); // Leggo lo stato del bottone
if (LetturaBottoneSX != UltimoStatoBottoneSX) TempoBottoneSX = millis();// Se è cambiato memorizzo quando c'è stato il cambiamento di stato
if ((millis() - TempoBottoneSX) > RitardoFiltraggio && LetturaBottoneSX==HIGH)
{
//qui metti le funzioni che devi eseguire quando il bottone viene premuto
}
UltimoStatoBottoneSX = LetturaBottoneSX;
 
Ultima modifica:

Sameh

Time-Lapser Novizio
#89
Salve ,ho appena iniziato a studiare arduino perché vorrei fare un progetto di un braccio meccanico, ho imparato come si fa a controllare motori a corrente continua, ma vorrei fare un menu e visualizzarlo su lcd keypad.mi potete aiutare. Grazie
 

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