0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RP2040マイコンでドットマトリックスを制御しようボードのサンプルプログラム①

Posted at
  • 商品概要

 RP2040マイコンを使って、8x8LED ドットマトリックスを制御して楽しもうというコンセプトです。
 RTCも簡単につながるので、時間表示なども楽しんで知的好奇心を満たせれば嬉しいです。

  • サンプルサンプルプログラム内容

 I2C接続が問題ないか、また各デバイスのアドレスを確認する。
 今回のボードは、ドットマトリックス制御IC、RTCとI2Cで接続しています。
 デバイスがつながっているかを確認するプログラムです。
 

  • プログラム環境

 ArduinoIDE バージョン:2.3.2
 

  • ハードウェアの主な仕様

 ①マイコン:PR2040-ZERO(RaspberryPiPico系)
 ②I2C接続ピン 
  SDA:GPIO8(GPIO4)
  SDL:GPI09(GPIO5)
 ③RTC DS1307RTCモジュール
 ④Lチカ用LED :GPIO10
 ⑤マトリクスLEDドライバ HT16K33-28Wまたは互換
 ⑥プッシュスイッチ1:GPI011
  プッシュスイッチ2:GPI012

  • サンプルプログラム

#include <Wire.h>  // I2C通信ライブラリをインクルード

void setup() {
  Wire.begin();  // I2Cバスを初期化

  Serial.begin(9600);  // シリアル通信を9600bpsで開始
  while (!Serial);  // シリアルモニタが開くまで待機
  Serial.println("\nI2C Scanner");  // シリアルモニタにメッセージを表示
}

void loop() {
  byte error, address;  // エラーコードとアドレスを格納する変数
  int nDevices;  // デバイスの数をカウントする変数

  Serial.println("Scanning...");  // スキャン開始メッセージを表示

  nDevices = 0;  // デバイス数を初期化
  for (address = 1; address < 127; address++) {  // 1から126までのアドレスをスキャン
    Wire.beginTransmission(address);  // 指定アドレスに通信を開始
    error = Wire.endTransmission();  // 通信終了し、エラーコードを取得

    if (error == 0) {  // エラーコードが0の場合、デバイスが見つかった
      Serial.print("I2C device found at address 0x");
      if (address < 16) 
        Serial.print("0");  // アドレスが16未満の場合、先頭に0を追加
      Serial.print(address, HEX);  // アドレスを16進数で表示
      Serial.println("  !");

      nDevices++;  // デバイス数をインクリメント
    } else if (error == 4) {  // エラーコードが4の場合、未知のエラー
      Serial.print("Unknown error at address 0x");
      if (address < 16) 
        Serial.print("0");  // アドレスが16未満の場合、先頭に0を追加
      Serial.println(address, HEX);  // アドレスを16進数で表示
    }    
  }
  if (nDevices == 0)  // デバイスが見つからなかった場合
    Serial.println("No I2C devices found\n");
  else  // デバイスが見つかった場合
    Serial.println("done\n");

  delay(2000);  // 次のスキャンまで2秒待機
}

  • ハードウェアとソフトウェアの関係性

マトリクスLEDドライバは、基板上のRA1,2,3、RB1,2,3、RC1,2,3の
3bitでアドレスを割り振りしています。

image.png

左側のドットマトリクスLEDは、
RA1,2,3=000binより0x70と設定しています。

同様に中央のドットマトリクスLEDは、
RB1,2,3=001binより0x71となります。

右側のドットマトリクスLEDは、
RC1,2,3=011binより0x73となります。

1=抵抗実装あり
0=抵抗実装なし
とハードウェアでアドレスを設定しています。

このプログラムを実行してシリアルモニタを表示させてみます。
こんな感じで結果が出てきます。

image.png

上の二つはRTCモジュールの本体とメモリですね。
下の三つは、ドットマトリックスのアドレスになります。

DS1307RTCモジュールには、I2Cで接続された
フラッシュEEPROMが載っているので試したことはないのですが
簡単なデータを書き込みできるかもしれませんね。


  • サンプルプログラム2

ボード上にLEDがいるのでLチカをしてみましょう!

  • サンプルプログラム

image.png

GP10にLEDが接続されているので、マイコン出力をHI、LOさせて点滅させてみます。
プッシュスイッチは2番(PSW2)を指定しています。


// 定数の定義(ピン番号)
const int buttonPin = 12;  // プッシュボタンのピン番号
const int ledPin = 10;    // LEDのピン番号

// 変数の定義
int buttonState = 0;  // プッシュボタンの状態を読み取る変数

void setup() {
  pinMode(ledPin, OUTPUT);  // LEDピンを出力に設定
  pinMode(buttonPin, INPUT);  // プッシュボタンピンを入力に設定
}

void loop() {
  buttonState = digitalRead(buttonPin);  // プッシュボタンの状態を読み取る

  if (buttonState == LOW) {  // プッシュボタンが押された場合
    digitalWrite(ledPin, HIGH);  // LEDを点灯
  } else {  // プッシュボタンが押されていない場合
    digitalWrite(ledPin, LOW);  // LEDを消灯
  }
}

PSW2番を押すとLEDが点灯、離すと消灯するプログラムです。

プッシュスイッチが二つあるので、PSW1をオン、PSW2をオフにするスイッチとか
遊べそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?