Arduino

05/09/2018

YHDC SCT-013-000 CT とArduinoで家庭内の電流を測定する

YHDC 非侵襲性AC電流センサSCT-013-000 CT  とArduinoを使って、電力量を測定する。(非侵襲性AC電流センサ は、Amazon(Hommy販売から @465円で購入))

参考にしたブログとスケッチ
1) Current monitoring with non-invasive sensor and arduino
2) SCT-013 – Sensor de Corrente Alternada com Arduino
3) openenergymonitor/EmonLib

YHDC SCT-013-000 CTの電流範囲は0〜100 Aです。
  VRefは、アナログ基準電圧で、ここでは、VRef = 5V

  Cmaxは、ADCの分解能で、ここでは、Cmax = 1024

  Rtは、電圧変換器比で、部品仕様から下記のように計算される。
     Rt = 100 A  ÷ 50 mA = 2000


  測定電流値 I = √2 * i(rms_current)= 1.414 * 100A = 141.4A

  センサーに流れる電流値 i は、次式で計算される。
       i =
測定電流値 I ÷ 電圧変換器比 Rt
        = 141.1A  ÷ 2000
         = 0.0707A


Arduinoは、電圧(0V〜5V)しか扱えないため、この電流を許容電圧に変換する必要がある。そのため、回路に負荷抵抗Rを追加する。

  電流は、0を中心に変動するので、
  センサ最大電圧は、Max_accepted_voltage(=5V) / 2 = 2.5V とすると、

       Rb(負荷抵抗)= U(センサ電圧)/ I(センサ電流)= 2.5V / 0.0707A =35.4Ω
  理想的な負荷抵抗Rb は 35.4Ωだが、そのような抵抗は無いので、
  33Ω(実際に使った抵抗の測定値は、テスターで計測した 32.8Ω)の抵抗を使用した。
図中、2個の抵抗(10kΩは、エネルギー消費を避けるため)、コンデンサ(10μF)は、交流電流が抵抗をバイパスする代替パス。

プログラム中に見られる数字は、
  counts = センサ入力ピンの電圧(=センサを通る二次電流×負荷抵抗値Rb) ÷ VRef × Cmax
 
  Isupply = counts ÷ ADCの分解能 Cmax × アナログ基準電圧VRef× 電流校正定数
      = Irms (←スケッチでの表示)
 
  ここに、電流校正定数 = Rt ÷ Rb
 
  YHDC SCT-013-000 CT センサと、テスターで計測した負荷抵抗を使い、
     電流校正定数 = Rt ÷ Rb
                = 2000 ÷ 32.8Ω = 60.976

計算は、オープンライブラリーの EnergyMonitor emon1 を利用したので、上記計算はそのライブラリーを使うための定数の理解と計算するためのステップである。

使った部品を含め、計測誤差の大きい回路構成なので、計測電流が流れていない時も0.3Aほどの電流が流れていると表示する。電流値がある値以下の場合には、スケッチの中にある様に、ゼロと表示するようにもできるが・・・。部品は安価に入手できるので、自宅で使っている電気(電流)の傾向を見るのには良いかもしれない。

《Fritzingと写真》
Sct013fritzing Img_20180417_200519SCT013のFritzingパーツがWeb上に見つからないので、僕はInkscapeの機能を使って、Fritzingに貼り付けられるよう、左図にある部品図を作った。この時参考にしたのは、Youtubeの『Fritzing Part Creation - Chapter9 - Using Photo and PDF』である。


《スケッチ》
// Current sensor SCT013-100A/50mA
#include "EmonLib.h"
#include <Wire.h>
#include <U8glib.h>

EnergyMonitor emon1;

//Oled表示設定
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

String str;
int characterlen;
double Irms = 0;  // the current measured

