PCF8591を使う(低水準IO編)


ic2接続のAD/DAコンバータ(PCF8591) を使って、アナログデータを出力する方法を紹介します。
このコンバータは4チャンネル-8BitのD/Aと、1チャンネル-8BitのA/Dを行うことができます。
今回はA/Dの使用方法として以下の2つの方法を紹介します。
  1. 低水準IOを使う
  2. analogWrite()を使う


回路図は以下のとおりです。
テスターをアナログ出力ポート(15番ピン)に接続しています。



ic2デバイスを使う場合、以下の準備が必要になります。
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
#blacklist i2c-bcm2708 → コメントアウト

$ sudo vi /etc/modules
snd-bcm2835
i2c-dev → 追加

さらに最新のfirmware(3.18.x)の場合、こ ちらを参考にして「/boot/config.txt」に以下を追加する必要があります。
$ sudo vi /boot/config.txt
dtparam=i2c1=on (or dtparam=i2c0=on on old models)

$ sudo apt-get install i2c-tools

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


まずは低水準IOを使うコードです。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#define I2C_SLAVE       0x0703

/*
cc -o test3 test3.c -lwiringPi
*/

int main (void)
{
    int fd;
    int i;
    const char *device;
    float a2dVol;
    float Vref = 3.3;
    unsigned char byte[2];

    device = "/dev/i2c-1";
    if ((fd = open(device,O_RDWR)) < 0)
    {
        printf("open failed:\n");
        exit;
    }
    if (ioctl (fd, I2C_SLAVE, 0x48) < 0)
    {
        printf("ioctl failed:\n");
        exit;
    }

    for(i=0;i<255;i=i+25) {
        a2dVol=i * Vref / 255;
        printf("i=%d a2dVol=%f[V]\n",i,a2dVol);
        byte[0]=0x40;
        byte[1]=i;
        write(fd,byte,2);
        sleep(2);
    }
}


実行してテスターでアナログ出力ポートの電圧を測ってください。
端末にa2dVol=XXXXとして表示される電圧が出力されます。

次回はanalogWrite()を使ったアナログデータ の出力方法を紹介します。