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ライブラリを使用しています。
実際に機器に組み込む時にはアナログフィルタが問題となります。PWM周期が 20MHz/16bit ≒ 300Hz ということでカットオフ周波数をかなり低くしたLPFが必要です。
UIスレーブ
lumさんとチャットしていてアイディアが浮かんだUIスレーブを思い立ったが吉日で形にしました。
マスタからの問い合わせに応じてスイッチとロータリエンコーダの状態をレポートするI2Cスレーブです。余ったポートでLEDを光らせてキー状態として表示できるようにしたり、ブザーをつけたり。ブザーなんかはワンコマンドでクリック音を出せるようにしたり。
これもATiny2313で、usiTWIライブラリ使用です。
マスタをArduinoにして動作チェック。一応は動作したものの反応が鈍いです。とくにロータリエンコーダ。無限ループで回転を検知したらクリック音を鳴らしてシリアルでArduino IDEにレポートするスケッチを書きました。
回転の検知は、ロータリエンコーダの状態取得のコマンドを送ってI2C受信待ちをして受信データをバッファから取り出す、という動作ですがこれまでのスケッチを流用していたもので受信待ちが100msecのディレイにしていたということに今さっき気がつきました。これでは反応が悪いはずです。後日これを Wire.available() のポーリングに変更しなくてはなりません。