Show Posts
Pages: 1 2 3 [4] 5
46  International / Generale / Re: 4 Arduino Master Slave in RS485 on: February 04, 2013, 04:27:27 am
Ciao,

innanzitutto provo a rispondere alla domanda di peppe e pietro. Mi pare giusto dato che mi sono inserito di "prepotenza" nel thread.

Ovviamente la mia risposta potrebbe essere discussa insieme proprio perchè non sono sicuro che l'architettura che ho in mente sia quella corretta.

Come ho già detto, a differenza di peppe, io non immagino una logica di controllo sugli slaves perchè questo mi costringerebbe ad aggiornarne il firmware in caso di modifiche. Preferirei avere una logica centralizzata con gli slaves che fanno solo da sensori/attuatori.

Ciò premesso penso che il sistema dovrebbe funzionare in questo modo.

1 - il master chiede ad ogni slave il suo stato (per esempio lo stato dei pulsanti ad esso collegati oppure l'ultimo valore di temperatura letto)
2 - conoscendo lo stato di uno slave invia un comando ad uno o più slaves (per esempio sullo slave 2 è stato premuto il pulsante 1 e comanda allo slave 3 di chiudere il relè 2 ed allo slave 4 di chiudere il relè 3)

Dal punto di vista del protocollo seriale, pensando a qualcosa di simile a quello indicato all'inizio di questo thread, il master chiede lo stato ad ogni slave inviando un pacchetto con un determinato codice comando (per esempio RichiestaStatoInput = 1). Lo slave risponde con un pacchetto con codice comando RispostaStatoInput = 2. In questo caso deve comunicare un valore e lo fa utilizzando i bytes del pacchetto predisposti per eventuali dati. Il master deve quindi comandare la chiusura dei relè e lo fa inviando al relativo slave un pacchetto con codice comando ImpostaStatoOutput = 3 utilizzando ancora i bytes di dati per comunicare il valore di Stato che vuole impostare.

Ovviamente si tratta solo di una traccia, il protocollo andrebbe approfondito nel dettaglio anche in funzione di quello che si deve implementare.

Ciao.
Vittorio.
47  International / Generale / Re: 4 Arduino Master Slave in RS485 on: February 01, 2013, 09:31:25 am
questo non lo sapevo... è già un ottimo punto di partenza.

Tuttavia mi pare che il problema iniziale rimanga... anche se abbassiamo a 30 il limite massimo dobbiamo comunque considerare che 10ms erano soltanto un esempio fatto per mostrare come anche con tempi così ridotti, si raggiungono tempi totali considerevoli. Se immaginiamo un tempo più realistico, per esempio 50ms, torniamo nuovamente a 1,5 secondi per interrogare 30 slaves.

48  International / Generale / Re: 4 Arduino Master Slave in RS485 on: February 01, 2013, 09:15:59 am
Ciao a tutti.

Intervengo nella discussione per affrontare con voi un aspetto dell'architettura proposta che mi pare più problematico del protocollo di comunicazione. Naturalmente non voglio confondere le idee a peppe91 per cui se volete, possiamo aprire un thread a parte oppure rimandare la questione a quando peppe91 avrà dissipato i suoi dubbi. Per il momento mi limito ad esporre la cosa.

In una installazione reale, oltre al master ci potranno essere numerosi slaves (diciamo fino a circa 250). Il master è l'oggetto sul quale gira la logica di controllo, gli slaves fanno invece da sensori (pulsanti, termometri, igrometri, sensori di luminosità...) o da attuatori (relè, dimmer...) o magari da entrambe le cose insieme.

Il master è l'unico che può avviare una comunicazione verso uno slave; quest'ultimo si limita a rispodere quando interrogato. In questo modo si evitano collisioni sulla linea che sono la ragione per cui si ricorre all'architettura master/slave. Questo però vuol dire che il master deve ciclicamente interrogare gli slaves per conoscere il loro stato ed eventualmente per comandare una o più attuazioni in caso di necessità.

Per esempio, l'utente preme un pulsante sullo slave 1; il master comanda la chiusura di un relè sullo slave 2 e di un relè sullo slave 5 (accensione di due lampade diverse, per esempio).

Tutto questo però dovrebbe avvenire in tempi brevissimi per garantire una reattività del sistema accettabile. D'altro canto però se il master impiegasse anche solo 10ms per interrogare ogni slave (e mi sembrano davvero pochi dato che bisognerebbe comunque concedere un certo timeout allo slave per rispondere), l'interrogazione di tutti gli slaves richiederebbe 2,5 secondi (ovviamente nel caso peggiore in cui ci siano davvero 250 slaves sulla rete). Questo tempo mi pare inaccettabile per un utente che potrebbe vedere le luci accendersi con un ritardo considerevole.

Accenno ad una possibile soluzione: gli slaves hanno priorità diversa, cioè alcuni vengono interrogati più spesso di altri. Un esempio: lo slave con i pulsanti deve essere interrogato molto più spesso di uno slave che fa da termometro. Anche così però mi pare che i tempi siano troppo stretti.

Cosa ve ne pare? Mi sfugge qualcosa?

Ciao.
Vittorio.
49  International / Generale / Re: Rimodernare vecchi oggetti on: January 28, 2013, 09:03:37 am
Ciao a tutti.

C'e' una cosa di carattere generale che mi sfugge. Si intende replicare abbastanza fedelmente il funzionamento di un basso oppure si vuole creare soltanto uno strumento simile? Mi spiego meglio.

Il video mostra la riproduzione di un'arpa (peraltro molto lontana da un'arpa vera, ha infatti solo dieci "corde" mentre quella tradizionale ne ha una quarantina). Ma quando si suona l'arpa, si pizzicano le corde che hanno ciascuna una lunghezza diversa e fissata. Pertanto nella riproduzione laser dello strumento, la semplice interruzione del raggio laser, corrisponde all'aver pizzicato la corda. Il funzionamento quindi rimane, grosso modo, lo stesso.