void draw()
{
  //ディスプレイのグラフィックスコマンドはここに配置する
  u8g.drawRFrame(0, 16, 128, 48, 4);
  u8g.drawRFrame(0, 0, 128, 16, 4);
  u8g.setFont(u8g_font_8x13B);
  u8g.setColorIndex(0);
  u8g.setColorIndex(1);
  u8g.drawStr( 40, 13, "Current");
  u8g.drawStr( 103, 60, "[A]");
  u8g.setFont(u8g_font_fur25);
  str = String(Irms);
  characterlen = str.length();
  u8g.setPrintPos(60 - (characterlen * 10), 53);
  u8g.print(Irms,3);
}

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Current measurements value by SCT013"); 
  Serial.println("");
  Serial.println("");
  
// Theoretical CT Sensor Calibration = CT Ratio / Burden resistance
// ⇒ (100A / 0.05A) / 32.8 Ohms = 60.976
  emon1.current(1, 60.976);   // Current: inputpin No, calibration
    
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255, 255, 255);
  }
}

void loop(void)
{
  Irms = emon1.calcIrms(1480);  // 1480 is no_of_samples
//  if(Irms < 1.0 ) Irms = Irms -0.3; // 表示誤差分を取り除く見かけの処理
//  if(Irms < 0.20) Irms = 0.0;
  
  Serial.print("  Sensor 1: ");
  Serial.print("  Irms=");
  Serial.print(Irms,3);  // print to the third decimal place
  Serial.print("[A]");
  Serial.print("  Power=");
  Serial.print(Irms*100.0);  // Apparent power (100 is the Voltage)
  Serial.println("[W]");
  
  //画面上で描画ルーチンを呼び出し
  u8g.firstPage();
  do
  {
    draw();
  }
  while ( u8g.nextPage() );
  delay(150);
}

12/06/2017

Bluetooth modules(HC-05、HC-06)のPairing設定

Bluetooth modules(HC-05、HC-06)が互いに通信するための条件設定は何かを調べてみたので、メモとして残しておく。
本件に関しては、「Arduinoを簡単にBluetooth無線化するHC-05/HC-06
」(2015年2月20日の記事)、「Connecting 2 Arduinos by Bluetooth using a HC-05 and a HC-06: Pair, Bind, and Link 」(2014年11月の英文記事)がとても参考になる。

Bluetooth module HC-05の特徴は、
 ・Bluetoothの親機としても使用できる。(マスターでもスレーブとしてでも使用できる。)
 ・通信はBluetoothで行うが、入出力端子はシリアルのRX/TXとなっているため、Arduinoのシリアル RX/TXに接続するだけで通常のSerial通信と変わらず使用できる。

Bluetooth module HC-06の特徴は、
 ・3.3Vデバイスなので、Arduinoと接続する際には、5V Tx信号を抵抗分圧で、3.3Vにレベルシフトする必要が有る。
 ・通常Arduinoとの接続時には、再起動される。
 ・HC-06は、他のBluetooth module とペアリングしていない場合、ATコマンドを受け入れる。
 ・ATコマンドは、シリアルモニタの下端にある窓の設定は、「改行なし(No line ending、キャリッジリターン (CR) とラインフィード (LF)が無い状態
)」とし、且つ 1秒以内に送信する必要が有り、この時間を越えるとコマンドは無視される。

 ・ディバイスの名前:HC-06
 ・Password: 1234(デフォルト)
 ・Baud: 9600baud(デフォルト)


Bluetooth module HC-05およびHC-06が相互に
通信するための設定手順

①両方のデバイスで同じボーレートを設定する。

  (例)HC-05およびHC-06で、ボーレートを9600に設定する。

②両方のデバイスで、パスワードが同じであることを確認する。

  (例)HC-05とHC-06のパスワードを同じにする。

③次に、HC-06のアドレスを見つける必要がある。

  HC-06のATコマンドでは、自分(HC-06)のアドレスを調べる事は出来ないので、
  Androidデバイスから、あるいはHC-05を使って調べる事が出来る。
  
  ここの手順は、
