GR-KAEDE 16×2 LCD

表示器をつけてみようと思います。定番の16×2キャラクターディスプレイです。HD44780コンパチブル品なので既存のソフトから移植できます。
LCDは以下の物を使用しました。
超小型LCDキャラクタディスプレイモジュール(16×2行バックライト緑)
http://akizukidenshi.com/catalog/g/gP-01675/
5V電圧品ですが、3.3Vのマイコン出力で制御できます。マイコン側は、入力を使用する場合、5Vトレラント入力を使用する必要があります。今回は、書き込みのみしか使用しないので、読み書き信号のR/W信号は、書き込み側のLowに固定しました。IOピンを節約するために4ビットアクセスとしました。
GR-KAEDEのCN10をLCDの接続に使用しました。
CN10   LCD
P12 -  RS
P13 -  E1
P14 -  D4
P15 -  D5
P16 -  D6
P17 -  D7
Jpeg
なるべく早く書き込みがしたかったので、E1のパルス幅を調整しました。500μsec以下にすると表示できなくなりました。1msecで1文字程度表示できそうです。 Jpeg

PIEZO SENSOR ON KURUMI2

ピエゾスピーカを振動センサとして使用する準備ができたのでGR-KURUMMIでAD変換したいと思います。 目標は、5弦開放(A):110Hzを計測することです。 サンプリング周期を250μsecとしました。50msec間サンプリングし、20倍して周波数をもとめました。
Jpeg
いくつか問題がありました。
・ピッキングの強さで振幅が大きく変わる。
・アタックから減衰していき振幅が変わる。
・倍音の振幅が結構大きい。
Jpeg
サンプリングの開始の強度を揃えたいので、或る強度以上になるのを監視しました。アタック時は、安定しないので、アタック検出から10μsec待ってから50μsecサンプリングしました。倍音を消す目的で2サンプリング毎に移動平均をとりました。
ここから、最大、最小、平均を算出し、最大値、最小値より少し内側に閾値を設定しました。閾値の上下で二値化して、パルス数をカウントしました。この方法で周波数を求めました。 ピッキングを一定の強さで弾くと近い周波数が出ることが確認できました。 チューナ持っているし、圧電スピーカで振動が取れることが分かったので良しとします。

PIEZO SENSOR ON KURUMI1

圧電スピーカを振動センサとして使用したいと思います。

圧電スピーカは以下のものを使用します。
圧電スピーカー(圧電サウンダ)SPT08(2個入)
http://akizukidenshi.com/catalog/g/gP-01251/

圧電スピーカは、洗濯バサミに取り付け、流行りのクリップチューナ風にしてみました。
Jpeg
これをギターのヘッドに挟み振動を取り込みます。
LabToolでギターの振動を取得してみました。0.006vppしか振幅がないので、増幅が必要です。
5thstring
増幅には、以下のオペアンプを利用しました。
2回路入汎用オペアンプ(ナショセミ製)LM358N(5個入)
http://akizukidenshi.com/catalog/g/gI-01012/

反転増幅回路を組んで100倍に増幅しました。

RORTRY ENCORDER ON KURUMI

入力にローラリーエンコーダを使ってみようと思います。角度検出でなく、数値設定などの入力装置に使用したいので精度は求めず、ソフトウェアで実現しようと思います。
ロータリーエンコーダは以下のものを使用しました。
2色LED付スイッチ付ロータリーエンコーダ(赤・緑)ツマミ付セット
http://akizukidenshi.com/catalog/g/gP-05771/Jpeg
エンコーダ出力の他にLED2色とスイッチ出力が1個ついています。
LEDがカソードコモンになっているのでアノード側に抵抗を介して出力ポートにつなぎます。 カソード側は、GNDにつなぎます。
抵抗は、300Ω使用。
スイッチも同様にLEDのカソードにつながっているので、スイッチの端子を10kΩでプルアップして入力ポートにつなぎます。
このエンコーダは、360度24パルスのエンコーダです。人の手で1周させるのに100msec程度かかると想定すると1パルスの周期が4msecくらいとなります。
1パルス中にAB相の値を4回見ればよいと考え、1msecの割り込みでポート監視しようと思います。

P30 D2 - A相    入力
P31 D4 - B相     入力
P15 D5 - スイッチ 入力

今回は、動作に関係ないのでLEDは制御しませんでした。
基本的な考えは、A相がONの時、B相がOFFからONになった時、+1とし、A相がONの時、B相がONからOFFになった時、-1とします。
今回は、ロータリーで設定した値でPWMの周期を設定し、圧電スピーカから音を出してみました。起動時の音を440Hzに設定し、CW方向に回すとPWM周期が伸びて音が下がり、CCW方向に回すとPWM周期が縮み音が高くなることが確認できました。

PWM SIMPLE DAC ON KURUMI

Jpeg
RL78/G13のPWM出力で、圧電スピーカから音を出してみましたが単音で寂しいので和音が出せないか考えました。DACを使えばできそうですが、DACがないので音信号をオーバーサンプリングして、PWMで簡易DACでPIEZO SPEAKERを鳴らす方法をやってみました。
DACの分解能は、大きくするとPWMの周期が伸びてしまうし、8bitより多くほしかったので9bit(512)としました。PWM周期TDR00に511を設定しました。
音は、正弦波とするため、EXCELでサインのテーブルを作成します。テーブルの配列長を決める必要があります。多い方が良いのですが、メモリを使うので今回は、3度間隔の120個としました。
PWMの周期(512)が終わるごとに割り込みを入れてTDR01の値を変えていきます。120個のテーブルを1周する時間がその時の音の高さになります。 32MHzの時は、PWM周期が32MHz/512になるので62500Hzになります。440HzのAの音の場合、62500/440=142となります。
142回で120個のテーブルを1周回すことになります。
テーブルのインデックスは、i=(PWM周期カウンタ%142)*120/142で算出しました。
音階を固定した音は、32MHzクロックで動かすことができましたが、割り込みに音階処理を入れると処理がPWM周期内に終わらず、不具合を起こすので、16MHzクロックに変更しました。C-D-E-F-G-A-Bと1秒ごとに音階を刻むことができました。しかし、音が小さいです。耳を近づけないと聞こえません。
次は、和音に挑戦です。3度上の音を足し合わせます。CとEのDAC値を足し合わせてPWMのTDR01に設定てします。ただ、そのまま足すとDACの上限512を超えてしまう時があるので、元のSIN信号のテーブルを半分の256振幅に変えました。
ここでまた、処理時間の問題が発生しました。信号が2つになったのでテーブルの検索が2倍になったので仕方ないのですが・・・。PWMのクロックを8MHzクロックにしました。
単音の振幅を半分にしたので更に音が小さくなり、正直、音階が上がっていくのはわかりますが、和音かどうか微妙です。PIEZO SKEAKERの前にCRでLPFを入れてみましたが、影響はわかりませんでした。音が小さすぎるのでこの試みは終了とします。