Un basso invece funziona in maniera diversa (come ovviamente sapete tutti...). La mano sinistra si usa per variare la lunghezza della corda (premendo sul capotasto corrispondente) mentre la destra pizzica la corda stessa per farla vibrare.

Finora, nel thread si è parlato di sensori in grado di rilevare la posizione del dito della mano sinistra che interromperebbe il raggio laser ad una distanza variabile. Ma poi come facciamo a "pizzicare la corda", visto che peraltro il raggio lo abbiamo interrotto e non arriva proprio più all'altezza della mano destra?

Da qui la mia domanda... Lo strumento che stiamo parlando di creare, deve funzionare come un basso tradizionale (seppur con una manualità ed una sensibilità diversa) oppure in maniera soltanto simile (cioè la nota viene emessa quando il raggio viene interrotto ad una certa lunghezza prescindendo quindi dalla pizzicata della mano destra...).

Ciao.
Vittorio.
50  International / Hardware / Re: Visione artificiale on: January 02, 2013, 12:19:00 pm
Ciao a tutti,

spero di non dire una banalità anche perchè magari dipende dall'architettura del nastro nel dettaglio.

Forse potresti mettere due barriere IR, una all'inizio del nastro ed una alla fine. L'interruzione della prima incrementa il conteggio dei pezzi sul nastro, l'interruzione della seconda lo decrementa. In questo modo conosci sempre il numero di pezzi presenti sul nastro.

Ovviamente è necessario che i pezzi passino in maniera indipendente l'uno dall'altro. Non devono cioè sovrapporsi quando passano attraverso la barriera.

Probabilmente, conoscendo il tempo medio di attraversamento di un pezzo tra le due barriere, è possibile determinare il numero massimo di pezzi che possono trovarsi sul nastro in condizioni normali. In caso tale numero superi una certa soglia, questo dovrebbe significare che c'è stato un inceppamento.

