Home Made Garbage

DMA駆動でLチカ ~Adafruit Itsy Bitsy M0 Express~

お父ちゃん お父ちゃん  2018.11.7 
ホーム
電子工作
Raspberry Pi
IOT
WEB

先日購入したAdafruit Itsy Bitsy M0 ExpressがDMAをサポートしているということで、DMA駆動でNeoPixelを光らせてみました。

DMAとは

Direct Memory Access の略で、CPUの介在なしに周辺機器とメモリ間で直接データを移動するソリューションのこと。

これによってNeoPixelとサーボやmillis関数との共存が可能になるんだって。
NeoPixelとサーボを同時に使うとサーボがジジッと変な動きになるんですよね。。

Neopixel と サーボモータの共存

DMAの詳しいことは以下を参照ください。

NeoPixels and interrupts living in peace and harmony!

てことで、Adafruit Itsy Bitsy M0 ExpressでそのDMAとやらのご利益を確認してみました。

Adafruit Itsy Bitsy M0 Express

デジタル5ピンがDMAに対応しています。この5ピンがちょっと特殊で、他のピンは 3.3V系なのですが、5ピンのハイサイド電源はVhiピンとなっています。Vhiピンの電圧はUSBピン(USB供給電圧)かBATピン(外部電源電圧)のいずれか高い電圧となります。

NeoPixelが5V駆動のため デジタル5ピンが内蔵レベルシフタでUSB 5Vもしくは外部電源電圧まで出力できるようにしているようです。過去気にせずちょくちょく3.3VでNeoPixel駆動してきたが。。

Adafruit Itsy Bitsy M0 Expressについては以下でも記載しておりますのでご参照ください。

Adafruit ItsyBitsy M0 Express で目ん玉ペンダント

DMA 比較実験

LEDマトリクスを10msecおきに1つづつ点灯させて、millis関数で一定時間測って正確な数のLEDが光るかでDMAの効能を確認してみました。

構成

 LEDデータ入力はDMA対応のデジタル5ピン。電源はVhiピンを接続。

部品

従来方法

まずは比較のために従来のAdafruit NeoPixelライブラリを使用します。
 https://github.com/adafruit/Adafruit_NeoPixel

Arduinoコード

LEDマトリクスを10msecおきに1つづつ点灯させて、millis関数で630msec数えたら点灯ループを抜けて370msec消灯するプログラムです。理論上は63個のLEDが点灯して消灯を繰り返すはずです。

動作結果

63個まで点灯してほしいところ、58個までしか光っておりませんでした。やはり従来NeoPixelライブラリでは、データ送信中にすべての割り込みを無効にしてしまうため millis関数の精度が落ちてしまっているようです。

DMA駆動

DMA駆動のため以下のライブラリを使用します。
 https://github.com/adafruit/Adafruit_ZeroDMA
 https://github.com/adafruit/Adafruit_NeoPixel_ZeroDMA

Arduinoコード

従来のコードの2箇所変更するだけです。

  • 1行目 以下に変更
  • 6行目 以下に変更

動作結果

きっちり63個まで点灯しています!最後の64個目の直前まで光っています。やるねぇDMA。

LEDマトリクスのDMAお試し

NeoPixelのマトリクス用のライブラリもDMAに対応してるものがあったので試してみました。以下のライブラリです。
 https://github.com/adafruit/Adafruit_NeoMatrix_ZeroDMA

構成は比較実験と同じです。

Arduinoコード

以下のライブラリも使用しています。
 https://github.com/adafruit/Adafruit-GFX-Library

1秒ごとにカウントアップして数字を表示します。

10〜13行目でマトリクスのサイズや始点や配置方向を指定してます。設定方法は以下参照ください。

Everything you always wanted to know about Adafruit NeoPixels but were afraid to ask

動作

いいですねぇ。精度良く1秒毎にカウントアップできてます。てかDMAどうこうよりマトリクスに簡単に文字表示できるライブラリに感動しちゃった。

ちょっと今度もう少しNeopixelマトリクスのライブラリいじってみようと思います。

Related Posts

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

TOP