マイコンArduinoを使って電光掲示板を作る。

 

 

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回は前回セットしたブレッドボードでプログラムを試していきます。

 

モジュールの信号線は最低限データ用とクロックそれにラッチは必要だと思うので下記のプログラムで試して見ました。

void setup() {
  // put your setup code here, to run once:
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);

  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
 }

void loop() {
  // put your main code here, to run repeatedly:

   digitalWrite(2,HIGH); // データをセット
   for (int i = 0;i < 16;i++) {
    digitalWrite(4,HIGH); // クロック
    digitalWrite(4,LOW);  // クロック
  }
  digitalWrite(5,HIGH);   // ラッチ
  digitalWrite(5,LOW);    // ラッチ
}

地道にデータをセット、クロック、ラッチの番号を入れ替えて試した結果

 

全点灯しました。

データをセットは 2

クロックは 4

ラッチは 5

他の組み合わせでも点灯する事は有りましたが1列のみや薄暗い等です。

ただ、今のところ完全には把握出来ておりません。

なぜラインの指定もしていないのに全点灯するのか、たまたま点いているだけなのか?

 

次回は条件を付けて点灯がどのように変わるかで信号線の働きを突き止めて行きます。

 

では、また。

 

mckeechan.hatenadiary.com

マイコンArduinoを使って電光掲示板を作る。

マイコンArduinoを使って電光掲示板を作る。

 

続き

ブレッドボードに繋いで実験できるようにケーブル類を作りました。

ネクターは3ヶ所有りますが1つはOUTなので

制御用×1

電源用×1

の2本。

 

モジュールに繋いだ様子

 

電源コネクターには+-がプリントされているのでそのように結線しました。

1,2番+ 3,4番-

制御用の6番は電源の3,4番と接続されているのでGNDと判断

残りの5本が制御用信号線と見てArduinoのd2~d6に接続

 

ブレッドボードにセットしました。

これで実験していきます。

 

試しに電源を繋いでみましたが何も起こりません。

 

次に前回のゲームのプログラムを走らせてみました。するとでたらめですが赤く点灯します。モジュール自体は生きている様です。

 

取り敢えず点きました。

 

次回、プログラムを作って行きます。

 

では、また。

 

mckeechan.hatenadiary.com

マイコンArduinoを使って電光掲示板を作る。

 

 

マイコンArduinoを使って電光掲示板を作る。

 

第3弾

今回から新しいLEDモジュールで進めていきます。

 

16×16ドット サイズ64㎜×64㎜

その他詳細は不明

今回のモジュールはデータシートが手に入らず推測で作って行きます。

 

表示側

 

基板側

L402453514で検索するもヒットせず。

 

ICの型番

シールをめくって現れたLD-TT906-00-U01でもヒットせず。

まあ、+-さえ間違えなければ壊れることは無いだろうと言う安易な考えで進めて行こうと思います。

 

Arduinoのプログラムは簡単に書き換えが出来るのでLEDモジュール用アナライザー的なものを作って進めて行こうかと思います。

 

次回、配線ケーブル他、必要なものを用意していきます。

 

では、また。

マイコンArduinoを使って電光掲示板を作る。

 

 

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回はタクトスイッチを使ってアクセルを追加していきます。

 

スピードのコントロールが出来るとよりゲームらしくなると思います。

 

衝突時のアクションの変更

