BETA

pigpioのCインターフェイスを使いたい I2C: master編

投稿日:2019-01-24
最終更新:2019-01-24

I2Cデバイスとやり取りしたい

pigpio Cインターフェイスのお話.
今回はI2C masterです.
I2Cってたった2線でいろんなデバイスとおしゃべりできて便利ですよね.

コード

0x01のアドレスを持つslaveを想定しています.
彼はリクエストを送るとfloat[4]のデータを送ってくれます.

このslaveはArduinoで作成しました.
そのうちそっちもメモします.

#include <iostream>  
#include <pigpio.h>  

// I2C_BUS 0: SDA=0, SCL=1  
//         1: SDA=2, SCL=3  
constexpr unsigned int I2C_BUS = 1;  

// 受信バイト変換のための共用体  
union {  
  float data[4];  
  char bytes[4 * 4];  
} receive_bytes;  
unsigned long long count = 0;  

// タイマ割り込み  
void int_time()  
{  
  // i2cハンドル取得  
  // 最後の引数は今の所使用されていないらしい.0推奨  
  // http://abyz.me.uk/rpi/pigpio/cif.html#i2cOpen  
  auto i2c_handle = i2cOpen(I2C_BUS, 0x01, 0);  

  // デバイスが存在しない場合 0以下が帰ってくる  
  if (i2c_handle < 0)  
  {  
    return;  
  }  

  // 受信したバイト数が帰ってくる  
  // http://abyz.me.uk/rpi/pigpio/cif.html#i2cReadDevice  
  auto length = i2cReadDevice(i2c_handle, receive_bytes.bytes, 4 * 4);  

  // 終了処理  
  // http://abyz.me.uk/rpi/pigpio/cif.html#i2cClose  
  i2cClose(i2c_handle);  

  // 書き出し  
  for (auto a : receive_bytes.data)  
  {  
    std::cout << a << "\t";  
  }  
  std::cout << std::endl;  
};  

int main()  
{  
  // gpioの初期化処理  
  // http://abyz.me.uk/rpi/pigpio/cif.html#gpioInitialise  
  if (gpioInitialise() < 0)  
  {  
    std::cout << "ERROR" << std::endl;  
    return -1;  
  }  

  // 開始時間メモ  
  // http://abyz.me.uk/rpi/pigpio/cif.html#time_time  
  auto start = time_time();  

  // タイマセット 10 ms  
  // http://abyz.me.uk/rpi/pigpio/cif.html#gpioSetTimerFunc  
  gpioSetTimerFunc(0, 10, int_time);  

  // 10 receive_bytes 待機  
  while (time_time() - start < 10)  
  {  
    // 特に意味はないけど sleep 0.1 receive_bytes  
    // http://abyz.me.uk/rpi/pigpio/cif.html#time_sleep  
    time_sleep(0.1);  
  }  

  // gpioの終了処理  
  // http://abyz.me.uk/rpi/pigpio/cif.html#gpioTerminate  
  gpioTerminate();  
  return 0;  
}

問題

クロックがなんか変

実際に出ているクロックをオシロスコープで計測すると6割減くらいになっているのが気になる.
100kHz, 400kHz, 1MHz でも同様に割合で減少しているように見える.回路の問題?
要検討.

↑はいろいろいじくり回したubuntuでの結果(ubiquity roboticsのイメージが元)
PiBakeryで作成したイメージで試すときちんと1MHzでていた.
あとで再検証.

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@zennihonの技術ブログ twitter/zen_nihon

よく一緒に読まれる記事

1件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
01/24 19:23

スペース2つはちょっと見にくい気がする

目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!