PicoW で秋月電子の「7セグメントLEDモジュール」で SPI接続での 7セグチカ しました
この記事に記述されているコードは、動かないことが確認できました。
新たな記事を書きましたので、そちらを参照願います。(2024/09/16)
先日待ちに待った RaspberryPi PicoW が発売されました。
今回、Pico, PicoWにおいて、「7セグメントLEDシリアルドライバモジュール」を利用した SPI0とSPI1の切り替え、GPIOピン指定によるSPI接続方法がわかったので、ここに記します。
以前にラズパイPicoは買っていじっていたんですが、PicoWを使おうとPlatformIOの新規Projectからボード選択しようとしてもPicoWはありません。まぁまだ対応バージョンが出てないのかなと思いPicoのボード情報でプロジェクトを起こし、まずはLチカからと思いサクッとコードを入力してもチカチカしません。
しかたない。とりあえず以前作った7セグスクリプトをコピーしてPicoで動かそうとするとコンパイルエラーとなります。
さらにPicoWでLチカもできないのはなぜか調べ始めると、どうもPlatformIOのPicoプラットフォームに別のモノ?があるらしく、さらに調べていくと「earlephilhower版」というモノ?があると。そのインストール方法を記してくれるサイト「あろしーど」様のページに辿り着き、やっとPicoWを使うための環境ができました。あろしーど様、どうもありがとうございました。
まずearlephilhower版Picoでプロジェクトを起こし、7セグスクリプトをメンテナンスして、未指定の状態でのSPI接続でなら動くことを確認しました。
意図的にGPIOピンを別のピン番号を指定するとコンパイルエラーになります。でもそのエラー内容にSPIコードのありかを記しているので、ファイルを確認してみました。そこには「keywords.txt」というファイルがあり、インスタンス名やメソッド名、定数について定義されていました。
このファイルに記される SPI1 や setRX 等のキーワードがヒントとなり、改めてコードを書き直してコンパイルすると、エラーはなく、アップロードも行われ7セグが数字を表示するようになりました。
記述方法について、M5 STAMP-PICO とはまったく違うのがわかります。
ということで、以下に今回のコードを記します。SPI1 を利用する方法です。
/**
* RaspberryPi PicoW で秋月電子通商の「7セグメントLEDシリアルドライバキット」で 7セグチカ しました.
* SPI接続した際に、SPI0,SPI1の切り替えと、標準のGPIOピンから任意のGPIOピンを指定できます.
* 秋月電子さんサイト内の ArduinoIDE用スケッチ を参考にしています.
* ついでにLチカもします.
* 利用製品:秋月電子通商 AE-7SEG-BOARD-KIT.
* 開発環境:VScode + PlatformIO + earlephilhower版RP2040プラットフォーム.
*
*/
#include <Arduino.h>
#include <SPI.h>
const byte digits[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01100111, // 9
0b01110111, // A
0b01111100, // b
0b00111001, // C
0b01011110, // d
0b01111001, // E
0b01110001, // F
0b10000000 // dot
};
int waitTime = 300;
bool boolLED = LOW;
byte pinLED = LED_BUILTIN;
byte pinLatch = D20; // AE-7SEG-BOARD-KITでの LATCH
/* SPI0 を利用する場合
byte pinMISO = PIN_SPI0_MISO; // D0; // D4; // D16; // RX
byte pinSS = PIN_SPI0_SS; // D1; // D5; // D17; // SS
byte pinSCK = PIN_SPI0_SCK; // D2; // D6; // D18; // SCK AE-7SEG-BOARD-KITでの SCK
byte pinMOSI = PIN_SPI0_MOSI; // D3; // D7; // D19; // TX AE-7SEG-BOARD-KITでの SDI
*/
/* SPI1 を利用する場合 */
byte pinMISO = PIN_SPI1_MISO; // D8; // D12; // RX
byte pinSS = PIN_SPI1_SS; // D9; // D13; // SS
byte pinSCK = PIN_SPI1_SCK; // D10; // D14; // SCK AE-7SEG-BOARD-KITでの SCK
byte pinMOSI = PIN_SPI1_MOSI; // D11; // D15; // TX AE-7SEG-BOARD-KITでの SDI
void setup() {
pinMode(pinLED, OUTPUT);
pinMode(pinLatch, OUTPUT);
pinMode(pinSCK, OUTPUT);
pinMode(pinMOSI, OUTPUT);
/* SPI0 を利用する際は SPI. とし、 SPI1 を利用する際は SPI1. とすること */
/* RX,CS は利用しないが、指定しないまたは-1を指定するとクラッシュするので、指定は必須 */
SPI1.setRX(pinMISO);
SPI1.setCS(pinSS);
SPI1.setSCK(pinSCK);
SPI1.setTX(pinMOSI);
SPI1.setBitOrder(MSBFIRST);
SPI1.setDataMode(SPI_MODE0);
SPI1.begin();
}
void loop() {
for (int forLoop = 0; forLoop < 17; forLoop++) {
digitalWrite(pinLatch, 0);
SPI1.transfer(digits[forLoop]); /* SPI0 , SPI1 どちらを使うか確認を忘れずに */
digitalWrite(pinLatch, 1);
digitalWrite(pinLED, boolLED = not boolLED); // Lチカ!
delay(waitTime);
}
}
おまけに Tiny 2040 で7セグしたのも記します。
こちらはLチカではなく、RGB LED の色が変化します。まぁすごくテキトーな方法ですが(笑
/* 変更箇所のみです */
// 初期化セクション
byte colorR = 0;
byte colorG = 63;
byte colorB = 127;
byte pinR = D18;
byte pinG = D19;
byte pinB = D20;
byte pinLatch = D29;
byte pinMISO = D0;
byte pinSS = D1;
byte pinSCK = D2;
byte pinMOSI = D3;
void setup() {
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
………
}
void loop() {
………
analogWrite(pinR, colorR + map(forLoop, 0, 16, 0, 255));
analogWrite(pinG, colorG + map(forLoop, 0, 16, 0, 255));
analogWrite(pinB, colorB + map(forLoop, 0, 16, 0, 255));
………
}