实时读取大量的模拟传感器


17

我正在尝试构建一个像吉他一样脖子的类MIDI控制器。在那个脖子上,有巨大的压力传感器矩阵。控制器将模拟3个字符串。

它的工作方式是:有3条长条状的双面铜带(宽度为0.5厘米,与脖子长一样),它们与电源(可能是3.3V或5V,暂时无关紧要)相连。在这些条带上是一层Velostat,可根据压力改变电阻率。在速凝器的顶部将是另一层连接到某物的铜带行或单元,其通过速凝器层吐出电压读数。由于脖子长约40厘米,因此将至少有80行。

如果您将底部的3条铜带想象成沿着脖子的图表列,则传感器将是单元格还是行,具体取决于测量方法(我认为一个人也可以多路复用这些列,然后有一些特殊条件可能会使此操作变得更容易:由于这是一个类似吉他的控制器,因此不需要测量每个交互!只有最接近控制器主体的触摸才重要。8位的分辨率也应该足够准确。255个压力水平可能仍然超出了需要。

现在的困难点:

测量必须足够实时,以检测锤击等。(不知道需要多高的采样率-为了获得良好的测量和可玩性,需要以几kHz的频率估算),并且控制器的数字输出应为MIDI(在3个单独的通道上-每个字符串一个)或可以用Raspberry Pi处理的数字信号。

现在,由于我的知识真的很有限,所以我想不出合适的工具来完成这项工作。我所知道的是:有可能。有一个相似但不同的控制器,它使用了非常相似的技术(我实际上对其进行了逆向工程,直到我注意到他们拥有专利,并且关于其操作方式的信息并不像我想的那样神秘),这称为ROLI海岸。

TL; DR:

  • 大约240个传感器

  • 可以分成80组,由同一条线路供电

  • 这是一个实时应用程序,我需要从触摸的每个传感器获取压力(某些条件适用,请参见上文)

在此先感谢您,我知道这里有很多书。我很感谢您的任何建议,如果您能帮助我完成我打算制造的可怕混乱,我将非常高兴!

到目前为止,我想到的是:

多行和多行复用,使用MCP3008或更大的ADC读取每个单元并链接(菊花链或类似树的)ATmega,这只会将位置最低的交互作用推向最终信号,但是从我的计算来看,这可能会成为瓶颈通讯开销。还有一个较早的型号包括带状电位器,由于设计不好(多次尝试,效果还不够好),我已将其丢弃。

编辑/更新:

感谢到目前为止的好建议!多亏了他们,我现在能够更清楚地表达我的问题:

我有一个80行* 3列的压力传感器矩阵。当人与传感器矩阵进行交互时,附近的多个传感器将仅沿一列进行触摸。列是机械分离的。传感器的电阻介于100 Ohm和1 kOhm之间。所有这些传感器都需要以8位的深度进行读取,处理并以至少1 kHz的速率发送结果。因此,一次读取/处理所需的时间不到一毫秒。每列的最终输出需要为:对于float32为4个字节,对于uint8为1个字节。float32将指示沿该列的第一次互动的平均位置。交互被定义为压力高于某个阈值的连续传感器簇。这是处理混在一起的地方:色谱柱将向下移动,直到读数超过阈值。然后将其视为交互的开始。存储每个传感器的压力和位置,直到第一个传感器下降到阈值以下(最多(可能)有四个)连续传感器为止。从记录的交互的所有传感器中,将只处理两个传感器-读取最高压力(最低电阻)的传感器,而直接读取最高压力或最高压力的传感器。浮点位置是通过将两个传感器位置的压力加权平均后得出的。交互的总压力将只是两个夹在0和255之间的压力之和(将unit8的两个压力相加到uint16中并除以2而不舍入,丢弃不需要的位-这应该很快)。这需要在每一列上进行。然后将15字节大小的结果通过SPI发送到充当合成器的小型计算机(Raspberry Pi B3)。我对传输的方法没有兴趣。如果SPI不是适合该工作的工具,我愿意采用Raspberry Pi可以处理的任何通信方法。由于这是一种音乐互动应用程序,因此延迟至关重要。

我的确切问题是:可以用一个微控制器解决这个问题而又不会花很多钱吗?我买不起价值数百美元的集成电路用于一个业余项目。您会推荐什么硬件?我需要警惕一些非显而易见的警告吗?

到目前为止,我从答案中得出的方法是分别给每一列供电,然后用5个通过SPI连接到Arduino的16通道ADC(ADS7961)读出行。我担心这可能不是最简单/最便宜的方法,或者不够快而无法达到> 1 kHz的速率。

免责声明:在电气工程方面,我通常是一名理论化学家,并且是一名糟糕的业余爱好者,我所知道的一切都是自学成才的,并且没有任何专业背景(这又是我寻求知识渊博的人的帮助的原因)。我确实知道围绕软件的方式。关于软件的任何事情,我都会花足够的时间解决。另外,我是德国人,所以请原谅语法缺陷。


只是一个主意...如果将多路复用器交错,则可能会提高速度....多路复用器0将扫描品格0、8、16、24等...多路复用器-1,9,17,25 ...最多达到mux7(或更高)...这样,先由8个muxes同时读取8个
品格,

2
术语“实时”可能不完全正确。这意味着数据以与进入系统时相同的速率离开系统(一个样本输入,一个样本输出)。但这并没有说明延迟-处理时间。对于音乐用途,您需要使总体延迟(包括合成/播放最终声音的时间)小于10-15毫秒,最好小于5毫秒
。– Schizomorph

按下和未按下之间的电阻变化是多少?
Trevor_G

大约在10到1000欧姆之间
d.oelert

要求与提议的实施混合在一起。您可能已经回答了这些问题。表演者能够演奏一张幻灯片,从而使乐器需要能够检测到相邻琴格之间的位置范围吗?您是否需要能够支持无品琴的乐器,还是可以将品品作为解决方案的一部分?
韦恩·康拉德

Answers:


7

根据您的价格范围,您可能需要考虑在Raspberry Pi和ADC之间使用FPGA,例如DE0-Nano板,它作为入门FPGA开发板具有良好的支持。该解决方案的优点是允许您编写代码,这些代码将同时为多个ADC计时,并以可呈现给Raspberry Pi的方式格式化数据。

您提到您正在考虑使用MCP3008。该芯片是SPI,因此您可以将多个设备通过相同的CS引脚连接到同一条总线上。假设您将三个芯片连接到总线,那么每个6针(三个数据线和三个CS线)将为您提供24个ADC通道。这意味着240个通道可连接60个引脚,这很容易在FPGA的功能范围内。

如果以最大频率2MHz运行MCP3008时钟线,则需要(15个时钟/通道)*(8个通道/芯片)*(3个芯片/总线)*(1/2000000秒/时钟)= 0.18ms读取所有240个传感器,对应于5.56kHz的采样率。


听起来很酷!我一定会调查的。我虽然没有FPGA的经验,所以这可能对我来说太难了……另一方面,我一直在寻找进入FPGA的借口...
d.oelert

您可以将ARM芯片与多条SPI线一起使用。这样,您可以避免FPGA的成本,并获得三倍的采样率(如果您有3个SPI控制器)。请记住,由于内部处理(将MCU内的读数移动到Pi可以到达的地方)和MCU-> Pi通讯所致,您必须管理延迟。
RonanPaixão18年

顺便说一下,PI还具有一个SPI控制器。
RonanPaixão18年

FPGA的思想是,您可以制作10个独立的SPI控制器(使用我提供的示例中的数字),并轻松地完美并行地操作它们。是的,Pi有一个SPI控制器,但它远不及FPGA使创建一个FPGA的速度或并行度高。
比利·卡尔夫斯

如果您可以找到带有无缓冲输入的FPGA或CPLD,甚至可以创建80:1模拟MUX。这是一个长镜头,但可能会起作用。
Caleb Reister

10

显而易见的答案是混合,这意味着您可以动态创建电气路径。因此,只需一次遍历整个矩阵,或者遍历尽可能多的ADC(模数转换器)输入即可。

如果您有3个ADC,那么您一次可以读取一行,然后将输入更改为多路复用器和本机,现在您正在读取第二行,然后继续。这种设置的问题是您有80行,而我所知道的却没有任何80:1(80个输入到一个输入)的多路复用器。但是,您可以将16:1多路复用器放在一起以获得16 * 5 = 80输入。

它看起来像这样:

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]_______|

