vorrei pilotare un pannello led(costruito con max7219) con processing(mi sembra il programma adatto, ne conoscete dimigliori per linux/mac?), per ora sono riuscito a far comunicare arduino con processing eseguendo dei test su un led.
ora vorrei iniziare a fare qualche prova con la mia matrice led, prima di tutto vorrei capire come comunicare con il max7219, secondo, vorrei provare a disegnare una forma geometrica e visualizzarla sulla matrice, per far questo devo capire come trasformare una forma disegnata in processing(quad() se non sbaglio per il quadrilatero) in dati validi per il max7219.
Io lavoro con Mac ma il software che citi non lo conosco.
Mi dai qualche info in più?
Parecchio tempo addietro scrissi tutta una libreria per trattare la grafica su di un piccolo schermo lcd grafico con touch screen per uso industriale. Sono presenti tutte le funzioni base per tracciare figure geometriche e visualizzare bitmap con i vari modi di visualizzazione (sovraimpressione, in negativo, ecc... ovvero le funzioni di and, or, xor di ciascun pixel). Con la possibilità di scrivere caratteri in grafica trattando font con forme diverse e dimensioni diverse (se non ricordo male però solo a spaziatura fissa), gestire icone, ecc. Comunque per le specifiche esatte devo riguardarmi i sorgenti perchè non li ho più utilizzati da anni...
Chiaramente il tutto è in C e non dovrebbero esserci problemi ad adattarlo per Arduino (ovvero Atmel).
Mi sembra che sia una cosa abbastanza diversa da quelle che devo fare, io ho semplicemente una matrice monocolore senza touch screen ne niente e di dimensioni ridotte(16x16 per ora).
Inoltre vorrei scrivere tutto in processing(basato su java), il C non fa proprio al caso mio, non mi sembra adatto a questo tipo di cose, lo userei giusto se avessi bisogno di performance elevate(cosa inutile in questo caso).
Mi sembra che sia una cosa abbastanza diversa da quelle che devo fare, io ho semplicemente una matrice monocolore senza touch screen ne niente e di dimensioni ridotte(16x16 per ora).
Inoltre vorrei scrivere tutto in processing(basato su java), il C non fa proprio al caso mio, non mi sembra adatto a questo tipo di cose, lo userei giusto se avessi bisogno di performance elevate(cosa inutile in questo caso).
A parte il touch screen (era solo un riferimento al lavoro che ho realizzato, ma che non c'entra NULLA con la grafica) lo schermo di cui ti ho parlato era un LCD monocromatico (quindi: acceso o spento), e direi che se vuoi pilotare una matrice di punti (che siano led o pixel di un display a cristalli liquidi non c'è alcuna differenza!) non puoi esimerti dallo scrivere delle routine apposite in C anche se la matrice è limitata a 16x16, perché la matematica che ti serve per la gestione grafica è la stessa sia che lavori con un francobollo o che tu la applichi ad uno schermo gigante.
Se poi pensi che il Java è di fatto un derivato del C, la cosa non dovrebbe esserti così difficile..
Comunque, se non ti interessa la mia offerta, pazienza!
non è che non mi interessa, ma da quanto ho letto in giro(quindi niente di certo) processing è studiato apposto per quello che vorrei fare inoltre coglierei anche l' occasione per impararlo un po.
sarà che non programmo in C(salvo le permormance non ho mai trovato un motivo per usarlo) ma l' idea di scrivere tutto in C mi sembra follia(per me e la mia situazione).
Ovviamente so che dovrò fare calcoli su matrici ma perchè usare un linguaggio vecchio come il C con tutti i casini che porta? solo a pensare ai puntatori mi vien la nausea.
Allora, vediamo se ho capito cosa ti può servire con un esempio:
mettiamo che con Processing tu elabori un'immagine (disegno, grafica, ... chiamalo come vuoi) in bianco e nero.
A questo punto potresti poi, con lo stesso Processing, inviare ad Arduino la matrice già completa, e il gioco è fatto... o no?
Per Arduino è sufficiente tu scriva poche righe che ti pilotano la matrice, ricevono via seriale il contenuto da visualizzare sotto forma di stringa, e lo visualizzano sulla matrice.
Per l'eventuale problema dell'invio dei dati in forma binaria, la soluzione più semplice può essere questa: ciascun byte letto lo dividi in due nibble (4 bit) ai quali sommi un valore fisso (ad esempio 0x10), che poi sottrai con Arduino per ricomporre ciascun byte senza così incorrere in eventuali problemi con il protocollo seriale (handshake).
Dimmi se questa volta ti ho dato qualcosa di utile
mmm così però sono confuso, allora, su arduino ho caricato un firmware per farlo comunicare con processing(non ho ancora guardato cosa c'è dentro anche perchè ho fatto davvero poco con arduino).
in processing ho usato questo codice per i test
in questo modo comando direttamente il pin selezionato, suppongo che vi sarà anche un modo per inviare un dato seriale.
da qui secondo te non posso pilotare direttamente il max senza passare per altre cose su arduino?
il fatto è che non ho idea di come pilotare il max da li, con arduino ho le funzione macOne e via dicendo che sioccupano di far tutto(clock, load e datain).
ah la questione dei dati in forma binaria non l'ho proprio capita, perchè dividi il byte?
PS: cmq mi è già di aiuto questa cosa, sto iniziando un po a capire come funziona il tutto.
Allora: tu usi del software già pronto che ti permette di far colloquiare Processing con Arduino mediante funzioni già predefinite, giusto?
Però, per pilotare un hardware specifico (max7219) collegato con Arduino devi per forza attivare (scrivere) una specie di interfaccia software sia per Arduino (in C che gli faccia fare le funzioni che ti servono) che per il tuo programma su Processing.
Quello che intendevo io era che tu prelevassi il bitmap dal computer mediante l'istruzione get() di Processing, per poi spedirlo al max7219 tramite Arduino via seriale.
La faccenda dei byte separati e poi ricomposti serve perchè la seriale (come ogni protocollo di comunicazione) usa dei codici di controllo, per questo normalmente si spediscono sempre stringhe con byte che rappresentano dei caratteri in codice ASCII (65 = "A", 48 = "0", 13 = CR ovvero "a capo", e così via). Se tu prendi dei byte e li riempi con dei pixel e li spedisci via seriale, in questi puoi, senza volerlo, includere anche dei codici che la seriale può interpretare diversamente.
Non ho controllato, ma credo che anche Arduino utilizzi un protocollo di controllo software visto che trasmette attraverso i due soli fili dell'USB (magari su questo qualcuno nel forum ne sa un pochino più di me), così è necessario trasmettere sempre dei byte che abbiano un valore maggiore dei valori che in ASCII sono previsti come codici di controllo (di norma > 8 e sei sul sicuro .. dai un'occhiatina a questo link Arduino Reference - Arduino Reference per capire meglio). Così se prendi un byte, lo dividi in due mezzi byte (nibble), ad ognuno sommi un valore fisso superiore al valore massimo rappresentabile in un nibble, che è 15 in decimale (ovvero 0x0F in esadecimale e B00001111 in binario), ad esempio 0x80 in esadecimale (ovvero 128 in decimale e B10000000 in binario) ottieni una serie di byte che non saranno mai minori di 128 ... giusto?
Per scomporre e ricomporre un byte in C puoi usare una funzioni tipo queste:
char mio_byte;
char primo_nibble;
char secondo nibble;
void scomponi(){
primo_nibble = (mio_byte & 0x0F) | 0x80; //salvi i bit da 0 a 4
secondo_nibble = ((mio_byte<<4) % 0x0F) | 0x80; //salvi i bit da 5 a 8
}
char ricomponi( primo_nibble, secondo nibble ){
return ((primo_nibble & 0x0F) | ((secondo_nibble & 0x0F) << 4));
}
tradurle in Java non dovrebbe essere un problema..
Una cosa ancora però non l'ho capita: il led che accendi con Arduino è pilotato dal MAX7219?
Però, per pilotare un hardware specifico (max7219) collegato con Arduino devi per forza attivare (scrivere) una specie di interfaccia software sia per Arduino (in C che gli faccia fare le funzioni che ti servono) che per il tuo programma su Processing.
esatto, quello che vorrei capire è come cmq un passo alla volta
Quello che intendevo io era che tu prelevassi il bitmap dal computer mediante l'istruzione get() di Processing, per poi spedirlo al max7219 tramite Arduino via seriale.
si, vorrei fare anche questo
La faccenda dei byte separati e poi ricomposti serve perchè la seriale (come ogni protocollo di comunicazione) usa dei ...
si ovvio, non ci stavo proprio pensando ai bit di controllo e al flusso di dati che si invia ad arduino, quindi ogni byte inviato contiene al massimo 4 bit di informazioi?
ora cmq mi si stanno schiarendo un po le idee, diciamo che ho qualche cosa su cui lavorare, magari provo a fare un mezzo port delle funzioni su arduino in processing, fatto quello devo solo capire come convertire ed inviare in real time immagini scritte ecc però direi che ci siamo quasi
si ovvio, non ci stavo proprio pensando ai bit di controllo e al flusso di dati che si invia ad arduino, quindi ogni byte inviato contiene al massimo 4 bit di informazioi?
infatti è così!
il mio consiglio è che tu prepari una routine che scandisca un'immagine (un pezzetto giusto grande quanto la tua matrice di led), e ad ogni riga scansionata prepari un stringa di byte elaborati con all'inizio il numero di riga corrispondente, es:
primo carattere = nr riga (ricorda che anche questo deve essere trattato come gli altri byte, ad esempio sommi 0x80)
secondo carattere = primo nibble del primo byte
terzo carattere = secondo nibble del primo byte
quarto carattere = primo nibble del secondo byte
quinto carattere = secondo nibble del secondo byte
ecc
in Arduino devi fare in modo di avere una routinetta che riceve la stringa, la ricompone e la mette in un array utilizzando come indirizzo il valore ricavato dal primo carattere ricevuto.
Quindi rinfresca il MAX con i nuovi valori e riprende a ricevere (e a rinfrescare la matrice).
In questo modo dovrebbe funzionarti .. certo non avrai mai prestazioni eccellenti (c'è lo strozzo della velocità seriale), ma qualcosa la vedi
ciao alla prossima (adesso stacco, magari domani se hai bisogno e se ho tempo... )
ho trovato qualche info in più, ho sentito uno che ha già fatto una cosa simile e a quanto pare(lui ha fatto così) ci vuole un parser su arduinoche prenda i dati sulla seriale(con i dovuti token di inizio e fini riga) e li replica al max7219.
io ho pensato che se potessi inviare da processing il clock relativo alla connessione seriale su un pin di arduino risolvere scrivendo direttamente interi byte sulla seriale, l'alternativa è mettere una funzione che generi il clock su arduino(nn so se sia possibile suppongo di si) , il problema è che magari deve essere sincronizzato con l'invio dei dati, nel senso che non vorrei inciampare in qualche stato di transizione da basso a alto.
cmq per ora mi sa che provo la strada del parser a meno che non trovi qualche cosa di meglio(meglio = + facile )
Quello che ti ho descritto nel mio precedente post può essere considerato un parser... l'informatica è piena di termini e nomi a volte strani che indicano procedure ovvie e inevitabili. Spesso questi termini (frutto di convenzioni) sono utilizzati in modo esagerato da chi lavora nel settore al pari di come si usa una lingua. Spesso però questi termini vengono utilizzati da chi non sa (o sa poco), e questo genera solo confusione.
Giusto sarebbe che ogni volta che si usa un termine che non è presente nella lingua con la quale si scrive, si fornisca anche la relativa spiegazione (se non altro per aiutare i tanti neofili che cercano e sperano di capirci qualcosa di più )
Comunque la spiegazione del termine PARSER la si può trovare qui: http://www.dizionarioinformatico.com/cgi-lib/diz.cgi?frame&key=parser