Arduino串行通信协议设计


8

为电子音乐制作了一个鼓音序器接口

在此处输入图片说明

它使用arduino mega作为微处理器,目前与我编写的用于串行通信的处理程序接口。从那里,OSC消息被发送到我的合作伙伴编写的Max / MSP程序以创建Midi数据流。

所以:

在此处输入图片说明

我的物理界面-> Arduino Mega->串行I / O->处理-> OSC-> Max / MSP-> Midi(->音乐应用程序)

我之所以选择此路径,部分原因是它不够聪明,无法删除任何步骤,而且还能够适应我们想要的方式来更新物理接口,能够使物理接口具有多种用途(推子,旋钮和语音选择按钮),并能够确保关键任务的定时和节奏修改(也称为“摇摆”)。

我的串行消息设置如下:


PL,1;        // transport control: play
PL,0;        // transport control: stop
SW,30;       // swing value 30
TM,130;      // tempo value 130
SD,1,8,04,0; // Step sequencer data, pattern 1, voice 8 (of 8), step 04 (of 16), off
MU,8,1;      // Mute, voice 8 (of 8), on
SO,4,0;      // Solo, voice 4 (of 8), off
VL,3,127;    // Velocity, voice 3 (of 8), value 127
CC,1,127;    // Midi CC, controller 1, value 127
NN,1,36;     // Note number, voice 1 (of 8), value 36 (usually a kick drum)

因此,您可以看到基于每个分号的逗号数量,我可以确定如何在处理程序中解析来自arduino的串行数据。通过处理,这些类型的消息将转换为OSC,如下所示:


/beatseqr/play 1
/beatseqr/play 0
/beatseqr/swing 30
/beatseqr/tempo 130
/beatseqr/matrix/1/8/04 0
/beatseqr/mute/8 1
/beatseqr/solo/4 0
/beatseqr/velocity/3 127
/beatseqr/midicc/1 127
/beatseqr/midinn/1 36

一切正常,但感觉效率很低。我真的需要中间的处理应用程序吗?

在此处输入图片说明

现在,我试图将处理和OSC部分从等式中剔除,但是我缺少有关串行数据协议设计的一些知识。

我知道udpreceiveMax 中有一个对象。那行得通,我猜呢?也许我用错了。

有一次,我已经将所有的arduino代码切换为在每条串行消息的末尾不发送换行符,因为这并不意味着Max的udpreceive对象有什么特别的地方。实际上,如果我没记错的话,它将只接受第一个换行符之前的第一个消息,然后它将停止处理数据。因此,为了解决这个问题,我取出所有换行符,然后将其连续喷入max / msp中。

然后,此方法的下一个问题是udpreceive对象一次只能接受一个字符。因此,我试图使用jsjavascript对象来连接传入的字符,然后将其解析为分号和逗号。我遇到的问题是它是不可预测的且不稳定的。字符将丢失,并且消息将不可处理。因此,这真的让我怀疑是否应该将串行数据协议更改为更强大的功能?或者,如果我只是完全做错了?

我是否应该全部清除并使用Firmata固件从头开始?我看过一些将Firmata与Max / MSP结合使用的教程,我想我可以重新审视包装盒上的代码在做什么以及是否需要这样做。固件可以接受引脚上的字符串数据以发送到板载串行LCD吗?如果我可以通过max / msp控制LCD,那可能行得通。

有什么建议吗?


1
+1仅用于OMGWTF按钮,但也经过深思熟虑和详尽的问题!
多项式

1
你看过这个页面吗?与Max / MSP接口的许多方法不涉及处理。他们中的任何一个对您都不起作用?
angelatlarge

@angelatlarge是的,有点。金田不是。我希望就我在做对还是错串行协议方面获得一些建议,但是如果最后我仍然可以得到相同的功能,那么我可以用一种替代的通信方法进行重复操作。
史蒂夫·库利

Answers:


1

您的问题是否可能是由Arduino引起的?我知道这听起来很奇怪,因为Arduino强烈依赖于串行通信,而且通常不会失败。但是我建议您以不同的速度尝试Arduino,转储可读数据并使用终端程序进行监视。我遇到了同样的问题,这是由我的arduino的地面问题引起的。另外,另一种解决方案可能是使用具有串行友好时钟速度的自定义arduino设计,例如14.7456MHz或3.6864MHz的任意倍数。希望能帮助到你...

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.