可以将连接到16:1多路复用器的4个输入信号连接在一起。

因此,最终,您在此模式下有了一个带有控制信号的字节:

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

这意味着您将需要5×16:1多路复用器和一个8:1多路复用器= 6个IC,

将其乘以3,因为您可能想一次读取一行。

这意味着您将拥有18个IC,7个控制信号。如果要增加模拟输入的数量,则可以减少IC的数量。它只有18个模拟输入,只有18个。

如果改用240/16 = 15个IC,则从15×16:1多路复用器中可获得15个模拟输出。然后,您可以将其与16:1多路复用器或16:8多路复用器级联。最后,如果使用16:1多路复用器对其进行“优化”,则将是16个IC。但这意味着您的软件解决方案不会像上面那样优雅……它将是纵横交错的和模数等,但是,您节省了2个IC。

1个0.8s=1.25ķHž

有可能,但这不是一个好的设计。

让我们以另一种...更节省空间和更多金钱的方式解决这个问题。

* 20分钟后*嗯...我提出的所有解决方案都太难设置和/或需要进行一些高级校准...

哦,那么,我认为您的设计适合您的手头工作。

祝你好运。


我想知道其他解决方案是什么。想要分享?– pandalion98

OP希望测量位置和压力​​。那是两个参数。这意味着我们需要将该信息打包在电压信号中,以便我们可以读取并解密它。或者我们需要将其包装到其他单位中,例如欧姆,电感,电容。

