記事

DIPマイコンLPC1114FNでmbed入門 <5>VIメータの製作 ~その2~

電圧と電流を同時に測れるVIメータの製作 ~その2~

 電圧と電流を同時に測定できるVIメータ(Wメータ)をマイコン1114FNを使って製作しています。今回はVIメータのクラウド・プログラミングを楽しみます。

mbed プログラミング
 下記アドレスにてPublishしています。

  https://developer.mbed.org/users/takeuchi/code/20150607_kiban_VImeter/

プログラム全体

// VI Meter Kiban


#include "mbed.h"
#include "I2cLCD.h"

I2cLCD lcd(dp5,dp27,dp26); //sda scl reset
I2C Ina226(dp5,dp27);//SDA SCL
DigitalOut led_yellow(dp16);
DigitalOut led_green(dp15);

unsigned int waddr=0x80,raddr=0x81;
char cmd[3],val[3];
double vc,ic,ihosei;

#define ON 1
#define OFF 0
#define XON 0
#define XOFF 1

#define batt1_ON lcd.seticon( I2cLCD::Battery_1 )
#define batt2_ON lcd.seticon( I2cLCD::Battery_2 )
#define batt3_ON lcd.seticon( I2cLCD::Battery_3 )
#define batt4_ON lcd.seticon( I2cLCD::Battery_4 )

#define batt1_OFF lcd.clearicon( I2cLCD::Battery_1 )
#define batt2_OFF lcd.clearicon( I2cLCD::Battery_2 )
#define batt3_OFF lcd.clearicon( I2cLCD::Battery_3 )
#define batt4_OFF lcd.clearicon( I2cLCD::Battery_4 )

#define arrow_down_on lcd.seticon( I2cLCD::ArrowDown );
#define arrow_up_on lcd.seticon( I2cLCD::ArrowUp );
#define arrow_down_off lcd.clearicon( I2cLCD::ArrowDown );
#define arrow_up_off lcd.clearicon( I2cLCD::ArrowUp );

/*
void batt_mark(){
   if(vc < 4.5 ){
      batt1_ON;
      batt2_OFF;
      batt3_OFF;
      batt4_OFF;
   }
   else if(vc < 4.8){
     batt1_ON;
     batt2_ON;
     batt3_OFF;
     batt4_OFF;
   }
   else if(vc < 5.0){
      batt1_ON;
      batt2_ON;
      batt3_ON;
      batt4_OFF;
   }
   else{
      batt1_ON;
      batt2_ON;
      batt3_ON;
      batt4_ON;
   }
}
*/

void led_flash(){
   int i;
   for(i=0;i<3;i++){
      led_green=ON;
      led_yellow=ON;
      wait(0.1);
      led_green=OFF;
      led_yellow=OFF;
      wait(0.1);
   }
}

int main() {

   led_flash();
   lcd.cls();
   lcd.locate(0,0);
   lcd.printf("* VI Meter 1.1 *");

   cmd[0]=0x05;// calibration registar
   cmd[1]=0x0a;// shunt reg=2m ohm
   cmd[2]=0x00;
   Ina226.write(waddr,cmd,3);
   wait(0.1);

   cmd[0]=0x00;// config reg.
   cmd[1]=0x45;// average set & number=16
   cmd[2]=0x27;
   Ina226.write(waddr,cmd,3);
   wait(0.1);

   cmd[0]=0x04;// current read
   Ina226.write(waddr,cmd,1);
   Ina226.read(raddr,val,2);
   ic=(short)(val[0]<<8 | val[1]);
   if(-3.0 <ic && ic < 3.0 ){
      ihosei=0.0-ic;
   }
   wait(0.1);

   while(1){

      cmd[0]=0x04;// current read
      Ina226.write(waddr,cmd,1);
      Ina226.read(raddr,val,2);
      ic=(short)(val[0]<<8 | val[1])+ihosei;
      if(ic < 0){ //discharge
         arrow_down_on;
         arrow_up_off;
         led_green=OFF;
         led_yellow=ON;
      }
      else{ //charge
         arrow_up_on;
         arrow_down_off;
         led_green=ON;
         led_yellow=OFF;
      }

      wait(0.1);

      cmd[0]=0x02;// voltage read
      Ina226.write(waddr,cmd,1);
      Ina226.read(raddr,val,2);
      vc=(val[0]<<8 | val[1])*1.25/1000;
/*
      cmd[0]=0x03;// power
      Ina226.write(waddr,cmd,1);
      Ina226.read(raddr,val,2);
      pw=(val[0]<<8 | val[1])/25;


      pw=out_v*ic/1000;// power
      if(out_v >= 12.0){
         out_v=12.0;
      }
      if(pduty <= 0.03){
         out_v=0;
      }
*/

      lcd.locate(0,1);
      lcd.printf("%4.1fV,%4.0fmA",vc,ic);

      led_green=ON;
      wait(1.0);
      led_green=OFF;
      wait(1.0);

      // batt_mark();

      }//while
}//main

