白旗製作所

RaXino+RaspberryPi電力計の電力計測部分の製作

この記事の電力計測部(CT~マイコン)の
詳細を書いていこうと思います.

電力計測部の回路は以下の図のようになっています.
CT.png
まず試験負荷としてドライヤーとスイッチを接続し,延長コードの1箇所にCTを取り付けます.
CTの負荷抵抗RLは100Ωとします.これで30A→1Vに変換できます.
ドライヤーは定格1200Wなので,大体12Arms→0.4Vrms→1.13Vp-pか,
これよりも小さいくらいの電流が検出できるはずです.

CTの負荷抵抗値について、秋月電子のHPやデータシートでは負荷抵抗RL=10Ωとしか記載がありませんでしたが,
以下のページを見ると300Ωまでは結合係数もよく計測できそうでした.
CTの最大スペックの80Aまでは使わないでしょうし,30Aで0.1Vだとあまり電気を使っていない時の精度が悪化しそうですので、なるべく負荷抵抗の値を上げて検出感度を高くしたいところです。
一方で、非線形な負荷だと電流のピークが通常の正弦波の倍とかになることもありますので負荷抵抗を大きすぎるのも考えものです。ここでは100Ωとしました.
参考:カレントトランス (秋月 SR-3702-150N/14Z) の特性測定 - ラジオペンチ



これを電流制限抵抗10kΩを経由してRaXino(RX62N)のアナログ入力AN0に入力します.
元は交流波形なのでADコンバータには0V中心に正負の電圧がかかりますが,
マイコンのアナログ入力には保護ダイオードがADコンバータ前に入っているため,
これで負電圧はカットし半波のみ検出することにします.

この回路を以下の写真のようにユニバーサル基板上に実装しました.
DSC_0653_.jpg


以下が負荷抵抗両端の波形です(200kHzのデジタルフィルタつき).
大体1.025Vp-pになっており,
きれいに電流を検出できていそうなことがわかります.
dry2.png

下がADコンバータの入力波形です.
元の波形と比較して負側の電圧が保護ダイオードのVfの-0.5V程度でカットされていることがわかります.
dry3.png

これをADコンバータで1ms周期で100サンプル取得した結果が以下のデータです.
AD生値
ADコンバータの電源は3.3V(この場合デバッガの電源を使ったので3.1Vくらい)で,分解能は12bitですから,
1.025/2/3.1*4096=677くらいのピークが読み取れており,大体一致しています.

このデータ列を全波整流したものとして積算しRMSを求めれば電流の実効値が求まります.
具体的には,
①データ列の2乗和平均の平方根を求める
②2乗の面積を2倍するためsqrt(2)をかける
③AD値→電圧→電流の変換係数(99/4096)をかける
と,10.5Aとなり,概ね正しい電流の実効値が得られます.
これにAC100Vをかければ瞬時電力になります.

以上の内容をマイコンに算出させて,RS232Cで送出させるプログラムを作成してやれば,電力計測部分は完成です.



次は可視化部分を書いていきます。
スポンサーサイト
  1. 2017/08/18(金) 00:44:47|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

Octaveを使ったPID制御のシミュレーション

Matlab互換ソフトのOctaveを使ってPID制御のシミュレーションをしてみました。
とはいえ、simulinkもなければ関数もいくつか未実装なので、
伝達関数をちゃんと計算して入力してあげないといけません。

①Octaveのインストール
 https://www.gnu.org/software/octave/
 からダウンロード,インストールします.
 今回はoctave-4.2.1-w64.zipを使用します.適当なフォルダに置いてbinフォルダのoctave.exeを実行すると起動します.

②制御用ライブラリのインストール
 Octaveのコマンドプロンプトから以下を実行します.
 pkg install -forge control
 少し時間がかかりますが,これでインストール終了です.
 ライブラリの使用の際には毎回以下を実行します.
 pkg load control

③伝達関数モデルの記述
 連続時間の伝達関数
 𝑃(𝑠)=1/(1+𝑇𝑠)
 を記述するには,以下のように書きます.

 %書き方①
 T = 13*60;
 s = tf(‘s’)
 plant = 1/(1+T*s)
 %書き方②
 plant = tf( [1], [T 1] )

 離散時間の伝達関数
 𝑃(𝑧)=1/(𝑧−𝑎)
 の場合はサンプリング時間Tsを定義して記述します.

 Ts = 1 %サンプリング時間[s]
 z = tf(‘z’, Ts)
 plant = (1) / (z-a)