这是我的一些想法,我只考虑一栏。只需将想法乘以3,就可以得到三列吉他的完整解决方案。

第一个想法:

使用两条平行线(低电阻)从吉他的底部到吉他的颈部。将接地线连接到吉他底部的一根导线。制作一个LR测量系统,并测量位于底部的另一根导线的电感和电阻。

当您用手指触摸两条导线时,您将连接两条导线,并且此处会有一些电感。您接触的吉他越远,电路越长,您将测得的电感就越大。按下的力度越大,两条线之间的表面积就越大,其电阻就越小。

它不必是两条“电线”,也不必是两条导电胶带或其他东西。

为什么我以前没有分享过这个信息:为了使它可靠,您需要为每个人校准传感器,因为每个人的皮肤电阻值都不同。每当您玩游戏时,您都会出汗,因此会进一步降低阻力,因此您需要对此进行补偿。每个人的出汗方式都大不相同,因此这也必须按人进行校准。

因此,电感=>手指的位置。阻力=>压迫力。

您将测量的值的偏差将在纳Ω和纳H中,这意味着您将需要一些有关CMRR和SNR的适当知识。否则,假设将在室内完成操作,您将看到的只是电源电压。或来自wifi或灯的其他一些频率或其他一些噪声源。因此,也许将需要一个合适的数字滤波器。而且...这可能已经超出了OP的能力和可接受的精神努力范围。因此,这个想法被抛弃了。

第二个主意:

在接地的吉他上制作平坦的导电表面。

使用一根电线或导电胶带,或仅使用扁平导体。在其上放置一些非导电涂料,或在其上放置一些常规的非导电胶带。

从吉他的底部到脖子将其绑在吉他上。将吉他底部的导线连接到数百MHz范围内的高频。现在您将开始获得明显的思考。因为从技术上来讲,您得到了一个...。传输线不良,仅一侧被屏蔽。

因此,您将发送一些短方波脉冲,并测量由于手指在绝缘电线上而引起的反射,使其返回需要多长时间。然后测量吉他底部反射尖峰的幅度。因此,行进时间=>手指的位置。反射的幅度=>按压的力度。

如果您不知道自己在做什么,那不是最容易的事情。再次重申,这对于OP来说可能太费力了。因此,这个想法被抛弃了。


它看起来像这样:

在此处输入图片说明

我假设特性阻抗为150Ω,换句话说,传输线非常糟糕。实际上,情况可能更糟,我不知道我从未这样做过。

如果有人想弄乱的话,这里是链接

