Show Posts
Pages: [1] 2 3
1  International / Software / Re: Errore nei primi 8 byte utilizzando pin RX e TX come seriale (arduino 2009) on: May 06, 2013, 12:18:13 pm
Come mi è stato fatto notare oggi da un collega, senza un Maxim 3232 (http://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf) tra adattatore usb/seriale e pin RX TX di arduino non vado molto lontano  smiley

Problem solved  smiley-cool
2  International / Software / Re: Errore nei primi 8 byte utilizzando pin RX e TX come seriale (arduino 2009) on: May 05, 2013, 05:58:45 am
Se è così allora è veramente inaccettabile come soluzione. Hai provato a far comunicare magari 2 arduino oppure provare con un altro convertitore seriale?

Purtroppo al momento non ho due arduino con cui provare. Ho provato anche con un altro convertitore seriale ma ho lo stesso problema (c'è da dire che usa lo stesso chip prolific pl2303).

Non so più dove sbattere la testa: qualcuno potrebbe fare una prova col proprio arduino ed un usb/serial sui pin RX TX e vedere se ha lo stesso problema?
3  International / Software / Re: Errore nei primi 8 byte utilizzando pin RX e TX come seriale (arduino 2009) on: May 04, 2013, 03:50:16 am
Se tutto funziona normalmente dopo l'invio di 8 byte potresti inviarli sempre quando devi stabilire una connessione. Non è la soluzione più elegante però potrebbe funzionare. Vedi comunque questa discussione se ti può tornare utile: http://arduino.cc/forum/index.php?topic=143781.0

Ho provato anche a impostare il pin 0 in output come scritto nel topic ma nulla.

Comunque la soluzione che hai proposto non è che non sia elegante: non è proprio accettabile! Anche perché comunque non è che mando 8 byte e dai in poi funziona: per farlo funzionare, ogni volta che voglio spedire qualcosa devo mandare 8 byte e dal 9° in poi mandare quello che voglio scrivere.

Ho provato a rifare mente locale ma non ne esco fuori: avessi un oscilloscopio capirai qualcosa in più.
4  International / Software / Re: Errore nei primi 8 byte utilizzando pin RX e TX come seriale (arduino 2009) on: May 03, 2013, 02:25:40 pm
Prova a sostituire print() con write() così sei sicuro di inviare un byte. Il tuo codice comunque funziona (l'ho provato con la connessione seriale classica cioè quella tramite usb di serie) quindi credo che sia un errore di comunicazione tra i due dispositivi. Che adattatore seriale è?

Ciao,

coin la connessione seriale via usb non ho nessun problema: funziona tutto perfettamente. E' utilizzando i pin 0 e 1 (RX e TX) che mi fa casino sui primi 8 byte.

Ho provato comunque utilizzando la write ma il problema rimane.

Code:
Serial.write(incomingByte);

L'adattatore usb/seriale che ho monta un chip prolific. Per la precisione (ho un mac):

Code:
               USB-Serial Controller D:

                  Product ID: 0x2303
                  Vendor ID: 0x067b  (Prolific Technology, Inc.)
                  Version: 4.00
                  Speed: Up to 12 Mb/sec
                  Manufacturer: Prolific Technology Inc.
                  Location ID: 0x1a124000 / 6
                  Current Available (mA): 500
                  Current Required (mA): 100

Per scrupolo ho provato anche col computer di lavoro (con ubuntu), su cui sono sicuro che il medesimo usb/seriale e i relativi driver funzionano in quanto lo uso quotidianamente a lavoro per debug, ma il risultato ahimè non cambia.

Potrei pensare che è l'arduino rotto, ma con un atmega328p vergine (senza bootloader) con il driver per la seriale riportato nel primo post ottengo lo stesso risultato.

Avevo letto che quando si utilizzano i pin 0 e 1 per comunicare via seriale non bisogna alimentare l'arduino con l'usb perché altrimenti fa casino con l'ftdi montato sulla scheda: il problema è che con l'atmega328p (montato su breadboard col minimo indispensabile e che dell'ftdi non ne sa neanche l'esistenza) ottengo gli stessi risultati. Quindi con certezza posso dire che i chip sono funzionanti.

Penso che mi sfugga qualcosa nei collegamenti elettrici o nelle alimentazioni, ma non so cosa. Certo che se dopo il byte n°8 funziona correttamente, penso ci sia qualcosa di errato nei driver seriale di arduino.

Possibile? Pensandoci meglio no, perché utilizzando la classica usb ricevo tutto senza problemi e i driver sono gli stessi.


EDIT: spulciando un po' su google, ho trovato questo link che utilizza i pin 2 e 3 di un atmega168 (corrispondenti ai pin 0 e 1 se si pensa ad un arduino 2009) per la seriale ad un connettore db9.

Code:
http://imagearts.ryerson.ca/sdaniels/physcomp/tutorials/arduino_serial/ard_serial.html

Ho notato che utilizza questo integrato (penso che sia un inverter per i livelli):

Code:
http://www.parl.clemson.edu/~wjones/371/chips/7404.pdf

La mia conoscenza hardware ahimè è abbastanza limitata: sposto la sezione in hardware? Che sia questo il problema?

Non vorrei cominciare a dire stronzate smiley Stasera stacco la testa: domani faccio mente locale e vedo se ne cavo qualcosa.

Se qualcuno nel frattempo mi sa dare qualche dritta ne sarei grato  smiley

Buona serata.
5  International / Software / Re: Errore nei primi 8 byte utilizzando pin RX e TX come seriale (arduino 2009) on: May 03, 2013, 02:06:16 pm
Grazie per la correzione: non me ne ero accorto  smiley

In ogni caso, non cambia nulla purtroppo.
6  International / Software / [RISOLTO] Errore nei primi 8 byte utilizzando pin RX e TX come seriale on: May 03, 2013, 01:07:47 pm
Ciao a tutti.

Ho un problema utilizzando la seriale di arduino tramite i pin RX e TX (0 e 1) invece che tramite usb.

Innanzitutto allego il codice che sto utilizzando (un semplice echo del carattere che spedisco dal serial monitor).

Code:
char incomingByte = 0;    // for incoming serial data

void setup() {
    Serial.begin(9600);    // opens serial port, sets data rate to 9600 bps
}

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
  
    // read the incoming byte:
    incomingByte = Serial.read();
  
    // say what you got:
    Serial.print((char)incomingByte);
  }
  
}

Sto utilizzando un adattatore usb/seriale che sono sicuro che funziona (lo utilizzo al lavoro quotidianamente). Collego come segue:

- il pin 3 (TX) dell'adattatore usb/seriale al pin 0 (RX) di arduino;
- il pin 2 (RX) dell'adattatore usb/seriale al pin 1 (TX) di arduino;
- il pin 5 (GND) dell'adattatore usb/seriale alla massa di arduino;

Carico lo sketch e mi collego con la serial monitor: se provo a scrivere singoli caratteri, questi vengono ricevuti e rispediti (se mando un carattere mi viene risposto un carattere, se ne mando due mi viene risposto due caratteri e così via). Il problema è che non sono corretti: è come se ci fosse il baudrate errato.

Riporto due esempi per far capire meglio:

- spedisco '1' -> ricevo 'L';
- spedisco '1234 -> ricevo 'L&¢>";

Ho notato però che spedisco più di 8 caratteri insieme, a partire dal nono carattere comincia a rispondere correttamente. Per esempio:

- spedisco '1234567890' -> ricevo 'L&"*2:90'
- spedisco '12345678ora comincia a rispondere in modo corretto' -> ricevo 'L&¢ª²:ora comincia a rispondere in modo corretto'

Ho a disposizione anche un programmatore avr-dragon e un atmega328p vergine senza bootloader che sto comincia ad utilizzare con tutta la toolchain di avr (per fare anche debug hardware con debugwire). Mi sono fatto il mio driver per la seriale ed ho lo stesso identico problema: ho provato a controllare com'è fatto il driver della seriale di arduino nei sorgenti ed è fatto esattamente come il mio.

Riporto anche il mio driver seriale che utilizzo con l'atmega328p e la toolchain avr se può tornare utile.

Code:
#include <avr/io.h>
#include <avr/interrupt.h>

#include <string.h>

#include "ser.h"

#define UBRR ((F_CPU / (SER_BAUD_RATE * 16UL)) - 1)

static char ser_rcved_byte; /* Received byte via serial comm. */

/**
 * Interrupt service routine on usart rx.
 *
 * @param USART_RX_vect usart rx vector.
 *
 * @return
 *
 * @warning global interrupt (function sei()) must be already called.
 */
ISR(USART_RX_vect)
{
  while ((UCSR0A & _BV(RXC0)) == 0)
    ;

  ser_rcved_byte = UDR0;
  
  while ((UCSR0A & _BV(UDRE0)) == 0)
    ;
  
  UDR0 = ser_rcved_byte;
}

/**
 * Initializes serial module.
 *
 */
void
ser_init(void)
{
  uint16_t ubrr;
  
  ubrr = ((F_CPU / (SER_BAUD_RATE * 16UL)) - 1);
  
  /* Set baud rate. */
  UBRR0H = ubrr >> 8;
  UBRR0L = ubrr;
  
  UCSR0B |= _BV(RXEN0) | _BV(TXEN0); /* Enable receiver and transmitter. */
  
  UCSR0B |= _BV(RXCIE0); /* Enable reciever interrupt. */
  
  if(SER_DATA_BITS == 8 && SER_STOP_BITS == 1)
    {
      UCSR0C |= _BV(UCSZ01) | _BV(UCSZ00); /* Set frame (8 data bits - 1 stop bit). */
    }
}

Ho provato ad alimentare arduino sia con l'usb del portatile attaccato all'adattatore usb/seriale che con l'usb di un altro portatile: stesso problema.

Ho provato anche con baudrate diversi: identico comportamento.

Sbaglio io o mi sfugge qualcosa?

Grazie mille.

Buona serata a tutti.
7  International / Software / Re: Pt100 e Smartec UTI on: December 02, 2012, 09:54:13 am
ho provato con acqua tiepida a 37.5 misurati col termometro da febbre. mi da una resistenza di 114.64, che a detta della famosa formula "universale" (calcolabile qui http://www.thermibel.be/documents/pt100/conv-rtd.xml?lang=en) corrisponde a circa 37.67gradi. anche questa volta direi proprio come da manuale, senza nessuna calibrazione.

tutto ciò mi rende molto contento dal momento che avevo uno smartec uti da mesi che non ero mai riuscito a farlo andare decentemente (penso colpa delle pt100 a 2 fili che avevo e di un errore nel codice che mi portavo dietro). ti devo veramente ringraziare!!! se ti può interessare. le pt100 a 4 fili le ho comprate qui  http://www.ebay.it/itm/190760784643?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

sono arrivate dopo 3gg  smiley  
8  International / Software / Re: Pt100 e Smartec UTI on: December 02, 2012, 09:04:33 am
ed infatti era proprio quello il problema: avevo seguito il foglio che c'era dentro con le pt100 ma segnava sbagliati i colori. ho verificato col tester e sistemato correttamente i valori. ora funziona alla grande smiley (almeno, da valori sensati). ora provo un po' a vedere calibrazioni varie etc

edit: sto calibrando con acqua e ghiaccio, ma mi sa che non bisogno molto di calibrazione.la media dei risultati, dopo circa 5min dall'inserimento del ghiaccio in un pinta di acqua, varia tra 100.02 ohm e 100.06 ohm. direi come da manuale (Pt100 Classe A ±0,15 °C [0 °C] ±0,06 Ω [0 °C]) smiley-grin
9  International / Software / Re: Pt100 e Smartec UTI on: December 02, 2012, 08:26:30 am
esatto ho pt100 a 4 fili(colori diversi, bianco-blu-maroone-nero).

il bianco blu dovrebbe essere il rosso e marrone nero il bianco.


ho collegato come hai detto te e ricaricato il codice. adesso come resistenza mi rileva sempre 0  smiley-cry

Il circuito l'ho appena controllato e dovrebbe essere giusto

edit: temo che ho sbagliato i colori: il bianco dovrebbe andare col nero e il marrone con il blu. ora riprovo a vedere se cambia
10  International / Software / Re: Pt100 e Smartec UTI on: December 02, 2012, 04:51:59 am
In ogni caso, paranoie a parte, ecco lo schema:



Uploaded with ImageShack.us

PS: ho apportato una correzione allo schema


Rispetto allo schema presente nel topic http://arduino.cc/forum/index.php/topic,17349.0.html, ho modificato la RBias che ho portato a 2.2K e il pin 6 (SEL 3) che da GND ho portato a +5V in modo da poter usare la Modalità 5 dell'integrato, come specificato nel datasheet per l'utilizzo di una PT100 a 4 vie. Ovviamente il codice che ho riportato qualche post fa è stato modificato adeguatamente.

rref non dovrebbe essere 100ohm per le pt100?

edit: ah no, come non detto smiley-grin . Comunque sto provando il tuo codice e il tuo schema (ho uno uti smartec anche io), ma mi stampa valori di resistenza intorno a 8500..C'è qualcosa che non mi torna smiley cosa potrebbe essere?

ri-edit: come non detto. penso che sto usando il vecchio codice con il nuovo schema smiley-grin potresti postare anche il nuovo codice?
11  International / Generale / Re: RTD library on: February 14, 2012, 12:36:12 pm
sono riuscito a risolvere, grazie mille!

nello sketch il multiplexer leggeva tutti e 4 i canali e mi sballava la lettura. leggendo solo il canale dove c'è la sonda attaccata funziona alla grande.

sono riuscito anche a calibrarlo molto bene (range 0-120 gradi): errore max +- 0.1, testato su liquido a 38 gradi misurato con termometro da febbre
12  International / Generale / RTD library on: February 13, 2012, 06:35:49 am
salve,

sto provando ad utilizzare la libreria RTD (per la lettura di pt100-pt1000) trovata a questo link http://openenergymonitor.org/emon/node/75.

premetto che di elettronica non sono un guru, anzi tutt'altro. è la prima volta che uso gli op amp (in questo caso lm324) e un preset, e quindi non capisco se sbaglio a collegare qualcosa o è il circuito che è sbagliato.

il circuito in questione è http://openenergymonitor.org/emon/sites/default/files/rtdmodule.png

leggendo il link sopra, lanciando lo sketch di esempio con arduino dovrei leggere 1023 perchè non è calibrato: collegando una resistenza fissa al posto della pt100, che mi simboleggia la temperatura minima che voglio rilevare, nel mio caso 100ohm (0 gradi), dovrei variare il preset fino a quando il valore dell'adc è compreso tra 10-40. il problema è che a me rimane al minimo 90, e come giro di poco il preset mi sbalza su a 1023 senza troppi valori intermedi.

il circuito è sensato o sto sbagliando io? nel caso qualcuno sa come leggere una pt100?ci sto sbattendo la testa da due giorni e non ho ancora trovato una soluzione
 
13  International / Generale / Re: reed switch on: August 12, 2011, 05:43:04 am
avete ragione.

ora ho capito: i diodi sono necessari per forza smiley

grazie mille per le info
14  International / Generale / Re: reed switch on: August 12, 2011, 04:10:40 am
Ciao sollazzo
Quote
ma sono proprio necessari i diodi? leggendo con i due cicli for come ho scritto poco sopra non dovrebbe funzionare? dovrei riuscire a decodificare ogni singolo reed indipendentemente da quanti ce ne sono azionati.

8 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1
6 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0
3 0 0 0 0 0 0 0 0
2 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1
  A B C D E F G H
Considera questa posizione:
Nella riga 1,7 e 8 hai tutte la riga collegata con tutte le collonne.
La piedina in posizione E4 viene vista in A4, B4, ... H4 perché la corrente passa per i Reed delle righe 1,7,8 e nello stesso momento non viene rilevato l'assenza della piedina in E2.

Ciao Uwe  


e se le righe le collego non ad un bus in comune ma ai singoli pin di output e ne attivo solamente uno alla volta?

voglio dire:

al primo ciclo for, setto high il pin della riga 1 e setto low i pin delle righe 2-8 e nel secondo for scorro tutte i pin delle colonne (quindi se rilevo corrente sono per forza della riga 1, in quanto tutte le altre colonne, anche se c'è un pezzo sopra, ha i pin disattivati quindi non passa corrente).
alla seconda iteriazione, setto high il pin della riga 2 e setto low i pin delle righe 1, 3-8, e scorro tutte i pin delle colonne (ora relativi alla riga 2), e cosi via.

forse non mi ero spiegato bene in questo passaggio.

effettivamente se le righe sono tutte alimentate non posso distinguere tra un pezzo in A4,B4 e così via, ma alimentandone solo una alla volta, e disattivando le altre, dovrei riuscirsci. almeno è quello che il mio cervello si ostina a farmi pensare smiley
15  International / Generale / Re: reed switch on: August 11, 2011, 05:39:21 pm
innanzitutto grazie a tutti per le risposte.

stasera mi sono trovato col socio con cui voglio fare la scacchiera e abbiam tirato giù un paio di problematiche/soluzioni.

per quanto riguarda i vostri post:

se il pezzo fosse solo uno, la cosa dovrebbe essere semplice, dovrebbe bastare leggere il cambio di tensione (anzi, di corrente sarebbe meglio) di tutti i PA e PB. Ma visto che i pezzi sono tanti, la cosa diventa quasi impossibile con quello schema (non so se matematicamente sia possibile). Se tutti i reed shift sono della stessa resistenza, analizzando la corrente e conoscendo a priori che si sposta una sola pedina, e lo stato iniziale delle pedine, analizzando la corrente dovresti farcela, anche se è molto complicato.


scusami ma non ho capito bene cosa intendi. per come l'ho intesa io (eliminando per il momento eventuali errori umani etc etc, quindi ipotizzando una situazione ideale, la situazione è questa:

1. nello schema che ho postato le righe sono elettricamente separate dalle colonne, e i pin digitali delle righe sono di output, mentre quelli delle colonne di input.
2. la matrice di partenza è la seguente

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

3. per leggere la posizione attuale della scacchiera, due cicli for (le colonne sono i e le righe j)

for (int i = 0 ; i<8;i++) {
   set pin i to high and set other pin to low;
// faccio passare corrente alla prima riga mentre le altre le setto a low
// rispetto allo schema che ho postato, non cè un unico bus a +5v sempre attivo, ma ogni riga è collegata ad un pin separato dagli altri (forse era qui che non mi ero spiegato bene)

   for(int j = 0;j<8;j++) {
      read status of pin j and save to matrix
// leggo lo stato di ogni casella di quella riga e la salvo in una nuova matrice.
// se c'è il pezzo, il magnete chiude il contatto e dovrei leggere 1 sul pin di input, mentre se non ce nessun pezzo leggo 0.
}
}

in questo modo penso che con 8 pin di output e 8 di input riesco a gestirmi tutta la scacchiera.

ipotizzando che abbia mosso una pedina, dopo la mossa ho per esempio questa matrice:

1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1

confronto questa matrice con quella precendete e scopro che c'è stato un cambiamento, che in pezzo di è mosso da e2 a e4 (coordinate della scacchiera). io a priori so che in e2 ci sta un pedone, e quindi so che in e4 ci è finito un pedone. poi questo come lo gestirò via software non lo so ancora che non ho ancora cominciato a smanettarci, ma credo che non sarà un problema troppo complicato in virtù della conoscenza iniziale delle varie posizioni dei pezzi.

Per quanto riguarda l'errore umano, basta fare una griglia led: led spento = stato ok,  led acceso = se c'è una pedina allora non ci deve essere(esempio mossa errata), se non c'è la pedina, ci deve essere.
per esempio mentre muovi, appena togli la pedina la casella si illuminerà per avvertirti che lì manca la pedina. se la appoggi da un'altra parte, calcola la mossa: se errata, si accende anche il led della casella in cui c'è la pedina, altrimenti si spegne il led di partenza. ciò è anche molto utile per indicare che la mossa è stata accettata, e quindi per debuggare il programma.

l'idea del led potrebbe tornare utile, magari non per ogni casella. parlando col socio abbiam pensato di aggiungere un pulsante da premere alla fine di ogni mossa (alla fine è quello che succede a scacchi quando si gioca con il cronometro: dopo ogni mossa lo si preme. abbiam già pensato ad un'eventuale integrazione con un cronometro, ma questo è un altro discorso). l'idea di aggiungere il pulsante da premere elimina qualsiasi problema dovuto all'errore umano o al cattivo posizionamento dei pezzi: interfacciandolo con due led il gioco è fatto.

ogni volta che si muove un pezzo, si preme il pulsante, e solo allora si controllato lo stato della scacchiera e si calcola la mossa effettuata: se si accende il led verde, la mossa è regolare. se si accende il rosso, c'è qualcosa che non va. quindi l'aggiunta di due leddini potrebbe tornare utile, specialmente in fase di debug.

Ci sono 2 problemi :
* La matrice di contatti reed da te proposto puó decodificare solo un reed azionato; con 2 giá non si capisce quale é azionato. Immaginati Tu decvi discriminare 32 contatti chiusi su 64. Serve aggiungere un diodo in serie a ogni contatto per poter ovviare a questo problema.

ma sono proprio necessari i diodi? leggendo con i due cicli for come ho scritto poco sopra non dovrebbe funzionare? dovrei riuscire a decodificare ogni singolo reed indipendentemente da quanti ce ne sono azionati.

* i contatti Reed sono cattivi. non funzionano cosí smplicemente come si pensa. All inteno hanno 2 linguette che se vengono polarizzate N e S indotto da un magnete esterno allineato all'asse del Reed si attraggono e chiudono il contatto. Questo vuol dire che se metti un magnete sotto ogni figura non é detto che aziona in modo affidabile il reed. Per ovviare questo puoi mettere vicino a ogni reet un piccolo mangete per "polarizzare" il reed e insieme al magnete della piedina aziona il reed.

Questo potrò verificarlo solamente con l'hardware in mano e facendo varie prove. dovrò sperimentare anchi diversi magneti e diversi spessori di plexiglas per vedere in che modo riesco ad azionarli senza errore. inoltre devo anche verificare che il magnete di un pezzo non interferisca anche sui reed delle caselle immediatamente vicine. potrebbero esistere alternative ai contatti reed per fare una roba di questo tipo?

Non vedo grandi problemi sul identificare quale piedina sia stata mossa visto che la posizione di partenza é sempre uguale. L' unico problema che vedo é quando si batte una piedina avversaria. La soliuzione potrebbe essere che per battere una piedina del avversario deve essere rimossa prima quella e poi spostata la propria.

In casi di problemi si puó fare in modo che si alza tutte le piedine in un carta sequenza per far riconoscere a Arduino le posizioni.

Ciao Uwe

Un altro problema da gestire e' che essendo molto sensibile il reed alla calamita del pezzo muovendo il pezzo si possono attivare in sequenza tutti i reed che si incontrano dalla posizione a alla b.
Bella idea cmq, potresti partire con la dama avendo solo due pezzi da gestire

l'aggiunta del pulsante da premere alla fine di ogni mossa dovrebbe risolvere anche questo problema.
Pages: [1] 2 3