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からのシリアルデータを解析する方法を決定できることがわかります。これらの種類のメッセージは、Processingから次のように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

そして、それはすべて問題なく動作しますが、非効率的です。中央に処理アプリが本当に必要ですか?

ここに画像の説明を入力してください

現在、ProcessingとOSCの部分を方程式から切り離そうとしましたが、シリアルデータプロトコルの設計に関する知識が不足しています。

udpreceiveMax にはオブジェクトがあることを知っています。そして、それはうまくいくと思いますか?多分私はそれを間違って使用しています。

ある時点で、すべてのarduinoコードを切り替えて、すべてのシリアルメッセージの最後に改行を送信しないようにしましたudpreceive。これは、Maxのオブジェクトに特別な意味があるわけではないためです。実際、正しく思い出せば、最初の改行までの最初のメッセージのみを受け入れ、データの処理を停止します。だからそれを回避するために、私はすべての改行文字を取り出し、それがmax / mspに継続的に吐き出されました。

次に、このメソッドの次の問題は、udpreceiveオブジェクトが一度に1文字しか受け入れないことです。したがって、jsJavaScriptオブジェクトを使用して着信文字を連結し、セミコロンとコンマで解析しようとしました。そこで遭遇した問題は、それが予測不可能で不安定であるということでした。文字が欠落し、メッセージが処理できなくなります。それで、シリアルデータプロトコルをより堅牢なものに変更する必要があるのか​​どうか、本当に疑問に思っています。それとも私がそれを完全に間違っているのですか?

それをすべてスクラップして、Firmataファームウェアを使用して最初からやり直す必要がありますか?Max / MSPfirmataを使用するためのチュートリアルをいくつか見てきたので、ボックスのコードが何をしているか、またそれを実行する必要があるかどうかを再確認できたと思います。ファームウェアは、オンボードシリアルLCDに送信するピンの文字列データを受け入れることができますか?LCDをmax / mspから制御できれば、うまくいくかもしれません。

何かアドバイスはありますか?


1
OMGWTFボタンだけを+1しますが、非常によく考えられ、詳細な質問も行われます。
多項式

1
このページを見ましたか?Max / MSPへのインターフェースには、処理を伴わない方法がいくつかあります。それらのうちのどれかがあなたのために働く/働かない?
angelatlarge 2013

@angelatlargeええ、ちょっと。ちょっと違います。私がシリアルプロトコルのことを正しく行っているのか、間違っているのかについてアドバイスを受けたいと思っていますが、最終的に同じ機能を引き続き利用できる場合は、別の通信方法でやり直すこともできます。
スティーブクーリー2013

回答:


1

Arduinoが問題の原因である可能性はありますか?Arduinoはシリアル通信に強く依存していて、通常は失敗しないので、私はそれが奇妙に聞こえることを知っています。しかし、Arduinoをさまざまな速度で試して、人間が読めるデータをダンプし、ターミナルプログラムで監視することをお勧めします。私は同じ問題を抱えていましたが、それは私のarduinoの地面の問題が原因でした。また、別のソリューションとして、14.7456MHzや3.6864MHzの倍数など、シリアルに適したクロック速度のカスタムarduinoデザインを使用することもできます。それが役に立てば幸い...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.