In realtà il primo modo a cui avevo pensato per implementare la decelerazione era molto più semplice, con u semplice contatore contavo i passi a ritroso e ad ogni passo incrementavo il valore del ritardo di una certa quantità settabile tramite il potenziometro....però in quel modo non sapevo come fare a calcolare il valore della decelerazione visto che la durata di ciascun passo va variando e quindi la decelerazione non era costante in quel caso...
non ho capito dove detrai (anzi aumenti) il downdelaytime... da un'analisi spannometrica lo lasci a 2....ma sicuramente sono io distratto.
un'altra cosa... e spero qua di non sputtanarmi ma mi pare che è così... vedo che fai operazioni abbastanza complesse tra double e long o int... (tra cui un 1/updelaytime)... mi risulta che lui fin che non serve convertire non converte quindi se hai
double = (1/intero)
...il risultato sarebbe una gran delusione per te...
meglio che fai cose del tipo d= (double) 1 /intero;
a me andava il motore in fischio quando perdeva il passo (picco di accellerazione o decellerazione) e si ritrovava quindi spaesato a fare cose che non può più fare... bloccato. Quando succede prova a dargli dei colpetti e vedi se riparte: di solito riparte e se no bisogna scendere a 0 di velocità e ripartire.
il downdelaytime è fisso perchè non mi serve variare la velocità di discesa della slitta, quello che varia è l'updelaytime: tramite l'istruzione
#upDelayTime = map(speedReadPin, 0, 1024, 10000, 100000);#
setto un suo valore iniziale che poi posso fare variare nel tempo tramite un altro potenziometro che gestisce la decelerazione: ogni 100 ms il suo valore viene incrementato di una quantità pari a ritardo che può andare da 0 a 1 ms:
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}#
updelaytime l'ho definito come double, per cui 1/updelaytime dovrebbe essere un double no?
Ma perchè non mi evidenzia mai il codice, cosa sbaglio?!?
Non devi inserire il carattere # da tastiera, ma premere il pulsante # che si trova sopra la faccina ammiccante. ![]()
Alla pressione del pulsante escono i tag (code). Il codice lo devi scrivere tra i due tag.
Volendo puoi anche modificare tutti i tuoi interventi precedenti premendo modify, selezionando il codice e premendi il pulsante #, sopra le faccine.
Poi salvi le modifiche.
quello che intendo dire è che se tu dividi due interi ottieni un intero... che poi tu voglia mettere questo risultato in un double sono affari tuoi ma lui mette dentro interi... prova... metti qualche serial.print e poi mi sai dire perchè io ho penso il peggior simulatore del pianeta ed il leonardo non ce l'ho mai sotto mano.
quindi
se i = 2 e fai d = 1/d non hai d = 0.5 ma... 0... perchè lui prima fa una divisione tra interi con risultato appunto 0 e poi il risultato lo sposta su d... ecco ora l'ho spiegato meglio: spero di non aver detto una cazzata ma mi pare di no.
no no, è chiarissimo quello che hai detto, ma nel mio caso a denominatore non ho un intero ma un double per come l'ho definito io...infatti la prima versione del programma funziona..è nella seconda che c'è qualche problema che non riesco ad individuare...forse è la funzione delayMilliseconds a dare qualche problema non capisco...eppure l'ho ottenuta con delle semplici conversioni direttamente dalla prima, non riesco a capire dove sta il problema...
leandro78:
no no, è chiarissimo quello che hai detto, ma nel mio caso a denominatore non ho un intero ma un double per come l'ho definito io...infatti la prima versione del programma funziona..è nella seconda che c'è qualche problema che non riesco ad individuare...forse è la funzione delayMilliseconds a dare qualche problema non capisco...eppure l'ho ottenuta con delle semplici conversioni direttamente dalla prima, non riesco a capire dove sta il problema...
ahh si hai ragione... ho fatto confusione.
ma perchè il SALI aumenta il ritardo? Non dovrebbe andare in accellerazione e quindi diminuire i tempi morti?
altra cosa... vedo currentMillis ma tu stai lavorando con i micros.... non ti conviene mettere i micros anche in questo test?
...comunque vedo che tieni alti gli intervalli a 100 millisecondi quindi non dovrebbe essere questo che ti infastidisce.... può succedere che il tuo upDelayTime superi in qualche modo i 100.000 microsecondi e pertanto ti ritrovi ad ogni step già a dover aggiornare?
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
upDelayTime += ritardo;
}
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delayMicroseconds(upDelayTime);
...un'altra cosa io non capisco come ti funziona la funzione di discesa... per me la tua procedura dovrebbe tenere una velocità costante con delay 2 e poi improvvisamente bloccarsi quando hai superato i 150(?) cicli.
PaoloP:
Ma hai collegato il motore direttamente ai pin di Arduino o stai usando un driver?Qui trovi le librerie del modulo di Adafruit (http://www.robot-italy.com/it/adafruit-motor-stepper-servo-shield-for-arduino-kit-v1-0.html) --> Arduino motor/stepper/servo control - Downloads
C'è anche una libreria specifica per far accelerare e decelerare lo stepper.
Hai provato questa libreria?
Doc --> AccelStepper: AccelStepper library for Arduino
Code --> GitHub - adafruit/AccelStepper: A small fork of AccelStepper v1.3 with AF_motor (Adafruit motor shield) support!
Zip --> http://www.open.com.au/mikem/arduino/AccelStepper/AccelStepper-1.27.zip
ciao, io vorrei che grazie alla funzione millis() e dopo aver ricevuto il mio comando tramite easyvr shield 2.0, i motori del mio robottino si fermassero. qualche idea?
Username8:
ciao, io vorrei che grazie alla funzione millis() e dopo aver ricevuto il mio comando tramite easyvr shield 2.0, i motori del mio robottino si fermassero. qualche idea?
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
grazie ma l'avevo gia fatto sul mio vecchio account quindi mi scocciava ripresentarmi
comunque ho conoscenze abbastanza elevate in programmazzione e elettronica