2015年8月9日日曜日

Arduinoでシーケンスの入力デバイスの実験

ほんとうはスイッチを16個並べたかったのですが、作っておいたタクトスイッチが8個並びの基板でテストしてみました。


ユニバーサル基板の方はSWの押し下げでGNDと導通します

ブレッドボードの方はSWのON/OFFをLEDで視認できるように組みました

Arduinoからの出力がHになるとLEDが発光します。

Arduinoのスケッチ

void setup() {
  for (int i = 2; i < 8; i++) {
    pinMode(i, INPUT_PULLUP);
  }
  Serial.begin(9600);
  Serial.println("Seaquence Input Test Start");
}

void loop() {
  for (int i = 2; i < 8; i++) {
    int v = digitalRead(i);
    if (v == 0) {
      digitalWrite(i + 6, HIGH);
    }
    else {
      digitalWrite(i + 6, LOW);
    }
    Serial.print(v > 0 ? i : 0);
    Serial.print("\t");
  }
  Serial.print("\n");
/*  
  for (int i = 8; i < 14; i++) {
    digitalWrite(i, HIGH);
  }
*/  
  delay(100);
}


ArduioのSerialクラスを使うとArduinoのD0,D1はシリアル通信と干渉するようです。(Arduinoの基板にもRX/TXと書いてあります)

なので、0と1はとばして2から処理するようにしました。


スイッチの押し下げとLEDの発光が連動するようになりました。

PB6とPB7も水晶発振でつぶされているので、AruduinoではポートB、ポートDともに6bitしか使えないみたいです

ポートCはもともと6こしかないです。


リズムマシンの入力デバイスをどうするか

シフトレジスタ(74HC595)を使えば2線のシリアルから8線のLEDを制御できそうです。

ですが、逆方向にパラレルの入力をまとめてシリアルにするロジックICは見つかりませんでした。(LED発光より入力用のスイッチのON/OFFの方が大事)

パラレル入力をまとめてシリアルにするには・・・と考えると単純な論理回路では実現できそうにないです。

なので、マイコンの方がいいかなと思ってPIN数が多くて値段が安いマイコンを探すと

AVRマイコン ATmega88V-10PU
http://akizukidenshi.com/catalog/g/gI-03655/

がヒットしました。

ざっと見た感じではATMega328PとPINは互換のようです。

スペックはほとんどどうでもよくてPIN数が稼げてコスト優先でATmega88はプラス加点

28Pあるので電源系は予約して、UARTと水晶のPINをあければIN:8bit(SW用)、OUT:8bit(LED用)はいけるかな?

ATmegaだから外部との通信もI2Cが使えそうです。I2CはPortCなのでなんとかぎりぎりいけるかな?

ホントは16個のスイッチを使いたいので、8個のSWで済まそうと思うと切り替え用のスイッチがあと1個いるのか・・・

悩ましいです(^q^;