デジタル入出力を操作する(C言語)

準備

初めて使用する場合は、セットアップ(ボードの取り付け)をおこないます。

DIO-8/4RD-IRCのセットアップ(ラズベリーパイ)

プログラムの作成

「test_dio84rd.cpp」というファイル名で以下のファイルを保存します。
(または test_dio84rd.cpp からダウンロードします)

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>

#define I2C_DEVICE      "/dev/i2c-1"
#define DIO84RD_ADDRESS 0x23

// レジスタ
enum PCA9535_Register {
    PCA9535_Reg_InputPort0,
    PCA9535_Reg_InputPort1,
    PCA9535_Reg_OutputPort0,
    PCA9535_Reg_OutputPort1,
    PCA9535_Reg_PolarityInversionPort0,
    PCA9535_Reg_PolarityInversionPort1,
    PCA9535_Reg_ConfigurationPort0,
    PCA9535_Reg_ConfigurationPort1,
};

// 初期化
int DIO84RD_Init(int fd) {
    if (ioctl(fd, I2C_SLAVE, DIO84RD_ADDRESS) < 0) {
        perror("DIO84RD_Init(ioctl)");
        return 1;
    }

    // ポート設定
    uint8_t reg[2];
    reg[0] = PCA9535_Reg_ConfigurationPort0;
    reg[1] = 0xf0;
    if ((write(fd, reg, 2)) != 2) {
        perror("DIO84RD_Init(write)");
        return 1;
    }

    return 0;
}

// デジタル出力
int DIO84RD_Output(int fd, uint8_t value) {
    uint8_t reg[] = { PCA9535_Reg_OutputPort0, (uint8_t)~value };
    if ((write(fd, reg, 2)) != 2) {
        perror("DIO84RD_Output(write)");
        return 1;
    }

    return 0;
}

// デジタル入力
uint8_t DIO84RD_Input(int fd) {
    uint8_t reg[] = { PCA9535_Reg_InputPort1 };
    if ((write(fd, reg, 1)) != 1) {
        perror("DIO84RD_Input(write)");
        return 0;
    }

    if (read(fd, reg, 1) != 1) {
        perror("DIO84RD_Input(read)");
        return 0;
    }

    return ~reg[0] & 0xff;
}

int main(int argc, char **argv)
{
    int fd;

    if ((fd = open(I2C_DEVICE, O_RDWR)) < 0) {
        perror("open");
        exit(1);
    }

    if (DIO84RD_Init(fd) != 0)
        exit(1);

    // デジタル出力
    // (例)OUT2とOUT0をオン(OUT3とOUT1をオフ)  
    if (DIO84RD_Output(fd, 0x05) != 0)
        exit(1);

    // デジタル入力
    printf("InputData: 0x%02x\n", DIO84RD_Input(fd));

    close(fd);

    return 0;
}

動作確認

プログラムをコンパイルします。

$ g++ -o test_dio84rd test_dio84rd.cpp

プログラムを実行します。

$ ./test_dio84rd  

デジタル出力のOUT2とOUT0がオンします。
デジタル入力値が表示されます。

InputData: 0x40

参考資料

DIO-8/4RD-IRCの製品情報・ドキュメント