(8×8ledマトリクス使ってみた。)

 

 今回は、秋月電子で購入した砂時計用の8×8 LEDマトリクスを使ってみました。

 

一旦LEDマトリクスの簡単な動作原理を理解しておきます。

LEDマトリクスには行(ROW)と列(COL)がありそれを組み合わせることで、点灯させています。例として、1つだけ光らせる場合は対象の行をhigh、対象の列をLOWにすることで、その交点だけ光る仕組みです。ただし人間の目は残像が残るため、同時に光っているように見えます。このような仕組みをダイナミック点灯というようです。

 

■配線作業。

写真(1)と下の表を参考に、アノード側に抵抗を入れて配線していきます。

今回は、マトリクスの定格電圧が2.1〜2.5Vだったため、手元に多くあった10kΩの抵抗を使用しました。

マトリクスLED(ピン番号) Arduino側(ピン番号)
1 Digital 6
2 Digital 8
3 Digital 11
4 Digital 12
5 Digital 9
6 Analog 1
7 Digital 7
8 Digital 4
9 Digital 2
10 Analog 0
11 Analog 2
12 Digital 5
13 Digital 10
14 Digital 3
15 Analog 3
16 Analog 4

写真(1)

配線後の様子。

内部回路

■「×」をマトリクスに表示してみる。

ソースコードを書く

①arduinoとマトリクスの配線を配列で定義する。

・ROW(行)

const int rowPins[8] = {  
2, // R1  
3, // R2  
4, // R3  
5, // R4  
6, // R5  
7, // R6  
8, // R7  
9  // R8
};

・COL(列)

Arduino Unoではデジタルピンだけでは出力ピンが足りないため、アナログピンも使用しています。

const int colPins[8] = {  
10, // C1  
11, // C2  
12, // C3  
A0, // C4  
A1, // C5  
A2, // C6  
A3, // C7  
A4  // C8
};

②点灯データーを作る。

LEDの点灯状態を2次元配列で表現します。

以下のデータで「×」の模様を表示できます。

byte matrix[8][8] = {  
{1,0,0,0,0,0,0,1},  
{0,1,0,0,0,0,1,0}, 
{0,0,1,0,0,1,0,0},  
{0,0,0,1,1,0,0,0},  
{0,0,0,1,1,0,0,0},  
{0,0,1,0,0,1,0,0},  
{0,1,0,0,0,0,1,0},  
{1,0,0,0,0,0,0,1}
};

③マトリクス表示コード

これまで設定した内容を使って、実際にLEDマトリクスを点灯させます。

const int rowPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
const int colPins[8] = {10, 11, 12, A0, A1, A2, A3, A4};

byte matrix[8][8] = {
  {1,0,0,0,0,0,0,1},
  {0,1,0,0,0,0,1,0},
  {0,0,1,0,0,1,0,0},
  {0,0,0,1,1,0,0,0},
  {0,0,0,1,1,0,0,0},
  {0,0,1,0,0,1,0,0},
  {0,1,0,0,0,0,1,0},
  {1,0,0,0,0,0,0,1}
};

void setup() {
  for (int i = 0; i < 8; i++) {
    pinMode(rowPins[i], OUTPUT);
    pinMode(colPins[i], OUTPUT);
  }
}

void loop() {
  for (int row = 0; row < 8; row++) {

    // 全行OFF
    for (int i = 0; i < 8; i++) {
      digitalWrite(rowPins[i], LOW);
    }

    // 全列OFF
    for (int i = 0; i < 8; i++) {
      digitalWrite(colPins[i], HIGH);
    }

    // 点灯データ反映
    for (int col = 0; col < 8; col++) {
      if (matrix[row][col] == 1) {
        digitalWrite(colPins[col], LOW);
      }
    }

    // 行ON
    digitalWrite(rowPins[row], HIGH);

    delay(2);
  }
}

 

■動作の様子

カメラで見ると点滅しているのがわかります。

 

応用として最終的な目標である、砂時計制作に向けて砂が流れ落ちていくアニメーションを作りました(chatgptが)。

改善点が何個かありますが、次からはこれも参考にするため、貼っておきます。

// ひし形砂アニメーション
// 1秒に1個ずつ砂が落ちる

