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 件のコメント:

コメントを投稿

【Puredata】ノイズゲートの作り方・考え方の備忘録【Noise Gate】

こちら にて作成したノイズゲートの仕組みについて簡単に解説します。 自己流なのであまり細かいところはツッコミ入れないでください。 【ノイズの基本的な処理について】 実際の波形を見ます。 ギターを弾いていない無音部分のはずがサーッというノイズが聞こえる事が多々あります...