I2Cライブラリはありますか


12

I2C for C ++と通信するための簡単なライブラリはありますか?PythonとJava用のものをいくつか見つけましたが、C ++が必要でした。誰かがArduino Wireライブラリを移植して、すでにArduino用に書いたコードを使えるようにしたいと思っていました。



1
同意しない... Arduino配線ライブラリがPiに移植されたかどうかを本当に質問しているので、Arduino用に記述されたコードをPiで簡単に使用できます。それはそうではないようですので、同等の、使いやすいライブラリがあればいいでしょう。ただし、それも存在しないようであるため、i2c-devコードを使用します。
ケビン

回答:


7

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のソースコード(ダウンロード)は、の良い例ですCC++これらの関数をラップするいくつかの単純なライブラリを見てきました。ニーズに合わせて独自のライブラリを作成することをお勧めします。このI2CBusライブラリのような他の優れた例はGithubにあります


5

私は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();
}

crj11、コード例を投稿していただきありがとうございます。それは私が見つけて正しい道を歩むことができた最高の例でした。私がそれについて抱えていた唯一の問題は、pigpiod_if.hライブラリを使用することで、sudoとしてコードを実行する必要があることでした。これは私のプロジェクトでは受け入れられませんでした。pigpiod_if2.hライブラリーに切り替えて、いくつかの調整を行うことができ、それはチャンピオンのように実行されました。
リチャードティール

2

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.hI²Cドライバーが存在する限り、他のデバイスでも使用できます。WiringPiはrPiにバインドされています。

よろしく

更新:

この情報は非推奨です。デバイスツリーの使用については、この投稿を確認してください。


0

WiringPiがありますが、これはまさにあなたが望むことをしていると思います。Pascal、Java、Python、Perl、TCL、Rubyのラッパーもあります。さらに、誰かが同様のリンクを探索したいと思うかもしれません:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0

いいえ、もう一度見てください。i2cではなく、基本的なピン機能だけです。プロジェクトの名前はやや誤解を招きます。最初のリンクには素晴らしいCコードがありますが、Arduinoのようなi2cを実行するための単純なラッパーではありません。おそらく自分で作成する必要があります。
ケビン

3
WiringPi I2Cライブラリ:lightingpi.com/reference/i2c-library
avra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.