Blocco infinito

Salve ragazzi, Spiego brevemente il problema. Ho implementato un programma per la comunicazione Seriale ( processing arduino ) , funziona perfettamente ma ke grande spreco di memoria xo'! in pratica tramite i pulsanti dell'LCD invio il seriale al processing ke fa ruotare un box, logicamente il tempo di reazione umana nel staccare il ditino dal pulsante è molto lento dinnanzi alla potenza computativa della board, quindi se per ipotesi il pulsante n1 viene schiacciato al posto di inviare un singolo 1 al processing che lo fara' ruotare, INVIA 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 nel migliore dei casi ovviamente altrimenti dovro' riempire pagine e pagine. Ovviamente è uno spreco di memoria notevole, ho impostato addirittura il Serial.begin al minimo ma il risultato è leggermente migliore. Ho pensato che se inviassi un solo 1, non concludo ugualmente nnt e il ke è banale. c'è un modo per dirgli finche' è premuto rimane su uno, appena alzo il dito si stoppa, chiaramente senza il blocco infinito di 1.

Chiaramente per spreco di memoria intendo lato pc, il mio processingx non fa altro che leggere dal meta file il tutto e rimuovere in testa ad ogni lettura. mi secca svuotare il file tramite port.clear() ad ogni istruzione ricevuta XD. ad esempio se premo il pulsante e mi invia 1111111111111111111111111111 al processing, tramite processing leggo il primo 1 e poi svuoto il file tramite clear(); ed esegue l'istruzione. ma ke spreco!! invio un blocco N della quale mi è utile soltanto il primo 1!

e se invece il codice arduino invii l'1 solo una volta ogni mezzo o un secondo?

Rallenterei il movimento dell'oggetto sul processing Ps confido in te!

è esattamente quello che fai con clear, solo che col clear il delay è varibile e molto più corto... se per esempio di solito fai clear di 10 "1", con baud rate a 9600, allora stai facendo un delay di (1/9600)*10 secondi.

kiss

Ritardo cn il clear? mmmmh penso di no, kmq sia gia' avevo pensato di mettere un delay(80) subito dopo l'invio del serial.write cn arduino, ma sostanzialemente il risultato è .......... come dire ........ " scattoso " XD

kmq ho risolto, ho ridotto il delay a 19 e impostato il baud rate a 1200, almeno al posto di milioni di “1” nel meta file spuntano solo 4-5 “1”, cn un risultato decente in termini di fluidita’

sì invece... allora ti spiego.

esempio baud rate di 9600, vuol dire 9600 "1" al secondo. troppi, secondo te, quindi fail il clear, eliminando un pò di questi 1, di fatto riducendo da 9600 "1" al secondo a qualcosa di meno. la stessa identica cosa la puoi fare con un delay... il problema sta nel trovare il valore di delay corretto.

volendo potresti anche inviare un "1" al secondo, se il codice processing continuasse per 1 secondo roteare LENTAMENTE, e smettesse di farlo quando arduino invia "0", ovvero il segnale che il bottone non è più premuto.

Da leggere amichevolemente.......... 1 quando faccio il clear svuota completamente tutto il meta file, e non qualche 1 come hai detto. 2 non è fattibile l'altra ipotesi che mi hai elencato, xke se mandi 0 al processing come segno di " stop" avrai ottenuto una succesione di questo tipo in maniera approsimativa 1111111111111111111111111110, legge comunque tutto fino ad "0". 3 lo so che cos'è un baud rate, mica sono un nubbio -.- ( ripeto da leggere scherzosamente XD)

cosa intendi per meta file? il buffer in lettura? e allora stai eliminando tutti gli 1 in ingresso... è come fare il debounce del segnale sul pulsante, ovvero il delay, ovvero eliminare un pò di uno (quelli ricevuti fino a quel momento), ovvero eliminare gli UNO che arrivno troppo in fretta, ovvero inserire un delay farlocco.

  1. non devi continuare a inviare 1... lo fai quando il pusante è premuto, salvi lo stato "premuto"... insomma tu avvisi processing quando CAMBIA lo stato del pulsante!

tranquillo che non mi offendo, sono è difficile riconoscere le capacità di una persona... posta il codice così ci capiamo meglio

Si ma non voglio risposte della quale conosco gia' XD... kmq ecco un pezzo di codice processing

void draw() { if (port.available() > 0) { x=port.read(); if (x==1) cooy+=0.1; if (x==2) coox+=0.1; if (x==3) coox-=0.1; if (x==4) cooy-=0.1;

} background(51); lights(); translate(width/2, height/2, 0); rotateX(coox); rotateY(cooy); box(120); }

nello sketch arduino ho un semplice switch case che a seconda del testo premuto mi scriva Serial.write(numero); dopodiche' ho introdotto una pausa per eliminare un po di 1 delay(19); funziona ma non è questo il problema, a causa del delay nel codice arduino mi si blocca anche la rotazione del box, xke come vedi vengono aggiornate le coordinate di volta in volta. Secondo me non c'è una soluzione xke se tu scrivessi un solo 1 nel /dev/ttyUSB0 ad esempio il codice processing lo legge e lo rimuove automaticamente dopo la lettura quindi nn puoi inviare un solo "1". Come fai a dirgli finche' è premuto rimane "1" altrimenti 0 se il processing una volta ke legge "1" lo rimuove dal meta file??

