raspberryPi2/3に(オーディオ用では無い)複数の普通のDAコンバータmcp4725を接続して、4ch以上のアナログ出力を得る方法
以前書いた記事の続編です。
cvl-robot.hateblo.jp
mcp4725は、安価で簡単に12ビット分解能のアナログ出力を得ることができる良いICなのですが、I2Cアドレスが0x60,0x61の2つからしか選択できません。
したがって、素直に使うと2chの出力しか得られません。
このページでは、もっと多くの出力数が必要で困る場合の対処方法を紹介します。
FXMA2102のOEピンを制御して時分割でI2Cの出力先を切り替える
4chの場合の参考回路図を載せておきます。
今回の回路図では、5V出力ではなく3.3V出力ですので注意してください。VCCBに5V電源をつないでやれば5V出力も取れます。
もっと数を増やしていくこともできますが、FXMA2102の数に応じて応答時間がどんどん遅くなることに留意してください。
スルーホール基板でも、ほとんどジャンパ飛ばすことなく回路が引けます。
参考ソースコード
2つのFXMA2102のOEピンをそれぞれ、4番ピンと11番ピンに接続した場合の例です。
I2Cバスを切り替えたときに、毎回EEPROMに焼きこまなくても、稼働中は出力電圧をちゃんと維持してくれます。
#include <stdio.h> #include <unistd.h> #include <wiringPi.h> #include <wiringPiI2C.h> #define BCM_4 4 #define BCM_11 11 void setDACVoltage(int deviceid, int voltage, int writeToEEPROM) { int fd = wiringPiI2CSetup(deviceid); voltage = (voltage > 4095) ? 4095 : voltage; voltage = (voltage >> 4); if(writeToEEPROM) wiringPiI2CWriteReg16(fd, 0b01100000, voltage); else wiringPiI2CWriteReg16(fd, 0b01000000, voltage); close(fd); } int main(int argc, char* argv[]) { if(wiringPiSetupGpio() == -1){ printf("wiringPi GPIO error\n"); return -1; } pinMode(BCM_4, OUTPUT); pullUpDnControl(BCM_4, PUD_OFF); // PUD_OFF, PUD_UP, PUD_DOWN pinMode(BCM_11, OUTPUT); pullUpDnControl(BCM_11, PUD_OFF); while(1){ for(int i=0; i<4096; i++){ digitalWrite(BCM_4, 0); digitalWrite(BCM_11, 1); setDACVoltage(0x60, i, 0); setDACVoltage(0x61, i/2, 0); digitalWrite(BCM_11, 0); digitalWrite(BCM_4, 1); setDACVoltage(0x60, 4095-i, 0); setDACVoltage(0x61, (4095-i)/2, 0); } } return 0; }