デジタル入出力を操作する(C言語)
準備
初めて使用する場合は、セットアップ(ボードの取り付け)をおこないます。
DIO-8/4RD-IRCのセットアップ(ラズベリーパイ)
DIO-8/4RD-IRCのセットアップ(NVIDIA Jetson Nano 開発者キット)
プログラムの作成
「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