SSブログ

手っ取り早くマトリックスLEDを使う その3 [Arduino]

マトリックスLEDで表示ができるようになったので、それで何かしてみようと思いました。
とりあえず、ジャンケンをしてみます。
jkp.jpg
スイッチを取り付けるのも面倒だったので、リセット毎にランダムで表示することとしました。
横スライドしやすいようにイメージデータは列毎1バイトとして作成しました。

また恥ずかしながらソースは下記のとおり。
// Arduino Pro Miniで手っ取り早くマトリックスLEDを使うスケッチ (Arduino Pro Mini専用)
//   (SZ420788K: 8x8, 0.8inch, カソードコモン)
//   を応用してジャンケンをする。
#include <avr/sleep.h>
const uint8_t MATRIX_ROW[] = {  2,  7, 17,  5, 10, 16, 11, 14 };  // 行 → デジタルピン番号
const uint8_t MATRIX_COL[] = {  6, 12, 13,  3, 15,  4,  8,  9 };  // 列 → デジタルピン番号 (左からLSB->MSB)
uint8_t *MATRIX_IMAGE;        // イメージのポインタ

uint8_t jkp_ready[] = {       // 横にスライドしやすいようにイメージは列毎にデータを作成
  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  // じゃん
  B00111111,  B01000000,  B10000000,  B10000000,  B10000010,  B01000100,  B01000001,  B00100010,
  B00000000,  B00010000,  B00010000,  B00011100,  B00110000,  B11001000,  B00001110,  B00101000,
  B00101000,  B00010000,  B00000000,  B11000000,  B00100000,  B00011000,  B00010110,  B00010001,
  B01100000,  B10000000,  B10000000,  B01000000,  B00100000,  B00000000,  B00000000,  B00000000,

  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  // けん
  B01111100,  B10000011,  B00000000,  B00000000,  B00000100,  B00000100,  B10000100,  B01111111,
  B00000100,  B00000100,  B00000000,  B11000000,  B00100000,  B00011000,  B00010110,  B00010001,
  B01100000,  B10000000,  B10000000,  B01000000,  B00100000,  B00000000,  B00000000,  B00000000,
  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  B00000000,  
};
uint8_t jkp_image[3][8] = {
  { B00111000,  B01111100,  B11111110,  B11111110,  B11111110,  B11111110,  B00111110,  B00011100 },  // グー
  { B00110000,  B01111111,  B11111111,  B11110000,  B11111111,  B11111111,  B01111000,  B00110000 },  // チョキ
  { B00110000,  B01111110,  B11110000,  B11111111,  B11110000,  B11111111,  B01110000,  B00011000 }   // パー
};
  
void setup() {
  for( int i = 2; i <= 17; i++ ) pinMode( i, OUTPUT );
  pinMode( A4, INPUT );       // ランダムな値の発生源として未接続のピンをアナログ入力にする
  TCCR2A = B00000000;         // Timer2 (8bit) のオーバーフローで割り込む。ちらつきがない分周比は
  TCCR2B = B00000010;         // dot毎なら010(8分周まで),line毎なら101(128分周まで)くらい。
  TIMSK2 = B00000001;         // TOIE2 (オーバーフロー割り込み許可)
}

void loop() {
  for( int i = 0; i < 72; i++ ) {
    MATRIX_IMAGE = jkp_ready + i;
    delay(30);
  }
  delay(200);
  MATRIX_IMAGE = jkp_image[ analogRead( A4 ) % 3 ];
  delay(2000);
  MATRIX_IMAGE = jkp_ready;   // 消灯
  delay(1);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
  sleep_mode();               // リセットするまで動作停止
}

ISR( TIMER2_OVF_vect ) {
  static uint8_t row, col;
  digitalWrite( MATRIX_COL[ col ], LOW  );
  if( ++col == 8 ) {
    col = 0;
    digitalWrite( MATRIX_ROW[ row ], HIGH );
    row = ( row + 1 ) % 8;
    digitalWrite( MATRIX_ROW[ row ], LOW  );
  }
  digitalWrite( MATRIX_COL[ col ], ( MATRIX_IMAGE[ col ] >> row ) & 1 );  // データの都合で行と列を変更
}

未使用のA4ピンをアナログ入力でランダムな値の発生源としましたが、入力端子をオープン(未接続)状態にするのはどうやら本当は良くないらしい、、、。

こんな感じです。



初めてのYou Tubeへのアップロードでした。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。