Salve a tutti,sono un nuovo utente di questo forum,nei giorni scorsi ho avuto a che fare con un carrello movimentato da un normale motorino DC 5V,per far fermare il carrello in una posizione esatta ho utilizzato un finecorsa o contatto meccanico come quelli presenti nei lettori CD,da software il carrello si ferma regolarmente ma quando vado a dargli il comando per farlo ripartire rimane fermo perennemente,perche' il finecorsa rimane premuto.qualcuno puo' aiutarmi?
grazie e buona giornata.
devi fornire sketch e schema
e' un programma complesso,ecco la parte interessata:
motor[motorId] -> start(forward, power); // fa partire il programma
encoder[encoderId] -> countCycles(cycles, timeout); l'encoder ottico conta i cicli
motor[motorId] -> start(forward, power); // fa partire il programma
encoder[encoderId] -> countCycles(cycles, timeout); //l'encoder ottico conta i cicli
motor[motorId] -> stop();
if (digitalRead(switchPin) == LOW) // se il finecorsa e' premuto il carrello si ferma,purtroppo perennemente
{
motor[motorId] -> stop();
Serial.println("HOME");
}
}
break;
devi mettere una condizione di uscita dall'IF una cosa tipo questo fatto con il while
...
while(fase == 2 && count == 1)
{
digitalWrite(cassetto_apre, HIGH);
delay(300);
digitalWrite(cassetto_apre, LOW);
delay(500);
digitalWrite(cassetto_chiude, HIGH);
delay(300);
digitalWrite(cassetto_chiude, LOW);
count = 0;//per uscire dal while
}
...
in un'altra parte del programma cambi la condizione affinche l'IF restituisca TRUE
il carrello si ferma perennemente sul finecorsa,e non riparte piú nonostante il comando per farlo andare nell'altra direzione . Poi nonostante il finecorsa non é collegato direttamente al motore ma bensí ad un pin digitale di arduino é come se il finecorsa tolga la corrente al motore . Ho qualche possibilitá a livello software di uscire dal ciclo "if" e quindi poter far capire al programma che il finecorsa non sia premuto nonostante lo sia ? Aiuto
ciao
la parte incriminata è questa:
if (digitalRead(switchPin) == LOW) // se il finecorsa e' premuto il carrello si ferma,purtroppo perennemente
{
motor[motorId] -> stop();
Serial.println("HOME");
}
Devi riuscire a distinguere se quando dai un comando il finecorsa è gia LOW o no.
Potresti aggiungere una variabile esempio:
BOOLEAN giapremuto = FALSE;
quindi cambiare il controllo del finecorsa:
if ((giapremuto == FALSE) && digitalRead(switchPin) == LOW)
{
motor[motorId] -> stop();
giapremuto = TRUE;
Serial.println("HOME");
}
Quindo quando arriva al finecorsa porta la variabile giapremuto a TRUE e non controllo più il finecorsa.
Adesso per sistemarlo dei aggiungere nel loop
if(digitalRead(switchPin)= HIGH) giapremuto = FALSE;
Quindi quando passi da finecorsa da LOW ad HIGH rimetti il controllo dello stesso.
Ricapitolando la logica è questa: se il finecorsa non è LOW allora lo controllo; se il finecorsa è LOW non lo controllo più finchè non torna ad HIGH.
P.S. ho scritto a braccio e non ho controllato il codice (evita il copia-incolla)
non so se ci potranno essere problemi di debounce (da verificare)
ciao
pippo72
Grazie per l'aiuto,ma purtroppo il carrello rimane fermo senza piú ripartire,ho paura che il finecorsa tolga la corrente al motore nonostante sia connesso ad un pin digitale di arduino e quindi controllato da esso.
ciao
diego-95:
...ho paura che il finecorsa tolga la corrente al motore nonostante sia connesso ad un pin digitale di arduino e quindi controllato da esso.
quello sche scrivi non ha tanto senso.
A questo punto senza uno schema di come hai collegato le cose è decisamente necessario altrimenti possiamo solo tirare a indovinare.
ciao
pippo72
edit: posta anche il codice COMPLETO, anche questo aiuta e di molto
Questo é lo schema:
ciao.
Tanto per chiarire: in questo tread siamo intervenuti io (pippo72) e stefa24. Entrambi abbiamo chiesto schema e sketch. Entrambi abbiamo tirato a indovinare e ti abbiamo dato dei consigli ma purtroppo sei un po' scarno di feedback: non riesco (almeno io) a capire se hai provato a fare le modifiche suggerite o no.
Riguardo allo schema postato questo si riferisce solo al finecorsa , sarebbe meglio uno schema completo dell'intero progetto come (ripeto) meglio allegare lo sketch COMPLETO. La resistenza di pullup di solito è di 10 kohm, 330 ohm sono un po' pochi.
Se hai problemi a disegnare uno schema col computer puoi tranquillamente usare carta e penna e allegare una foto.
Se invece non ti và di condividere sketch e schema sei naturalmente liberissimo di farlo ma difficilmente troverai qualcuno che riuscirà ad aiutarti (a parte mago otelma )
Naturalmente non sto e non voglio "sgridare" nessuno, chieso solo maggiori informazioni per provare ad essere d'aiuto.
ciao
pippo72
ciao pippo,scusa forse hai ragione e sono stato scarno,il programma é davvero molto complesso e lungo ho apportato le modifiche che mi avete suggerito ma niente di nuovo....
questo é lo schema su carta:
http://imageshack.com/a/img538/8531/n3NLXO.jpg
questo é il finecorsa utilizzato(tipico dei lettori CD)
http://imageshack.com/a/img537/6272/cG585d.jpg
spero di aver chiarito qualcosa...Capisco le vostre difficoltá e sono grato del tuo aiuto pippo.fammi sapere se hai un bisogno indispensaabile del codice completo,peró ripeto é molto complesso...
Diego..
motivo in più per fornirlo nella complessità potrebbe essere sfuggito qualcosa, inoltre non riesci ad alimentare il motore con una alimentazione separata?
ciao,allora il programma é costituito da molti sottoprogrammi tali che io possa comandare il motore dalla seriale allora é pieno di istruzioni che non hanno a che fare con il motore....
ecco la parte che riguarda il motore:
case DC_MOTOR:
{
int motorId = 0;
int encoderId = 0;
if (nextMotor > 1)
motorId = command -> getParameter("id", -1);
if (nextEncoder > 1)
encoderId = command -> getParameter("encoderId",
motor[motorId] -> getDefaultEncoder());
bool forward = command -> getParameter("forward", true);
int power = command -> getParameter("pwm", 255);
const int cycles = command -> getParameter("cycles", -1);
const int timeout = command -> getParameter("timeout", 10);
Serial.println("==> Motor " + String(motorId) + " started forward=" + String(forward ? "yes" : "no") + " cycles=" + String(cycles));
unsigned long time = millis();
motor[motorId] -> start(forward, power);
encoder[encoderId] -> countCycles(cycles, timeout);
motor[motorId] -> start(forward, power);
encoder[encoderId] -> countCycles(cycles, timeout);
motor[motorId] -> stop();
if (digitalRead(switchPin) == LOW)
{
motor[motorId] -> stop();
Serial.println("HOME");
}
}
break;
hai seguito i suggerimenti di pippo72 qualche post fa?
certo che li ho seguiti,ma il problema persiste purtroppo!!!
ciao.
diego-95:
certo che li ho seguiti,ma il problema persiste purtroppo!!!
Sei sicuro?
Nell'ultimo codice postato non ci sono i cambiamenti che ti avevo suggerito di provare:
if (digitalRead(switchPin) == LOW)
{
motor[motorId] -> stop();
Serial.println("HOME");
}
Scusa la domanda ( e questo è un limite MIO) ma che linguaggio stai usando?
ciao
pippo72
Si chiama C pippo72,
il -> è un puntatore a struttura, equivalente a (*motor[motorId]).stop(); In questo contesto sembra che sia stata creata una struttura correlata a più motori ognuno con una routine di moto tipo "start, "stop", "run" etc...
icio:
Si chiama C
:-[ :-[ :-[
Ok, ho posto male la domanda.
Non conoscevo i puntatori a struttura... non si finisce mai di imparare
ciao
pippo72
Il C è stato ideato una 35 di anni fà da Brian kernighan e Dennis Ritchie , il loro libro tradotto in italiano e edito dal gruppo editoriale jackson lo trovi ancora , cerca Linguaggio ANSI C, ISBN 88-7056-443-6 devi studiarlo quasi come la Bibbia, perchè molte volte le interpretazioni sul C che si trovano in internet sono diverse, altre volte invece sono ottimi chiarimenti ma la base di riferimento è sempre quel libro che la jackson stampa da una vita, BISOGNA averlo
... suggerisco lo studio di QUESTO libro (... tranquilli, è un sito legale, purché per esclusivo uso PERSONALE).
Guglielmo