電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

I2Cスレーブをいくつか増やしました

I2Cスレーブをいくつか増やしました

ATtiny2313によるスイッチ/ロータリエンコーダ読み取りスレーブ
no title
ATtiny2313による16bit PWMスレーブ
no title
ATtiny2313による7セグメントのLED表示器スレーブ
no title
ATtiny2313によるLCD表示器スレーブ
no title
ATtiny85による正弦波生成スレーブ
no title

16bit PWM電圧設定スレーブ

作っている電子楽器周辺機器の部品として必要に迫られて、マイコンから電圧を設定できるようにしたくなりました。アナログシンセのオクターブ/ピッチチューニングの電圧を作りだそうとしています。

これまでの経験から8ビットでは明らかに足りない、しかしよくわからないので、16ビットタイマをあてがって、16bitの分解能のPWMとしてみました。

ときおりしも、pcm1723さん(d:id:pcm1723)のところでシグマデルタ変調PWMの実験と評価が成されていた(pcm1723さんの日記を「シグマデルタ変調」で検索)ので、これを利用させていただいて、ON/OFFで切り替えられるようにしつつアプライしました。

以上をATiny2313にI2Cのスレーブとしてまとめました。これまでの一連の ATtiny2313 I2Cスレーブで使っている usiTWIライブラリを使用しています。

f:id:Chuck:20090823103145j:image f:id:Chuck:20090823103142j:image

実際に機器に組み込む時にはアナログフィルタが問題となります。PWM周期が 20MHz/16bit ≒ 300Hz ということでカットオフ周波数をかなり低くしたLPFが必要です。

UIスレーブ

lumさんとチャットしていてアイディアが浮かんだUIスレーブを思い立ったが吉日で形にしました。

マスタからの問い合わせに応じてスイッチとロータリエンコーダの状態をレポートするI2Cスレーブです。余ったポートでLEDを光らせてキー状態として表示できるようにしたり、ブザーをつけたり。ブザーなんかはワンコマンドでクリック音を出せるようにしたり。

これもATiny2313で、usiTWIライブラリ使用です。

f:id:Chuck:20090914043552j:image

マスタをArduinoにして動作チェック。一応は動作したものの反応が鈍いです。とくにロータリエンコーダ。無限ループで回転を検知したらクリック音を鳴らしてシリアルでArduino IDEにレポートするスケッチを書きました。

回転の検知は、ロータリエンコーダの状態取得のコマンドを送ってI2C受信待ちをして受信データをバッファから取り出す、という動作ですがこれまでのスケッチを流用していたもので受信待ちが100msecのディレイにしていたということに今さっき気がつきました。これでは反応が悪いはずです。後日これを Wire.available() のポーリングに変更しなくてはなりません。