Connecting 2 Arduinos by Bluetooth using a HC-05 and a HC-06: Pair, Bind, and Link 」の『3. Find the address of the HC-06』 に詳しく記載されているので、ここを確認するのが良い。

  HC-05で行う場合、HC-05をATコマンドモードにして以下のように行う。

  a)以前にペアになったデバイスをすべて消去するために、
    AT+RMAAD

  b)HC-05をマスタモードにする。
    
AT+ROLE=1

  c)
HC-05をリセットする。
    AT+RESET

  ピン34をHIGHにして(ATコマンドモードにして)から

  d)HC-05を任意のデバイスに接続するように設定する

    AT+CMODE=0

  e)最大5台のデバイスを9秒間検索するを行う場合、下記のコマンドを入力する。
    AT+INQM=0,5,9

  f)SPPプロファイルを開始する。もしSPPが既にアクティブであれば、無視することができるエラー(17)が表示される。
    AT+INIT
  g)ここで、他のBluetoothデバイスを検索する。
    AT+INQ
   Bluetoothデバイスが複数ある場合には、上記の設定により、5台までのデバイスが表示される。
   AT+INQは3つの値を返します。
     最初の値はアドレスで、これがペアリングの為に必要な値です。
     2番目の値はデバイスのモード。
     3番目の値はRSSI信号の強さ。

④HC-05をHC-06とペアリングする。(所謂、電話番号の交換)
  ペアリングするには、AT+PAIR= <addr>、<timeout>コマンドを使用する。
  (例) "AT + PAIR = 3014,10,171179,9"(引用符なし)と入力する。

     上記の例で、HC
-05がHC-06と 9秒以内にペアリングできない場合、
     エラーメッセージが表示される。
     ペアリングが成功すると、「OK」が表示される。

HC-06をHC-05にのアドレスとしてバインド設定する。(所謂、通話すること)
  "AT + BIND = 3014,10,171179"を使用してバインドする

⑥ペアリングされた特定の1台のデバイスにのみ接続するようにHC-05を設定する。
   CMODEコマンド でこれを行う。
  
   "AT + CMODE = 1"

HC-06へのリンク(HC-05からリモートデバイスであるHC-06への接続)
  リンクコマンドAT + LINK = <addr>を使用する

  (例)前述からの流れで示すと・・・
   "AT + LINK = 3014,10,171179" として行う。

  すべてがうまくいけば、「OK」 の応答が得られる。


  HC-05のLEDは、毎秒1回点滅し、HC-06のLEDは点灯状態(点滅ではない)。
  これで、HC-05とHC-06が接続した。

  接続設定が完了すると、HC-05は電源を入れるたびに自動的にHC-06に接続する。


  接続が確立されると、HC-05は通信モードに切り替わる。



通信の確認
テストスケッチで(私のブログならばここを参考に)確認を行う。

①HC-05とHC-06が接続された2台のArduinoの電源を切る。


②先ず、
HC-06の電源を入れる。
  LEDは1秒間に5回点滅している筈で、これは、接続を待っているか、ペアになっていることを示す。

③次に、
HC-05の電源を入れる。
  最初にLEDが数回点滅し、その後、通常パターンの点滅に変わる。

④HC-06のLEDが常時点灯する(点滅はしない)。

⑤以上で、2台のモジュールが接続される。



シリアルモニタを開くと、入力したコマンド等は、もう一方のデバイス用のモニタに表示され、逆も同様に表示される。


モジュールの電源がONになるたびに、接続し直す必要がある。モジュール間で接続していないことがわかったら、Arduinoの電源を入れ直すこと。

場合によっては、HC-05が接続しようとしてスタックしていることがある。この場合、HC-05のLEDの状況は、下記のようである。


1)2秒間に3回の点滅をしている。

2)あるいは、1秒に2回点滅します。
これは通常、HC-05をリセットしないで HC-06の電源を切り再度ONにしたときに発生する。

