UNO R4 ライブラリ使わずにNeoPixel を使ってみる。

ライブラリ使わずに NeoPixel を使ってみる。

素直にライブラリ使えばいいじゃん、っていう話なんですけど。

83.3nsという100ナノセカンドオーダーでI/Oポートレジスタの操作ができることを利用して、NeoPixelの制御信号を作ってみました。


// UNO R4 minima NeoPixel test
inline void PH()  {   R_PORT1->POSR = bit(11);  }       // D13(UNO R4 minima P111) HIGH (83.3ns)
inline void PL()  {   R_PORT1->PORR = bit(11);  }       // D13(UNO R4 minima P111) LOW  (83.3ns)
inline void T0()  {   PH(); PH(); PH(); PH(); PL(); PL(); PL(); PL(); PL(); PL(); PL(); PL();   }
inline void T1()  {   PH(); PH(); PH(); PH(); T0();   }

#define NUMPIXELS (12)
uint8_t pixels[NUMPIXELS * 3];  // GRBGRBGRB...

void setup() {
 R_PORT1->PODR |= bit(11);     // D13(UNO R4 minima P111) pinMode OUTPUT
}

void loop() {
 for (uint8_t i = 0; i < NUMPIXELS; i++) {
   for (uint8_t c = 0; c < 6; c++) {
       pixels[ ((NUMPIXELS + i - c) * 3 + 2) % (NUMPIXELS * 3) ] = 31 >> c;
   }
   neoPixelShow();
   delay(100);
 }
}

void neoPixelShow() {
 for(uint8_t i = 0; i < NUMPIXELS * 3; i++) {
   for(uint8_t bm = 0b10000000; bm; bm >>= 1) {
     noInterrupts();
     if (pixels[i] & bm) T1();   else  T0();
     interrupts();
   }
 }
}

r4neopixel.jpg

この記事へのコメント