最困难的部分之一是将端点与某个电阻匹配,因为这可能需要示波器或其他昂贵的仪器。

另一个困难的部分是实际测量TOF(飞行时间),那里有一些IC,但是它们并不便宜..但是您总是可以制作一个恒定电流源并填充一个小电容器,然后读取电压。

这里的想法是,当手指靠近电线时,手指将成为电路的一部分并充当电容器。手指越靠近,电容越大。这就是为什么指点处的阻力会降低的原因。

https://en.wikipedia.org/wiki/Transmission_line向下滚动一点,您将看到电容参数是分母的一部分。

每当电线上的一点不匹配时,就会产生反射,您可以在信号源自的“输出”处读取该反射。如果在任何地方都没有反射,则您的信号将在任一端点处终止。

越用力向下按压,手指的面积就会越平坦=>由于面积而导致的电容越大。同样,导线和手指之间夹入的任何非导电材料都会被轻微挤压,以进一步增加电容。

第三个主意:

Theremin贴在吉他内,然后测量频率和振幅。我不确切知道Theremin会输出什么,但是肯定可以使用。

在这一点上,我的想法不多了,说我已经花了20分钟。实际上,我可能花了10欧元。哦。现在,我肯定已经花了10分钟编写了这篇文章,所以这一切加起来了。


1
我觉得将15个IC连接到3套80个传感器上所涉及的调试可能很重要。而且,由于传感器阵列上悬挂了数百根电线,因此肯定不会足够坚固耐用。
BeB00

我认为这实际上是可行的,并且如果正确完成,可以减少原本需要的布线量。
pjc50

我想知道其他解决方案是什么。想要分享?
PNDA

1
@ pandalion98嗯...也许第二个想法毕竟不是一个坏主意。那好吧。
哈里·斯文森

6

三个想法:

1.在电源侧进行一些多路复用

实际上,您所描述的电路是大量可变电阻,每个可变电阻的一端与电源电压共用。您想读出所有的电阻值,到目前为止,其他答复大多建议在模拟端多路复用信号。

但是,您也可以通过将电源“导轨”划分为n个部分,在电源端进行部分或全部多路复用。将n个传感器板连接在一起,每个传感器板具有不同的供电轨。现在一次只给一个供电轨供电,并使用一个ADC输入读取每组焊盘。(这是读取计算机键盘的电路通常的工作方式,并且开关的接线方式通常称为“交叉点开关”。)最终,您可以只使用一个连接至所有“导轨”的ADC来完成此工作。通过依次将电源连接到每个焊盘来进行所有多路复用。

唯一的问题是,所有其他焊盘都需要与电源轨隔离,而不是接地,如果您只是对每个焊盘使用数字输出,情况就是如此。有几种方法可以解决此问题,包括通过二极管,双极晶体管或FET对每个焊盘进行布线,或者-我不知道在实践中可以做到多快,但原则上是可能的-使用单板的输入输出引脚微控制器,并在其应具有较高阻抗时将其设置为输出高电平或作为输入。

与使用单个固定电压源和高质量模拟多路复用器相比,通过这种技术测量传感器的精度可能并不完美,但是我怀疑它会足够好,尤其是因为我确信压力传感器在它们的电阻-无论如何,您可能都需要使用参考力针对每个传感器进行校准。

2.使用一些具有大量ADC输入的微控制器

例如,PICAXE 40X2具有27个可用作模拟输入的引脚,因此您可以用其中9个引脚满足您的需求。它使用一种简单的BASIC语言进行编程,并且可以充当i2c从设备-因此您可以使用另一个微控制器读取9个芯片-或者您可以将每个芯片的输出作为串行数据发送并将其读入主机通过串行到USB转换器。我不能保证确切的速度,但是我认为如果以最大速度(使用16 MHz外部谐振器,为64 MHz)为PICAXE计时,它应该可以正常工作。当然,如果您对使用C进行单片机编程感到满意,则可以使用PICAXE所基于的PIC18F45K22进行相同的操作。

3.使用现成的模拟输入单元

最后,如果您不介意节省时间,并且便携性不是您的重中之重-例如,如果可以通过一些较粗的电缆将仪器拴在设备机架上,则可以购买足够的高-通道计数模拟输入设备,可一次测量所有传感器。例如,Measurement Computing USB-2633读取64个模拟输入,价格略高于1000美元。


