M5Stack Unit DACでアナログ出力

UnitDAC view

Unit DACはM5StackのPORT.A(I2C通信)に接続して使います。Unit DACの中身はMCP4725というMicrochip社のI2C通信I/Fを持った12bitのDACと、その出力にTI社のLM321というオペアンプをバッファとして接続したものです。現在(2026/6月)では後継のUnit DAC2が出ています。今回は手元にあるUnit DACとM5Core2の組み合わせで実験しました。

目次

Unit DACの仕様

Unit DACはM5Stack本体のPORT.Aに接続します。PORT.AはI2C通信のポートです。I2Cアドレスは0x60になっています。DACは12bitで、公式サイトの仕様では出力電圧は0〜3.3Vとなっています。PORT.Aの電源5Vを使っているのになぜ3.3Vという疑問が湧きますが、Unit DAC回路内のICスペックを追っていくと理解できます。

このDAC(MCP4725)の特徴として、内蔵EEPROMに出力値を記憶させておくと、パワーオン時に、通信にて設定値を受信するのを待たずして起動直後から記憶した電圧を出力できるようになっています。

また、パワーダウンモードというものがあり、パワーオフ時に出力電圧が低下する速度を、出力の抵抗値を変えることで3段階に設定できるようになっています。

このような機能を持っているため、制御プログラムはモード切替えなどをしなければならず複雑になりますが、ArduinoIDEでは「Adafruit_MCP4745」というライブラリを使えばこのあたりの複雑なプログラミングを避けることができます。

Unit DACの回路

回路は下記のようになっています。PORT.AとDACのMCP4725がI2C通信で接続されます。DACのアナログ出力端子にはオペアンプLM321がバッファとして接続されています。両ICとも電源はPORT.Aの5Vを使っています。

Unit DAC回路図

引用元:https://docs.m5stack.com/en/unit/dac

DAC出力のプログラム

以下にDAC出力のプログラムを示します。ライブラリ「Adafruit_MCP4725」のAPI関数を使って初期化と12bitで電圧値を指定しています。初期化は関数「begin(I2Cアドレス)」を使います。出力電圧設定は「setVoltage(設定値, EEPROM書き込み)」を使います。設定を0x000から1づつインクリメントし最大値の0xFFFまできたら0x000に戻ってくり返すプログラムです。ノコギリ波が出力されます。

#include <M5Core2.h>
#include <Adafruit_MCP4725.h>//DAC MCP4725ライブラリ

Adafruit_MCP4725 dac;
int da = 0;  //DA値の初期化

void setup(void) {
    M5.begin();

    dac.begin(0x60);//I2C address
    dac.setVoltage(0x000, false);//DAC初期化

    M5.Lcd.setTextSize(2);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.print("Unit DAC MCP4725 PORT.A");
}

void loop(void) {

    da += 1;//DAC設定値を1づつインクリメント
    da = da % 0xFFF;//0xFFFで割った剰余を設定。0x000から0xFFFまできたら0から再スタートする
    dac.setVoltage(da, false);//falseはEEPROM書き込みでないの意。
                                //DAC出力値書き込み(0〜5.0V(0x000〜0xFFF))   
    delay(2);
}
Code language: C++ (cpp)

アナログ出力結果

上記プログラムでの出力波形が下記グラフです。水色がDAC MCP4725のアナログ出力端子波形、黄色がバッファLM321の出力波形です。DACには12bitなので0x000から0xFFFまでを設定しており、最大5Vまで出力できていますが、LM321の出力は3.5Vでサチってしまっています。

これはDACの下段に接続されているLM321のバッファ入力の最大値が電源電圧-1.5Vになっているためです(LM321データシート参照)。なので実質DACの設定上限値は0xB33(=3.5V)になります。

DACのMCP4725内にもオペアンプのバッファが内蔵されていますが、こちらはレールツーレールのため下記波形の通り電源電圧の5Vまでフルスイングできて、電流も25mAまで流せるものになっています。LM321は何のために入っているのか。

UnitDACオシロ波形 ch1:LM321バッファ出力 ch2:MCP4725DAC出力
UnitDACの内部

まとめ

  • Unit DACは12bitのDACで最大3.5Vまで出力できます。
  • 注意点は12bitでの設定値の最大は0xFFFですが、回路上3.5Vでサチってしますので実質、最大設定値は0xB33(=3.5V)となります。
  • DACのMCP4745はAdafruit_MCP4745というライブラリを使えば簡単にアナログ電圧出力のプログラムを作ることができます。
目次