記事の詳細
後閑哲也先生監修!μアンペアオシロ Web詳細解説
※記事内に試作品の画像を使っているものがあります。
・Windows用アプリケーション [microv1.0.zip]
・Windows用簡易説明書 [manual.pdf]
第一章 μアンペアオシロの全体概要
Raspberry Pi(以下ラズパイと略す)とPICマイコンを組み合わせ、ラズパイのネットワーク機能を活用してブラウザベースの測定器で実験ベンチに必要と考えられる測定器を揃えます。
今回製作する測定器は微小電流オシロです。この微小電流オシロの目的は、変化の大きなμAレベルの微小電流を正確に測定することです。
完成した微小電流オシロの全体構成が写真Aとなります。左側のラズパイと右側のPICマイコンで構成したデータ収集ボードで構成されています。ラズパイにはRaspberry Pi3 Model Bを使っています。
写真ではこの両者をUSBシリアル変換ケーブルで接続していますが、この接続はラズパイのGPIOピンとヘッダピンケーブルによる接続でも可能になります。
1-1 全体構成
微小電流オシロの全体構成は図Aのようにしました。データ収集ボードに実装した24ビット分解能の高性能デルタシグマA/Dコンバータで微小電流を連続的に測定し、PICマイコンのメモリにデータを保存します。このデータ収集ボードに接続されたラズパイが収集したデータを一括で受け取り、グラフ化しさらにブラウザで表示するためのサーバ機能を実行します。
これで同じネットワークに接続した任意のパソコンやタブレット、スマホでブラウザを使って計測結果を観測することができます。
1-2 微小電流オシロスコープの仕様と構成
製作する微小電流オシロの仕様は、μAレベルからmAレベルで変化する電流をできるだけ正確に計測できるものにするため表Aのようにすることにしました。
A/Dコンバータのサンプリング周期はもっと高速にできますが、ノイズとのトレードオフになります。本稿ではμAレベルも十分計測できるように最大サンプリング速度を8kspsに抑えました。
ラズパイとデータ収集ボードとの間の通信データのフォーマットは表Bのようにしました。
ブラウザでの表示形式は図Bのようにするものとします。表示は約4秒周期で更新し、新たな波形に更新されるようにします。URLのアドレスはIPアドレスとポート番号で指定します。
左側に設定用のボタン、右側がグラフ領域とします。Startボタンが計測開始ボタンでこのボタンクリックでグラフの更新が開始されます。
Shudownボタンでラズパイのシャットダウンを行って終了させます。
水平時間軸選択の各ボタンでX軸の時間範囲を変更します。この変更は次の計測更新時に有効となります。
電流レベル選択の各ボタンでY軸方向の電流表示範囲を変更します。この変更も次の計測更新時に有効となります。
第2章 ハードウェア設計
最初は微小電流を高速で取り込むデータ収集ボードの製作です。高分解能で微小なアナログ信号を取り込む必要がありますから、高分解能なデルタシグマA/Dコンバータと高容量メモリを内蔵するPICマイコンを組み合わせて実現することにしました。完成したデータ収集ボードの概観が写真Aとなります。A/Dコンバータは基板のはんだ面側に実装されています。
2-1 全体構成
データ収集ボードの全体構成は図Aのようにしました。全体制御はPICマイコンの16ビットファミリである「PIC24FJ256GA702」という28ピンのPICマイコンを使いました。
1μAという電流計測は、シャント抵抗を10Ωにしても10μVの電圧ですから、これをPICマイコンのA/Dコンバータで計測することは不可能です。そこで、この微小電流の計測にはマイクロチップ社のアナログデバイスの新製品である「MCP3911」を使いました。
電源は、すべて3.3V動作としラズパイからDC5Vを供給して3端子レギュレータで3.3Vとしています。
2-2 高分解能A/DコンバータMCP3911の使い方
今回使用したMCP3911は16または24ビットの分解能を持ちながら、最高125kspsという高速で動作します。この速度があればダイナミックに変化する微小電流をリアルタイムで計測することができます。
MCP3911の内部構成とピン配置は図B、仕様は表Aのようになっています。
図Bに示したように、電力測定のため電流と電圧を同期して変換できるように独立に2チャネル内蔵しており、同期タイミングも位相制御でずらすことができるようになっています。両方のチャネルに最大32倍まで増幅可能な可変ゲインアンプも内蔵しています。
クロック発振回路を内蔵していますので、外付けにクリスタル発振子を接続すればクロック信号を生成できます。BOOST機能で最高クロック周波数が変わり、BOOST機能を最大にすると最高16MHzのクロックで動作させることができます。
電源とグランドはアナログ用とデジタル用で分離されていますが、同じ動作電圧範囲となっています。内蔵リファレンスとして1.2Vで7ppm/℃の高精度定電圧源も内蔵していますので、アナログ関連の外付け部品は必要としません。
オーバーサンプリング比(OSR)とサンプリング周期、有効ビット分解能(ENOB)は表Bのようになります。ただし本稿ではマスタクロックを16.384MHzとして、サンプリング周期がちょうど1kspsの倍数となるようにしています。ICの規格では最大16MHzとなっていますので、2.5%のオーバークロック周波数となりますが、問題なく動作していますのでこれでよしとしています。
この表からサンプリング周期とビット分解能つまりノイズレベルはトレードオフの関係になっていますから、分解能つまりノイズレベルを確保するためにはサンプリング周期を抑える必要があります。本稿ではノイズレベルをできる限り低くするためにOSRを512以上で使うことにして、サンプリング周期を最高8kspsとしました。したがって250μsec以下のパルス信号を検知することはできません。さらに短時間のパルス検知が必要な場合はOSR値を小さくする必要があります。
表Bから、最高の有効分解能(ENOB)が得られるのはオーバーサンプリング比が4096の場合で、16ビット分解能となり、このときのサンプリング周期は1kspsです。
したがって、PGAを1倍とすれば、最大入力が±600mVですから、600mV÷216=600mV÷65536≒9.1μV という計測分解能になります。
A/Dコンバータとしては符号付24ビット分解能ですから、値としては600mV÷223=600mV÷8388607≒0.072μVまで読み取ることが可能です。シャント抵抗を10Ωとすれば、PGAのゲインが1倍でも1μA以下の計測分解能が得られ、読み取り値としては0.01μAまで可能になるはずです。
MCP3911の外部インターフェースはSPI接続となっており、最高20MHzのシリアル通信でPICマイコンと通信できます。MCP3911の制御は、このSPIインターフェースで内部レジスタを設定することで行うようになっています。SPIのモードは0,0か1,1となっています。たとえばモードが0,0のときのSPIの送受信フォーマットは図Cのようになっています。
PICマイコン側がマスタとなり、最初の送信バイトをコマンドとして、デバイスアドレス(デフォルトは00)とレジスタのアドレス、Read/Writeの区別ビットをまとめて送信します。
Writeの場合には、コマンドに続いてレジスタに書き込むデータを送信します。1バイト送信するごとにMCP3911の内部でレジスタアドレスが自動的に+1されますので、データだけを連続して出力すれば、レジスタに順番に書き込むことができます。
Readの場合には、レディーピン(DR)がLowになるのを待ってから入力を開始します。この場合にも連続して読み込みが可能で、アドレスは自動カウントアップします。
MCP3911のレジスタには、表Cのようにアドレス0x00から0x1Aまでの種類があります。グループ(GROUP)とタイプ(TYPE)と全部一括(ALL)に区分けされていて、連続書き込み、連続読み出しが可能な範囲を示しています。つまり、自動的に行われるアドレスカウントアップは、グループとタイプと全部一括の中で行われ、表Cで指定された範囲内でループしてカウントアップが行われます。(デフォルトはグループとなっています)
動作設定をするためのレジスタの内容詳細は図Dとなっています。ここでは本稿で使用するもののみとなっています。
MCP3911を使う場合には、最初にRESETコマンドを実行します。CONFIGレジスタのRESETビットを1にして1バイトだけ送信すれば内部をリセット状態とします。
この後リセット動作完了を待つための遅延を入れてから初期設定を開始します。初期設定は、STATUSCOMレジスタのWRITEビットでALLを指定して、PHASEレジスタからOFFCAL_CH1レジスタまで連続して一気に設定してしまいます。MODレジスタとGAINCAL_CH1レジスタは使いませんので設定不要です。1バイト書き込むと自動的にレジスタアドレスが+1されますので、順番にデータを出力すればよいことになります。
今回の使い方では、GAINレジスタの初期設定は、BOOSTは最大、PGAは両方1倍としています。
STATUSCOMレジスタの初期設定では、MOD出力なし、DRは論理レベルで両チャネルとし、RAEDはグループ、WIDTHは24ビット、EN-OFFCALは有効としてEN_GAINCALは無効としています。
GAINの較正を有効にすると変換時間が余分に必要となってサンプリング周期が異なってしまいますので、ここではGAIN較正は無効とします。
CONFIGレジスタの初期設定では、PRESCALEは1/1、OSRは4096、DITHERは最大、ゼロ調頻度は高速とし、RESET、SHUTDOWNはなし、内蔵リファレンス、発振子で発振を選択します。
OSR値は後から水平同期切り替設定で変更されることになります。
変換結果の読み出しは、変換が終了するとDRピンがLowになりますので、それを状態変化割り込みとして入力し、割り込み処理の中で両方のチャネルを連続して一気に読み出します。データは24ビットの分解能の場合でそれぞれ3バイトとなります。この場合にも最初に0x00のレジスタアドレスを指定すれば、1バイト読み出すごとにアドレスが+1されますから連続して読み出すことが可能です。
この設定で、A/Dコンバータは指定されたOSRによる一定周期で変換を実行し、変換終了でDR信号を出力します。A/Dコンバータ側で自動的に一定間隔により変換を実行しますから、DRピンを割り込みとして変換結果データを取り出せば、OS値で決まる一定周期の変換データが得られることになります。
このときのデータのフォーマットは24ビットモードでOSRが512以上で使うことにしましたから、表Dのような形式でデータを入力することになります。
2-3 回路設計と製作
図Aの全体構成図から作成した回路図が図Eとなります。
全体の電源は3.3Vで統一し、ラズパイからの5Vから3端子レギュレータで生成して供給します。MCP3911の電源も3.3Vでよいのですが、そのままではノイズの影響が出ますので、フィルタを通して供給しています。またノイズ対策のため、アナログ系のグランドとデジタル系のグランドパターンを完全に分離し、L2を経由して1ヶ所で接続するようにしています。
ラズパイとの接続はUSBシリアル変換ケーブルによるものと、GPIOとの2通りできるようにしました。両方とも電源の5Vを供給するようにしています。
MCP3911とPICマイコンとはSPI接続としますが、RSTピンとCSピンの制御が必要ですので接続ピンを追加しています。さらにDRピンを状態変化割り込みとして変換終了を通知することにしました。
液晶表示器はI2C接続ですので、そのままPICのI2Cモジュールを使います。
A/Dコンバータの入力にはローパスフィルタを挿入していますが、入力側のコンデンサ(C18からC21)は実装を省略しています。
この回路図からパターン図を作成しプリント基板を製作しました。微小な電流を扱いますので基板のリークを考え絶縁度の高いガラスエポキシ基板としました。
プリント基板が完成し、部品が集まったら図Fの組み立て図にしたがって組み立てます。基板への実装順序は、最初にはんだ面側の表面実装部品をはんだ付けします。MCP3911が小型の表面実装パッケージとなっているので実装はちょっと手強いですが、フラックスを活用してブリッジしないようにしてはんだ付けします。
次にジャンパ線と抵抗を実装します。スイッチSW2、SW3のジャンパは本体でできますので不要です。あとはソケット類など背の低いものから順に実装します。
液晶表示器はピンヘッダソケットを使って取り外しができるようにしました。入力端子は簡単なチェックピンとしています。
こうして組み立てが完了した基板の部品面が写真B、はんだ面が写真Cとなります。
液晶表示器はソケットに後から実装します。
第3章 ファームウェアの製作
微小電流オシロのデータ収集ボードのハードウェアが完成したら、次はPICマイコンのファームウェアの製作です。
3-1 ファームウェアの構成
このファームウェアは単純な構成となっていて、全体の流れをフロー図で示すと図Aのようになります。
最初の初期化部では内蔵モジュールの初期化を行っています。デルタシグマADCと液晶表示器の初期設定は別関数としています。
初期設定が完了するとすぐA/Dコンバータが連続的に変換動作を開始し、変換完了ごとにDRの状態変化(IOC)割り込みが発生しますから、IOC割り込み処理でデータを取り込んでバッファに格納します。2500回の変換が終了した時点で変換終了フラグをセットし状態変化割り込みを禁止しています。
メインループでは常時A/D変換が2500回完了したかどうかをフラグでチェックし、完了していれば最初のデータを取り出してスケール変換したあと液晶表示器に表示します。
これに続いてUARTからのコマンド受信があるかどうかをチェックしています。受信は割り込みで実行されていて終了文字の「E」の受信で終了フラグをセットしています。
受信があればメインループで受信データ処理を実行し、計測要求コマンドであれば、水平同期時間となるサンプリング周期に基づいてA/Dコンバータの初期設定をやり直してから、状態変化割り込みを許可してデータの取り込みを開始します。
2500回の変換を待ってから、固定のトリガレベルでトリガの検出処理を実行します。検出は200サンプル目から500サンプルの間で実行し、検出ができたら、その検出位置の前200サンプルを送信データの開始位置とします。検出できなかったら、最初のサンプルを送信開始位置とします。
その後、収集したデータを2000個分一括で送信します。送信が完了したら再度コマンド受信待ち状態となります。
1個のデータが3バイトで構成されていますから全部で12000バイトのデータを送信することになります。
3-2 ファームウェアの詳細
ファームウェアの詳細を説明します。最初は宣言部でリストAとなります。最初のコンフィギュレーション部は省略しますが、ここでは内蔵発振器でPLLあり、WDTなしとしています。次がグローバル変数宣言ですが、計測データ保存用に7500バイトという大きなバッファが2個必要です。
次がメイン関数の初期化部でリストBとなります。
最初がI/Oピンの初期化で、すべてデジタルピンとしています。次にUARTの初期化でTXとRXのピンを決めた後115.2kbpsの速度にしています。
次がADCを接続するためのSPIの初期設定で、2Mbpsの速度にしました。この後、外付けADCの初期化の関数(SetupMCPADC())を呼んで初期化を行っています。
次にI2Cの初期化を行ってからADCのRDピンの状態変化割り込みを有効化しています。最後に液晶表示器の初期化をして開始メッセージを表示しています。液晶表示器の制御はライブラリ化して独立のファイルとしています。
初期化で呼び出しているADCの初期化関数の詳細がリストCとなります。
SPI接続ですのでSPIの送受信関数もサブ関数として作成しています。最初がADCのリセットでハードウェアピンによるリセット後、念のためソフトウェアによるリセットも実行しています。
その後レジスタをPHASEレジスタから順番に設定しています。
PHASEレジスタは使わないので0に設定、GAINレジスタは両チャネルとも1倍、BOOSTは両方とも最大に設定、STATUSCOMレジスタでは、MOD出力はなし、DRは論理レベルで両チャネルのレディー、さらにREADをTypeとし、WRITEは一括、24ビット幅でオフセット較正は有効でGAIN較正は無効としています。
続くCONFIGレジスタでは、プリスケーラは1/1、OSRもDITHERも最大、ゼロ調整も高速とし、さらに内蔵リファレンスで内蔵発振回路を使うという設定としています。
次のオフセットの較正用データは、完成後にチャネルごとのオフセット値を求め、それをキャンセルするような値を設定します。
次がメインループ部の詳細でリストDとなります。前半は液晶表示部で、常時A/Dコンバータの2500回の変換終了を待っていて、変換終了ごとに最初のデータをスケール変換して電流値として液晶表示します。そして変換終了時に禁止になっている状態変化(IOC)割り込みを再許可して次のA/D変換の処理を再開します。
後半はUARTの受信データ処理で、常時コマンド受信完了を待っていて、受信完了したらヘッダ部を確認して正常ならデータ処理を実行します。
ヘッダ部が「ST」の場合は、計測要求コマンドですから、計測処理を開始します。最初に水平同期種別のデータで周期設定関数(Hsync())を実行し、前回と異なる場合のみADCのOSRを変更してADCの初期設定をやり直します。
このあとは2500回のサンプリングが終了するまでwhileで待ちます。変換が終了したら、バッファに格納されたデータからトリガ検出を行います。200サンプル目から700サンプルの間で条件に合う変化があるかどうかを検出します。検出できた場合はFindを1にします。トリガ検出できなかった場合は最初から、できた場合は検出位置200サンプル目から2000サンプル分のデータをラズパイに送信します。これで1回の計測が完了します。
次はA/Dコンバータのデータレディ(DR)の状態変化(IOC)割り込み処理関数部でリストEとなります。計測要求コマンドで水平同期が設定変更された場合の最初の変換結果だけ不定になることがありますから、これをスキップして2回目以降をデータとして読み出してバッファに格納しています。データは2チャネル連続で読み出しますが、チャネル別に3バイトごと別のバッファに格納します。
後半は水平同期切り替えのサブ関数部で、全部で6種類の切り替えになりますが、0から2の3通りの場合は、同じOSR値としますので同じ設定となります。設定はOSR値をパラメータとしてA/Dコンバータの初期化サブ関数を実行しているだけです。
最後が液晶表示器の表示制御のサブ関数部でリストFとなります。液晶表示器の制御そのものはライブラリとして別ファイルとしていますが、詳細は省略します。
表示制御の最初では各チャネルの計測データの最初の3バイトを符号付き整数の値に変換します。その後正負を判定して符号を表示バッファにセットしてから正の値にし、さらにスケール変換して実際の電流値の小数値に変換します。これを文字数字に変換して表示バッファに格納します。このときチャネル0は1倍ですが、チャネル1は10Ωのシャント抵抗なので1/10倍の値になります。
この後は表示行を指定してチャネルごとの表示バッファの内容を表示出力します。
液晶表示器への表示例が写真Aとなります。
この他にUARTの送受信関数や遅延関数がありますが詳細は省略します。以上でファームウェアの全体となります。これをPICマイコンに書き込めば動作を開始し、常時液晶表示器に電流値を2チャネル同時に表示しながらラズパイからのコマンド待ちとなります。
第4章 ラズパイのアプリケーションの製作
次はラズパイで動作させるアプリケーションプログラムの製作です。こちらは、ラズパイに標準実装されているRasbianを有効活用して製作します。
4-1 プログラムの全体構成
微小電流オシロの計測結果をブラウザで観測するために製作したプログラムの全体構成は、図Aのようになっています。基本はWebIOPiというアプリケーションとPythonスクリプトを活用し、matplotlibというPythonのライブラリでグラフを作成しています。データ収集ボードとの通信部分もPythonで記述したプログラムとなっています。
まず、データ収集ボードのPICマイコンとはシリアルインターフェースで接続しますが、ここは2通りの方法があって、ラズパイのUSBにUSBシリアル変換ケーブルで接続するか、GPIOのシリアルピンに直接接続するかです。本稿ではUSB経由としています。
WebIOPiというアプリケーションを使って、ラズパイがネットワークから呼び出されたとき、Current.htmlというHTMLファイルで微小電流オシロとしてのグラフと各種ボタンを含む表示ページを提供します。
ブラウザで表示されたページでStartボタンを押すと、Macro.pyというPythonのマクロ関数を通してGetData.pyというPythonスクリプトをデーモンとして起動します。このGetData.pyスクリプトは一定周期でシリアル通信によりデータ収集ボードに計測要求コマンドを送信し、データ収集ボードから計測データを取り込みます。さらにそのデータをグラフ化してファイルgraph1.pngとgraph2.pngとして保存しています。HTMLファイルではこの生成されたグラフgraph2.pngを読み出してブラウザで表示できるようにしています。これとは別にいくつかのボタンを用意し、WebIOPiのマクロ関数呼び出しにより水平同期や電流レベルの切り替えを実行しています。
4-2 HTMLファイルの詳細
ブラウザに表示するページを提供するHTMLファイル(Current.html)の詳細です。まず提供するページの詳細情報は図Bのようになっています。
表題とStartボタンの下はテーブル構成になっています。左端のテーブル枠内にボタンを並べ、右側の枠内にグラフを表示しています。グラフにだけ「G」というIDを付与しています。
各ボタンには呼び出すJavascriptの関数が図のように割り付けられていて、クリック時にそれぞれの関数を実行するようになっています。
このページを実現したHTMLファイルのHeader部がリストAになります。ここでボタンに割り付ける関数をJavascriptで記述しています。
最初にJavascriptとwebiopiのJavascriptであることを宣言しています。次にwebiopiとして使う関数の定義をしています。ボタンごとの関数となります。
StartAp()関数がStartボタンを押したときに実行される関数で、ここでGetGraphマクロ関数を呼び出して、データの取り込みとグラフの作成をデーモン扱いで実行させます。
次がDisplay関数で、GetGraph関数で作成されたグラフを3秒間隔でグラフ領域に表示しますが、同じファイル名の場合はブラウザの表示が更新されませんから、ファイル名に検索語を付加して擬似的に毎回異なるファイル名になるようにしています。
水平同期ボタンの場合は同期種別をパラメータとしてSetHsyncマクロ関数を呼んでいます。
電流レベルボタン選択も同様にSetVscaleマクロ関数を呼んでいます。
シャットダウンボタンの場合は、確認ダイアログを表示してYesの場合だけShutCmdマクロ関数を呼んでいます。
次に、HTMLファイルのBody部がリストBとなります。ここで実際に表示する内容を記述しています。
最初は見出しの表示でちょっと大き目の文字にしています。続いてStartボタンの表示と呼び出す関数(StartAp())の指定をしています。
この後はテーブル構造としていて、各設定ボタン表示と関数の指定をまとめて同じセルの中に入れています。次のセルに波形グラフgraph2.pngを表示しています。最後にShutdownのボタンの表示と呼び出す関数の指定です。
4-3 データ取り込みスクリプトGetData.pyの詳細
GetData.pyはデータ収集ボードからデータを取り込んでグラフを作成するPythonスクリプトになります。
Startボタンクリックでデーモンとして常駐して動作するようになります。
スクリプトの前半部がリストCとなります。ここでは最初に変数の定義と変数を格納するファイル名を定義しています。2つのPythonスクリプト間での変数の受け渡しをファイルですることにしました。
次が実際にグラフを作成する関数makeGraph()です。まず、データ収集ボードから入力されたデータを文字列のリストからINT型の数値のリストに変換します。一つのデータが3ケタの16進数のバイナリで表現されていますから、それを数値に変換します。ただし読み出したデータは文字型の扱いになっていますので、ord関数を使ってバイナリ値に変換してから数値化します。さらに負の値の場合は強制的に0にして正の値だけ扱うようにしました。
また、Y軸のグラフの分解能をCH0とCH1とも同じ最大2000000とし、電流表示の最大値は、CH0は500mA、CH1は20mAとしましたので、CH0の方は電流値を2/5倍してY軸のスケールが同じ扱いでできるようにしました。
その後グラフのインスタンスを生成してからまずY軸の体裁を整えています。
電流レンジ選択に応じてY軸の座標の最大値を2000000、200000、20000、2000の4段階とし、最大電流値は、CH0の方は500mA、50mA、5mA、500μAで表示し、CH1の方は20mA、2mA、200μA、20μAとして表示します。それぞれの電流レベルごとにY軸の左右の表示目盛の値を設定しています。最後に日本語の表題を追加しています。
次がGetDataスクリプトの後半部でリストDとなります。ここでは横軸を表示させていますが、水平同期ごとに横軸の拡大率と目盛が異なることになりますから、それぞれに別々の表示設定となっています。横軸の拡大率を設定してからX軸の補助線を表示し、目盛を表示しています。
最後に実際の波形グラフを表示していますが、CH0は赤線で、CH1は青線で表示しています。さらに生成したグラフ全体をファイルとして保存しています。
グラフ生成が完了したらmatplotlib関連のリソースをすべて解放します。これを解放しないとメモリを食いつぶしていくので、ある時点でラズパイが動けなくなってしまいます。
GetData.pyスクリプトの最後がメイン関数部になりリストEとなります。
最初にグローバル変数を定義し、シリアルインターフェースを有効化してから、現在設定値ファイルを最初に生成しています。その後繰り返しループに入ります。
シリアルインターフェースを有効化する場合、USB接続の場合はリストEのとおり「/dev/ttyUSB0」と記述しますが、GPIO接続とする場合にはここを「/dev/ttyAMA0」に変更します。
ループ内ではまず、現在設定値をファイルから読み出します。この設定値は次で説明するMacro.pyスクリプトで変更保存されています。
この後、データ収集ボードに計測要求コマンドを送信し、折り返し送信されてくる全データをdataというリスト変数に格納します。受信完了で受信データのヘッダの文字を確認して正常受信できていたらグラフ作成関数を呼び出してグラフgraph1.pngを作成します。さらにできたグラフの名前をgraph2.pngと変えてコピーします。HTMLファイルで表示するグラフはgraph2.pngの方です。これは、graph1.pngを直接表示に使うと、グラフ生成に時間がかかりますので作成途中のグラフが表示されてしまうためです。最後に2.5秒の間をいれて繰り返します。
4-4 マクロ関数スクリプトMacro.pyの詳細
最後がwebiopiのマクロ関数のスクリプトファイルMacro.pyでリストFとなります。
ここではブラウザでボタンが押されたときに実行するマクロ関数を記述しています。水平同期などの設定ボタンの場合は、設定値をファイルとして保存し、ファイルでGetData.pyに渡すようにしています。
Startボタンの場合がGetGraph()マクロ関数で、ここではまず既に起動済みのGetData.pyスクリプトを終了させてからデーモンとして再起動しています。終了させているのは複数の同じプロセスが起動しないようにするためです。
水平同期のボタンではすべてSetHsync()マクロ関数が呼び出され、パラメータとして水平同期の種類をファイルとして保存します。このファイルにより種別をGetData.pyに渡します。電流レベル設定も同様にSetVscale()マクロ関数が呼び出され種別をファイルとして保存します。
最後がシャットダウンボタンに対応するマクロ関数で、ここでは直接シャットダウンのシェルコマンドを実行しています。
以上がラズパイのアプリケーションプログラムの全体です。
4-5 アプリケーションの実装
微小電流オシロとしてラズパイに必要なプログラムができたところで、次はラズパイを微小電流オシロとして使うために必要なインストール作業と設定となります。必要な作業は次のようになります。
- Rasbianのインストール
NOOBS ver2.3.0を使いました。標準的なインストールで問題ありません。日本語環境にするのと、Wi-Fiを使ったリモートデスクトップ環境にしておく必要があります。 - シリアルインターフェースの有効化
シリアルインターフェースを有効化します。Raspberry Pi 3Bモデルの場合には、コンソールを無効化しさらにBluetoothを簡易シリアルにする必要があります。その手順は下記となります。
① 次のコマンドで「cmdline.txt」を読み出して内容を変更します。
sudo nano /boot/cmdline.txt
下記の行を修正します。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline rootwait
シリアルポートの “serial0″を含む記述部、ここでは「console=serial0,115200」の部分を削除します。
② Bluetoothの無効化のためコンフィギュレーションファイルに追記
Bluetoothの設定と、CPUクロック周波数の自動変更を禁止するように修正します。次のコマンドでファイルを読み出します。
sudo nano /boot/config.txt
このファイルの最後に下記2行を追加します。
core_freq=250
dtoverlay=pi3-miniuart-bt - webiopiのインストール
最新の「WebIOPi-0.7.1」をインストールします。このとき、Raspberry Pi2B以降用のパッチも忘れずにインストールします。インストール手順は次のようになります。
①下記で最新バージョンを入手
sudo wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
②圧縮ファイルを解凍
sudo tar xvzf WebIOPi-0.7.1.tar.gz
③パッチの入手と適用
cd WebIOPi-0.7.1 (ディレクトリの移動)
wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
patch -p1 -i webiopi-pi2bplus.patch
④セットアップ
sudo ./setup.sh
⑤再起動 - webiopiのconfigファイルの変更
微小電流オシロとしてwebiopiが自動的に動作するようにconfigファイルをリストGのように4か所追加修正します。
さらにwebiopiが自動起動するように下記1行のコマンドを実行します。
sudo update-rc.d webiopi defaults
5.作成したアプリケーションプログラムを下記ディレクトリにすべて格納する
/home/pi/Current/
以上の作業でラズパイの電源をオンにすれば、微小電流オシロとして自動起動して動作するようになります。
第5章 μアンペアオシロの使い方
ラズパイのアプリも完成したらいよいよ動作開始です。ラズパイとデータ収集ボードを接続して測定を開始する手順を説明します。
5-1 接続方法
まずラズパイとデータ収集ボードの接続方法です。これには2通りの方法があります。
①USBシリアル変換ケーブルを使ってラズパイのUSBで接続する場合
このとき使用する変換ケーブルはUART側がTTL接続となっているものを使います。
ラズパイ側のUSBにはコネクタが4つありますが、どれに接続しても問題ありません。
データ収集ボード側は写真Aのように黒のGNDピンがスイッチと反対側になるように接続します。
USBから電源も供給しますから、データ収集ボードの電源ジャックなどはありません。
②ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続する場合
こちらは写真Bのようにヘッダピン接続ケーブルを使います。写真ではたまたま市販の6ピンのものを使いましたので1ピン余分な状態となっています。
こちらの場合もやはりGPIOから電源を供給しますので、接続方向やラズパイの列を間違えないようにしてください。
5-2 ブラウザで開く
ラズパイとデータ収集ボードを接続し、ラズパイに電源を供給して、ラズパイの起動が完了すれば、同じネットワークに接続しているパソコンやスマホからブラウザのページが開けるようになります。
ブラウザで開く場合のURLは「ラズパイのIPアドレス:8030のようにラズパイのIPアドレスにポート番号を付加して指定すればよいだけです。
ブラウザで画面が表示されたら「Start」ボタンをクリックします。最初のデータが表示されるまで10秒ほどかかります。その後は4秒から6秒間隔で画面が更新されます。
表示されるブラウザ画面例は図Aのようになります。
この計測例は電池と可変抵抗を直列接続したときの電流をCH0とCH1同時に計測したもので、左側が約6μA、右側が約1.1mAのときの図になります。左側がこの微小電流オシロで計測可能な最小電流値を示していて、0.1μAまでの分解能となります。
実際の動作中の電源電流を計測した例が図Bとなります。この図はPICマイコンで製作した時計の電源電流をCH0、CH1両方同時に計測したものです。左側は100ms/Divで計測し、右側は10mse/Divで時間を拡大表示したものです。
常時はスリープで1秒ごとにウェイクアップして時刻の更新を行っていて、スリープ中は2μA程度で、1秒ごとに約20msec間だけ180μAの電流が流れていることが明確に分かります。これで平均電流が 2×0.98+180×0.02=1.96+3.6=5.56μAとなって200mAhのコイン電池であれば2年以上動作を継続できることが確認できます。