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

- ## 商品概要
　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または互換
　⑥プッシュスイッチ１：GPI011
　 プッシュスイッチ２：GPI012


- ## サンプルプログラム

```c++
#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/ca7bd969-06a7-cb4f-0575-a24f9e421e13.png)


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

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/0440b81c-759f-5672-da1d-51874291887f.png)

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



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

---

- ## サンプルプログラム2
ボード上にLEDがいるのでLチカをしてみましょう！

- ## サンプルプログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/966c05a7-f432-0899-6ebb-b7908235ba07.png)


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

```c++

// 定数の定義（ピン番号）
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をオフにするスイッチとか
遊べそうです。