12/04/2017

HC-06 Bluetooth module のATコマンド

HC-05のATコマンドモードは、HC-05のプッシュボタンを押しながらArduinoの電源を入れれば、ATモードになり、それをLEDの点滅間隔で確認することができるが、HC-06にはHC-05のようなプッシュボタンが無いので、ATモード動作をどうやって行い、確認することが出来るのか?
調べてみると、「AT Command Mode of HC-05 and HC-06 Bluetooth Module by sayem2603 in wireless」に記載があった。要約したものをメモしておく。

《HC-06とHC-05の違い等について》

 ①HC05は、マスターとスレーブの両方として機能し、HC-06は、
常にスレーブに設定されていて、スレーブとしてのみ機能する。

 ② HC-06モジュールは、他のデバイスとペアリング設定されていない場合は、常にATモードになっている。したがって、HC-05のようにATモードになっていることを確認する点滅は無い。モジュールの電源を入れると、即ATコマンドモードになっている。HC-06のデフォルト設定内容を変更するには、ATコマンドを渡せば設定を変更できる。
下記にHC-06用にスケッチを書いてみると・・・
 【HC-06用のスケッチ】

// Basic Bluetooth sketch HC-06
// HC-06 モジュールと繋いで、シリアルモニタを使った通信用スケッチ
//
// HC-06 を電源ONした直後のデフォルト値と注意点は、
//   電源ON直後は ATモード(LEDの点滅とは関係なし)
//  ボーレートは 9600
//  NL+CR をコマンドに追加しない事
//   コマンドは、ATに続けて打ち込めばよい(例:AT+VERSION )
//
#include <SoftwareSerial.h>
  SoftwareSerial BTserial(2, 3); // RX | TX
// HC-06 の TX は、Arduino の RX pin2(D2)に接続する。 
// HC-06 の RX は、Arduino の TX 分電圧をして pin3(D3)に接続する。
// 
void setup() 
{
    Serial.begin(9600);
    Serial.println("AT コマンド入力 :");
// HC-06 のデフォルトでのシリアル速度は、9600
    BTserial.begin(9600);
}
void loop()
{
// HC-06 からコマンドを読み続けて、Arduino のシリアルモニタに通信する
    if (BTserial.available())
    {  
        Serial.write(BTserial.read());
    }
 
    // Arduino のシリアルモニタからのデータを読み続け、HC-06に通信する
    if (Serial.available())
    {
        BTserial.write(Serial.read());
    }
}


 ③HC-06では、ATコマンド入力の終了文字を待たず、1秒後に入力した文字に応じて動作する。したがって、1秒以内にコマンド入力を完了できない場合は、入力が無視される。
また、入力した文字のフィードバック出力も無い。このため、AT以外のATコマンドが無視されたかのように振る舞うことになる。そのため、IDE標準のシリアルモニタではなく、「Tera Term」等、別のモニタを使い、必要なATコマンドをエディタで編集して作成したものをコピーし、モニタの入力部分に貼り付けるの
が良いらしい。

  例えば、
  「
AT+VERSION」をマウスの右クリックメニューからコピーし、Tera Termに貼り付ければ、+Version:<version number>として表示されるはず。

 ④HC-06は、③の動作をするため、
複数の文字のバッチ送信を可能にする端末ソフトウェア(Tera Term等)を使用する必要がある。

 ⑤arduinoシリアルモニタで、 "AT"(引用符なし)で「Enterキー」を押すと、 "OK"が表示されATモードを確認出来る。しかし、HC-05と異なり、デフォルトの名前やボーレートは表示されない。出来るのは、それらを変更することだけ。

 ⑥HC-06で使用できるATコマンドには制限があるので、HC-05よりも少ないらしい。
  ・AT
  ・AT+NAME
  ・AT+BAUD
  ・AT+PIN
  ・AT+VERSION
  ・AT+UART
  など

 ⑦また、HC-06のコマンド入力では、HC-05とは違って、デフォルトの名前やボーレートは表示されないが、それを変更する事は出来る。
  ・名前を「PROTOTYPE」に変更する場合には、
   AT+NAMEPROTOTYPE  と記載すること。NAMEとPROTOTYPEの間にはスペースを入れないこと。

  ・ボーレートを変更するには、 AT+BAUDX  と記載すること。
   ここで、X は 1から8迄の数値をとることができる。
    1 --
