Leggere un numero enorme di sensori analogici in tempo reale


17

Sto cercando di costruire un controller simile a MIDI che abbia un collo come una chitarra. Su quel collo c'è un'enorme matrice di sensori di pressione. Il controller emulerà 3 stringhe.

Il modo in cui funziona è: ci sono 3 lunghe strisce di nastro di rame biadesivo (0,5 cm di larghezza, lungo quanto il collo) che sono collegate all'alimentazione (3,3 V o 5 V probabilmente, non importa per ora). Su queste strisce è presente uno strato di Velostat, che cambia la resistività in base alla pressione. Sulla parte superiore del velostato ci sarà un altro strato di file o celle di nastro di rame, collegato a qualcosa, che sputerà una lettura della tensione attraverso lo strato di velostato. Poiché il collo è lungo circa 40 cm, ci saranno almeno 80 file.

Se immagini le 3 strisce inferiori di nastro di rame come colonne di un grafico lungo il collo, i sensori saranno o le celle o le file, a seconda del metodo di misurazione (pensavo che si potesse anche essere in grado di multiplexare le colonne, quindi potrebbero esserci delle righe.) Ci sono alcune condizioni speciali che potrebbero rendere questo più semplice: Poiché si tratta di un controller simile a una chitarra, non tutte le interazioni devono essere misurate! È importante solo il tocco più vicino al corpo del controller. Anche una risoluzione di 8 bit dovrebbe essere abbastanza accurata. 255 livelli di pressione sono probabilmente più del necessario comunque.

Ora i pezzi difficili:

La misurazione deve essere in tempo reale sufficiente per rilevare i colpi di ariete ecc. (Non ho idea di quanto sia alta la frequenza di campionamento - stimata a diversi kHz per una buona misurazione e giocabilità) e l'uscita digitale del controller dovrebbe essere MIDI (su 3 canali separati - uno per stringa) o un segnale digitale che può essere elaborato con un Raspberry Pi.

Ora, poiché le mie conoscenze sono davvero limitate, non sono riuscito a pensare agli strumenti giusti per il lavoro. Quello che so però è: è possibile. Esiste un controller simile ma diverso che utilizza una tecnica molto simile (che praticamente ho invertito fino a quando non ho notato, che hanno un brevetto e le informazioni su come lo fanno non sono così arcane come pensavo), si chiama ROLI Costa.

TL; DR:

  • circa 240 sensori

  • può essere separato in gruppi di 80 che sono alimentati dalla stessa linea

  • questa è un'applicazione in tempo reale, devo acquisire pressione da ogni sensore quando viene toccato (si applicano alcune condizioni, vedi sopra)

Grazie in anticipo, so che è molto da leggere. Sono grato per qualsiasi suggerimento e sarei molto felice se potessi aiutarmi a realizzare il terribile pasticcio che ho deciso di produrre!

Cose a cui ho pensato finora:

Righe e colonne multiplexing, lettura di ogni cella con un ADC MCP3008 o superiore e concatenamento di ATmegas (daisy chain o tree like) che spingono solo l'interazione più bassa dal punto di vista della posizione al segnale finale, ma dai miei calcoli, che potrebbe eventualmente essere strozzata da le spese generali di comunicazione. Anche un modello precedente includeva potenziometri a nastro, che ho scartato, perché il design era difettoso (diversi tentativi, non era abbastanza interessante).

EDIT / UPDATE:

Grazie per i buoni suggerimenti finora! Grazie a loro ora sono in grado di esprimere il mio problema in modo molto più chiaro:

