■タグ「RaspberryPi」

■RasPd3 操作方法

RasPd3の内部プログラムが概ね完成したので、自分用に取扱説明書のようなものを記載しておきます。LCDの文字が小さいですがなんとか大丈夫そうです。そのうちタップテンポやチューナーも実装できたらいいなと思っています。



03_230_1raspd3sh.jpg
<コントロール類と略称>
・左側ロータリーエンコーダ:LR
・中央ロータリーエンコーダ:CR
・右側ロータリーエンコーダ:RR
・左側押しボタンスイッチ:LS
・中央押しボタンスイッチ:CS
・右側押しボタンスイッチ:RS
・左側フットスイッチ:LF
・右側フットスイッチ:RF



<画面中央 緑色領域>
・エフェクトの種類とエフェクトパラメータを「プリセット」として8パターン(A~H)保存
(Pure Dataのプログラムを「パッチ」と呼ぶので、混同しないよう「プリセット」という呼称にしている。)
・プリセット1つにつき直列に6つのエフェクト(上3つ→下3つへ繋がっている)
・エフェクトは内蔵エフェクト20種類から選択(1つのプリセット内で複数重複使用は不可)
・エフェクトオン状態のエフェクトの名前右横に白色の丸印がつく
・「RF割当」を設定したエフェクトの名前右横に紫色の四角形がつく

※RF割当:プリセット内部モード(後述)時、RF押下でオンオフが切り替わるエフェクトを割り当てられる。
【例】ディストーション(オン)とコーラス(オフ)にRF割当を設定しておくと、RF押下時にディストーションをオフ、コーラスをオンという風に切り替えられる。

<画面右側 青色領域>
・プリセットの切替順番を3パターン保存
・フットスイッチで上下にプリセットを切り替える

<画面下側 灰色領域>
・エフェクトパラメータを表示
・エフェクトオンの場合、右に[ON]が表示される
・「RF割当」を設定している場合、右に[EN]が表示される



<2種類のモード(●プリセット切替、◆プリセット内部)と操作方法>
※LSを押しながらCSを押す:データ保存、押し続けるとシャットダウン(両モード共通)

●プリセット切替モード
複数のプリセットをフットスイッチで切り替えるモード。プリセット切替の順番を編集できる。

LR:カーソル左右移動
CR:カーソル上下移動
RR:プリセットA~Hまたは「X」を選択
※「X」を選択すると、フットスイッチでのプリセット切替時にX以降への切替がキャンセルされる。
【例】A→B→C→D→X→F→E→Gの場合…Dの後はA、Aの前はDに切り替わる。

LS:「プリセット内部モード」へ切替
CS、RS:なし
LF:プリセット切替(下側へ)
RF:プリセット切替(上側へ)

◆プリセット内部モード
1つのプリセット内で単独もしくは複数のエフェクトのオン・オフを切り替えるモード。エフェクトの種類やパラメータを編集できる。

LR:カーソル左右(エフェクト順番)移動
CR:カーソル上下(プリセット間)移動
RR:エフェクトの種類またはバイパスを選択
(エフェクトパラメータ編集時は、各ロータリーエンコーダでパラメータを増減させる)

LS:押す度にエフェクトパラメータ上段→エフェクトパラメータ下段→エフェクトの種類へと編集箇所切替
CS:「プリセット切替モード」へ切替
RS:「RF割当」設定/解除
LF:選択中のエフェクトをオン/オフ(オンの時、左側LED点灯)
RF:「RF割当」が設定されたエフェクトをオン/オフ

■RasPd3 ハードウェア編

03_220_1raspd3p.jpg
今まで製作したRaspberry Pi搭載エフェクター(RasPd1RasPd2RasPd4)は単一エフェクトのみしか使えませんでしたが、今回のRasPd3は複数のエフェクトを同時に使えてパッチ切替もできる、いわゆるマルチエフェクターを想定したものです。当初はオーディオインターフェースにCS4272を使うつもりでした(別記事参照)が、うまくいかずWM8731を使っています。しかしながらCS4272を使ったオーディオカードTeensy Super Audio Board(SAB)は全データが公開されているので、大いに参考にしました。

▽回路図
03_220_2raspd3s.png
ΔΣ型ADコンバータでは入力のフィルタは簡易なものでよいらしいので、RasPd4より簡略化しました。ギター入力はモノラルですが、WM8731のLR入力を逆位相にして内部プログラム(下図)で足し合わせるという差動入力っぽいことをしています。
03_220_3raspdpd.png

