I2C for C ++と通信するための簡単なライブラリはありますか?PythonとJava用のものをいくつか見つけましたが、C ++が必要でした。誰かがArduino Wireライブラリを移植して、すでにArduino用に書いたコードを使えるようにしたいと思っていました。
I2C for C ++と通信するための簡単なライブラリはありますか?PythonとJava用のものをいくつか見つけましたが、C ++が必要でした。誰かがArduino Wireライブラリを移植して、すでにArduino用に書いたコードを使えるようにしたいと思っていました。
回答:
Linuxユーザースペースにはi2c-devヘッダーがあります。このヘッダーがlm-sensorsパッケージに同梱されているかどうか、またはソースからインストールする必要があるかどうかは思い出せません。ディストリビューションのパッケージリポジトリを確認します。xGoatには、準備と使用法に関する素晴らしい記事があります。
#include <linux/i2c-dev.h>
/*
Including i2c-dev header will allow the following I2C SMBus functions
- i2c_smbus_access
- i2c_smbus_write_quick
- i2c_smbus_read_byte
- i2c_smbus_write_byte
- i2c_smbus_read_byte_data
- i2c_smbus_write_byte_data
- i2c_smbus_read_word_data
- i2c_smbus_write_word_data
- i2c_smbus_process_call
- i2c_smbus_read_block_data
- i2c_smbus_write_block_data
- i2c_smbus_read_i2c_block_data
- i2c_smbus_write_i2c_block_data
- i2c_smbus_block_process_call
*/
i2c-toolsのソースコード(ダウンロード)は、の良い例ですC
。C++
これらの関数をラップするいくつかの単純なライブラリを見てきました。ニーズに合わせて独自のライブラリを作成することをお勧めします。このI2CBusライブラリのような他の優れた例はGithubにあります
私はpigpioライブラリを使い始めたばかりで、とても感銘を受けました。プルアップ抵抗がある限り、任意の2つのGPIOピンをI2Cインターフェイスとして使用できるため、ビットバンモードが特に好きです。PI2を使用している場合、CPUが4つあるため、ビットバンギングのデメリットはあまりありません。ビットバングコマンドの良いところは、コマンドアドレスの「アドレス、書き込み、データ、読み取り、開始、停止」のリストを取得して、1回の呼び出しで複数のI / Oを実行できることです。読み取りコマンドの開始時にレジスタ番号を取得する多くのデバイスで必要とされる、繰り返し開始トランザクションを確実に実行することがわかったのはそれだけです。ライブラリは十分に文書化されており、使いやすいです。
以下は、MAX31785の温度レジスタを読み取るテストプログラムです。4は次のバイトでアドレスを設定します。2=開始、7 =書き込みの後にバイトカウントとデータバイトが続き、3 =停止、6 =読み取りの後にバイトカウントが続きます。呼び出しは、読み取られたデータバイトとバイト数を返します。
#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>
#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6 // Offset in CmdBuf of the page register write value
main( int argc, char *argv[])
{
int rcnt;
char ReadBuf[256];
char CmdBuf[] = {4, 0x52, // Chip address
2, 7, 2, 0x00, MAX31785_TEMP0, 3, // Write page register to select temperature sensor
2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
0 // EOL
};
if (gpioInitialise() < 0) return 1;
// Open bit banging I2C on standard I2C pins
if (bbI2COpen(2, 3, 100000)) return 1;
while(1)
{
// Loop over the 7 temp sensors
for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)
{
// Read the temp reg for the current page
rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));
if(rcnt == 2)
// Print out degrees C
printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
else
printf("Error: %d\n", rcnt);
}
printf("\n");
fflush(stdout);
sleep(1);
}
bbI2CClose(2);
gpioTerminate();
}
emcconvilleが述べたように、Linuxユーザー空間(#include <linux/i2c-dev.h>
)にi2c-devヘッダーがあります。さらに、読み込みにはキャラクターデバイスが必要です。これは、正しいモジュールをロードすることで実行できます。
i2c_bcm2708
低レベルのドライバーおよびi2c-dev
バスのキャラクター決定を生成します。適用...
sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000
その場でそれらをロードするため。適用...
sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf
ブラックリストへの登録を解除i2c_bcm2708
し/etc/modprobe.d/raspi-blacklist.conf
て、永続的に表示/dev/i2c-0
および/dev/i2c-1
表示します。
これからは、I²Cdel maestroを自分で使用する方法のヒントに従ってください。
プラットフォームに依存しないため、この方法が好まれます。linux/i2c-dev.h
I²Cドライバーが存在する限り、他のデバイスでも使用できます。WiringPiはrPiにバインドされています。
よろしく
この情報は非推奨です。デバイスツリーの使用については、この投稿を確認してください。
WiringPiがありますが、これはまさにあなたが望むことをしていると思います。Pascal、Java、Python、Perl、TCL、Rubyのラッパーもあります。さらに、誰かが同様のリンクを探索したいと思うかもしれません: