フォト
2020年6月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
無料ブログはココログ

« NeoPixel(WS2812B)の制御 | トップページ | 梅澤無線電機さんの「電子倶楽部60」を購入してみました »

2018年5月22日 (火)

NeoPixel(WS2812B)の制御 その2

前回行った、ArduinoによるNeoPixel(WS2812B)の制御の続きです。
前回の処理の一部をSPIを利用する方式に書き換えました。

SPIを使っているため、出力ピンはMOSIピン(D11)固定となりますが、
前回よりも安定したクロックでの出力となりました。

  04

前回の信号生成の条件を考慮し、

02

03

SPIのクロックを8MHzとした場合、1クロック幅は0.125μ秒となります。
このクロック幅を元に利用して、

   T0H、T1L : 0.375μ秒 (3クロック分)
   T0L、T1H : 0.625μ秒 (5クロック分)

として利用します。値としては、「Data transfer time」の表の有効範囲から
少々ずれていますが、問題無いようです。

ちょうど0、1の送信とも8クロック分になりSPIの送信単位の8ビットにマッチします。

01
NeoPixelに1ビット送信するのに、SPIを利用して1バイト送れば良いことになります。
    0 : 0b11100000
    1 : 0b11111000


修正したスケッチ(2020/01/15 修正)

前回のスケッチでNeoPixelの初期化とデータ送信を行っている NeoInit() 、NeoUpdate()をSPIを利用する方式に修正しました。


SPIによるデータ送信は、関数呼び出しだと処理が間に合わないと判断し、
データレジスタSPDRに送信データをセットし、ステータスレジスタSPSRを参照して
送信完了待ちを行っています。

次回は8x8ドットマトリックスタイプのNeopixelを使ってもう少し複雑なことをやろうかと思います。

関連記事
 NeoPixel(WS2812B)の制御 その4(2020.01.09)  ・・・ 16x16マトリックスの制御 
 
NeoPixel(WS2812B)の制御 その3(2018.05.30)  ・・・ 8x8マトリックスの制御
 NeoPixel(WS2812B)の制御 その2(2018.05.22)   ・・・ SPIを使った制御(この記事です)
 NeoPixel(WS2812B)の制御(2018.05.20)            ・・・ GPIOを使った制御

参考にしたサイト
Todotaniのはやり物Log - SPIの基本動作とArduinoでの使い方
しなぷすのハード製作記 - 「SPI」の解説
garretlab - Arduinoで遊ぶページ - SPI関連レジスタ
Stupiddog - ArduinoでSPI通信を行う方法
株式会社インデペンデンスシステムズ横浜 - Arduino UnoでSPI通信(その1)Arduino Uno2台で通信
QEEWiki - SPI (Serial Peripheral Interface)

« NeoPixel(WS2812B)の制御 | トップページ | 梅澤無線電機さんの「電子倶楽部60」を購入してみました »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: NeoPixel(WS2812B)の制御 その2:

« NeoPixel(WS2812B)の制御 | トップページ | 梅澤無線電機さんの「電子倶楽部60」を購入してみました »