Oscilloscopio con scheda audio

Ciao a tutti,

Volevo realizzare un oscilloscopio con Arduino ma sopratutto per Arduino e i miei esperimento con gli infrarossi ma sono giunto però alla conclusione che la seriale è troppo lenta per trasferire i dati necessari per campionare a 40 KHz nonostante l'analogRead con prescaler impostato a 16 sia in grado, seppur con imprecisione, di campionare a 77 KHz.

Avevo pensato di memorizzare i dati nella ram o in una eeprom per un replay in differita di un intervallo di qualche secondo e di passare poi questi dati compressi con qualche algoritmo tramite la seriale ma la scrittura su eeprom 24LC256 raggiunge un massimo di 12,8 kbyte/s stando al datasheet e quindi ho scartato l'idea.
*Datasheet 24LC256 : 5ms max write cycle time (byte or page), dato che una pagina è 64 bytes, ottengo (1/0.005)*64=12.800 bytes al secondo

La mole di dati è infatti data, considerando un campionamento minore di 38.400Hz ed una precisione di 8 bit invece di 10 (tanto col prescaler diminuito si ottengono risultati più approssimati) è di ben 38,4 kbyte/s.

La ram interna è decisamente troppo piccola (1 Kb) e quindi non dispongo di interfaccie di output per comunicare col pc.

Mi è sorta dunque un'idea pensando a questo insormantabile a prima vista problema: utilizzare la scheda audio del computer?
Dovrebbe disporre almeno di un campionamento di 44100 Khz e 16 bit di risoluzione (qualità CD) quindi potrebbe andare bene per i miei esperimenti con gli infrarossi, ora vi chiedo:

-Qualcuno a già provato?
-Come posso evitare di fare danni al computer? Quali precauzioni posso prendere? Devo tenere conto di effetti capacitivi/induttivi particolari?
-Avete qualche informazione su come "sondare" un segnale dalla breadboard e leggerlo tramite scheda audio

Nota: Dispongo di un jack da 3.5 vergine quindi potrei iniziare a costruire "la sonda"

Ciao a tutti e grazie per la vostra partecipazione

La massima quantità di dati per volta che puoi trasferire verso una EEPROM I2C è 30 byte perché il buffer I2C è di 32 byte: 2 byte vengono usati per l'indirizzo e gli altri 30 per i dati.

La SRAM interna è di 2 KB, cmq sempre poca.

Per la scheda audio, personalmente non ci ho provato ma esistono alcuni software che fanno questa operazione. Si chiamano software sampler e sono programmi tipo gigastudio, HALion, Kontakt. Poi non li conosco in dettaglio, ripeto: mai usati.

EDIT:
qui un lungo elenco:

flz47655:
Volevo realizzare un oscilloscopio con Arduino ma sopratutto per Arduino e i miei esperimento con gli infrarossi ma sono giunto però alla conclusione che la seriale è troppo lenta per trasferire i dati necessari per campionare a 40 KHz nonostante l'analogRead con prescaler impostato a 16 sia in grado, seppur con imprecisione, di campionare a 77 KHz.

Guarda che se hai un Arduino con FTDI puoi dialogare con il PC fino a 1 Mbit/s, ovvero 125 kByte/s, decisamente molto più veloce del ADC.

Se c'è un'interfaccia così veloce allora cambiano molte cose e slitta l'utilizzo della scheda audio che comporta maggiori rischi di danneggiare il pc.

Ora però sorgono alcune domande a cui non ho trovato risposta con Google:
-Come posso scrivere su FDTI con arduino? Con la seriale avevo Serial.write()
-Come posso leggere da FDTI con il pc? Con la seriale configuravo i miei programmi sulla porta COM

flz47655:
Ora però sorgono alcune domande a cui non ho trovato risposta con Google:
-Come posso scrivere su FDTI con arduino? Con la seriale avevo Serial.write()

L'FTDI è collegato alla seriale, basta che metti Serial.begin(1000000); e la Vcom sulla USB lavorerà a questa velocità.
Puoi facilmente verificarlo con uno qualunque degli sketch demo di Arduino, p.e. quello che stampa la tabella ASCII, modifica la Serial.begin(), apri la Vcom sul pc con programma emulazione terminale che ti permette di impostare 1 mbps e sei pronto per il test.
Ovviamente se vuoi spedire le letture ADC senza perderle devi bypassare wiring sia per la lettura del ADC che per l'invio dei dati sulla seriale, se non lo fai i vari colli di bottiglia imposti da wiring non ti permettono di inviare dati con quella velocità in modo continuo.

Serial.begin() - Arduino Reference dice che al massimo si può impostare 115200, come mai?

For communicating with the computer, use one of these rates: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200. You can, however, specify other rates - for example, to communicate over pins 0 and 1 with a component that requires a particular baud rate.

C'è scritto quali sono i valori standard per la comunicazione con il pc, ma c'è anche scritto che puoi usare valori diversi, non è indicato nessun limite massimo che è dato dall'UART del micro e il clock, con 16 MHz 1 Mbps è il massimo possibile.
Se non ci credi fai la prova che ti ho indicato e vedrai da solo che funziona.

Rivedendo i "pezzi" che ho in casa mi è venuta un'idea:
E' possibile utilizzando un ATTiny 85 standalone (eventulmente a 20 MHz tramite oscillatore esterno) e collegarsi ai pin 1 e 2 di una scheda Arduino Uno per trasmettere attraverso la sua USB ad almeno 1 Mbit/s?
In questo modo avrei un micro dedicato solo alla funzione di oscilloscopio senza però la necessità di avere un altra porta USB, altri chip FDTI, etc..

