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でアドレスを割り振りしています。
左側のドットマトリクスLEDは、
RA1,2,3=000binより0x70と設定しています。
同様に中央のドットマトリクスLEDは、
RB1,2,3=001binより0x71となります。
右側のドットマトリクスLEDは、
RC1,2,3=011binより0x73となります。
1=抵抗実装あり
0=抵抗実装なし
とハードウェアでアドレスを設定しています。
このプログラムを実行してシリアルモニタを表示させてみます。
こんな感じで結果が出てきます。
上の二つはRTCモジュールの本体とメモリですね。
下の三つは、ドットマトリックスのアドレスになります。
DS1307RTCモジュールには、I2Cで接続された
フラッシュEEPROMが載っているので試したことはないのですが
簡単なデータを書き込みできるかもしれませんね。
ボード上にLEDがいるのでLチカをしてみましょう!
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をオフにするスイッチとか
遊べそうです。