④PID制御器の伝達関数モデルの記述
 連続系のPID制御器の伝達関数は以下になります.
 𝑃𝐼𝐷(𝑠)=𝐾_𝑝 (1+1/(𝑇_𝑖*𝑠)+𝑇_𝑑*𝑠)

 ただし,連続系の微分要素は高周波のゲインが高くなりノイズが増幅されてしまうため,
 1次遅れフィルタを追加した以下の伝達関数が最も用いられます.
 𝑃𝐼𝐷(𝑠)=𝐾_𝑝 (1+1/(𝑇_𝑖*𝑠)+(𝑇_𝑑*𝑠)/( 1+0.1𝑇_𝑑*𝑠))
 参考:宮崎技術研究所,自動制御の基礎と実際

 これを③同様に記述すると以下になります.
 Kp = 5;
 Ti = 750;
 Td = 0.1;
 P = 1;
 I = 1/(Ti*s);
 D = ( Td*s ) / ( 1+0.1*Td*s );
 PID = Kp * (P + I + D);

⑤閉ループ系の作成
 ③の制御対象となる伝達関数に④のPID制御器を接続し,フィードバックした伝達関数を作成します.

 openloop = ( PID * plant );
 closedloop = openloop/(1+openloop);
 controlinput = PID/(1+openloop);

⑥ステップ応答とボード線図の確認
 制御対象のステップ応答と制御後のステップ応答をstep()関数で確認します.
 それぞれ別の図に表示するよう,グラフウインドウをあらかじめ作っておきます.
 PID制御により立ち上がりを高速化できていることがわかります.多少オーバーシュートが出ているので,パラメータはもう少し調整してもいいでしょう.
 figure(1);
 step(plant);
 figure(2);
 step(closedloop)
step_plant.pngstep_pidloop.png

 ボード線図はbode()関数で確認します.離散系のボード線図関数dbode()は未実装なので,離散系ではボード線図は容易ではありません...
 figure(3);
 bode(openloop)
bode.png

こんな形でPID制御のシミュレーションが簡単にできました.今回のシミュレーションに使ったコードを末尾に記載しておきます.
幾つか関数が未実装であるなど欠点に目をつぶればOctaveでもMatlabに近い感覚でシミュレーションができます.

一方でやはりMatlabのsimulinkの強力さが際立ちます.
個人用途ならMatlabは¥16,500,Simulinkは\4,990なので,このくらいの出費が許容できるかと言ったところでしょうか.

  1. 2017/08/16(水) 08:35:15|
  2. 制御工学
  3. | トラックバック:0
  4. | コメント:0

Raspberry Piの初期設定

Raspberry Piの初期設定方法を記載します。
既に色々な方が記事にしているので今さらですが、自分の環境ではそのままだと使えなかったものが多数あったので自分用にまとめておきます。
ちなみに、使用しているRaspberry PiはModel A+ V1.1です。

①Raspberry PiのOSイメージの用意
4GB以上のMicroSDカードを用意。
https://www.raspberrypi.org/downloads/raspbian/
からイメージを落として、
Win32DiskImagerで焼く。


②起動
MicroSDカードをRaspberry Piに入れて、キーボード、HDMIケーブルを指して起動。
普通に起動すればOK。OSによってGUIかCUIかが異なる。
初期ユーザIDとパスワードは
ID: pi,
pass: raspberry
パスワードの変更は
passwdコマンドで行う。


③日本語設定
ターミナルから、sudo raspi-configで初期設定画面に入る。
4. localisation optionsのChange Localeで、jp EUC-JPと、jp UTF-8をスペースで選択してOK。デフォルトはen.GB-UKにしておく。
Change TimezoneでAsia Tokyoを選択。
Change Keyboard Leyoutで105のJapaneseのデフォルトを選択して再起動しておく。

(ネットに繋いだ後)
sudo apt-get install ttf-koch-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfont-kaname
sudo apt-get install uim uim-anthy
sudo apt-get install jfbterm
を行い、フォントを導入してから、再起動。

④SSHの有効化
5. Interfacing OptionsのSSHをEnableにする。
(7. Advanced Optionsにはいっていることもあり。OSのバージョンに寄る)

⑤WiFi接続
PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 150Mbps MacOS X10.10対応 GW-USNANO2A
をUSBコネクタに指す。

GUIでSSIDがステルスでなければ右上のアイコンからWiFi接続出来る。
ステルスの場合、
sudo sh -c "wpa_passphrase [SSID] [PASS] >> /etc/wpa_supplicant/wpa_supplicant.conf"
でconfファイルを作った後、
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
でwpakeyの下に
scan_ssid=1を追加して保存して終了(Ctrl+xでYes(y), Enter)
ifconfig wlan0で接続されたか確認。接続されなければ再起動する。

コンソールの場合、
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
の最終行に
network={
ssid="[SSID]"
psk="[PASS]"
}
を追加して保存

6 IPアドレスの固定
sudo nano /etc/dhcpcd.confで
interface wlan0
static ip_address=192.168.0.X/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
を末尾に追加して再起動
注意:IPアドレスを確認する場合はifconfigを使う

