見出し画像

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」というファイルがあり、インスタンス名やメソッド名、定数について定義されていました。

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));
		………
}


いいなと思ったら応援しよう!