ATtiny13aでneopixelを光らせる

# はじめに
* 先日の「[AVRマイコン ATtiny13とボタン電池でLチカ](https://qiita.com/Nabeshin/items/b70c8b66df2acc6850d7)」の続き。
* 今回は、neopixelを制御してみた。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ATtiny13A でneopixel動いた。<br>次はATtiny10やりたい。<a href="https://twitter.com/hashtag/ATtiny13a?src=hash&amp;ref_src=twsrc%5Etfw">#ATtiny13a</a> <a href="https://twitter.com/hashtag/neopixel?src=hash&amp;ref_src=twsrc%5Etfw">#neopixel</a> <a href="https://t.co/DfMOb67yr9">pic.twitter.com/DfMOb67yr9</a></p>&mdash; Nabeshin (@desmoquattro996) <a href="https://twitter.com/desmoquattro996/status/1406214988289564677?ref_src=twsrc%5Etfw">June 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# neopixel
* イルミネーションとかに使われるマイコンLED。
* １つ１つのLEDユニットにマイコンが入っており、たった１個のGPIOでLED単位で独立した指示が出せる。
* Amazonで8個付きのお手軽なものがあって、現在160円。
    * [Rasbee WS2812 5050 RGB LED ランプ パネルモジュール 5V 8ビット レインボー LED Arduinoに対応](https://www.amazon.co.jp/Rasbee-WS2812-パネルモジュール-レインボー-Arduinoに対応/dp/B085N27QYK)
![IMG_3577D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/dec27cad-1d11-e446-0d99-295c79f843dd.jpeg)

# マイコンへの書込み
* Arduino Nanoをライタとして使用する。
* 詳細は「[AVRマイコン ATtiny13とボタン電池でLチカ](https://qiita.com/Nabeshin/items/b70c8b66df2acc6850d7)」参照。

![IMG_3576D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/b7d495d8-5611-cfc3-12d8-416398c4cfd0.jpeg)


# コード

https://github.com/gitnabeshin/ATtiny13a_neopixel

ここでは、メインのファイルだけ掲載。

* こちらのコードからリモコン制御部分を外し、ループで独自のlighting制御する感じで使わせて頂いた。
    * https://github.com/fbiego/attiny13a_neopixel_ir.git


```c:attiny13a_neopixel.ino
/*
 * ATTINY13A neopixel
 *  Ref: https://github.com/fbiego/attiny13a_neopixel_ir.git
 *  WS2812 >> PIN 0
 */

#define F_CPU 9600000 // Must stay at this speed

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "light_ws2812.c"

#define  PIXEL_NUM  (8)     //number of ws2812 leds
#define  BRIGHTNESS (10)    //brightness 0-255
#define  DELAY_TIME (400)   //ms

struct pixel {
  uint8_t g;
  uint8_t r;
  uint8_t b;
};

struct pixel p[PIXEL_NUM];

void my_delay(uint16_t ms) {
  while (0 < ms)
  {
    _delay_ms(1); //must be fixed parameter in compile time.
    --ms;
  }
}

void set_all_off(void) {
  for (int n=0; n<PIXEL_NUM; n++) {
     p[n].r = 0;
     p[n].g = 0;
     p[n].b = 0;
  }
  ws2812_setleds((struct cRGB *)&p, PIXEL_NUM);
  my_delay(DELAY_TIME);
}

void setleds_act(uint8_t r, uint8_t g, uint8_t b) {

  for (int n=0; n<PIXEL_NUM; n=n+2) {
     p[n].r = r;
     p[n].g = g;
     p[n].b = b;
  }
  ws2812_setleds((struct cRGB *)&p, PIXEL_NUM);
  my_delay(DELAY_TIME);

  for (int n=0; n<PIXEL_NUM; n=n+2) {
     p[n].r = g;
     p[n].g = b;
     p[n].b = r;
  }
  ws2812_setleds((struct cRGB *)&p, PIXEL_NUM);
  my_delay(DELAY_TIME);

}

void setleds(uint8_t r, uint8_t g, uint8_t b) {

  set_all_off();

  //sequencial lighting
  for (int n=0; n<PIXEL_NUM; n++) {
     p[n].r = r;
     p[n].g = g;
     p[n].b = b;
     ws2812_setleds((struct cRGB *)&p, PIXEL_NUM);
     my_delay(DELAY_TIME);
  }

  //pattern lighting
  for (int n=0; n<3; n++) {
    setleds_act(r, g, b);
  }
}

int main(void) {
  while(1){
    setleds(BRIGHTNESS, 0, 0);
    my_delay(DELAY_TIME);

    setleds(0, BRIGHTNESS, 0);
    my_delay(DELAY_TIME);

    setleds(0, 0, BRIGHTNESS);
    my_delay(DELAY_TIME);
  }
}
```

うん、いい感じ。

![IMG_3575D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283854/0b033405-ab3b-127b-c920-cc3a2d490ef4.jpeg)