7 セキュリティ設定
raspberry piのアップデート
$ sudo rpi-update
$ sudo reboot
rootへのパスワード設定
$ sudo passwd root
ユーザー名の変更
$ sudo usermod -l AAAA pi
sshのポート番号変更して再起動
$ sudo vi /etc/ssh/sshd_config
$ sudo /etc/init.d/ssh restart

⑧リモートデスクトップ接続出来るようにする
sudo apt update sudo apt upgrade→時間がかかる
sudo apt install tightvncserver
sudo apt install xrdp sudo reboot する。
tightvncを入れないとだめっぽい

⑨コマンドラインからのLチカ
$ sudo su
$ echo 25 > /sys/class/gpio/export
$ echo out > /sys/class/gpio/gpio25/direction
$ echo 1 > /sys/class/gpio/gpio25/value
$ echo 0 > /sys/class/gpio/gpio25/value
$ echo 25 > /sys/class/gpio/unexport
25をexportしてoutに設定し、Hにする、Lにする、その後unexportして開放する。
→開放しないと使えなくなるので注意。
ピン配置はこの辺を参照
http://nejiketa.seesaa.net/article/414258096.html



⑫PythonでLチカ
//Todo


16 python のインストール
sudo apt-get install python-pip
sudo apt-get install python3

17 pythonを使ったシリアル通信
sudo pip install pyserial
sudo nano test.py で以下を記述

# -*- coding: UTF-8 -*-
import serial
from datetime import datetime
ser = serial.Serial(port='/dev/ttyACM0', baudrate=38400, timeout=0.5)
file = 'test.csv'
line = ser.read(1000)
#infinity loop
while True:
    if( ser.inWaiting() > 0 ):
        data = ser.read()
        f = open(file, 'a')
        f.write(data)
        print data
        if( '\n' in data ):
            now = datetime.now().strftime('%Y/%m/%d %H:%M:%S, ')
            f.write(now)
            print now

100 windowsでSDカードのフォーマット
cmd diskpartを開く
list disk list volume SDカードのディスク番号を確認する
select disk 1
clean
create partition primary
format quick で再使用可能になる。
  1. 2017/07/23(日) 14:24:52|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

RaXino+RaspberryPiで家の電力見える化

タイトルの通り、家の電力使用状況を見えるようにするため、電力計を作ってみました。

全体の構想としてはこのスライドのものがほとんどそのままです。
RaXino+Raspi 

カレントトランスで分電盤の電流値を検出し、マイコンのA/Dコンバータで読み込んでRaspberryPiでWeb上に可視化します。この方法だと電圧は計測しないので、位相差がわからず計測した電力は有効電力ではなく皮相電力になりますが、まあ大きな差は出ないと思います。
今回は分電盤のうち各部屋に分配された電力も読み取ることにし、6ch用意します。6chもあるのでチャンネルごとの回路を簡素化するために、アナログの回路側はこのページを参考にして作成し、下側半波は読み取らない形をとりました。 この辺は以下の記事に詳しく書きました。 RaXino+RaspberryPi電力計の電力計測部分の製作 また、マイコンも相応のチャネル数と処理能力を持つもの、ということで、購入後に少しだけさわって放置していたRaXinoを使います。

RaXinoはRX62Nを積んだマイコンボードで、RXduinoというArduinoライクのライブラリを合わせて使えるものです。RaXinoであればEthernetに繋げるのでこれだけでも良かったのですが、
・わざわざ無線LANコンバータ買ってくるのが面倒だった
・RTCで時刻を刻ませないといけない
・Ethernetにつなげるとは言え高機能なことが出来るわけでもなくPCからのアクセスが面倒
なのでRaXinoで計測したデータを一度RaspberryPiに送って保存し無線で飛ばします。


RaXinoをさわるのが久しぶり過ぎて、まずは環境構築から行いました。
RXduinoライブラリは、現在はFreeRXduinoという名前で無料で提供されています。
使用方法として、GCCでコンパイルする方法と、ルネサスの統合開発環境であるHEWやCS+(旧CubeSuite+)で使えるサンプルプロジェクトが用意されています。最初はGCCでコンパイルをしようとしていたのですが、RaXino基板にmakefileを合わせるとinvectの問題でエラーが出てしまったので、結局CS+をインストールして使いました。

やりたいことは1kHz以上で6chのA/Dコンバータを1サンプルずつして電流の瞬時の大きさを記録し、1秒ごとくらいで実行値(RMS)を計算してRaspberryPiに渡すことです。
モジュールとしては1kHzタイマ、A/Dコンバータ、シリアル通信を使います。タイマ割り込み関数でA/D変換して、データがたまったら1秒ごとにメインループ実行値計算させます。
とりあえず以下のコードがあれば最低限OKです。

コード例