> 1200bps
    2 --> 2400bps
    3 --> 4800bps
    4 --> 9600bps
    5 --> 19200bps
    6 --> 38400bps
    7 --> 57600bps
    8 --> 115200bps

   もし、38400bpsに設定したければ、 
AT+BAUD6  とすればよい。 

  因みに、ATコマンドに対して HC-06の応答は、このようになる・・・

    ATコマンド    HC-06の応答
    AT                     ->  OK
    AT+VERSION   ->    OKLinvorV1.8
    AT+BAUD4       ->    OK9600
    AT+PIN1234     ->    OK1234

12/01/2017

Arduino接続の HC-05 Bluetooth module をペアリングする方法

Arduino接続の HC-05 Bluetooth module をペアリングさせる方法について、Youtube「How to Pair HC-05 Bluetooth module」情報を文書化しておく。

準備するもの
①Arduino 2台(Master用とSlave用各1台)
②HC-05(Master用)x1、HC-05(Slave用)x1
Hc05








③ArduinoとHC-05を接続するジャンパーケーブル

手順の概要
①Slave用のHC-05の設定と、Slave用Bluetooth module アドレス取得
②Master用のHC-05の設定と、通信するBluetooth module のアドレス書込み
③Master用Bluetooth moduleをArduino に接続

具体的手順
1)ArduinoをUSB接続
(USB 2.0 Type-Bを挿し込んで電源ON)して、 IDEを起動
  ボード、プロセッサを確認して、Arduino に書き込み、
  USBケーブルを外す(USB 2.0 Type-Bを抜いて電源OFF)
Usb2






2)Slave用のHC-05に対して、Arduino と次のように接続する。
  (左側がBluetooth module で、右側がArduino (例えばUNO))

   STATEピン → 接続しないで開放のまま
   RXピン → RXピンへ
   TXピン → TXピンへ
   GNDピン → GNDピンへ
   +5Vピン → 5Vピンへ
   ENピン → 3.3Vピンへ

3)Slaveモード側の
HC-05の設定状態を確認・設定する作業を行う。
 ①HC-05のEN端子側にあるプッシュボタンを押したままの状態にして、

   USB 2.0 Type-B をArduino に挿し込んで電源ONする。

 ②HC-05は、約2秒間隔でLEDが点灯する。
   これで、ATモードが起動した。

  (HC-05のプッシュボタンを押さずにUSBを接続すると、HC-05は短い間隔でLED点滅する。この時のモードが、ペアリングモードである。)

  もし、プッシュボタンを押し込んだ状態にしてUSBを接続するのが難しければ、
   小型の「目玉クリップ」等でボタンを挟んで、ボタンが押された状態にして、
   USBケーブルをArduino に挿し込めばよい。

 ③Arduino IDE を起動させて

  ・ツール → シリアルモニタを起動させる。
  ・シリアルモニタ画面で、改行指示と通信速度を確認する。
   「CRおよびLF」「38400」にすること。

 ④シリアルモニタのコマンド入力部分に「AT」と入力して、「OK」の表示が出ればATモードになっている事が確認できる。
  ・Master/Slave の確認を行う。
   AT +ROLE?  とコマンド入力して、
    +ROLE:0  と応答があれば、Slave になっている。
    +ROLE:1  と応答があれば、Master になっているので、
   AT +ROLE=0 とコマンド入力し、Slave に変更する。

  ・次に、このBluetooth module のアドレスを表示させる。
   AT +ADDR?  とコマンド入力すると、アドレスが表示される。
   ( 例えば、XX:XX:XX のように表示される。)
  ・これをノートパッドなどに貼り付けて、「:」のところを「,」に編集する。

 ⑤ArduinoからUSBケーブルを外し、
   Slave用のBluetooth module もジャンパーケーブルから外す。

 ⑥Master用のBluetooth module をジャンパーケーブルに接続する。
   このとき、ジャンパーケーブルの接続ピン位置は2)と同じままで良い。

 ⑦