Il problema secondo me si trova lato arduino.
Tu pigi il pulsante, ed il case switch invia un dato su seriale, ma tu il dato devi spedirlo solo quando rilasci il pulsante.

Quindi il case switch imposta un FLAGS, quando cicla dentro lo stessa switch trova il flags abilitato e non invia il dato fintantochè il pulsante non viene rilasciato.

nella routine di rilascio pulsante devi azzerare il FLAGS, altrimenti alla prossima pressione entra nel case ma non fa nulla ed aspetta che il pulsante venga rilasciato in eterno.

Questo è quello che si chiama oneshot, e non richiede debounce, se c’è è meglio.

Ciao.

Si ma se premo il pulsante essendo che non invia nulla a meno che nn lo rilascio l'informazione nn viene inviata. Quindi se per esempio continuo a premete il pulsante destro il box non si muove resta immobile. Secondo me l'unica soluzione è impostare un delay subito dopo che invio il Serial.write in modo da " aspettarmi nell'eventuale rilascio" mi spiego meglio. senza delay premo il pulsante per 1 secondo, lui cicla un numero di volte, scrivendo nel metafile molti "1" con delay (1000) premo il pulsante per 1 secondo, scrivera' sul metafile solo un "1". Ho Risolto kosi' come avevo gia' citato prima, e sembra essere l'unico modo "banale", chiaramente mi gioco la fluidita' di un oggetto in movimento nel processing, ma riducendo il baud rate a 300 e ipostando un delay minimo avra' soltanto una ventina di "1" nell'arco di qualche millisecondo.

clui: Si ma non voglio risposte della quale conosco gia' XD...

si ma io non so che tu le sai xD

clui: void draw() { if (port.available() > 0) { switch(port.read()){ case '1': ruota1=true; break; case '5': ruota1=false; break; case '2': ruota2=true; break; case '6': ruota2=false; break; } if (ruota1) cooy+=0.1; if (ruota2) coox+=0.1;

background(51); lights(); translate(width/2, height/2, 0); rotateX(coox); rotateY(cooy); box(120); }

che ne dici? per ora gestisce solo 2 tasti: un tasto quando premuto invia 1 e invia 5 quando rilasciato, il secondo tatsto 2 quando premuto e 6 quando rilasciato...

in oltre si nota una cosa che sarebbe SEMPRE da fare: rendere indipendente gli input/output esterni dalla parte di render.... in teoria è sbagliatissimo anche solo leggere la seriale nello stesso thread o preocesso della grafica. questo perchè se c'è qualche problema nella seriale, anche la grafica si blocca, e viceversa se la grafica è troppo pesante per il pc, che blocca per svariato tempo il codice, a quel punto sarà la seriale a perdere pezzi dal buffer.

Credo di aver capito cosa gli serve fare, prima no.

Io sta cosa l'ho fatta con una tastiera analogica su A0, ma in digitalo non ho idea chiara di come implementarla al momento.

In pratica: Case intercetta la pressione del tasto tastoCount++ if tastoCount == 1 invia dato tastoON = true else if tastoCount >10 invia dato

Da qualche parte nel codice quando il tasto viene rilasciato si deve azzerare tastoCount. Il funzionamente è: alla prima pressione viene inviato il dato perchè tastoCount vale 1, quando il codice entra nuovamente nel case il dato non viene inviato ammenoché tastoCount è maggiore di 10, così si discrimina la pressione una singola pressione da una continua.

Sempre che cio ho capito qualcosa.

Ciao.

si mi piace questa variante del tuo switch "Lesto", xo' non funziona secondo me. Perche' se io ho 5 pulsanti, come fa a sapere il processing quale tasto ho rilasciato? mi spiego meglio, essendo che i pulsanti sono collegati in serie, tramite un "congegno" di resistenze avro' tensioni analogiche distinte per ogni pulsante, quindi a seconda del pulsante premuto so perfettemante tramite una serie di if (lato arduino) a quale bottone ho premuto. Ma non posso sapere quale bottone ho rilasciato. Anche MauroTec mi ha fatto riflettere su qualcosa, sono ovviamente soluzione fattibili ma non credo siano le soluzioni migliori. Io avrei pensato a questo: invio il segnale al processing e scrivi sul metafile, ma scrive solo un "1", il processing legge 1 esegue ma non rimuove il file dalla lista! kosi appena rilascio invia 0 e viene sovrascritto il metafile il processing legge e se è 0 smette di fare qualcosa. quìndi secondo me è un problema lato processing. che ne dite? bisognerebbe trovare la funzione su arduino che impediche di accodare tutti gli "1", ma ke si limiterebbe a sovrascriverli in un unica locazione. Aspetto delle vostre risposte grazie