シリアル通信はRX.TXの結線をしないといけないかと思っていたのですが、USB端子のシリアルをRaspberryPiに指すとそのまま認識したので、これで行きます。認識後にポート名をdmesgコマンドで取得します。

Raspberry Piでは、Pythonを使ってシリアル通信でデータ取得し、時刻とともにCSVで保存しておきます。
Pythonでシリアル通信するにはpySerialというライブラリがあれば簡単に使える様なので、早速インストールします。と思ったらpipすらインストールしてなかったので、ついでにpipも入手しておきます。
$ sudo apt-get install python-pip
$ pip install pyserial

シリアルのポート名は/dev/ttyACM0だったので、それを使ってシリアル通信するスクリプトを記述します。

コード例

これで時刻付きCSVが保存できるようになったので、SCPでとってくればいつでも見られるようになりました。

あとは、別個でWebから見えるインターフェースを用意して、当日の電力推移とデータをとってこれるようにしたいなと思っています。とはいえWebの知識があまりないので、まずはpythonでmatplotlibをつかってグラフ描画する感じになりますかね。
また、せっかく電力を計っているので、どの機器がどのくらい電力を消費するか分析し、節電の方策を立てようと思っています。

参考ページ:
FreeRXduino
自作電子小物/簡易電力計/7チャネル版
自作電子小物/簡易電力計/7チャネルGUI版
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Raspberry Pi 3でエアコン一体型パソコン「airpi」を作る!
python/pandas/matplotlibを使ってcsvファイルを読み込んで素敵なグラフを描く方法(Mac/Raspberry Pi)

  1. 2017/07/23(日) 01:01:00|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0

ScanSnap ix500Aを使った書籍読み取り設定

今更ですが、ドキュメントスキャナと裁断機を購入して自炊をはじめました。

使用しているのはこちらの機器です。
ScanSnap iX500 FI-IX500A
ディスクカッター・スリム DC-F5100

自炊をされている方の記事を見ながら試してみていまして、
なかなかうまく読み取れて良さ気です。
ただ、読み取り設定に不満が出てきてカスタムした点が有りますので、
ココにメモしておきます。

【通常】
普通は、以下の読み取りモード設定にしておくと思います。
 画質:ファイン
 カラーモード:自動判別
 読み取り面:両面読み取り
 向き:自動判別
 白紙ページを自動的に削除:□
 継続読み取りを有効:☑
 オプション:全て□

【文庫本等】
 画質:ファイン
 カラーモード:白黒
 読み取り面:両面読み取り
 向き:自動判別
 白紙ページを自動的に削除:☑
 継続読み取りを有効:☑
 オプション:文字列の傾き自動補正のみ☑

古くて色あせた文庫本を上の通常設定で読み込むと、
カラー・グレー・白黒がページごとにまちまちで読み取られることが有ります。

ページによって色あせ具合は違うので仕方ない部分もありますが、
読み込んだ結果はページごとに全然違う色に見えてしまいます。

個人的に小説を読んでいると紙色の違いはすごく気になりますし、
文庫本であまりカラーとかにしても仕方ないので、
カラーモードを白黒に変えて読み取っています。

また、読み込み時に微妙に傾くことがあるので、
傾き自動補正もチェックを入れています。

ちなみに、文庫本の場合カバーは捨ててしまっています。
カバー絵が欲しければAmazonから画像引っ張ってくれば良いですし。

【教科書類】

 画質:スーパーファイン
 カラーモード:グレー
 読み取り面:両面読み取り
 向き:自動判別
 白紙ページを自動的に削除:□
 継続読み取りを有効:☑
 オプション:文字列の傾き自動補正のみ☑
 検索可能なPDF:☑

教科書類も文庫本とほぼ同様ですが、教科書には図や細かい文字が出ることがあるため、
カラーモードは白黒ではなくグレー、画質はスーパーファインにしています。

また、ページ番号は揃えておきたいので白紙ページは残し、
テキスト認識で検索可能なPDFにしておきます。

【漫画】
 画質:スーパーファイン(orエクセレント)
 カラーモード:グレー(orカラー)
 読み取り面:両面読み取り
 向き:自動判別
 白紙ページを自動的に削除:□
 継続読み取りを有効:☑
 オプション:全て□
 検索可能なPDF:□

結構きれいに読み取りたい漫画の場合、画質を上げ、
カラーorグレーで読み取ります。

また、傾き補正を入れてしまうとコマ割りによっては不必要なところまで
傾けてしまうことがあるので、漫画の場合入れません。



こうしておくと大体満足する読み取り結果が得られることがわかりました。
ここまで細かく分けるか、いっそ全て自動で読み取って労力を削減するかは
用途に依存すると思いますが、冊数が多い場合このくらいは分けておいても
良いような気がします。


  1. 2017/05/02(火) 03:10:00|
  2. 自炊
  3. | トラックバック:0
  4. | コメント:0
次のページ