■ロータリエンコーダ用Pythonプログラム

RasPd1でロータリーエンコーダを使っていましたが操作性がイマイチでしたので、もう少しエフェクター向けの動作となるようPythonプログラムを作り直しました。参考ページ→RaspberryPi + Python でロータリエンコーダを制御してみた

▽回路図
03_219_1res.png
2つのスイッチ(AとB)のタイミングの違いを利用して回転方向を判断します。今回使用したのは秋月電子で購入したEC12E2420801というクリックありのものです。あまりチャタリングは発生しないようですが、念のためチャタリング対策のコンデンサと抵抗を挿入しました。一般にロータリーエンコーダの出力波形は下図のようになります。
03_219_2rep.png

▽テストプログラム
#!/usr/bin/env python
# coding:utf-8

import RPi.GPIO as GPIO
from time import sleep

Ap = 6 # Rotary_encoder_A
Bp = 12 # Rotary_encoder_B
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(Ap,GPIO.IN)
GPIO.setup(Bp,GPIO.IN)
re_value = 0

def rot(channel):
global re_value
if GPIO.input(Ap) == 0 :
cw = 0 # Crockwise or countercrockwise
Ac = 0 # Ap switching counter
Last_Bp = GPIO.input(Bp) # Bp status
for m in range(0,100):
if GPIO.input(Ap) == 1:
break
sleep(0.0005)
if Last_Bp == 0 and GPIO.input(Bp) == 1 :
cw = -1
if Last_Bp == 1 and GPIO.input(Bp) == 0 :
cw = 1
for n in range (0,24):
Last_Ap = GPIO.input(Ap) # Ap status
sleep(0.002)
if Last_Ap == 1 and GPIO.input(Ap) == 0 :
Ac = Ac + 1
if Ac == 0:
re_value = re_value + cw * 1
elif Ac == 1:
re_value = re_value + cw * 4
elif Ac == 2:
re_value = re_value + cw * 8
elif Ac == 3:
re_value = re_value + cw * 16
else:
re_value = re_value + cw * 32
print re_value

GPIO.add_event_detect(Ap,GPIO.FALLING,callback=rot,bouncetime=50)

try:
while True:
sleep(60)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
AピンがH→L(=FALLING、1→0)となった時にrot関数が呼び出されます。「if GPIO.input(Ap) == 0 :」という当たり前のことが入れてありますが、以前バックグラウンドでPure Dataを起動していた際にGPIOの読み取りがおかしくなったため、念の為の処置です。

まずAピンがHに戻るまでループを続け、Hになった瞬間のBピンの状態をみます。BピンがL→Hと変化していた場合は反時計回りで、逆の場合は時計回りと判断されます。次のループでは、Aピンが約50msの間に何回H→Lになったかカウントします。カウント数によって変化量が変わり、ロータリーエンコーダを速く回すほど値が大きく変化するということになります。

ロータリーエンコーダの種類によってはうまく動作しないかもしれません。また、値の更新が50msごとなのでリアルタイム性が必要な用途には向いていないだろうと思います。

■タグ : RaspberryPi

■OSCによるPure DataとPythonの連携

Pure Data(Pd)とPythonを連携させる方法として、Open Sound Control(OSC)という通信方法を試しました。これによりRaspberrry Pi(RPi)上でPdから間接的にGPIOを操作し、スイッチやLED等を扱うことができるようになります。もちろん別のコンピュータとの通信を行うといったことも可能です。



Python側の準備として、pylibloを導入します。python-oscというものもあるようですが、試していません。
$ sudo apt-get install python-liblo
参考ページ→pylibloを使ってOSCメッセージを扱う
Pd側はversion 0.46以降であればOSC用オブジェクト[oscformat][oscparse]が使えます。

▽テストプログラム
py_osc.py
#!/usr/bin/env python
# coding:utf-8

import liblo

server = liblo.Server(8000)
target = liblo.Address("127.0.0.1",8001)

def callback(path, args, types, src):
print "py got msg from pd:", args[0]

server.add_method("/msg_from_pd","f", callback)
liblo.send(target,"/msg_to_pd", 4558)
server.recv(1)

pd_osc.pd
03p_218_1osc.png

先にバックグラウンドでPdパッチを実行した後、Pythonプログラムを実行します。
$ pd pd_osc.pd &
$ python py_osc.py
通信に成功すれば、以下のメッセージが表示されるはずです。
pd_got_msg_from_py: 4558
py got msg from pd: 4558.0

Pythonプラグラムから送信された4558という数値をPdが受け取り、Pdから同じ数値が送信されてPythonが受け取ります。pylibloのExample Codeや[oscformat][oscparse]のヘルプを簡略化したものなので、特に難しいところはないでしょう。



Pdでスイッチ類を扱う他の方法についてメモしておきます。

