Shujima Blog

Apple製品,技術系の話をするブログ

Nucleo-F401でI2C電流センサ使ってみた(INA226,STM32CubeIDE)

環境

  • Nucleo-F401
  • INA226PRCディジタル電流・電圧・電力計モジュール【精密タイプ】(ストロベリーリナックス
  • STM32CubeIDE v1.0.0
  • macOS 10.14.5

電流センサについて

今回購入したのはストロベリーリナックスの電流計測モジュールです.

strawberry-linux.com

測定したい電流レンジが小さかったので精密タイプとしましたが,標準タイプとは測定用抵抗の値が異なるだけなので,同じプログラムで動くはずです(電流値の読み替えが必要です).

モジュールの準備と配線

モジュールはピンヘッダ等が付いてない状態で届くので,ピンヘッダを取り付けます.

つけた状態.

f:id:masa_flyu:20190616171954j:plain

他にもメスのソケットタイプや測定部用のねじ止めターミナルも付いてきました.今回はつけません.

また,I2Cのアドレスを16種類から選択する必要があります.今回はA0をGND,A1をGNDに接続することでアドレスを0b1000000xとします.表面にある2箇所のパッドをはんだでショートさせます.

f:id:masa_flyu:20190616172159j:plain

最も右のビットはR/Wで変わる値なので,アドレスとしてはその部分を除いた0b1000000=64になります.ただ,この先のプログラムで64を1ビット左にずらす表現が多様されますので気に留めておいてください.

配線は以下の画像の通りで電源とI2Cの配線計4本をつなぐだけです.

f:id:masa_flyu:20190616164650j:plain

I2CはSCL,SDA線にプルアップ抵抗を必要としますが,今回はSTM32の内蔵プルアップを利用するので不要です.

STM側のI2Cのピンは設定でいくつかから選べますが,今回はArduino互換ピンからとしました.

ピンの設定

ピンを設定します.PB8,PB9ピンをそれぞれ

  • I2C1_SCL
  • I2C1_SDA

に設定します.

f:id:masa_flyu:20190616165403j:plain

またI2C1の詳細設定からI2Cを有効にします.

f:id:masa_flyu:20190616165415j:plain

内蔵プルアップはこの時点で自動で設定されているはずです.

f:id:masa_flyu:20190616165426j:plain

以上でピンの設定は完了です.

保存すると,main.cが自動で書き換えられ,I2Cの設定が反映されます.

プログラム

3箇所を編集します.

Includeを追加します.

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/* USER CODE END Includes */

変数を追加します.

  /* USER CODE BEGIN 1 */
  uint8_t readcur[2],readvol[2];
  uint16_t curma,volmv;
  char sval[100];
  /* USER CODE END 1 */

while文の中です. .

    /* USER CODE BEGIN 3 */

    HAL_I2C_Mem_Read(&hi2c1, (uint16_t)64<<1, 0x01, I2C_MEMADD_SIZE_8BIT, readcur, 2, 1000);
    HAL_I2C_Mem_Read(&hi2c1, (uint16_t)64<<1, 0x02, I2C_MEMADD_SIZE_8BIT, readvol, 2, 1000);

    curma = ((readcur[0]<<8) + readcur[1]) * 0.1;//mA
    volmv = ((readvol[0]<<8) + readvol[1]) * 1.25;//mV
    sprintf(sval, "I:%2x%2x->%5d[mA], V:%2x%2x->%5d[mV]\r\n",readcur[0], readcur[1], curma, readvol[0], readvol[1], volmv);
    HAL_UART_Transmit( &huart2, sval , strlen(sval) + 1, 0xFFFF);
    HAL_Delay(100);
  }
  /* USER CODE END 3 */

動作

こんな風に値が読めます.

値が飛んでいるのは,測定部分に何も繋いでいないためで,繋げばきちんと値が出ました.

f:id:masa_flyu:20190616172717j:plain

参考

gsmcustomeffects.hatenablog.com

ccwo.hatenablog.jp

当ブログをご利用いただく際には免責事項をお読みください。