Wio LTE M1/NB1(BG96)に、NeoPixelのテープLEDを繋ぎたいが、よくあるNeoPixelのライブラリーは(STM32用ではない)使えないので、内蔵LEDがフルカラーLEDなら、出来る方法があるんじゃないか?ということで、コードを書いてみました。
ハードウェア
GROVEコネクタをつけるために、GROVE – 4ピン-ジャンパメスケーブル 20cm (5本セット)を使って接続します。写真はオスですが、現在は、メスしか売っていないようなので、両端ロングピンヘッダを使って、テープLEDと繋ぎます。電源とGNDとD38を使うので、黄色のケーブルをテープLEDのDO端子と繋ぎます。
ソースコード
WioCellLibforArduinoの内部関数である。DelayLoopを利用することで、ms以下のDelayを実現!GPIOパタパタでテープLEDに信号を送っているのがミソ
#include <WioCellLibforArduino.h>
#define PIN (WIO_D38)
#define MAX_LED 60 // テープLEDの数
extern "C" void DelayLoop(int32_t iterations);
WioCellular Wio;
int count = 0;
void setup() {
// デバッグ用シリアル初期化
SerialUSB.begin(115200);
SerialUSB.println("");
SerialUSB.println("--- START ---");
// Wi LTEoの初期化
Wio.Init();
pinMode(PIN, OUTPUT);
// GROVE端子へ電源供給を行う(D38以外向け)
Wio.PowerSupplyGrove(true);
delay(100);
LED_RESET();
delay(2000);
}
void loop() {
for(int i = 0 ; i < MAX_LED ; i++)
{
if((i % 2) == 0)
{
SetSingleLED(0x00,0x10,0x00);
}
else
{
SetSingleLED(0x00,0x00,0x10);
}
}
delay(150);
for(int i = 0 ; i < MAX_LED ; i++)
{
if((i % 2) == 0)
{
SetSingleLED(0x00,0x00,0x10);
}
else
{
SetSingleLED(0x00,0x10,0x00);
}
}
delay(150);
count++;
if(count > 20)
{
LED_RESET();
delay(2000);
count = 0;
}
}
void SetBit(bool on)
{
if (!on) {
LED_GPIO_HIGH();
DelayLoop(30);
LED_GPIO_LOW();
DelayLoop(65);
}
else {
LED_GPIO_HIGH();
DelayLoop(60);
LED_GPIO_LOW();
DelayLoop(50);
}
}
void LED_GPIO_LOW(){
digitalWrite(PIN,LOW);
}
void LED_GPIO_HIGH(){
digitalWrite(PIN,HIGH);
}
void SetByte(uint8_t val)
{
for (int i = 0; i < 8; i++) {
SetBit(val & (1 << (7 - i)));
}
}
// LEDを消灯させる
void LED_RESET()
{
for(int i = 0 ; i < MAX_LED ; i++)
{
SetByte(0x0);
SetByte(0x0);
SetByte(0x0);
}
}
// 色をセットする。
void SetSingleLED(uint8_t r, uint8_t g, uint8_t b)
{
SetByte(g);
SetByte(r);
SetByte(b);
}
以上、ご参考までに