・pdsend、pdreceiveコマンド
  pdsendは今まで使っていました。pdreceiveの方は詳細不明で通信成功に至りませんでした。
・Pduino
  別途Arduinoが必要で、検証していません。
Pd-wiringPi(Pd外部オブジェクト)
  Pdの実行にsudoが必要になります。GPIOの入力待ちがやりにくそうでしたが、使えないことはないと思います。
py/pyext(Pd外部オブジェクト)
  Pdでpythonプログラムを動かします。導入が難しく、RPiではコンパイルが必要なようです。

■タグ : PureData

■monomonster Relay Bypass Module 解析

SPSTモーメンタリースイッチを使ってトゥルーバイパス+LED切替が実現できるmonomonster Relay Bypass Module (RMB)というものがGarrettaudioで販売されています。一体どういったものなのか興味があり、購入後回路を調べてみました。

▽基板写真
14_217_1rbmp1.png 14_217_2rbmp2.png

▽回路図
14_217_3rbms.png
ATTiny13AというマイコンとHFD31/5-L1というラッチリレーが使われています。やたらとフィルムコンデンサが大きいので、積層セラミックコンデンサに変えてもよさそうです。出力側にある2N7000はスイッチングノイズ軽減の役割があると思われます。エフェクト回路の入力をGNDに落とすため、リレーの2番端子はGNDに繋ぐのが普通かと思いますが、基板裏のベタパターンが離れているために実際はどこにも繋がっていません(表のベタ塗りを忘れたのかも)。

スイッチングの様子を録音しました。
14_217_4rbmsw.png
スイッチング時10ms程度出力がミュートされるプログラムとなっているようです。しかしながらMOSFETは構造上ダイオードが入っている(寄生ダイオード)ため、音量が大きいと波形がクリップされます。2N7000を外した場合は、スイッチング時大きくノイズが入ります。たぶん通常の3PDTスイッチと同じ程度のノイズだろうと思います。試しに2N7000を2SK303に差し替えた場合(足を曲げる必要あり)も録音しましたが、この場合はIdssの影響か音量が下がり波形も歪んでしまいました。

結局このモジュールはそのままでは使いにくいという結果となりました。回路採取にミスがないとも言い切れませんが……とにかく購入される方は注意が必要だと思います。

■タグ : 回路図

■Raspberry Pi でのCS4272使用方法

Raspberry Pi(RPi)で音声信号向けのADCとDACを使う場合、最も手軽に使用できるICはWM8731だと思います。今回はさらなるノイズ低減を期待して、CS4272というICを試しました。



CS4272を使ったオーディオカードにTeensy Super Audio Board(SAB)というものがあり、KiCAD files and some test codeから回路図や使用ガイド等がダウンロードできます。このSABのデバイスドライバを利用するわけですが、カーネルビルドというやや面倒な作業をしないとドライバを使えるようになりません。→「rpi-update」コマンドで簡単に利用できるようになったようです。(2018年5月21日追記)

RPi公式サイト記事Kernel buildingのLocal buildingの通りに操作を行っていきます。

[1]
$ sudo apt-get install git bc
↓SAB用のカーネルソースをコピー
$ git clone --depth=1 https://github.com/whollender/linux

[2a] RPi 1, 0 の場合
$ cd linux
$ KERNEL=kernel
$ make bcmrpi_defconfig
↓ビルド開始、RPi0で14時間程度かかる
$ make zImage modules dtbs

[2b] RPi 2, 3 の場合
$ cd linux
$ KERNEL=kernel7
$ make bcm2709_defconfig
↓ビルド開始、RPi3で3時間程度かかる
$ make -j4 zImage modules dtbs

[3]
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

そして再起動すると/boot/overlaysディレクトリにsuperaudioboard.dtboというファイルができています。続いて/boot/config.txtを編集します。
$ sudo nano /boot/config.txt
 以下の2行の#を外す
  #dtparam=i2c_arm=on
  #dtparam=i2s=on
 最後に以下の1行を追加
  dtoverlay=superaudioboard

再起動後、lsmodコマンドでSABドライバのモジュールが確認できる…はずですが、読み込まれていないことがわかります。モジュール情報をmodinfoコマンドで確認するとvermagic:4.9.59+という記載が出てきますが、ビルドしたカーネルのバージョン(リリース番号)をuname -r コマンドで確認すると4.9.80+となっています。強制的にモジュールを読み込ませようとしてみます。
$ sudo modprobe -f snd-soc-superaudioboard
Exec format errorというのが出てきてダメでした。