Ho una matrice di 80 file * 3 colonne di sensori di pressione. Quando un essere umano interagisce con la matrice del sensore, diversi sensori in prossimità rilevano il tocco, ma solo lungo una colonna. Le colonne sono separate meccanicamente. I sensori hanno una resistenza tra 100 Ohm e 1 kOhm. Tutti questi sensori devono essere letti con una profondità di 8 bit, elaborati e i risultati devono essere inviati con una frequenza di almeno 1 kHz. Quindi una singola lettura / elaborazione deve richiedere meno di un millisecondo. L'output finale per colonna deve essere: 4 byte per un float32 e 1 byte per un uint8. Float32 indicherà la posizione media della prima interazione lungo la colonna. Un'interazione è definita come un gruppo consecutivo di sensori con una pressione superiore a una determinata soglia. Qui è dove l'elaborazione entra nel mix: la colonna verrà attraversata verso il basso fino a quando una lettura supera una soglia. Questo conterà quindi come l'inizio di un'interazione. La pressione e la posizione di ogni sensore vengono memorizzate fino al primo sensore, che scende al di sotto della soglia con un massimo di (probabilmente) 4 sensori consecutivi. Da tutti i sensori dell'interazione registrata, verranno elaborati solo due sensori: quello che legge la pressione più alta (resistenza più bassa) e quella più alta direttamente sopra o sotto di essa. La posizione in virgola mobile viene calcolata facendo la media delle due posizioni del sensore ponderate in base alle loro pressioni. La pressione complessiva dell'interazione sarà solo l'aggiunta di entrambe le pressioni bloccate tra 0 e 255 (aggiungere entrambe le pressioni dell'unità8 in un uint16 e dividere per 2 senza arrotondamento, scartare i bit non necessari - questo dovrebbe essere veloce). Questo deve accadere per ogni colonna. Il risultato della dimensione di 15 byte verrà quindi inviato tramite SPI a un piccolo computer (Raspberry Pi B3) che funge da sintetizzatore. Non sono impostato sul metodo di trasmissione. Se SPI non è lo strumento giusto per il lavoro, sono disposto a prendere qualsiasi metodo di comunicazione in grado di gestire un Raspberry Pi. Poiché si tratta di un'applicazione musicale-interattiva, la latenza è cruciale.

Le mie domande esatte sono: questo può essere risolto con un singolo microcontrollore senza rompere la banca? Non posso permettermi di acquistare diverse centinaia di dollari di circuiti integrati per un progetto di hobby. Quale hardware consiglieresti? Ci sono avvertimenti non ovvi di cui devo stare attento?

L'approccio che finora ho derivato dalle risposte è stato quello di alimentare ciascuna colonna singolarmente, quindi leggere le righe con 5 ADC a 16 canali (ADS7961) collegati a un Arduino su SPI. Sono preoccupato che questo potrebbe non essere l'approccio più semplice / economico o non abbastanza veloce da raggiungere una frequenza> 1 kHz.

Disclaimer: di solito sono un chimico teorico e un terribile dilettante quando si tratta di ingegneria elettrica, tutto ciò che so è autodidatta e senza alcun background professionale (che è a sua volta il motivo per cui cerco aiuto da persone più competenti). Conosco comunque il mio modo di aggirare il software. Qualunque cosa riguardi il software, lo scoprirò con abbastanza tempo. Inoltre, sono tedesco, quindi per favore scusa occasionali difetti grammaticali.


solo un'idea .... potrebbe esserci un miglioramento della velocità se i mux sono interlacciati .... mux0 scansionerebbe il tasto 0,8,16,24, ecc ... mux1 - 1,9,17,25 ... fino a mux7 (o superiore) ... in questo modo i primi 8 tasti vengono letti contemporaneamente da 8 mux ... quindi i successivi 8 tasti ... ecc.
jsotola

2
Il termine "tempo reale" potrebbe non essere esattamente quello giusto. Significa che i dati stanno lasciando il sistema alla stessa velocità con cui li inseriscono (un campione in ingresso, un campione in uscita). Ma non dice nulla sulla latenza: il tempo necessario per elaborarla. Per uso musicale, la latenza complessiva (incluso il tempo per sintetizzare / riprodurre il suono finale) deve essere inferiore a 10-15 ms, preferibilmente inferiore a 5.
Schizomorph

Qual è la variazione di resistenza tra premuto e non premuto?
Trevor_G,

tra 10 e 1000 ohm (circa)
d.oelert

I requisiti sono in qualche modo confusi con l'implementazione proposta. Potresti aver già risposto a queste domande. L'esecutore sarà in grado di eseguire una diapositiva, in modo tale che lo strumento debba essere in grado di rilevare un intervallo di posizioni tra i tasti adiacenti? Devi essere in grado di supportare uno strumento senza tasti o i tasti possono far parte della soluzione?
Wayne Conrad,

Risposte:


7

A seconda della fascia di prezzo, potresti prendere in considerazione l'utilizzo di un FPGA tra Raspberry Pi e ADC, come la scheda DE0-Nano , che offre un buon supporto come scheda di sviluppo FPGA introduttiva. Questa soluzione ha il vantaggio di consentire la scrittura di codice che sincronizzerà più / molti ADC contemporaneamente e formatterà i dati in modo presentabile a Raspberry Pi.

Hai detto che stavi considerando l'MCP3008. Questo chip è SPI, quindi è possibile connettere alcuni dispositivi sullo stesso bus con pin CS diversi. Supponiamo di aver collegato tre chip a un bus, in modo da ottenere 24 canali ADC per 6 pin (tre linee dati e tre linee CS). Ciò significa 240 canali per 60 pin, che rientra facilmente nelle capacità dell'FPGA.

Se si esegue la linea di clock MCP3008 alla sua frequenza massima di 2 MHz, sarebbero necessari (15 clock / canale) * (8 canali / chip) * (3 chip / bus) * (1/2000000 secondi / orologio) = 0,18 ms a leggere tutti i 240 sensori, corrispondenti alla frequenza di campionamento di 5,56 kHz.


sembra un approccio incredibilmente interessante! lo esaminerò sicuramente. non ho esperienza con FPGA però, quindi questo potrebbe essere troppo per me da gestire ... d'altra parte ho sempre cercato una scusa per entrare in FPGA ...
d.oelert

È possibile utilizzare un chip ARM con più linee SPI. In questo modo eviti il ​​costo FPGA e ottieni il triplo della frequenza di campionamento (se hai 3 controller SPI). Tieni presente che devi gestire i ritardi dovuti all'elaborazione interna (spostare le letture all'interno dell'MCU da qualche parte che il Pi può ottenere) e le comunicazioni MCU-> Pi.
Ronan Paixão,

A proposito, il PI ha anche un controller SPI.
Ronan Paixão,

L'idea alla base dell'FPGA è che potresti creare, diciamo, 10 controller SPI separati (usando il numero dell'esempio che ho fornito) e farli funzionare perfettamente perfettamente in parallelo. E sì, il Pi ha un controller SPI ma non è affatto veloce o parallelo come un FPGA consentirebbe di creare.
Billy Kalfus,

Se potessi trovare un FPGA o un CPLD con ingressi senza buffer, potresti persino essere in grado di creare un MUX analogico 80: 1. È un colpo lungo, ma potrebbe funzionare.
Caleb Reister,

10

La risposta ovvia è il muxing, questo significa che fai un percorso elettrico dinamicamente. Quindi basta scorrere l'intera matrice, una alla volta, o tutti gli ingressi ADC (convertitore da analogico a digitale) che hai.

Se hai 3 ADC, puoi leggere una riga alla volta, quindi modificare gli input in un mux e un voilla, ora stai leggendo la seconda riga e poi continui. Il problema con questa configurazione è che hai 80 righe e non ho alcun 80: 1 (ottanta input per un input) di cui sono a conoscenza. Ma ci sono mux 16: 1 che puoi mettere insieme per ottenere 16 * 5 = 80 input.

Sarebbe simile a questo:

row  0-15 [16:1 mux]____________ 5 inputs in [8:1 mux]-ADC
row 16-31 [16:1 mux]_| | | |
row 32-47 [16:1 mux]___| | |
row 48-63 [16:1 mux]_____| |
row 64-79 [16:1 mux]_______|

I 4 segnali di ingresso ai mux 16: 1 possono essere collegati insieme.

Quindi alla fine hai un byte con segnali di controllo in questo modello:

Grouped up:
0, 3 bits for the 8:1 mux, 4 bits for the 16:1 mux

Bit for bit:
0,8:1 MSB, 8:1 LSB+1, 8:1 LSB, 16:1 MSB, 16:1 LSB+3, 16:1 LSB+2, 16:1 LSB+1, 16:1 LSB

Ciò significa che avrai bisogno di mux 5 × 16: 1 e uno mux 8: 1 = 6 IC,

Moltiplicalo per 3 perché potresti voler leggere una riga alla volta.

Ciò significa che avrai 18 circuiti integrati, 7 segnali di controllo. È possibile ridurre il numero di circuiti integrati se si desidera aumentare il numero di ingressi analogici. È 18 con solo 3 ingressi analogici.

Se invece hai usato 240/16 = 15 IC, allora hai 15 uscite analogiche dai mux 15 × 16: 1. Quindi potresti metterlo in cascata con un mux 16: 1 o 16: 8 mux. Alla fine sarebbero 16 IC se lo "ottimizzassi" con i mux 16: 1. Ma questo significherebbe che la tua soluzione software non sarebbe così ... elegante come sopra, sarebbe incrociata e modulo e altre cose, ma ehi, salvi 2 IC.

10.8ms=1.25kHz

È possibile, ma non è un buon design.

Risolviamolo in un altro modo ... più efficiente in termini di spazio e denaro.

* 20 minuti dopo * Hmmm ... tutte le soluzioni che ho escogitato sono troppo difficili da configurare e / o richiedono una calibrazione avanzata ...

Vabbè, allora presumo che il tuo design sia appropriato per il tuo compito da svolgere.

Buona fortuna.


Mi chiedo quali siano quelle altre soluzioni. Vuoi condividere? - pandalion98

OP vuole misurare posizione e pressione. Sono due parametri. Ciò significa che dobbiamo racchiudere tali informazioni all'interno di un segnale di tensione in modo da poterle leggere e decifrare. Oppure dobbiamo impacchettarlo in qualche altra unità, come ohm, induttanza, capacità.

Ecco alcune delle mie idee, in cui penso solo a una colonna. Basta moltiplicare l'idea per 3 e hai l'intera soluzione per una chitarra a 3 colonne.

Prima idea:

Usa due fili paralleli (bassa resistenza) che vanno dal fondo della chitarra al collo della chitarra. Collegare la terra a uno dei fili nella parte inferiore della chitarra. Realizza un sistema di misura LR e misura l'induttanza e la resistenza dell'altro filo, anche nella parte inferiore.

Quando tocchi entrambi i fili con un dito, collegherai i due fili e qui ci sarà una certa induttanza. Più in alto tocchi la chitarra, più lungo sarà il circuito e maggiore sarà l'induttanza che misurerai. Più forte si preme, maggiore è la superficie tra i due fili e minore è la sua resistenza.

Non devono essere due "fili", possono essere due nastri conduttivi o qualcos'altro.

Perché non l'ho mai condiviso prima: Affinché ciò sia affidabile, è necessario calibrare i sensori per ogni individuo perché ognuno ha una diversa resistenza nella propria pelle. Ogni volta che giochi, suderai e quindi ridurrai ulteriormente la resistenza, quindi dovrai compensare questo. Tutti sudano in modo molto diverso, quindi anche questo dovrà essere calibrato per persona.

Quindi l'induttanza => posizione del dito. La resistenza => quanto forte stavi premendo.

La deviazione dei valori che misurerai sarà in nano Ω e nano H, questo significa che avrai bisogno di una conoscenza adeguata di CMRR e SNR. Altrimenti vedrai solo la tensione di rete, supponendo che ciò avvenga in ambienti chiusi. O alcune altre frequenze dal wifi o lampade o altre fonti di rumore. Quindi forse sarà necessario un filtro digitale adeguato. E ... probabilmente è già al di fuori dell'ambito delle capacità di OP e di uno sforzo mentale accettabile. Quindi questa idea viene buttata via.

Seconda idea:

Crea una superficie conduttiva piatta sulla chitarra collegata a terra.

Utilizzare un filo o nastro conduttivo o solo un conduttore piatto. Metti un po 'di vernice non conduttiva su di esso o un normale nastro non conduttivo su di esso.

Legalo attraverso la chitarra dal basso al collo della chitarra. Collega il filo nella parte inferiore della chitarra alle alte frequenze, nella gamma di centinaia di MHz. Ora inizierai a ottenere riflessi evidenti. Perché tecnicamente hai una ... cattiva linea di trasmissione in cui è protetto solo un lato.

Quindi invierai un breve impulso ad onda quadra e misurerai quanto tempo ci vuole per tornare a causa del riflesso dovuto al fatto che il tuo dito si trova sopra il filo isolato. E poi si misura l'ampiezza del picco riflesso nella parte inferiore della chitarra. Quindi il tempo del viaggio => posizione del dito. L'ampiezza del riflesso => ​​quanto forte stavi premendo.

Questa non è la cosa più semplice da configurare ... se non sai cosa stai facendo. Quindi, di nuovo, questo potrebbe essere uno sforzo eccessivo per OP da affrontare. Quindi questa idea viene buttata via.


Sarebbe simile a questo:

inserisci qui la descrizione dell'immagine

Ho assunto l'impedenza caratteristica di 150 Ω, in altre parole una linea di trasmissione molto brutta. In realtà potrebbe essere peggio, non so di non averlo mai fatto.

Ecco il link nel caso in cui qualcuno voglia fare casino.

Una delle parti più difficili sarà quella di abbinare i punti finali a una certa resistenza, per questo potrebbe essere necessario un oscilloscopio o qualche altro strumento costoso.

L'altra parte difficile sarà effettivamente misurare il TOF (Time of flight), ci sono alcuni circuiti integrati là fuori, ma non sono economici .. ma puoi sempre solo creare una sorgente di corrente costante e riempire un piccolo condensatore e poi solo leggi la tensione.

L'idea qui è che quando un dito si avvicina al filo, il dito diventerà parte del circuito e fungerà da condensatore. Più il dito è vicino, più è capacitivo. Questo è il motivo per cui la resistenza sulla punta del dito diminuirà.

https://en.wikipedia.org/wiki/Transmission_line scorrere un po 'verso il basso e vedrai che il parametro capacitivo fa parte del denominatore.

Ogni volta che un punto sul filo non corrisponde, allora ci sarà un riflesso, e puoi leggerlo sull'uscita da cui proviene il tuo segnale. Se non viene riflesso da nessuna parte, il segnale verrà interrotto in uno dei punti finali.

Più si preme verso il basso, maggiore è l'area del dito che diventa piatta => maggiore capacità dovuta all'area. Inoltre, qualsiasi materiale non conduttivo che hai tra il filo e il dito verrà schiacciato leggermente per aumentare ulteriormente la capacità.

Terza idea:

Inserisci un theremin all'interno della chitarra e misura la frequenza e l'ampiezza. Non so esattamente cosa produrrà un theremin, ma sicuramente qualcosa può essere usato.

A questo punto sto finendo le idee e dico che ho trascorso 20 minuti. Quando in realtà forse ho trascorso 10. Oh bene. Ora ho sicuramente trascorso altri 10 minuti a scrivere questo, quindi tutto sommato.


1
Sento che il debug coinvolto nel collegare 15 circuiti integrati a 3 serie di 80 sensori potrebbe essere ... significativo. Inoltre, sicuramente questa cosa non sarà mai abbastanza robusta da usare, a causa delle centinaia di fili che pendono dall'array di sensori.
BeB00,

Penso che questo sia in realtà abbastanza fattibile, e se fatto correttamente riduce la quantità di cablaggio che altrimenti sarebbe richiesto.
pjc50,

Mi chiedo quali siano quelle altre soluzioni. Vuoi condividere?
PNDA

1
@ pandalion98 Hmmm ... forse la seconda idea non è stata poi una cattiva idea. Oh bene.
Harry Svensson,

6

Tre idee:

1. Esegui il multiplexing sul lato alimentazione

In effetti, il circuito che hai descritto è un gran numero di resistenze variabili ciascuna con un'estremità in comune con una tensione di alimentazione. Volete leggere tutti i valori di resistenza e le altre risposte finora hanno suggerito principalmente approcci al multiplexing del segnale sul lato analogico.

Ma potresti anche fare tutto o parte di questo multiplexing dal lato dell'offerta , dividendo la 'guida' dell'offerta in n sezioni. Collegare insieme set di n pad per sensori che hanno ciascuno una guida di alimentazione diversa. Ora eccita solo una guida di alimentazione alla volta e usa un ingresso ADC per leggere ogni set di pad. (Questo è il modo in cui di solito funziona il circuito che legge la tastiera di un computer, e il modo in cui gli interruttori sono cablati viene spesso chiamato 'interruttore crosspoint'.) Alla fine potresti semplicemente usare un singolo ADC, collegato a tutti i 'binari', e fare tutto il multiplexing collegando l'alimentazione a ciascun pad a sua volta.

L'unico problema è che tutti gli altri pad devono essere isolati dalla barra di alimentazione, non collegati a terra, il che sarebbe il caso se si utilizzasse solo un'uscita digitale per ognuno. Esistono diversi modi per risolverlo, incluso il cablaggio di ciascun pad tramite un diodo, un transistor bipolare o un FET, oppure - non so quanto velocemente si possa fare in pratica, ma è possibile in linea di principio - usare il pin input-output di un microcontrollore e impostarlo su output alto o essere un input, quando dovrebbe avere un'impedenza relativamente alta.

L'accuratezza della misurazione dei sensori con questa tecnica potrebbe non essere perfetta rispetto all'utilizzo di una singola sorgente di tensione fissa e multiplexer analogici di alta qualità, ma sospetto che sarà abbastanza buono soprattutto perché sono sicuro che i sensori di pressione avranno una certa tolleranza su la loro resistenza - potrebbe essere necessario calibrarlo per ogni sensore usando comunque una forza di riferimento.

2. Utilizzare alcuni microcontrollori con molti ingressi ADC

Ad esempio, il PICAXE 40X2 ha 27 pin che possono essere utilizzati come analogici, in modo da poter coprire le tue esigenze con 9 di essi. È programmato in un semplice linguaggio BASIC e può agire come uno slave i2c - in modo da poter leggere i 9 chip con un ulteriore microcontrollore - o probabilmente potresti semplicemente inviare l'output da ciascun chip come dati seriali e leggerlo sul computer host tramite convertitori da seriale a USB. Non posso promettere esattamente quanto andrà veloce, ma penso che dovrebbe funzionare bene se si sincronizza PICAXE alla massima velocità (di 64 MHz, utilizzando un risonatore esterno a 16 MHz). Naturalmente, se sei soddisfatto della programmazione del microcontrollore in C, puoi fare la stessa cosa con il PIC18F45K22 su cui si basa PICAXE.

3. Utilizzare unità di input analogiche standard

Infine, se non ti dispiace spendere soldi per risparmiare tempo, e la portabilità non è una priorità assoluta, ad esempio, se è corretto collegare lo strumento a un rack per apparecchiature con alcuni cavi spessi, puoi semplicemente acquistare abbastanza conteggio dei canali dei dispositivi di input analogici per misurare tutti i sensori contemporaneamente. Ad esempio, il Measurement Computing USB-2633 legge 64 ingressi analogici per poco più di US $ 1k.


4

Potrebbe valere la pena considerare un condizionamento del segnale di forza bruta (forse passivo) seguito da piccoli ADC o MCU / ADC con 16 o più ingressi ADC MUX ciascuno. Sono solo 40 gettoni. Un esempio di un chip che potrebbe funzionare è ADS7961QDBTRQ1 , che ha una modalità di canale di auto-incremento e 16 ingressi.

La velocità dati complessiva anche a una frequenza di campionamento di 4 kHz e 240 byte per campione è di circa 1 MB / s, il che non è troppo spaventoso. Forse una CPU master con un bus SPI da 10 MHz o 20 MHz che comunica con gli slave. Utilizzare 2 bus SPI se la larghezza di banda non è presente. La parte sopra menzionata funziona a 20 MHz, quindi lo farà un singolo SPI.

O forse puoi usare un singolo chip TI: il DDC2256AZZF , che ha un campionamento simultaneo a 64 canali e 256 ingressi .. ma non è particolarmente economico (circa $ 350 USD) e viene fornito in un array LFBA da 14x14mm a 323 pin, quindi non lo farà lavorare con una breadboard plugboard bianco.


3

Per un'applicazione di interfaccia umana in tempo reale, una frequenza di campionamento complessiva di multi-khz sembra elevata. 50Hz è probabilmente sufficiente ( https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times ). Questo significa che devi campionare tutti i sensori in <20ms, quindi 80us per sensore. Questo non è troppo difficile e può essere gestito praticamente da tutti i normali microcontrollori a 8 bit (cioè Atmega88 può farlo in <30us).

Potresti anche misurare tutte le interazioni e poi scartare quelle che non ti servono, visto che misurarle tutte non è tecnologicamente difficile. Il problema deriva dal multiplexing. Sono un po 'confuso al tuo post, perché dice che i sensori sono alimentati 80 alla volta? La solita cosa da fare è, come dici tu, colonne e righe multiplex. Se non lo fai, dovrai gestire> 80 fili che escono dal tuo dispositivo, il che non è una grande idea. Devi trovare un modo per dividerlo in una matrice, in modo da ottenere 30 fili (che è ancora molto). Potresti quindi multiplexarli ecc., Ma se fossi in te avrei solo più microcontrollori e li collegherei a un master. È possibile utilizzare un ADC dedicato anziché gli MCU slave, ma personalmente rimarrei con gli MCU.

Hai correttamente identificato che le comunicazioni potrebbero essere un problema, ma questo non è un grosso problema, almeno tra le MCU. Un Atmega a 8 MHz può fare SPI a 2 MHz, quindi l'invio di tutti i dati del sensore richiederà <1ms. La domanda quindi è cosa vuoi fare con questi dati dopo che l'MCU master ce l'ha.


2
Quando si reagisce a un singolo ingresso 50 Hz è generalmente considerato "sufficiente" in termini di GUI generale, ma dalla mia esperienza con le schede audio, riprodurre musica con una latenza di 200 ms non è affatto un'esperienza piacevole (si pensi a un jamming vocale). Immagino che una latenza variabile di 0-200 ms renderebbe lo strumento praticamente ingiocabile, poiché ogni senso di ritmo sarebbe sicuramente ucciso. Una frequenza di polling di circa un kHz sarebbe un buon punto di partenza minimo, pensa.
Dampmaskin,

1
@Dampmaskin 50 Hz = 20ms, non 200ms. 20ms è probabilmente più ragionevole
Steven Waterman

1
Colpa mia. 20 ms probabilmente possono essere utilizzabili se si tratta di 20 ms consenzienti, ma una latenza inferiore è sempre migliore. Ci sarà sempre più latenza in seguito nella catena del segnale comunque.
Dampmaskin,

@Dampmaskin questo è esattamente il problema che vedo con l'approccio descritto. ho bisogno di "salvare" quanta più latenza possibile per i componenti successivi della catena, poiché sto cercando di collegare un synth Raspberry Pi e idealmente mi piacerebbe rimanere al di sotto di 15-20ms di latenza totale. Se il controller occupa già 20 ms, non rimane spazio per la testa.
d.oelert,

@StevenLowes 20ms è troppo lungo per la maggior parte dei musicisti. Questo è anche al di fuori della distanza di Haas per alcuni suoni. Personalmente non riesco davvero a gestire una latenza superiore a 10 ms e conosco un pianista che semplicemente non può sopportare una latenza di 6 ms.
Todd Wilcox,

3

Il metodo più semplice potrebbe essere quello di costruire il tutto su un lungo circuito flessibile con una catena di 10 seriale a collettore aperto da 8 bit a registri paralleli distribuiti lungo il flex per alimentare ciascuna colonna di pad singolarmente.

Puoi usarli per guidare ogni colonna in tutte le righe contemporaneamente e multiplexare le linee di ritorno comuni al tuo ADC. Le linee di ritorno avrebbero bisogno di pull-up appropriati in modo da ottenere una tensione del divisore della resistenza con la resistenza del pulsante.

schematico

simula questo circuito - Schema creato usando CircuitLab

Il micro di controllo invierebbe quindi un singolo bit zero lungo la catena di registri in modo da alimentare solo una colonna alla volta. Le connessioni rimanenti sarebbero fluttuanti.


1

il modo ovvio per farlo (visto che è sufficiente vedere un solo tocco su ciascuna stringa) è quello di collegare i tasti a un divisore di tensione e quindi misurare la tensione su ogni stringa

che ti dirà toccando la posizione.

per ottenere la pressione al tocco, posizionare un condensatore da terra su ciascun tasto e misurare la resistenza CA su ciascuna corda.

il lato negativo di questo approccio è che le stringhe risponderanno a tocchi più elevati


2
scusate se avete frainteso ma non c'è nessun vero manico di chitarra coinvolto e nemmeno corde. è solo una tavola di legno con una matrice di sensori di pressione sulla parte superiore, che emula lo stile di gioco che utilizzeresti su una vera tavola frittata. Grazie per l'input, potrei tenerlo a mente per progetti futuri!
d.oelert,

per tasti e archi sopra intendo le strisce di rame che menzioni nella tua domanda,
Jasen

ah capisco cosa intendi adesso, scusa se era denso. questo approccio potrebbe interrompersi, quando le note vengono suonate legato, perché in questo caso ci saranno inevitabilmente più tocchi sulla stessa stringa. solo le cose più basse però
d.oelert il

anche se mi piace molto il tuo approccio, questo non risponde alla mia domanda originale, che è come si dovrebbe in genere gestire un gran numero di sensori analogici, che devono essere elaborati in tempo reale.
d.oelert

le telecamere hanno un gran numero di sensori analogici ...
Jasen,

0

Se riesci a ottenere del filo che ha una resistenza per pollice ragionevolmente uniforme compresa tra 100 ohm e 100 K per la lunghezza della chitarra, potresti essere in grado di realizzare semplicemente il collo di un materiale moderatamente conduttivo, con una resistenza superficiale che diminuisce con la pressione, quindi misura la resistenza tra il collo e ciascuna estremità di ogni corda. La somma delle resistenze, meno la resistenza di una stringa, indicherebbe il doppio della resistenza del punto di contatto. Dopo aver sottratto la resistenza del punto di contatto da ciascuna resistenza misurata, il rapporto delle resistenze rimanenti indicherebbe il punto di contatto sul collo.

Si noti che questo approccio sarebbe in grado di rilevare pressioni simultanee su tutte e tre le stringhe, ma non funzionerebbe se una stringa potesse essere premuta in più punti. Su una chitarra, un tale design impedirebbe l'uso di accordi di barre - una limitazione piuttosto grave - ma altri strumenti potrebbero non richiedere il tocco di corde in più punti.


" Se riesci a ottenere del filo che ha una resistenza per pollice ragionevolmente uniforme compresa tra 100 ohm e 100 K per la lunghezza della chitarra ", dubito che possa trovare quel tipo di filo.
Harry Svensson,

Non sono d'accordo; Ho un filo di resistenza nel mio ufficio che è 1717 ohm / m, quindi non dovrebbe essere difficile da trovare. Non sto dicendo che sia facile da lavorare, visto che si tratta di un filo Ø50 µm, ma non è difficile da acquisire.
Mr Gerber

@MrGerber: avevo dimenticato che la resistenza del filo di nicromo è molto più bassa a temperature più fredde di quelle più calde, e quindi probabilmente sarebbe meglio cambiare il circuito per lavorare su qualcosa di più vicino a 10 ohm, ma il concetto di base potrebbe essere lavorato. In alternativa, avere il collo essere un materiale debolmente conduttivo e fare in modo che le stringhe si colleghino a quello potrebbe funzionare.
supercat

Questo non è NiCr, ma FeCrAl, e la resistenza non sta cambiando molto al di sopra della temperatura. Il tipo che ho sta cambiando di circa l'8% da 100 C a 1300 C. Rif: Kanthal D (E no, non sto facendo E-cigs.)
MrGerber

@MrGerber: Okay, non è male. In risposta al commento precedente avevo cercato alcune tabelle e visto resistenze che aumentavano di un ordine di grandezza con la temperatura.
supercat

0

Ho visto questo post e stavo pensando, potrebbe essere possibile con un singolo chip. Vorrei che ti prendessi una specie di scheda microcontrollore, come la scheda bluepill economica. Ha un ARM M3, con 10 canali ADC gratuiti da usare. Se metti le colonne in 3 cluster di 3 stringhe, collegale a 9 canali ADC gratuiti. Usa gli altri 21 pin per alternare le file di pin, per un totale di 63 "tasti". matrice di connessione, i resistori sono le celle del velostato, le unità gpio a 3,3 V o sono in modalità di ingresso, i pin ADC misurano la caduta di tensione attraverso la cella del velostato Il microcontrollore ha due ADC da 1 Msps a 12 bit che possono essere utilizzati con ritardo di fase per supportare 2 Msps, che dovrebbero essere sufficienti per non perdere mai un martello o notare alcuna modulazione. Penso che tu possa usare la connessione USB e far funzionare la cosa come un controller midi USB. Potresti usare un microcontrollore più grande per più input, ma non vedo come gestirai la spaziatura dei tasti con più di 30 tasti, o sarà più simile a un touchscreen?

Non so esattamente come funzionano quei fogli velostat, ma non riesci a mettere come piccoli punti di terminazione sul fondo di un foglio più grande e correlare la posizione e la pressione del dito alla tensione in più punti? Quindi probabilmente puoi cavartela con molto meno rilevamento e supportare cose come curve e vibrato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.