4

可能值得考虑使用蛮力信号调理(也许是无源的),然后再调配较小的ADC或每个具有16个或更多MUX'd ADC输入的MCU / ADC。只有40个筹码。ADS7961QDBTRQ1是一种可能工作的芯片示例,该芯片具有自动递增通道模式和16个输入。

即使在4kHz采样率和每个采样240bytes的情况下,总体数据速率也约为1MB / s,这并不算太吓人。也许是具有10MHz或20MHz SPI总线的从站CPU与从站通信。如果没有带宽,请使用2条SPI总线。上面提到的部分在20MHz下工作,因此单个SPI即可工作。

或者,也许您可​​以使用单个TI芯片DDC2256AZZF,它具有64通道同时采样和256个输入..但是它并不是特别便宜(约350美元),并采用14x14mm 323引脚LFBA阵列,因此它不会使用白色的插板面包板。


3

对于实时人机界面应用程序,总体采样率为几千赫兹。50Hz可能就足够了(https://en.wikipedia.org/wiki/Input_lag#Typical_overall_response_times)。这意味着您必须在不到20ms的时间内对所有传感器进行采样,因此每个传感器需要80us。这不太困难,基本上可以由所有普通的8位微控制器来管理(即Atmega88可以在<30us内完成)。

您最好测量所有交互,然后丢弃不需要的交互,因为认为测量所有交互在技术上并不困难。问题来自多路复用。我对您的帖子感到有些困惑,因为它说传感器一次供电80?如您所说,通常要做的是多路复用列和行。如果不这样做,则必须处理从设备中引出的80根以上的电线,这实际上不是一个好主意。您需要找到一种将其拆分为矩阵的方法,以便获得30条导线(仍然很多)。然后,您可以对它们进行多路复用等,但是如果我是我,我将只有多个微控制器,并将它们连接到主机。您可以使用专用ADC代替从属MCU,但我个人会坚持使用MCU。

您已经正确地识别出通信可能是一个问题,但这并不是什么大问题,至少在MCU之间是如此。8MHz的Atmega可以2MHz进行SPI,因此发送所有传感器数据将花费<1ms。然后的问题是,在主MCU拥有数据之后您要如何处理该数据。


2
在一般的GUI术语中,对单个输入做出反应时,通常将50 Hz视为“足够”,但是从我自己对声卡的经验来看,以200 ms的延迟播放音乐根本不是一种令人愉快的体验(请考虑语音干扰)。我认为,可变的0-200 ms延迟会使该乐器几乎无法演奏,因为任何节奏感都必定会被杀死。方法上,大约1 kHz的轮询频率将是一个很好的起点最小值。
Dampmaskin

1
@Dampmaskin 50 Hz = 20ms,而不是200ms。20ms可能更合理
Steven Waterman '18

1
我的错。如果持续20毫秒,则20毫秒可能是可用的,但是等待时间越短越好。无论如何,以后在信号链中总会有更多的延迟。
Dampmaskin

@Dampmaskin就是我所描述的方法所遇到的问题。我需要为链中的后续组件“保存”尽可能多的延迟,因为我试图连接一个树莓派合成器,理想情况下,我希望保持在15-20毫秒的总延迟以下。如果控制器已占用20毫秒,则没有剩余空间。
d.oelert '18

@StevenLowes 20ms对于大多数音乐家来说太长了。甚至在哈斯距离之外也能听到一些声音。就我个人而言,我不能真正处理超过10ms的延迟,而且我认识一个钢琴家根本无法遵守6ms的延迟。
Todd Wilcox

3

您最简单的方法可能是将整个电路构建在一个长的柔性电路上,该电路由10个8位开路集电极开环串联而成,串行连接到在柔性电路上分布的并行寄存器,分别为焊盘的每一列供电。

您可以使用它们来同时驱动所有行中的每一列,并将多路公共返回线复用到您的ADC。回线需要适当的上拉电阻,以便获得带有按钮电阻的电阻分压器电压。

原理图

模拟该电路 –使用CircuitLab创建的原理图

然后,控制微控制器将在寄存器链中发送零个零位,因此一次只有一列被供电。其余的连接将处于浮动状态。


1

这样做的显而易见的方法(看到您只需要在每个弦上看到一个触摸)就是将琴格连接到分压器,然后测量每个弦上的电压

它将告诉您触摸位置。

为了获得接触压力,将一个电容器从地面接地到每个琴格,并测量每根弦上的交流电阻。

这种方法的缺点是琴弦会响应较高的力度


2
抱歉,如果您误解了,但没有涉及实际的吉他琴颈,也没有弦。它只是一块木板,上面有一个压力传感器矩阵,模仿了您在真正的带绒板上使用的游戏风格。不过,感谢您的投入,我可能会在以后的项目中牢记这一点!
d.oelert '18年

上面的品格和弦表示您在问题中提到的铜条,
Jasen

啊,我明白你现在的意思了,很抱歉那太密集了。连奏音符时,这种方法可能会中断,因为这样一来,同一根弦上不可避免地会有多次触碰。尽管只有最低
限度的

同样,尽管我真的很喜欢您的方法,但这并不能回答我最初的问题,即通常如何处理大量需要实时处理的模拟传感器。
d.oelert '18年

相机有大量的模拟传感器...
Jasen

0

如果您得到的导线在吉他的长度上每英寸具有合理的均匀电阻,介于100欧姆和100K之间,那么您可以简单地用中等导电性的材料制成琴颈,并具有表面电阻随压力下降,然后测量琴颈与每根弦的两端之间的阻力。电阻的总和减去线串的电阻将表示接触点的电阻的两倍。从每个测得的电阻中减去接触点电阻后,剩余电阻的比率将指示颈部上的接触点。

请注意,此方法将能够检测到所有三个字符串的同时按下,但是如果可以在多个位置按下一个字符串,则该方法将不起作用。在吉他上,这样的设计会排除使用重和弦的局限性(这是一个非常严格的限制),但是其他乐器可能不需要在多个位置触摸琴弦。


如果您能得到某种导线,每根导线的电阻在吉他的长度范围内具有相当均匀的电阻,介于100欧姆和100K之间。 ”-我怀疑他/他会找到这种导线。
哈里·斯文森

我不同意; 我办公室的电阻丝为1717 ohm / m,因此一点都不难找到。我并不是说它很容易使用,因为它是Ø50µm的导线,但并不难获得。
MrGerber '18年

@MrGerber:我忘记了镍铬合金导线在较冷的温度下的电阻要比在较热的温度下低得多,因此最好将电路更改为工作在接近10欧姆的电阻上,但是基本原理是可行的。替代地,使颈部为弱导电材料并且使线与之连接也可以起作用。
超级猫

这不是NiCr,而是FeCrAl,并且电阻不会随温度变化很大。我的类型从100 C更改为1300 C约8%。参考文献:Kanthal D(而且,我不是在制造电子

@MrGerber:好的,还不错。为了回应前面的评论,我查看了一些表格,发现电阻随温度增加了一个数量级。
超级猫

0

我看了这篇文章,我在想,如果使用单芯片,这可能是可能的。我希望您使用某种微控制器板,例如便宜的bluepill板。它具有ARM M3,可免费使用10个ADC通道。如果将列分为3组,每组3个字符串,则将其连接到9个空闲ADC通道。使用其他21个引脚切换引脚的行数,总计63个“品格”。 连接矩阵,电阻器是速恒电池,gpio驱动在3.3v或处于输入模式,ADC引脚测量了速恒电池上的压降 该微控制器具有两个1 Msps 12位ADC,可以使用相位延迟来支持2Msps,这应该足够大,以至于不会遗漏任何锤子或注意到任何调制。我认为您可以使用USB连接并使其像USB Midi控制器一样工作。您可以将更大的微控制器用于更多的输入,但是我看不到如何管理超过30个品格的“品格”间距,还是更像触摸屏?

我不知道这些速控器表是如何工作的,但是您不能像较小的终端点一样放在较大表的底部,并将手指的位置和压力​​与多个点上的电压相关联吗?然后,您可能可以减少很多感测,并支持弯曲和颤音之类的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.