const int rowPins[8] = {2,3,4,5,6,7,8,9};
const int colPins[8] = {10,11,12,A0,A1,A2,A3,A4};

byte matrix[8][8];

int sandCount = 0;

const int MAX_SAND = 64;

int sandRow[MAX_SAND];
int sandCol[MAX_SAND];



// =======================
// 初期化
// =======================

void setup() {

  for(int i=0; i<8; i++){
    pinMode(rowPins[i], OUTPUT);
    pinMode(colPins[i], OUTPUT);
  }

  buildSandOrder();
}



// =======================
// メイン
// =======================

void loop() {

  if(sandCount >= MAX_SAND){

    delay(2000);

    sandCount = 0;

    clearMatrix();
  }

  int targetRow = sandRow[sandCount];
  int targetCol = sandCol[sandCount];

  // 砂を落とす
  animateSand(targetRow, targetCol);

  // 着地
  matrix[targetRow][targetCol] = 1;

  sandCount++;

  // 1秒待つ
  showMatrix(1000);
}



// =======================
// 積もる順番生成
// =======================

void buildSandOrder(){

  int index = 0;

  // 右下から対角線ごと
  for(int sum=14; sum>=0; sum--){

    for(int r=7; r>=0; r--){

      int c = sum - r;

      if(c >=0 && c <8){

        sandRow[index] = r;
        sandCol[index] = c;

        index++;
      }
    }
  }
}



// =======================
// 左上→右下へ流す
// =======================

void animateSand(int targetRow, int targetCol){

  int x = 0;
  int y = 0;

  while(x <= targetCol && y <= targetRow){

    drawStoredSand();

    matrix[y][x] = 1;

    // 落下スピード
    showMatrix(80);

    x++;
    y++;
  }
}



// =======================
// 積もった砂描画
// =======================

void drawStoredSand(){

  clearMatrix();

  for(int i=0; i<sandCount; i++){

    int r = sandRow[i];
    int c = sandCol[i];

    matrix[r][c] = 1;
  }
}



// =======================
// 全消去
// =======================

void clearMatrix(){

  for(int r=0; r<8; r++){
    for(int c=0; c<8; c++){
      matrix[r][c] = 0;
    }
  }
}



// =======================
// 表示
// =======================

void showMatrix(int duration){

  unsigned long start = millis();

  while(millis() - start < duration){

    for(int row=0; row<8; row++){

      // 全行OFF
      for(int i=0; i<8; i++){
        digitalWrite(rowPins[i], LOW);
      }

      // 全列OFF
      for(int i=0; i<8; i++){
        digitalWrite(colPins[i], HIGH);
      }

      // LED反映
      for(int col=0; col<8; col++){

        if(matrix[row][col]){

          digitalWrite(colPins[col], LOW);
        }
      }

      // 行ON
      digitalWrite(rowPins[row], HIGH);

      delay(2);
    }
  }
}

 

■まとめ

今回は8×8 LEDマトリクスを使って「×」マークと砂のシュミレーション的なものをを表示してみました。

配線自体はピン数が多くて大変ですが、行と列を組み合わせて制御する仕組みが分かりちょっと使えるようになりました。

            (本格ベーコン作りました)

 ベーコンが食べたくなったので本格ベーコンを作りました。

完成まではおよそ1週間かかります。

 

手順は

1、400~800g(今回は400g)程度の豚バラブロックを用意し、フォークで穴をあける。

2、ハーブ塩を作る

3、ハーブ塩を肉に刷り込む

4、ラップで包み、ジップロックに入れて冷蔵庫で4日間寝かせる。

  その間一日一回上下をひっくり返す。

5、肉にくしを指して燻製できる状態にし一夜風にあて乾燥させる。

6、60°cで6時間燻製させる。

 

【ハーブ塩の分量(肉500gに対して)】

・塩(自然塩や岩塩)……25〜30g(肉の2.5〜3%) 

・砂糖(きび糖など)……10g

 ・黒こしょう(粗挽き)……5g 

・にんにく(すりおろし)……1〜2片 

・ローリエ(砕く)……3枚 

・タイム(乾燥)……小さじ2 

