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

準備

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

DIO-0/16RC-IRCのセットアップ(ラズベリーパイ)

プログラムの作成

「test_dio016rc.cpp」というファイル名で以下のファイルを保存します。
(または test_dio016rc.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 DIO016RC_ADDRESS    0x24

// レジスタ
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 DIO016RC_Init(int fd) {
    if (ioctl(fd, I2C_SLAVE, DIO016RC_ADDRESS) < 0) {
        perror("DIO016RC_Init(ioctl)");
        return 1;
    }

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

    return 0;
}

// デジタル出力
int DIO016RC_Output(int fd, uint16_t value) {
    uint8_t reg[] = { PCA9535_Reg_OutputPort0, (uint8_t)(~value & 0xff), (uint8_t)((~value >> 8) & 0xff) };
    if ((write(fd, reg, 3)) != 3) {
        perror("DIO016RC_Output(write)");
        return 1;
    }

    return 0;
}

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

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

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

    // デジタル出力
    // (例)OUT15, 13, 2, 0をオン
    if (DIO016RC_Output(fd, 0xa005) != 0)
        exit(1);

    close(fd);

    return 0;
}

動作確認

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

$ g++ -o test_dio016rc test_dio016rc.cpp

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

$ ./test_dio016rc  

参考資料

DIO-0/16RC-IRCの製品情報・ドキュメント