Bluetooth module のプッシュボタンを押した状態で、Arduino にUSBケーブルを接続(電源ON)し、ATコマンドモード起動する。

   ATコマンドモードにして行う事は、以下の3項目
    ・ROLE(役割)をMaster にすること。
    ・ペアリング接続先を1つにすること。
    ・Slave用module と接続するようにアドレスを設定すること。

   Arduinoに接続したBluetooth module をMaster 設定するには、
   前記の3項目の順に作業する。

 
ATコマンドで、先ず現在の役割設定を下記のようにして確認する。
   
 AT +ROLE?
    +ROLE:0   と表示されれば、Slave の設定になっている。

    この場合には、

    AT +ROLE=1   と打ち込んで、ROLEをMasterに設定する。

 ⑨ペアリングの為に、このSlaveのアドレスを調べる。
    AT +ADDR?  と打ち込み、表示されたアドレスをコピーして、ノートパッドなどに貼り付ける。
    ノートパッドの編集機能を使って、コピーしたアドレスの「:
(半角)」の部分を「,(半角)」に変更する(2箇所)。この編集したアドレス「XX,XX,XX」は、後(⑭)で使う。


 ⑩Arduino のUSB電源ケーブルを外し、
   Slave用のBluetooth module も外し、Master用のBluetooth module を接続する。
   この時のピン接続は、⑥と同じで良い。

 ⑪HC-05(
Bluetooth module)のプッシュボタンを押したまま、Arduino のUSB電源ケーブルを接続し、HC-05をATモードで起動させる。

 ⑫Arduino IDEのをシリアルモニタを起動し、ATモードでROLE をMaster に設定する。
   AT +ROLE?   先ず設定状況を確認し、(+ROLE:0  となっている筈なので、)

   AT +ROLE=1  と打ち込んで、Master に設定する。

 ⑬他のBluetooth とのコネクション(接続)モードを確認・設定する。
   AT +CMOD?   で現設定状態を確認して、
    +CMODE:0  ならば、1台のみに接続
    +CMODE:1  ならば、どのBluetooth Module とも接続できるモード

   ここでは、1台のみに接続したいので、+CMOD:0 としておきたい。

   AT +CMOD=0  と打ち込んで設定する。

 ⑭次に、接続するBluetooth module のアドレスを設定する。
   先ほどノートパッドを使って編集したアドレス「
XX,XX,XX」(=[address])をコピーして、


   AT +BIND=[address]  として設定する。


4)2台のArduinoが交信するための準備
 ①別のArduinoにHC-05(Bluetooth module)を接続する。

  (左側がBluetooth module で、右側がArduino (例えばUNO))

   STATEピン → 接続しないで開放のまま

   RXピン → TXピンへ
   TXピン → RXピンへ
   GNDピン → GNDピンへ
   +5Vピン → 5Vピンへ
   ENピン → 3.3Vピンへ

 ②Youtubeでは、これでHC-05を繋いだ2台のArduino が、互いに通信出来る筈・・・
   試してみたい。


参考:HC-06(ZS-040)をArduinoでATコマンド接続するには
  Martyn Currey「Arduino and HC-06 (ZS-040)


June 2018
Sun Mon Tue Wed Thu Fri Sat
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Recent Trackbacks

無料ブログはココログ