Salve a tutti,
sono nuovo del forum e colgo l'occasione per congratularmi con tutti voi del lavoro e passione che mettete in questo "mondo" che ho da poco scoperto e che voglio imparare...
Sono alle prese con la realizzazione di un rasaerba e voglio controllarlo con Arduino.
Volevo partire da zero e trascrivere passo passo tutti i progressi e di poter avere un contributo "intelletivo" alla realizzazione.
Mi sono documentato in maniera sufficente su cosa circola su internet e youtube ma credo che ci sia una sorta di "secretazione" di certi accorgimenti come fossero segreti di stato...
Allora con tanta passione e determinazione del tipo "chi fa da se fa per tre" mi sono procurato Arduino un paio di settimane fa e ci ho giocato con potenziometri,resistenze e servocomandi ecc ecc... Ora si fa sul serio!!! ]
Partiamo dal primo problema: motore elettrico che taglia l'erba!
Soluzione: un bel brushless con la sua bella ESC dedicata, portalame tornito con supporto per le lame da cutter (in fase di realizzazione...)
Per controllare la ESC nessun problema con la libreria Servo il motore gira che è uno spettacolo... il problema più grosso è armare l'ESC in automatico una sola volta all'accensione o eventualmente richiamandola se ce ne fosse bisogno.
Per armare l'ESC ho creato un ciclo for da 0 a max e viceversa, con un if (condizione) seguito da break sono uscito dal for e con analogWrite impostato il valore a cui volevo il motore girasse. Ora il problema è che sul ciclo loop questo viene ripetuto ciclicamente!
Nella realtà l'ESC si arma il motore gira ma poi si ferma perchè riparte il ciclo fin tanto che non arriva l'ultima riga dove si rimette a girare perchè l'ESC è gia armata per il delay che ho messo e poi si ferma e sempre cosi...
Come posso fare ad armare l'ESC una sola volta e poi far partire il motore a regime?
Questo e il codice che al momento avevo scritto:
Esattamente non ho capito che problema hai, se lo spieghi meglio ci si può lavorare su.
Per adesso ho notato:
1)Il ciclo for più esterno è inutile con quel settaggio perchè esegue il suo codice una sola volta. Se poi a lo incrementi più volte ti consiglierei di mettere una variabile o una costante all'inizio.
2)le variabili contatore dei cicli for è meglio dichiararle nel for stesso e usare ++ visto che è più bello :).
for(int a=0;a<max;a++)
Per comandare il controllo del motore forse ti conviene usare un micro dedicato a cui deleghi la gestione delle lame così non hai problemi di temporizzazioni. Basta un bell'enable e lui fa il suo sporco lavoro.
che motore hai preventivato? il mio con brushless da 1300W ce la fa a malapena.. dovessi comprarlo di nuovo lo prenderei minimo da 1700 in su. devi poi ridurre il numero di giri.
comandare l'esc è il meno, lo comandi come un servo. L'avvio è un po' problematico da rendere automatico bisogna trovare una rampa adeguata per permettergli di "prendere i giri" essendo sensorless.
pensato a come ridurre i giri? la lama che gira a 20000giri è alquanto spaventosa oltre al fatto che non ce la farà mai a tirarla. per il mio ho messo un 1:6 che me lo porta a 3000giri, velocità alla massima potenza di molti taglia erba
...ok forse ho dato per scontato alcune cosette
allora l'ESC per pilotare il brushless ha bisogno di essere armata per far partire il motore.
Per armarla bisogna dare un impulso dello stick motore e riportarlo a zero, l'ESC compie i suoi controlli (questione di 2 secondi) e poi si puo dare gas; questo nel modellismo con la radio e la ricevente!
Con Arduino devo ricreare questa situazione per far partire il motore cioè:
collego il pacco batterie all'ESC che tramite il BEC mi alimenta a 5V anche Arduino
Arduino tramite il PPM al pin 9 dovrebbe partire da 0 arrivare a 180 e ritornare a 0 (tipo "impulso")
attendere 2 secondi (a questo punto l'ESC risulta armata)
riportare il pin 9 a 180 per far girare il motore
Il problema è che la procedura per armare l'ESC deve essere fatta una volta sola all'avvio del codice e non in modo ciclico.
Infatti quel primo ciclo for era stato scritto proprio per eseguire una sola volta i cicli for all'interno, quando si verificava la condizione di if==1si saltava con break
garinus:
che motore hai preventivato? il mio con brushless da 1300W ce la fa a malapena.. dovessi comprarlo di nuovo lo prenderei minimo da 1700 in su. devi poi ridurre il numero di giri.
comandare l'esc è il meno, lo comandi come un servo. L'avvio è un po' problematico da rendere automatico bisogna trovare una rampa adeguata per permettergli di "prendere i giri" essendo sensorless.
pensato a come ridurre i giri? la lama che gira a 20000giri è alquanto spaventosa oltre al fatto che non ce la farà mai a tirarla. per il mio ho messo un 1:6 che me lo porta a 3000giri, velocità alla massima potenza di molti taglia erba
io ne ho uno da 450W ma la mia realizzazione vuole essere per un praticello di 40 mq
mi sto facendo tornire il portalame con il supporto per le lame da cutter...
io ho scaricato alcuni pdf di alcuni modelli in commercio e alcuni sulle caratteristiche riportavano motori brushless da 150W!
Con 1300W dovresti estirpare l'erba non tagliarla
poi dipende da quanta è alta l'erba che vuoi tagliare in un colpo solo
Se per armare l'ESC devi eseguire una volta sola i primi 3 passaggi che hai elencato e se sono proprio i primi tre in assoluto (ossia non devi fare nient'altro prima di questi), ti basta mettere i passaggi nel setup, togliendoli dal loop.
Un banale esempio: quando usi un display LCD esso va inizializzato una sola volta all'inizio e poi tutto il resto diventa ripetitivo sulla base di ciò che deve fare il software; bene, l'inizializazione dell'LCD si mette in setup, che viene eseguito una sola volta, tutto il resto in loop.
Esatto. Se poi per qualche ragione hai bisogno di reinizilizzare l'aggeggio è meglio mettere le istruzioni in una procedura così le richiami dove vuoi con facilità. La procedura/funzione va scritta allo stesso livello del setup() e del loop() cioè fuori da essi,dove metti le costanti per intenderci.
lama da 44, puleggia per ridurre la velocità a or non a cinghia trapezoidale(troppi attriti)
1300 watt con un'erba buona (inteso come densità) fatica. il motore che montano su un taglia erba con lama da 44 non un tagliaerba da supermercato si aggira sui 2kW 2,5kW..
...avevo pensato a una lama un po più piccola tipo 30cm... meglio un giro in più per il giardino e tagliare un pò meno e più spesso...così risparmio anche un po più la batteria perchè voglio riuscire ad ottimizzare anche i consumi il più possibile!!!
una curiosità che batteria/e usi?
Comunque perchè mi da errore sulla compilazione sullo sketch di prima????
....ecco dopo svariate prove con la mia ESC ho trovato lo sketch giusto prima arma l'ESC poi torna a riposo e poi riparte la rampa per poi mantenere il valore costante tramite il loop XD!!! Funziona!!
Devo fare 2 precisazioni sull'argomento ESC:
ho letto vari forum sull'argomento ESC e diciamo che quasi tutti concordano sul fatto che si comanda con un segnale PPM... io ho fatto ripetute prove con la mia e funziona con l'uno e con l'altro segnale in maniera pressochè simile con una sostanziale differenza: l'ESC che possiedo ha dei parametri programmabili tramite il controllo dello stick del motore (questo nel modellismo...) tipo il modo di avvio del motore, i giri massimi, la frequenza di lavoro ecc... e simulando lo stick del radiocomando con un potenziometro e relativo sketch ho provato a programmarla con un segnale PPM e niente da fare mentre con il segnale PWM la programmo senza problemi. Posso dedurre che la mia funziona meglio con un segnale PWM.
2)lo sketch che ho postato funziona benissimo per la mia ma è frutto di prove specifiche e vari tentativi e non credo possa diventare universale per tutte le ESC bisognerebbe provare con qualche altra ESC se qualcuno avesse voglia di provare....
int brush = 9;
void setup() {
Serial.begin(9600);
pinMode (9, OUTPUT);
for ( int a=0; a<1; a++ ) { //ciclo for per ripetere una sola volta i cicli for successivi
for ( int i=0;i<140;i++){ //ciclo for per fare la prima rampa e armare l'ESC
analogWrite (brush , i);
delay(20);
}
for(int i=140;i>=1;i--){ //ciclo for per riportare a 0 la rampa
analogWrite(brush , i);
delay(20);
}
if(a==1){
break;}
}
delay(2000); //attesa di 2 sec perchè l'ESC si inizializzi
for ( int i=0;i<185;i++){ // ciclo for per far partire il motore
analogWrite (brush , i);
delay(5);
}
}
void loop() {
analogWrite(brush , 185); //livello motore desiderato
}
...primo problema risolto!!!
Adesso ordino l'Arduino motor shield per comandare i motori di traino e poi implementiamo il programma....
...ma il mio vuole essere un progetto passo passo e questo dell'ESC non era un problema fine a se stesso chiedo gentilmente perchè dovrei mettere RISOLTO? in realtà si che è risolto ma in parte anche perchè ho appena cominciato