flz47655:
E' possibile utilizzando un ATTiny 85 standalone (eventulmente a 20 MHz tramite oscillatore esterno) e collegarsi ai pin 1 e 2 di una scheda Arduino Uno per trasmettere attraverso la sua USB ad almeno 1 Mbit/s?

Per farlo devi tirare via l'ATmega 328 da Arduino, abbastanza scomodo e alla lunga rompi qualche pin, dovresti prendere un convertitore USB basato su FTDI standalone, ma a questo punto ti conviene spendere qualcosina in più e prenderti un piccolo dso standalone come questo, hai 2 Megasamples/s, stadio amplificato d'ingresso e ha il suo schermo lcd, se cerchi in giro lo trovi ad un prezzo sensibilmente minore di quello praticato da Futura Elettronica.

Grazie Astrobeed per la risposta,
Ma perchè dovrei togliere il 328 se voglio solo inviare e non ricevere?
Non posso agganciarmi al pin 1 e basta e utilizzare così l'usb lasciando il micro al suo posto mentre è acceso?
Quali danni rischio di fare?

PS: Il link non funziona, punta all'home page e non al prodotto

flz47655:
Grazie Astrobeed per la risposta,
Ma perchè dovrei togliere il 328 se voglio solo inviare e non ricevere?

Perché ad RX del FTDI è collegato il Tx del ATmega, due TX in parallelo non vanno molto d'accordo.

PS: Il link non funziona, punta all'home page e non al prodotto

Adesso funziona.

In che senso non vanno d'accordo? Se non uso Serial.begin sul 328 tutto dovrebbe andare liscio. Nella documentazione leggo:

Digital Pins 0-1/Serial In/Out - TX/RX (dark green) - These pins cannot be used for digital i/o (digitalRead and digitalWrite) if you are also using serial communication (e.g. Serial.begin).

Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data. On the Arduino Diecimila, these pins are connected to the corresponding pins of the FTDI USB-to-TTL Serial chip. On the Arduino BT, they are connected to the corresponding pins of the WT11 Bluetooth module. On the Arduino Mini and LilyPad Arduino, they are intended for use with an external TTL serial module (e.g. the Mini-USB Adapter).

O c'è qualche problema di tipo elettronico tipo tipo qualche effetto capacitivo o altro?
Grazie ancora

flz47655:
In che senso non vanno d'accordo? Se non uso Serial.begin sul 328 tutto dovrebbe andare liscio. Nella documentazione leggo:

Nel senso che se su Arduino c'è caricato uno sketch che utilizza la seriale, praticamente quasi tutti, metti in corto il TX dell'ATmega con quello dell'ATTiny, il rischio di fare danni è quasi nullo, però non puoi comunicare sulla seriale.
Se ogni volta che usi "l'oscilloscopio" devi caricare su Arduino uno sketch che ti disattiva sicuramente la seriale allora tanto vale che carichi direttamente lo sketch per trasformarlo in un oscilloscopio senza usare un micro dedicato.

Ok, allora il problema non esiste e posso procedere.
Sostanzialmente le ragioni per utilizzare un micro dedicato a ruolo di oscilloscopio sono:

  • Si può clockare a 20 Mhz facilmente
  • Fa solo quello
    e portano entrambe a tempi di campionamento minori e quindi una maggiore frequenza.

Il micro "principale", il 328 è libero di svolgere altri compiti che non richiedono la seriale. Se il 328 si mettesse anche a campionare per l'oscilloscopio sarebbe per forza di cose molto più lento nel campionamento e il codice si complicherebbe parecchio visto che non ci sono thread o cose del genere.

Grazie a tutti, vi terrò aggiornati se funziona dopo le prime prove

flz47655:
Ok, allora il problema non esiste e posso procedere.
Sostanzialmente le ragioni per utilizzare un micro dedicato a ruolo di oscilloscopio sono:

  • Si può clockare a 20 Mhz facilmente
  • Fa solo quello

C'è il piccolo problemino che gli ATtiny non hanno l'UART, hanno l'USI che non è la stessa cosa e non possono dialogare a 1 Mbps, di usare la seriale software non se ne parla proprio.

C'è il piccolo problemino che gli ATtiny non hanno l'UART, hanno l'USI che non è la stessa cosa e non possono dialogare a 1 Mbps, di usare la seriale software non se ne parla proprio.

In più non possono lavorare a 20MHZ ma solo a 12MHZ, poi se tollerano anche 20MHZ non lo so.

Ciao.

MauroTec:
In più non possono lavorare a 20MHZ ma solo a 12MHZ, poi se tollerano anche 20MHZ non lo so.

Dipende da quali hai, se sono con la V (tensione minima 1.8V), p.e. ATtiny85V, al massimo 10 MHz se alimentati con più di 2.7V, se sono senza V e con un -20, p.e. ATtiny85-20, arrivano a 20 MHz se alimentati con più di 4.5V.

Dipende da quali hai, se sono con la V (tensione minima 1.8V), p.e. ATtiny85V, al massimo 10 MHz se alimentati con più di 2.7V, se sono senza V e con un -20, p.e. ATtiny85-20, arrivano a 20 MHz se alimentati con più di 4.5V.

Ok, non lo sapevo, comunque la sigla è differente giusto, ho postato perchè questi dati me li sono trovato davanti di recente mentre creavo le GUI per avrdudequi.

Grazie, ne terro conto in futuro.

Segnalo questo software, che i più già conosceranno: Visual Analyser