2017年5月7日日曜日

[Pduino]ロータリーエンコーダーをPuredataで使うヒント

実は難しいのです!
PuredataのフォーラムでもC++やPyhon使ったほうが簡単ですと回答があります。
難しいと言われるとPuredataだけでどうにかしたくなります。

やってみました。
こんな感じで割とサクサク動きます。
※配線の誤記載があったので修正しました。
また、回転方向の誤検出のパターンについて付録につけました。






使ってみたロータリーエンコーダーはこちらです。
安い。
一般的なACBピン配列でプッシュすればモーメンタリーのボタンにもなるものです。

ピン配列は入手したものにより異なるのでデータシートを要確認ですが、
上記の物はこちら。


繋ぎ方と回路図的なものはこちら。



Arduinoとの繋ぎ方もテンプレ的な繋ぎ方です。
なお、デジタルピンは
A・・・53ピン
B・・・52ピン
で繋いでいますが、お好みで。

rotary_encorder_testV1.zip
同じ環境を再現しないと動作しないかと思いますが、使ったパッチをアップロードしました。
[arduino]オブジェクトは必須です。
一番最初にArduinoが出力したピンNo.を拾って右回転・左回転を検出するので、
残念ながら若干回転方向を間違える事がありますが、シビアなリアルタイム操作が不要な場合はまぁ支障無いかと思います。
Arduinoが出力した値を適宜削る方法には[route]オブジェクトがありますが、
今回は[unpack]を使用しました。こちらのほうが簡単です。
ロータリーエンコーダーを1個しか使わないなら[unpack]のほうが早いですが、
多数の可変抵抗等を繋ぐ際は[route]で出力を綺麗にデータ抽出するほうがいいです。

[moses 52]はたまにピンNo.が0や1といった予期しない値を出力したときがあったので削除するために保険で入れています。

【回転方向の検出について】
[t b b]
|
[timer]
|
[ float  ]
|
[moses 50]

ロータリーエンコーダーを回すと高速で多数の出力が始まるのですが、一番最初の値だけが欲しいので、
Bang版threshold~的な動作をするフローを作りました。
すなわち、bangとtimerを使って出力の間隔時間が短い時(ここではmoses 50 の50ms)
は次のspigotで出力を遮断します。


*汎用的にすぐ使えるようパッチを作りました。
rotary_encorder_forPduinoV1.zip
上記のように繋いでピン情報を送るとすぐ使えます。
ロータリーエンコーダーのAピンをArduinoの若番(例えば22)
ロータリーエンコーダーのAピンをArduinoの老番(例えば23)
に繋いで下さい。




0 件のコメント:

コメントを投稿

[機材]Boss Mega Distortion MD-2 MOD

こちらの記事 で無改造のVanillaを紹介していますが、 今回紹介するのは自分で改造したものです。 紹介動画は以下。 内容は、 Vanillaの低音域が効きすぎて少々使いづらかったので 1:低音をカット(ただしゲインも少なくなるので) 2:ブースター...