2015年8月26日水曜日

シーケンス入力用のデバイス 基板設計とブレッドボードで実験

もう少し考えてみた。

回路図

基板図

部品を並べた

POTを2個追加した。

外部との通信はI2CなのでI2CのLCDを載せることも考えてみたが、ユニバーサル基板では配線がきつそうなのでPOTを2個追加することにした。

ADCの入力に使えるPORTCの空きピン数を増やすために、タクトスイッチの入力用のPINをPORTB、PORTDにまたがって使うことにした。

プログラミングがちょっと煩雑になりそうだが(^q^;

POTの用途はまだちゃんと考えていないがLevelやDecayの調整に使えないかと思っている。

基板図の黄色い配線は基板の表面で配線しようかな?

ツマミを乗せた

いつも使ってるつまみをつけてみたが、なんか大げさな感じがするのでもっと安っぽいやつを仕入れる予定。

Sequencer_IC接続表

接続状態が混乱しそうなので、一応表にまとめてみた。

ATMega88Vの空きピンはPC3の一本だけになってしまった。

PINを大量消費したが、外部との接続には最低I2CのSCL、SDAとGNDの3本で済む。AVRの起動時の挙動(Fuse Bitで指定するらしい)をうまくすれば、RESETは省略できるかも知れない。


ブレッドボードで実験

ArduinoとのI2Cの通信と、LED制御用のシフトレジスタ(74HC595)だけ実験してみた。

なんか色々問題がありそうなのでもう少し実験続行予定。

I2C通信は割り込みで処理するべき?


ファームウェアのソース
https://github.com/ryood/RhythmMachine/blob/master/Atmel%20Stduio/Sequencer_I2C_Slave/Sequencer_I2C_Slave/Sequencer_I2C_Slave.c

前回テストしたI2C Sleveのコードをそのままコピペで使ったが、I2Cの処理でマスターからの送信要求をwhileループでWaitしている
// Wait for TWINT Flag set.
while( !( TWCR & (1<<TWINT) ) );
マスターからの要求が無い限りこのループからは抜け出さない。なので、待ち状態の間はメインループでポーリングで読み取っているタクトスイッチの押し下げを検知できない。

I2C通信を割り込みで処理するか、スイッチ押し下げをTimer割り込みで検知するかしないとダメっぽい。

納期はないので(^q^;両方割り込みで処理できるように実験してみようかな?

ATMegaならFreeRTOSも使えるみたいだが、まずは割り込みで処理することを目標に
→ロータリーエンコーダーとPOTのADCもあるので悩ましい(^q^;

I2C通信の送出

どこまでこの基板上で処理するかも悩ましい。

単なる入力デバイスとして考えると
スイッチの状態[1..8](8bit)|スイッチの状態[9..16](8bit)|POT1のADC値(8bit)|POT2のADC値(8bit)|ロータリーエンコーダーの状態(8bit)
ぐらいかな?ロータリーエンコーダーによるトラックの切り替えは本体で処理しようか?悩ましい(^q^;;;

メモ:
  • スイッチのトグル動作はできたがチャタリング対策はまだ
  • タクトスイッチはTR-808みたいに4個ずつ(1小節ごと)で色分けしたほうが使いやすそう
  • シーケンスの[1..8]、[9..16]切り替え表示用のLEDは縦に並べたほうが良さそう
  • GND、VCCにテスト・ピンを追加
  • パスコンに10uFぐらいのケミコンを追加