4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめての記事投稿

Spresense SDK用にAdafruit NeoPixelライブラリを作成する

Posted at

数年前に少し触っただけで放置していたSony SpresenseとNeoPixel。
久々に動かそうと思い立ち、Spresense SDKでNeoPixelを動かせないかと試してみました。

Spresense SDKにはNeoPixelライブラリが無い

Arduino IDEを使う場合にはライブラリがあるんですけどねぇ。
私も購入した当初に以下のライブラリを使って光るだけ光らせて満足してました。

つい最近には以下のライブラリも公開されていました。
(Adafruit公式のAPIをOverrideしたような感じ?)

NeoPixelを使うには基本的にこれらのライブラリを使うのが一番手っ取り早いんですが…
色々少し込み入ったことをしたいなぁと思うと、Arduino IDE環境だと個人的に少々やりづらく感じたというのと、まぁ勉強にもなるだろうと考えたのが今回の経緯です。

Spresense SDK用のNeoPixelライブラリを作成してみる

こちらの記事を読むにSpresense/externalsに外部ライブラリとして置けるらしいので、せっかくだし今後使用するためにもライブラリっぽい感じに作ってみようと思います。


そんなこんなで出来たのがこちら

基本的に上述のライブラリとSpresenseのArduino互換ライブラリを見てSpresense SDKに展開しただけなので、実装に関する詳しい解説は特にないです。

というよりろくに解説ができないから一旦スキップです…
先人様様です本当に…勉強します…ハイ…

導入方法

Spresense SDKの環境構築とかは公式ドキュメントにお任せして飛ばします。

  1. spresense/externals ディレクトリ上でNeoPixelライブラリをClone
    git clone https://github.com/whyes-develop/neopixel-for-spresense.git
  2. spresense/sdk ディレクトリ上で以下のコマンドを実行し、NeoPixelライブラリを有効化
    tools/mkdefconfig.py -d ../externals/neopixel-for-spresense neopixel
    ※ もしくは tools/config.py -m で表示されるmenu config上で
    Application Configuration->Spresense SDK->Externals->Adafruit Neopixel libraryにチェックを入れる

使い方

サンプルコード

とりあえず5秒間白色点灯するだけのサンプルコードがこちら。

#include <nuttx/config.h>

#include <arch/chip/pin.h>
#include <stdio.h>

#include "neopixel.h"

int main(int argc, FAR char *argv[])
{
#define N_PIXELS (12)

  neopixel_client_t *client = NULL;
  neopixel_color_t   color = {255, 255, 255};

  client = neopixel_inizialize(PIN_PWM0, N_PIXELS);

  neopixel_setall(client, &color);

  neopixel_show(client);

  sleep(5);

  neopixel_clear(client);
  neopixel_show(client);

  neopixel_finalize(client);

  return 0;
}

neopixel.hをincludeします。

#include "neopixel.h"

② neopixel_client_t の構造体ポインタ変数clientを用意します

  neopixel_client_t *client = NULL;

neopixel_inizialize()を実行してclientを初期化します
引数は順に GPIO PIN番号、NeoPixelのピクセル数です。

#define N_PIXELS (12)
  client = neopixel_inizialize(PIN_PWM0, N_PIXELS);

neopixel_setall()を実行して全セルの色を設定します
今回は全てのセルに対して白色を設定しています。

  neopixel_color_t   color = {255, 255, 255};
  neopixel_show(client);

 セルごとに色を設定したい場合はセル番号を指定できるneopixel_set()を使用します。

int neopixel_set(neopixel_client_t *client,
                 uint32_t n,
                 neopixel_color_t *color);

neopixel_show()を実行してLEDを点灯します

  neopixel_show(client);

neopixel_clear()を実行してセルに設定した色を初期化します

  neopixel_clear(client);

⑦ 最後はneopixel_finalize()を実行してclientを解放します

  neopixel_finalize(client);

動かしてみる

上記のサンプルコードを実際に動かしてみます。
今回の試験環境はこちら。
DSC_0267.jpg

  • Spresenseメインボード
  • Spresnese LTE拡張ボード(なんかあったからこれ使っただけ)
  • NeoPixel Ring - 12連フルカラーシリアルLED

ジャンパーピンを無理やり捻じ曲げて接続した雑配線には目を瞑っていただいて…早速動かしていきます。

ビルドして、
build.jpg
実機に焼き、
burn.jpg

コマンドを実行する…
simple_light_exec.jpg

動きました。 イェーイ
DSC_0270.jpg

サンプル集

上記で動かしたサンプル (simple_light) も以下で公開しています(他のサンプルもでき次第随時追加予定)。

本当はライブラリと一緒にしたかったんですが…ビルドコンフィグの勉強不足で実現できず…

最後に

というわけでSpresense SDKにNeoPixelライブラリを作成してみました。

正直先人のArduinoライブラリをほぼパクって参考にしたので、先人のライブラリが無ければ到底作れませんでした…本当に感謝です。レジスタとかアセンブリとかの知識なんてほぼ無いので…
一部 //なんかよく分からないけど動く みたいな状態なので、理解はちゃんと深めていこうと思ってます。

私自身組み込みアプリエンジニアを5年くらいやってきたつもりですが、担当範囲が基本ミドルらへんだったので、ハード寄りの知識がほぼ無いことを痛感しました…勉強しないといけないですね。
今後は自分なりに勉強しつつこのライブラリも適宜リファクタしたり、それなりに機能拡張したりできればと思ってます。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?