ノイズ対策として、絶縁型DC-DCコンバータやデジタルアイソレータ(Si8662BB、Si8602AB)を用いてRaspberry PiとGNDを分離しました。スイッチについてはチャタリング対策の抵抗とコンデンサを入れています。ロータリーエンコーダは高速回転させるかもしれないので、コンデンサの容量が少なめです。

2.2インチLCDディスプレイモジュールはAmazonで購入しました。SAINSMARTの商品ページのManualに回路図が入っています。回路図中に3.3Vと記載がありますが、実際は3.0Vのレギュレータが使われていました。LEDピンへ抵抗を挿入すると明るさが減り、消費電力を抑えられます。Raspberry Piでの使用方法についてはadafruitのILI9341 TFT display用ページの内容で問題ありませんでした。

▽レイアウト(KiCadのデータはこちらへ)
03_220_4raspd3l 03_220_5raspd3swl.png
WM8731のアナログGNDとデジタルGNDは分離せず、裏面のベタGNDができるだけ一面プレーンになるようにしています。スイッチ類の基板はユニバーサル基板で作成しており、細い線がジャンパーです。ディスプレイモジュールのSDカードソケットは配線の邪魔なので取り外しました。ケースはタカチTD10-15-4Bです。

ノイズについては、劇的ではないですが少しは減少したようです。入力が0.5Vrmsぐらいで歪率1%となりますが、ブースターとして使うことはないので大丈夫でしょう。内部プログラムについてはまだ全然できていません。今までにない規模のプログラミングとなるので、相当時間がかかると思われます。

■ロータリエンコーダ用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

■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

■RasPd4 プログラミング編

各設定についてはRasPd2 ソフトウェア編と同じですが、今回はオーディオ設定の入出力音量を操作していないので、alsamixerのMasterとCaptureのdB gainは両方0となっています。内部プログラムは2チャンネルのディストーションエフェクトです(データダウンロードはこちらへ)。

▽コントロール割り当て
左側LED: エフェクトオン時点灯、チャンネル切替モード時点滅
中央LED: Aチャンネル選択時点灯
右側LED: Bチャンネル選択時点灯
左側スイッチ: バイパス音とエフェクト音を同じ音量に合わせる機能
中央スイッチ: チャンネル切替
右側スイッチ: 2秒長押しでシャットダウン
各ポット: エフェクトパラメータ(自動保存されている)
フットスイッチ: 2秒長押しで通常モードとチャンネル切替モードを変更、通常モード時はエフェクトオン・オフ切替、チャンネル切替モード時はチャンネル切替

なかなかプログラミングが面倒でしたが、完成すると大したことはしていない感じです。フットスイッチに長押し機能を持たせた関係で、スイッチを押した時ではなく離した時に切替が働く形になり、少し違和感は残っています。

一つ原因不明の問題があり、バックグラウンドでPure Data(Pd)が起動状態のとき、立ち下がりエッジ検出で定義したコールバック関数がたまに立ち上がりエッジでも呼び出されるという現象が起こりました。どう調べてもスイッチのチャタリングではないようです。とりあえず呼び出される関数に「対象GPIOピンがLOW(0)」という条件を追加して対策しています。

▽Pdパッチ
03_214_1raspd4pd.png
なぜか今回は[spigot~]でエフェクトオン・オフを切り替えるとプツっとノイズが出るため、Isaac(139)さんの[pd spigot~]に[line~]を入れたものを使っています。[pd effect_distortion]の中身の表示は省略しましたが、前々回の記事のオーバードライブのトーン部分を変更したものが入っています。2チャンネル程度ならエフェクトをまるごとコピーすれば簡単ですが、今後の応用を考えてPdのメッセージ機能を使うことにしました。終了時にこのパッチ自体を上書き保存するため、外部ファイル操作はしていません。参考ページ→PureDataで値のプリセットを外部ファイルで管理する方法

エフェクトパラメータの取得は、RasPd2と同じでMCP3008を使っています。0.2秒ごとに0.0から100.0までの値を取得しますが、ノブを触らなくてもたまに値がブレることがあるようです。勝手に値が変わるとPdパッチに記録しているデータも変化して困る場合があるので、1以上変化しないとPythonからPdへ値を送信しないようしています。すごくゆっくりとポットを動かしたときはパラメータが変化しないことになってしまいますが、実用上は問題ないでしょう。

▽Twitter動画(そのうち消えるかもしれません)



RasPd4 ハードウェア編

管理人

ブログ内検索

メールフォーム

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

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

アクセスカウンター