◆I2C INA226

<初期化>
 cmd[0~2]にデータをセットして、waddrに書き込みます。

cmd[0]=0x05;// calibration registar
cmd[1]=0x0a;// shunt reg=2m ohm
cmd[2]=0x00;
Ina226.write(waddr,cmd,3);
wait(0.1);

cmd[0]=0x00;// config reg.
cmd[1]=0x45;// average set & number=16
cmd[2]=0x27;
Ina226.write(waddr,cmd,3);
wait(0.1);


wait(0.1);


<電流の読み出し>
 cmd[0]に0x04をセットして、waddrに書き込み後、raddrより電流値を読み出すことができます。何も接続していないで読み出した時に-3.0~+3.0であれば、0補正としてihoseiにデータをセットします。

cmd[0]=0x04;// current read
Ina226.write(waddr,cmd,1);
Ina226.read(raddr,val,2);
ic=(short)(val[0]<<8 | val[1]);
if(-3.0 <ic && ic < 3.0 ){
      ihosei=0.0-ic;
}


<電圧の読み出し>
 cmd[0]に0x02をセットして、waddrに書き込み後、raddrより電圧値を読み出すことができます。

cmd[0]=0x02;// voltage read
Ina226.write(waddr,cmd,1);
Ina226.read(raddr,val,2);
vc=(val[0]<<8 | val[1])*1.25/1000;


<電力の読み出し>
 本プログラムでは電力はコメントアウトしていますが、cmd[0]に0x03をセットして、waddrに書き込み後、raddrより電力値を読み出すことができます。

cmd[0]=0x03;// power
Ina226.write(waddr,cmd,1);
Ina226.read(raddr,val,2);
pw=(val[0]<<8 | val[1])/25;


pw=out_v*ic/1000;// power
if(out_v >= 12.0){
      out_v=12.0;
}
if(pduty <= 0.03){
      out_v=0;
}


<I2C LCDのアドレス>
 I2C LCDのアドレスは、I2cLCD.cppに書き込まれています。別のLCDでアドレスが違う際には、ここを書き換えてください。

#include "I2cLCD.h"
#include "mbed.h"

#define I2CLCD_ADDR 0x7C

#define RS_CMD 0x00
#define RS_DATA 0x40

#define FUNC_SET1 0x38
#define FUNC_SET2 0x39
#define INT_OSC 0x14

#define CNTR_DEF 0x20

完成!
 完成したプログラムをmbed 1114FNに書き込み、ソケットに差し込みます。NiMH電池×2本を電池ボックスにセットします。

 測定対象を未接続の状態で、電源スイッチをONにします。0.0V、0mAが表示されれば完成です。

 この状態で、0mAとならない場合もありますが、リセット・スイッチを押す補正機能により0mAになります(ならない場合もある)。

 INとOUTに小型ソーラ・パネルを接続し、NiMH電池×4本の充電電流を測定しています。

 5.9V、185mAと計測しています。

 便利に使うことができるVIメータをぜひ活用ください。

竹内浩一

連載メニュー DIPマイコンLPC1114FNでmbed入門

(1) mbedでLチカする手順

(2) サーボ・テスタの製作 ~その1~

(3) サーボ・テスタの製作 ~その2~

(4) 電圧と電流を同時に測れるVIメータの製作 ~その1~

(5) 電圧と電流を同時に測れるVIメータの製作 ~その2~