バージョン情報を編集して再ビルドするという方法を行います。参考ページ→Linux 4 Tegraにv4l2loopbackモジュールを入れる時の注意点
$ sudo nano linux/include/generated/utsrelease.h
#define UTS_RELEASE "4.9.80+"という記載があるので、4.9.80+を4.9.59+(RPi 2, 3の場合は4.9.80-v7+→4.9.59-v7+)へ変更した後、もう一度[2a](または[2b])と[3]をやり直し再起動します。一度ビルドしているので早く終わります(未確認ですが、RPi3で1時間未満)。
※後から確認すると、再ビルド後のバージョンは4.9.80+でした。どこか記憶違いをしている部分があるかもしれません。



RPiとCS4272との接続は下図です。SABと同じように24.576MHzの水晶発振子と39pFのコンデンサを使います。
22_216_1cs.png

aplay -l コマンドでサウンドカードの確認ができます。接続が正しければ、CS4272がSABとして認識されているはずです。音量等の調節はalsamixerコマンドでできます(hキーでヘルプ表示)。今後特に問題が出てこなければ、自作デジタルエフェクターRasPd3に採用する予定です。→FILT+とVCOMピンが0Vになるという問題が解決できず、ボツになりました。(2018年5月7日追記)

■タグ : RaspberryPi

■Crosstortion

02_215_1crossP.jpg
東京エフェクター「第5回 エフェクタービルダーズ・コンテスト」に向けて製作したエフェクターです。コンテストのテーマは「ハイゲイン」だったのですが、ちょうど回路を考えていた2017年10月頃はBig Muffに注目が集まっていたので、なんとなくBig Muffをベースにすることにしました。また、今回は今までやったことがなかった「クロスオーバー歪み」をコントロールしています。ペダル名は単にcrossover distortionを略したものです。

ルックスもコンテストでは重要となりますが、私にはセンスがないので評価は低いでしょう。ポット周りの図形のカドが目盛りになっているというのをやってみたかったので、角ばったデザインにしました。それと、ウケがいいかもしれないという安易な考えで、適当に黄金比を取り入れています。シールは「手作りステッカー メタリックシルバー」というものを使いました。

▽回路図
02_215_2crossS.gif
オペアンプばかりですが、ICBM(オペアンプマフ)ではありません。トーン回路や周波数特性はトランジスタを使った現行Big Muffとほとんど同じで、歪み部分は個人的に好きな「オペアンプで歪ませる」というものとなっています。参考ページ→Big Muff Pi Analysis
コンデンサは3.9nFを持ってなかったので3.3nFにしたり、まとめ買いしていた10μFをやたらと使っていたり等、ある意味Electro-Harmonix精神も盛り込んでいます。

真ん中あたりの4つのオペアンプとLM317がクロスオーバー歪み関連です。こちらのページの図11と同じ回路で、理想ダイオード回路にLM317で調節した電圧を加算しています。同ページ図12のように波形の半分以上をバッサリとクリップしますが、プラス側とマイナス側を足し合わせることで擬似的にクロスオーバー歪みがある音を生み出しています。小音量の音はクリップする電圧値を超えられず切り捨てられるため、ノイズゲートとしても働きます。倍音については、奇数次倍音のみが出るようです(各クリッピングと倍音の記事最下部に掲載)。コンテスト用の個体は、一応トリマーを追加して最小電圧値を細かく調節しました。

あまり回路検討にかける時間がなかったので、後から見ると粗がある感じがします。入力部のICを変えれば全部5V駆動でよさそうです。あとクロスオーバー歪みを扱うなら素直にトランジスタを使う方がもっと簡単だったんじゃないかと思います。

▽レイアウト
02_215_3crossL.png
▽PCB(横86.4mm縦40.6mm)
02_215_4crossLP.gif
歪みエフェクターは筐体が大きい方が印象に残る気がするので、余裕を持ってHAMMOND 1590BBを使いました。基板は秋月電子にある角型ランドのもので、見た目はなんだかカッコイイですが少し薄い(厚さ1.2mmぐらい)です。

音についてはたぶんBig Muffっぽくなっていると思います。まぁ私は自作ラムズヘッドぐらいしかビッグマフを弾いた経験がないのでよくわかりません。倍音も測定しましたが、少し奇数次倍音が多く普通の歪みという感じでした。ハイゲインだとクリッピングの違いはあまりわからなくなると思います。肝心のクロスオーバー歪みについては、なんともいえないジュワーという感じが付加されます。ゲートファズのようなブチブチ系にもできますが、正直私はあまり好きでなかったです…

---以下2018年3月19日追記---

「第5回 エフェクタービルダーズ・コンテスト」第一次審査の点数を記載しておきます。
コンセプト:17 サウンド:16 ルックス:16 操作性:16
総合点:65 21台中11位

管理人

ブログ内検索

メールフォーム

当ブログに関するお問い合わせはこちらからお願いします。 ※FAQ(よくある質問)もお読みください。

お名前
メールアドレス
件名
本文

アクセスカウンター