白旗製作所

Google Chart APIによるデータのグラフ描画

Raspberry Piを使用してロギングしたデータを手軽に直接可視化する方法として
Google Chart APIを使用するという方法があります.

基本的な使い方は以下のページに事例が載っています.
Using Google charts in Python CGI scripts

ここでは上記のページのスクリプトの解説と,複数グラフを書く場合の例を記載します.
前提としてPython(2系)CGIスクリプトの動くWebサーバ上の動作とします.
(Webサーバ環境構築方法は以下を参考ください.
Raspberrpy PiのWebサーバ(Apache)追加

2013.07.01;23
2013.07.02;67
2013.07.03;45
2013.07.04;17
2013.07.05;56
のようなセミコロン区切りのデータを描画する例です.


複数の系列がある場合にグラフを縦に並べるには,以下のようにします.
(Draw Multiple Chartsを参考にします.)


これで別のスクリプトで取得したCSVデータ等を全て並べてグラフ化することができます.
Google Chart APIはRaspberry Piに限らず使用できますし,Webサーバが立っている環境でササッと
可視化するにはなかなかよい方法だと思います.
スポンサーサイト
  1. 2017/09/24(日) 23:43:09|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

Linux(Raspberry Pi)でプログラムを走らせたままにしておく(screen, service)

Raspberry Piを使用していル際に,データ受信スクリプト等を走らせたまま
別作業を行なう方法として,screenコマンド,serviceの使い方を記載します.
他にも方法があると思いますが,以下の2つが確実性があり使いやすかったです.

①screenコマンド
 screenコマンドでは,単独のセッションを立ち上げて
 その中でスクリプトを走らせ別のセッションに移ることができます.
 ぱぱっとスクリプトを裏で動かしておきたいときに便利です.

 主に以下の5つのコマンドを知っておけばOKです.
 (a)新規セッションを作成する
 $ screen

 (b)セッションを離れる
 Ctrl+aを押した後dを押す

 (c)セッション一覧を確認
 $ screen -ls
 数字がセッションのID

 (d)セッションに再参加する
 $ screen -r XXXXX
 XXXXXは(c)で調べたセッションID

 (e)セッションを削除
 $ rm -rf /var/run/screen/S-UU/XXXXX.pts-*.raspberrypi
 UUはユーザー名,XXXXXはセッションID,*はよくわかりません.
 S-UU以下は(c)で調べれば名前がわかります.

②service
 スクリプトをOSのサービスとして登録しておけます.
 バックグラウンドで動かすことができるのはもちろん,
 電源投入次に自動で実行させることができます.

 (a).serviceファイルを作成
  サービス内容を記述するファイルを作成します.場所は/etc/systemd/systemに置いておきます.
  例として,シリアル通信でデータ受信するpythonスクリプトを登録します.
  $ sudo nano test.service
[Unit]
Description=SerialDataReciever
After=syslog.target
[Service]
Type=simple
WorkingDirectory=/home/pi/public_html/data
ExecStart=/usr/bin/python /home/pi/python/serialrcv.py
TimeoutStopSec=5
StandardOutput=null
[Install]
WantedBy = multi-user.target
 (b)サービスの開始
  $ sudo systemctl start test

 (c)サービスの停止
  $ sudo systemctl stop test

 (d)サービスの自動起動への登録
  $ sudo systemctl enable test

 (e)サービスの自動起動解除
  $ sudo systemctl disable test
  1. 2017/09/24(日) 21:50:05|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

Raspberrpy PiのWebサーバ(Apache)追加

Raspberry PiをWebサーバとして使用するため,Apacheをインストールする手順を記載します.
Apache公式のHow-To / チュートリアルも参考にしてください.
ここでは以下を行います.
・Apache2の導入
・Webサーバのポート番号の変更
・cgiの設定

①ダウンロードとインストール
 $ sudo apt-get install apache2

②動作確認
 /var/www/html/test.htmlに以下を記載


test

This page is test page.

  http://localhost/html/test.htmlにアクセスして動作確認

③ユーザーディレクトリの有効化
 デフォルトだと/var以下にhtmlファイルなどを置く必要があるので,
 ユーザーのディレクトリ(/home/pi/public_html)以下に置けるようにする.
 $ cd /home/pi
 $ sudo a2enmod userdir
 $ mkdir ~/public_html
 $ sudo cp /var/www/html/test.html ~/public_html
 $ sudo service apache2 restart
 で
 http://localhost/~pi/test.htmlにアクセスして動作確認
 
④ポートの変更
 $ sudo nano /etc/apache2/sites-available/default
 $ sudo nano /etc/apache2/ports.conf
 で双方ポートを任意の値に変更する.
 
⑤cgiの設定
 (a)cgiを有効にする
 $ sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load
 (b)cgiの設定を変更する
 $ sudo nano /etc/apache2/sites-enabled/000-default
 でInclude conf-available/serve-cgi-bin.confのコメントを外し,以下を変更する
(変更前)
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

(変更後)
ScriptAlias /cgi-bin/ /home/pi/public_html/cgi-bin

~~~
AddHandler mod_python .py
AddHandler cgi-script .cgi .py .pl

 /etc/apache2/mods-enabled/mime.conf 219行目
 で,AddHandlerのコメントを外し,.pyを追加
 #AddHandler cgi-script .cgi
 →AddHandler cgi-script .cgi .py
 (d)test.pyでテスト
 /home/pi/public_html/cgi-bin/test.pyに以下を記述
#!/usr/bin/python --
f=open('/home/pi/test.csv','a')
print "Content-type: text/html"
print
print ""
print ""
print "test"
print " "
print " This is a test page with python script."
print " "
 http://localhost/~pi/cgi-bin/test.pyにアクセス

 (e)アクセス権設定
 apacheのユーザ(www-data)は通常のユーザとは異なるため,直接ファイル操作等ができない.
 そのため操作するデータが格納されたディレクトリの所有者を以下のように変更しておく.
 $ sudo chown www-data:www-data /home/pi/public_html
 データの入ってるフォルダの所有権をwww-data(apacheの起動ユーザ)に移す
  1. 2017/09/24(日) 21:35:07|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

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
次のページ