// slx_5024
byte address = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int count = 0;
int speed = 20;
int car_pos = 6;
int advance = 0;
boolean conflict = false;
//short car_data
= {0x0000, 0x03c0, 0x03c0, 0x0180, 0x0180, 0x03c0, 0x03c0};
short car_data = {0x0000, 0x000f, 0x000f, 0x0006, 0x0006, 0x000f, 0x000f};
short road_data
= {0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xc00f, 0xc00f, 0xc00f, 0xc00f, 0x801f, 0x801f, 0x801f, 0x801f, 0x803f, 0x803f, 0x803f, 0x803f,
                     0x807f, 0x807f, 0x807f, 0x807f, 0x803f, 0x803f, 0x803f, 0x803f, 0x801f, 0x801f, 0x801f, 0x801f, 0xc00f, 0xc00f, 0xc00f, 0xc00f,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003};

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      digitalWrite(6,LOW); // GREEN  緑データ              // データのセット
      digitalWrite(9,LOW); // RED    赤データ              // データのセット
      if ((road_data[k + advance] & 0x8000 >> i) != 0)
        digitalWrite(6,HIGH); // GREEN  緑データ              // データのセット
      if (k < 7) {
        if ((car_data[k] & 0x8000 >> i + car_pos) != 0)
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット

        if ((road_data[k + advance] & car_data[k] << car_pos) != 0)
          conflict = true;
      }
      clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }

  if (conflict) {
    speed = 20;
    conflict = false; // 衝突すると停止する
  }
  count++;
  if (count > speed) {
    count = 0;

    if (speed < 20) // アクセルオンで再スタート
      advance++;
      
    if (advance > 64)
      advance = 0;
     
    // 車の位置
    if (digitalRead(11) == 0)
      if (car_pos < 12)
        car_pos++;

    if (digitalRead(12) == 0)
      if (car_pos > 0)
        car_pos--;
        
    if (digitalRead(14) == 0) { // アクセル
      speed--;
      if (speed < 1)
        speed = 1;
    }
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

 

アクセルで速度の調整が出来る。


www.youtube.com

速度を上げると直ぐにぶつかる。(難しい)

 

今回のゲームは如何だったでしょうか。

Arduinoは書き換えて直ぐに実行できるので色々試して下さい。

 

ゲームはここで一旦終了とさせて頂きます。

 

では、また。

マイコンArduinoを使って電光掲示板を作る。

マイコンArduinoを使って電光掲示板を作る。

 

 

続き

今回は障害物に衝突したら何らかのアクションを起こす様に改造していきます。

 

簡単なところから ぶつかる=とまる で行きたいと思います。

 

プログラムを作って行くのですが、ぶつかった事を知る方法を考えなければなりません。

色々と考えたが、車と道路のANDを取ってビットが立っていたら衝突が成り立つようです。

 

そこで作ったプログラム

// slx_5024
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int count = 0;
int speed = 5;
int car_pos = 6;
int advance = 0;
boolean conflict = false; // 衝突
//short car_data[ ] = {0x0000, 0x03c0, 0x03c0, 0x0180, 0x0180, 0x03c0, 0x03c0};
short car_data[ ] = {0x0000, 0x000f, 0x000f, 0x0006, 0x0006, 0x000f, 0x000f};
short road_data[ ] = {0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xc00f, 0xc00f, 0xc00f, 0xc00f, 0x801f, 0x801f, 0x801f, 0x801f, 0x803f, 0x803f, 0x803f, 0x803f,
                     0x807f, 0x807f, 0x807f, 0x807f, 0x803f, 0x803f, 0x803f, 0x803f, 0x801f, 0x801f, 0x801f, 0x801f, 0xc00f, 0xc00f, 0xc00f, 0xc00f,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003};

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      digitalWrite(6,LOW); // GREEN  緑データ              // データのセット
      digitalWrite(9,LOW); // RED    赤データ              // データのセット
      if ((road_data[k + advance] & 0x8000 >> i) != 0)
        digitalWrite(6,HIGH); // GREEN  緑データ              // データのセット
      if (k < 7) {
        if ((car_data[k] & 0x8000 >> i + car_pos) != 0)
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット

        if ((road_data[k + advance] & car_data[k] << car_pos) != 0)
          conflict = true; // 衝突した
      }
      clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
  
  if (!conflict) // 描画が更新されない
    count++;
    
  if (count > speed) {
    count = 0;
    
    advance++;
    if (advance > 64)
      advance = 0;
     
    // 車の位置
    if (digitalRead(11) == 0)
      if (car_pos < 12)
        car_pos++;

    if (digitalRead(12) == 0)
      if (car_pos > 0)
        car_pos--;
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

car_data[ ]を新しくしました。

衝突判定でのビット操作を単純化する為

 

道路上を走行している様子


www.youtube.com

ぶつかると止まります。

 

次回はタクトスイッチがもう一つ余っているのでそれを使ってアクセルを追加していきます。

 

では、また。

 

mckeechan.hatenadiary.com

マイコンArduinoを使って電光掲示板を作る。

 

 

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回は道路を作って行きます。

 

ただ真っ直ぐな道路ではつまらないのでカーブが連続した道路を作ります。

 

作ったプログラム

// slx_5024
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int count = 0;
int speed = 5;
int car_pos = 0;
int advance = 0; // 道路の描画
short car_data[ ] = {0x0000, 0x03c0, 0x03c0, 0x0180, 0x0180, 0x03c0, 0x03c0};

// 道路のデータ
short road_data[ ] = {0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xc00f, 0xc00f, 0xc00f, 0xc00f, 0x801f, 0x801f, 0x801f, 0x801f, 0x803f, 0x803f, 0x803f, 0x803f,
                     0x807f, 0x807f, 0x807f, 0x807f, 0x803f, 0x803f, 0x803f, 0x803f, 0x801f, 0x801f, 0x801f, 0x801f, 0xc00f, 0xc00f, 0xc00f, 0xc00f,
                     0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
                     0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003};

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      digitalWrite(6,LOW); // GREEN  緑データ              // データのセット
      digitalWrite(9,LOW); // RED    赤データ              // データのセット
      if ((road_data[k + advance] & 0x8000 >> i) != 0)
        digitalWrite(6,HIGH); // GREEN  緑データ              // データのセット
      if (k < 7) {
        if ((car_data[k] & 0x8000 >> i + car_pos) != 0)
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      }
      clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
  count++;
  if (count > speed) {
    count = 0;
    
    advance++;
    if (advance > 64)
      advance = 0;
     
    // 車の位置
    if (digitalRead(11) == 0)
      if (car_pos < 6)
        car_pos++;

    if (digitalRead(12) == 0)
      if (car_pos > -6)
        car_pos--;
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

道路は緑で表示しました。

2面分のデータをループさせて表示(+1面分は繋ぎ用)

難易度は道路のデータを書き換えることで可能です。

 

道路上を走っている様子


www.youtube.com

 

車と道路は完成しましたが、このままではぶつかっても何も起こりません。

ゲームとして成り立たないので次回は衝突時のアクションを作って行きます。

 

では、また。

 

mckeechan.hatenadiary.com

マイコンArduinoを使って電光掲示板を作る。

マイコンArduinoを使って電光掲示板を作る。

 

続き

今回からはまたゲームを作って行きます。

 

作るゲームはドライブゲームです。

 

車を運転して障害物を避けながら進む定番ゲームです。

 

プログラムとしてはテニスのラケットを動かす所に似ています。

モジュールを立てて使うので左右上下の違いはありますが。

 

作ったプログラム

// slx_5024
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int count = 0;
int speed = 5;
int car_pos = 0;
short car_data[ ] = {0x0000, 0x03c0, 0x03c0, 0x0180, 0x0180, 0x03c0, 0x03c0};

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }

  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      digitalWrite(9,LOW); // RED    赤データ              // データのセット
      if (k < 7) {
        if ((car_data[k] & 0x8000 >> i + car_pos) != 0)
          digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      }
      clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
  count++;
  if (count > speed) {
    count = 0;

    // 車の位置
    if (digitalRead(11) == 0)
      if (car_pos < 6)
        car_pos++;

    if (digitalRead(12) == 0)
      if (car_pos > -6)
        car_pos--;
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

car_data[ ]で車のパターンを作っています。

ラケット移動で使ったタクトスイッチをそのまま流用しています。

 

車が左右に移動する様子


www.youtube.com

 

次回は道路を作って行きます。

 

では、また。

 

mckeechan.hatenadiary.com