Se la soluzione è accettabile, magari può essere interessante aumentare il numero di barriere in modo da sapere anche il tratto di nastro in cui si è fermato un pezzo.

Ciao.
Vittorio.

51  International / Software / Re: Inserire una cifra tramite Keypad 4*4 on: December 18, 2012, 06:46:13 am
ti ringrazio (per l'"interessante")... peccato che avendo usato solo le 4 operazioni sembri più un metodo da aritmetico che da matematico  smiley smiley smiley

ovviamente ho compreso il tuo post... la mia è solo una battuta...
52  International / Software / Re: Inserire una cifra tramite Keypad 4*4 on: December 18, 2012, 04:01:07 am
Ciao,

immagino che per "cifra" tu intenda in realtà un numero composto da più cifre, per esempio il numero 375 composto dalle cifre 3, 7 e 5. Se ho capito bene quindi vuoi premere il 3, il 7 ed il 5 sulla tastierina e trovarti nella variabile il valore intero 375.

Oltre al suggerimento di Pelletta, ti propongo un altro sistema, tanto per avere ulteriori spunti.

All'inizio imposti il valore della tua variabile, diciamo V, a zero. Alla pressione di ogni tasto, moltiplichi per dieci il valore attuale di V e sommi il valore del tasto appena premuto.

Quindi nell'esempio iniziale parti con V=0; alla pressione del 3 ottieni: 0 * 10 + 3 = 3; alla pressione del 7 ottieni: 3 * 10 + 7 = 37; alla pressione del 5 ottieni 37 * 10 + 5 = 375. Immagino tu debba quindi gestire una sorta di ENTER per confermare il valore letto.

Se volessi gestire anche un tasto DEL per consentire la correzione del valore finora impostato, ti basta dividere V per 10 e troncare eventuali cifre decimali. Nell'esempio di prima 375 / 10 = (int)37,5 = 37

Ciao.
Vittorio.

53  International / Software / Re: IRRemote on: December 05, 2012, 09:13:05 am
Madwriter hai ragione  smiley, in effetti ho riletto il post e mi sono reso conto che per come l'ho scritto sembra che ad aspettare sia il telecomando e non il televisore.

Naturalmente intendevo il contrario dato che l'ho suggerito come soluzione con l'arduino al posto del televisore (non certo del telecomando). Non per altro programmiamo l'arduino, mica il telecomando.

Per farmi perdonare spendo qualche minuto a descrivere meglio il suggerimento di Madwriter che dice proprio quello che intendevo io.

Ad ogni ciclo della loop():

  • controlli se è stato premuto un tasto del telecomando. Se sì lo metti in un array e incrementi l'indice dell'array in cui metterai il prossimo tasto
  • controlli se è passato un certo tempo (millis()) dall'ultimo tasto premuto. Usa un flag per tenere traccia del fatto che è stato premuto almeno un tasto. Se il tempo è scaduto, leggi i tasti premuti nell'array, esegui l'azione ed azzeri l'array

Io dimensionerei l'array staticamente per il numero massimo di cifre che intendo gestire. Penso quindi dovrai anche tenere una variabile che ti dice quanti tasti ci sono realmente nell'array. Infatti il numero massimo potrebbe essere, per esempio, 3 ma io posso aver premuto 1, 11, 111.

Ciao.
Vittorio.
54  International / Software / Re: IRRemote on: December 05, 2012, 06:15:31 am
ciao,

potresti fare come fanno i telecomandi dei televisori più nuovi. Ogni volta che premi uno dei tasti da 0 a 9 il tv non cambia canale subito ma aspetta un certo tempo la pressione di ulteriori cifre. Trascorso un certo tempo senza che tu prema altro, lui salta al canale corrispondente alle cifre che hai premuto.

Farlo non è difficile, pensaci e se hai bisogno di aiuto, chiedi.

55  International / Software / Re: Miglior approccio per cambiare funzione? on: December 04, 2012, 04:16:20 am
ciao,

spero di riuscire a spiegarmi. In effetti l'obiettivo è quello di non interrompere troppo a lungo il loop principale (quello creato dalla funzione standard loop()).

Non hai postato tutto il codice ma immagino che la funzione points() che hai postato venga richiamata da loop() e che ce ne sia una diversa per ogni effetto da visualizzare selezionato con la pressione del tasto.

Ti suggerirei allora di non inserire dei cicli all'interno di points ma di rendere globali le variabili col e row e di utilizzare dei while. Ogni volta che loop() chiama points tu esegui soltanto un ciclo degli attuali for, incrementi la/e variabile/i col e row ed eventualmente le azzeri attraverso degli if per vedere se sei arrivato a fine ciclo.

Sembra complicato, e non sono sicuro di essere stato sufficientemente chiaro (ma, nel caso, chiedi pure ulteriori info). In questo modo però riesci a leggere lo stato del pulsante anche durante l'esecuzione dei cicli.

Ciao.
Vittorio.
56  International / Hardware / Re: Convertitori ADC on: December 04, 2012, 03:56:40 am
Ciao,

scusa ma sono confuso... tu parli di un ADC, che ribadisco è già presente in Arduino. Al contrario, come ti fa notare ratto93, Arduino non ha un DAC (almeno le versioni precedenti al DUE).

Leggendo però il tuo ultimo post mi pare di capire che tu voglia usare un DAC per inviargli una tensione che lui convertirà in un pattern di bit che presenterà in uscita. Per generare la tensione con Arduino dovresti usare un piedino PWM con un integratore (rete RC). Mi pare un poò complicato.

Non sarebbe più semplice utilizzare degli IO extender su I2C? Tipo, per esempio, i PCF8574 (un tutorial: http://www.settorezero.com/wordpress/utilizzare-l-io-expander-pcf8574/). Ti offre 8 linee che puoi usare sia come input che come output (nel tuo caso ti interessano come output). Ne metti tre (costano circa un paio di euro l'uno) ed ottieni le 24 linee che desideri. Poi magari ne esiste anche una versione con più uscite...

Ciao.
Vittorio.

57  International / Hardware / Re: Convertitori ADC on: December 03, 2012, 12:25:30 pm
Ciao,

perchè hai bisogno di integrati esterni? Arduino fa già la conversione A/D con 10 bit di risoluzione.
58  International / Software / Re: Come fare per muovere un servo di 10° in 10 secondi in modo continuo? on: November 30, 2012, 05:17:38 am
Code:
for (int a=0; a>10;a+=0.000001)
{
Myservo.write(a);
Delay(10);
}

Scusatemi, nei primi post del thread avevo pensato che il codice riportato fosse solo esemplificativo e non avevo fatto notare la condizione a > 10 che pensavo fosse solo un svista notata da tutti.

Adesso mi pare di capire che il codice sia stato testato e forse è opportuno sottolineare che così come è scritto il ciclo non viene mai eseguito.

59  International / Software / Re: Salvare sulla memoria di Arduino alcuni parametri fatti variare da seriale on: November 22, 2012, 08:55:09 am
Scusa, leo, forse sono stato poco chiaro. Io non dicevo di utilizzare il tipo "word" ma la funzione di conversione word. Cioè:

byte h = 2;
byte l = 1;
int X = word(h, l);
// X = 513

Ciao.
Vittorio.
60  International / Software / Re: Salvare sulla memoria di Arduino alcuni parametri fatti variare da seriale on: November 22, 2012, 05:00:53 am
Ciao, stavo scrivendo la stessa risposta di leo che è arrivato prima. Per rimporre l'int a partire dai due bytes è possibile anche utilizzare la word (magari un po' più leggibile).

Ciao.
Vittorio.
Pages: 1 2 3 [4] 5