🤖

Electro-smith Daisy seedのGPIOを使う

2021/05/04に公開

Daisyの出力に使えるピンの種類

Daisyの出力は、大きく分けて、

  • Audio out
  • DAC out
  • デジタルのGPIO

の3種類があるようです。ピン配置を見るとわかりますが、Audio outとDAC outはそれぞれ2個です。アナログ出力は貴重なので、LチカのようにHIGH/LOWの2値でいいような場合はケチってデジタルピンを使いたくなります。が、これもDaisyExamplesに例があまりなかったのでメモ...

(出典: https://github.com/electro-smith/DaisyWiki/wiki/2.-Daisy-Seed-Pinout)

GPIOの使い方

デジタルのGPIOは、ピンアサインを見るとわかるように、それぞれデフォルトではUART通信用・I2C通信用、といった何らかの役割が割り振られています[1]。これを出力用に使うには以下のような設定が必要です。

#define PIN_GATE 13

dsy_gpio gate_output;

gate_output.pin = seed.GetPin(PIN_GATE);

// DSY_GPIO_MODE_OUTPUT_PP はプッシュプル。オープンドレインにしたい場合は DSY_GPIO_MODE_OUTPUT_OD。
// ドキュメント: https://electro-smith.github.io/libDaisy/group__other.html#ga0edc3fcaf729346c5251d263d732666e
gate_output.mode = DSY_GPIO_MODE_OUTPUT_PP;

// 内部プルダウン・プルアップ抵抗を使うか
// ドキュメント: https://electro-smith.github.io/libDaisy/group__other.html#gad8a85223f8dbcdf2c2cfc9302b3451b8
gate_output.pull = DSY_GPIO_NOPULL;

// 初期化
dsy_gpio_init(&gate_output);

こうしておくと、dsy_gpio_write()で値を書き込めるようになります。falseがlow、trueがhighです。

dsy_gpio_write(&gate_output, false);

(参考)DAC outへの出力

DAC outは、seed用のコードも用意されていましたが、別の目的で使うこともあるからという理由でコメントアウトされていました。手元で試してないんですが、こういう感じで出力できるみたいです。値はuint16_tなので65536段階?

// ここでコメントアウトされているコード。Patchなどの場合はここは不要。
// https://github.com/electro-smith/libDaisy/blob/831f3820808f7718c55d6c844489d17bc20c2086/src/daisy_seed.cpp#L274-L284
DacHandle::Config cfg;
cfg.bitdepth   = DacHandle::BitDepth::BITS_12;
cfg.buff_state = DacHandle::BufferState::ENABLED;
cfg.mode       = DacHandle::Mode::POLLING;
cfg.chn        = DacHandle::Channel::BOTH;
seed.dac.Init(cfg);

uint16_t value = ...;
seed.dac.WriteValue(
  DacHandle::Channel::ONE, // あるいはTWOを指定
  value
);
脚注
  1. ちなみに、libDaisyにはマルチプレクサIC(405x)やシフトレジスタIC(595)を扱う関数も用意されていて、デジタルのGPIOはここでも使われます(例: https://electro-smith.github.io/libDaisy/structdaisy_1_1_adc_channel_config.html#ae8d9aafe3ca60ee3e657272fd7810fd4) ↩︎

Discussion