・ローズマリー(乾燥・細かく刻む)……小さじ2

 ・セージ(乾燥)……小さじ1 

・オールスパイス……小さじ1/2

 

今回用意した肉は400g * 10個で合計4Kg

■作業の様子

ハーブ類

4日間漬け込んだ後の肉

つるすために針金を加工した串を刺します。

その後、扇風機を使って風乾。

七輪の上に、さくらチップを入れたフライパンを置き燻製。

途中燻せていない時間があったのでこの工程が終わるのに8時間かかりました。

■いざ実食

塩辛かったです。

もうちょっと塩の量減らしたほうが良かったかも。


おまけ

ヒバカリを見つけました。

          (VOXELAB Aquila S2の修理)

 今回は、以前ノズル詰まりで使えなくなっていた3Dプリンターを修理しました。

詳しい原因は、ヒートシンク部分に溶けたフィラメントが張り付いてしまい、フィラメントがノズル先端まで送られなくなっていたことでした。

もしかしたらPLAを有機溶剤で溶かすなどして対処できた可能性がありますが、今回はホットエンドごと新品に交換しました。値段は2,483円。

https://ja.aliexpress.com/item

 

交換後は問題なく動きました。

 

交換中の様子

交換パーツ

コメリで買ってきた修理部品

ノズル部分にアクセスするためにファンとモーターをばらします。

センサーの配線は半田付けで接続しました。
温度センサーは付属品が動作しなかったため、以前のものを流用しました。

印刷したしゃちほこ↓

            (海水魚水槽の模様替え

 今回は、海水魚水槽の掃除と模様替えを行ったので、記録として残しておこうと思います。

 

「掃除」といっても、水槽内のリセットに近い作業になります。

主に変わった点・リセットした点は次のとおりです。

・上部フィルターから外部フィルターへ交換
・飼育水は以前のものを10Lのみ残し、それ以外はすべて新しい水に交換
・これまで使用していたライブロックやあわびの貝殻は廃棄
・底砂の厚みを薄く調整
・新しいライブロックを約1kg追加

といった内容です。

 

ここからは作業の様子です。

 

まずはリセット前の状態。こんな感じで3年間やってきました。

コケも生えまくりですね。

リセット作業中は、水槽の位置も部屋の模様替えに合わせて変更しました。底砂は水道水で洗ってから投入しています。

魚たちはその間、バケツに待機です。

水を張った後は海水を作り、

ヒーターと熱湯←たぶんあんまよくない))で温度を調整していきます。

外部フィルターは、Amazonで約6000円のものを買いました。

水槽まわりをすっきりさせるために購入。静かでgoodです。

購入したライブロック

かにがなかに。

そしてリセット後の様子。夜に撮影したため、魚たちはすでに就寝モード。

サンゴも最近不調ですが、時間が解決してくれるはずです。

最後に動画

初めての大掛かりなリセットですがかなり満足できる仕上がりになりました。

今後も長年の夢であるカクレクマノミの繁殖に向けても、頑張って環境を整えていきます。

              (秋月電子の購入品メモ)

約3か月ぶり、そして今年最初の投稿です。

しばらく電子工作をさぼっていてネタがなかったのですが、今日からまた本格的に再開しようと思います。

今回は秋葉原へ行き、特に目的を決めずに部品を見ながら散策。その中で、8×8ドットマトリクスを使った砂時計を作ることにしました。

上下にドットマトリクスをつなげ、6軸IMUセンサーで傾きを検知して、本物の砂時計のように動かす予定です。複数制作も考えて、PICマイコンも購入しました。

 

そのほかに買った部品も含め、次に表でまとめておきます。

制作は準備が整い次第ということで

品名 個数 単価(円) 合計(円)
8×8ドットマトリクス(青) 2 280 560
8×8ドットマトリクス(赤) 2 180 360
8×8ドットマトリクス(黄) 2 180 370
6軸IMUセンサーモジュール 2 990 1980
LEDマトリックスドライバー (HT16K33) 2 330 660
ペルチェ素子 1 500 500
ESP32 1 1770 1770
OH182/E 2 30 60
可変スイッチング電源 1 1300 1300
XHコネクター 1 100 100
12F1822 4 200 800
合計金額 8460 円