PCF8591を使う(wiringPiI2CWrite編)


今回はic2接続のAD/DAコンバータ(PCF8591) を入手しましたので、アナログデータの読み方を紹介します。
PCF8591をADコンバータとして使う場合は4チャンネル 8Bitの変換を行うことができます。
今回は以下の3つの方法を紹介します。
  1. wiringPiI2CWrite()を使う
  2. analogRead()を使う
  3. コマンドを使う


使用した回路は以下のとおりです。
ボリュームは20KΩの物を使いました。
ボリュームの出力をPCF8591のチャンネル0のアナログ入力ポート(1番ピン)に接続しています。

PCF8591

ic2デバイスを使う場合、raspi-configでi2cデバイスを有効する必要があります。
以下のコマンドでPCF8591のi2cアドレス(0x48)が認識されればOKです。

$ 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: -- -- -- -- -- -- -- --


まずはwiringPiI2CWrite()を使うコードです。
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

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

int main (void)
{
    int fd;
    int i;
    int a2dChannel = 0; // analog channel
    int a2dVal;
    float a2dVol;
    float Vref = 3.3;

    if ((fd = wiringPiI2CSetup(0x48)) < 0)
    {
        printf("wiringPiI2CSetup failed:\n");
    }

    for(i=0;i<20;i++) {
        wiringPiI2CWrite(fd,0x40 | a2dChannel);
        a2dVal = wiringPiI2CRead(fd); // Previously byte
        a2dVal = wiringPiI2CRead(fd);
        a2dVol = a2dVal * Vref / 255;
        printf("a2dVal=%d\n",a2dVal);
        printf("a2dVol=%f[V]\n",a2dVol);
        sleep(1);
    }
}


実行するとボリュームの出力電圧を読み込みます。
適当にボリュームを回してください。
sudo ./test1
a2dVal=0
a2dVol=0.000000[V]
a2dVal=0
a2dVol=0.000000[V]
a2dVal=14
a2dVol=0.181176[V]
a2dVal=24
a2dVol=0.310588[V]
a2dVal=76
a2dVol=0.983529[V]
a2dVal=96
a2dVol=1.242353[V]
a2dVal=112
a2dVol=1.449412[V]
a2dVal=137
a2dVol=1.772941[V]

次回analogRead()を使ったアナログデータの 読み込みを紹介します。