記事の詳細
後閑哲也先生監修!レベル測定ボードWeb詳細解説



※記事内に試作品の画像を使っているものがあります。
キット版の組み立て方はこちらのPDFもご参照ください
・Windows用アプリケーション [levelv1.0.zip]
・Windows用簡易説明書 [manual.pdf]
第一章 アナライザの全体概要
Raspberry Pi(以下ラズパイと略す)とPICマイコンを組み合わせた測定器シリーズ製作例より、周波数特性を解析するアナライザです。
10Hzから20MHz程度の正弦波を2チャネル入力し、その振幅をデシベルで計測します。
同シリーズのWave Generatorを組み合わせていろいろな装置や回路の周波数特性をブラウザのグラフで確認することができます。
完成した外観は写真Aのようになります。
Raspberry Pi3BとPICマイコンで製作したレベル測定ボードの2つで構成されています。
両者の接続はUSBシリアル変換ケーブルでラズパイのUSBと接続するか、ヘッダピン接続ケーブルを使ってラズパイのGPIOと接続するか、いずれも可能です。

このアナライザの基本的な使い方は、写真BのようにWave Generatorの波形生成ボードと組み合わせて使います。

1-1 アナライザのシステム構成
製作するアナライザの全体構成は図Aのようにするものとします。
レベル計測そのものはPICマイコンで製作した「レベル測定ボード」のログアンプで行います。
このログアンプで正弦波の振幅を対数増幅してPICマイコンに入力し、PICマイコンでデシベル値に変換します。
デシベル値は常時液晶表示器に表示します。

基本的な使い方は前回製作した波形生成ボードと組み合わせ、波形生成ボードとレベル測定ボードとの間に周波数特性を計測する対象を接続します。
1台のRaspberry Pi3Bに2種類のボードを接続する必要がありますので、レベル測定ボードはGPIO接続で、波形生成ボードはUSBシリアル変換ケーブルで接続することにしています。
この接続状態で、パソコンやタブレットのブラウザに被測定装置の周波数特性をグラフ表示します。
まず、ブラウザに表示されたページでスイープする周波数の範囲を設定してからStartボタンクリックすれば、波形生成ボードから正弦波を出力し、被測定装置に入力します。
そして被測定装置を通過した信号をレベル測定ボードに入力し、そのレベルをデシベルに換算してからブラウザのグラフとして表示します。
1-2 アナライザの仕様
製作するアナライザの目標とする性能仕様は表Aのようにするものとします。
波形生成そのものは前回製作した波形生成ボードによります。スイープさせる周波数は1Hz単位で設定ができます。

ラズパイと波形生成ボード間の通信フォーマットは表Bのようにしました。

ブラウザでの表示形式は図Bのようにするものとします。計測する周波数範囲と周波数ステップを入力したあと、Startボタンのクリックで計測を開始し、約1秒間隔で計測し2秒間隔でグラフを更新します。

Stopボタンで途中停止します。また実行中にStartボタンをクリックすると設定開始周波数から計測をやり直します。
Shutdownボタンクリックでラズパイを強制シャットダウンさせます。
第2章 アナライザのハードウェア設計
アナライザの本体となるレベル測定ボードを製作します。このボードはPICマイコンとログアンプで構成しています。
レベル測定ボードの外観は写真Aのようになります。2個のログアンプは表面実装パッケージしかありませんのではんだ面側の実装となっています。入力は最高20MHzになりますから、両チャネルともBNCコネクタで接続するようにしました。

2-1 全体構成
レベル測定ボードの全体構成は図Aのようにしました。全体制御はPICマイコンの16ビットファミリである「PIC24FJ256GA702」を使いました。
レベル測定そのものにはアナログデバイス社のログアンプIC(AD8310)を使いましたが、この出力が直流レベルでしかも最大2.5V程度ですのでPICマイコンの12ビット分解能のA/Dコンバータで直接変換することができます。液晶表示器には小型のI2Cインターフェースのものを使いました。
電源供給はラズパイからの5Vとしています。ログアンプの電源は5Vとしましたが、ノイズの影響を避けるためノイズフィルタを挿入しています。PICマイコンと液晶表示器にはレギュレータ経由で3.3Vを供給しています。

2-2 ログアンプICの使い方
レベル測定にはアナログデバイスのAD8310というログアンプを使いました。このICの仕様規格は表A、ピン配置と各ピンの機能は図Bのようになっています。
このログアンプはDCから400MHzまで測定可能で、電源電圧も2.7Vから5.5Vの範囲で広く使いやすいものとなっています。


このログアンプの入出力特性は図C(a)の黒線ようになっています。入力信号のレベルを91dBから+9dBまで計測して、結果を0.4Vから2.6Vの直流電圧として出力します。デシベル値に直線的に比例した直流電圧で出力されますのでマイコンとしては非常に扱いやすくなります。
しかし、このままでは今回の使い方では感度が高過ぎますので、最高入力レベルを+10dB以上にするため、入力に直列抵抗を挿入して約1/10倍つまり20dBだけ感度を下げて使います。内部入力インピーダンスが1kΩですので、5.1kΩを入力ピンにそれぞれ直列接続して約1/10のレベルにしています。これで図C(a)の赤線で示したように-70dBから+20dBの範囲をおよそ0.5Vから2.6Vの直流電圧で測定できることになります。使ったICのバラつきや抵抗値のバラつきによる誤差はプログラムにより補正することにします。

できるだけ低い周波数まで安定に測定できるように、このログアンプの出力を250msec以上の間1msec周期で計測を繰り返してその平均値を計測値とすることにします。
このログアンプICの電源は5Vとしますが、特にノイズ対策として電源に簡単なLCフィルタを挿入します。
ログアンプの出力はDCで0.5Vから2.5Vの範囲ですから、PICマイコンの12ビットA/Dコンバータで直接デジタル変換します。
2-3 回路設計と基板製作
全体構成に基づいて作成した回路図が図Dとなります。右下にあるMountの記号は取り付け用の穴で、各位置のグランドパターンに接続しています。
電源はラズパイの5Vか、USBシリアル変換ケーブルからの5Vのいずれかを使用します。5Vを直接ログアンプの電源としますので、LCフィルタを通してノイズ対策をしています。PICマイコンと液晶表示器は3.3Vですから3端子レギュレータで生成しています。
ログアンプのフィルタ用のコンデンサには大き目のものを接続して、低い周波数でもできるだけ安定した出力となるようにしています。

回路図を元にプリント基板を作成しました。
このプリント基板に図Eの実装図にしたがって部品を実装していきます。入力部分は、はんだ面への表面実装部品が多いので最初に実装します。まずICをはんだ付けし、特にログアンプが小さいのでこれらを慎重に取り付けます。
次にレギュレータIC、チップコンデンサをはんだ付けします。はんだ面が終わったら部品面です。最初はジャンパ線です。スイッチ部のジャンパ配線はスイッチ自身でできますので配線は不要です。
次は抵抗ですがすべて横向きに取り付けます。足をまげて取り付け穴に挿入してから基板を裏返せば固定されますから楽にはんだ付けできます。次がICソケットです。あとは大物を取り付けていきます。液晶表示器はピンヘッダソケットを使ってソケット実装としました。BNCコネクタが一番の大物ですので最後に取り付けます。

こうして組み立てが完了した基板の部品面が写真Bとなります。液晶表示器を実装する前の状態です。

写真Cがはんだ面で、こちらの方は小型部品が多いので丁寧な作業が必要です。とくにICのピン間のはんだブリッジがないことを十分チェックしてください。

第3章 アナライザのファームウェアの製作
続いてレベル測定ボードのPICマイコンのプログラムの製作です。使ったPICマイコンが16ビットファミリですから、MPLAB X IDEとXC16 Cコンパイラを使って製作します。
3-1 プログラム全体構成
製作するプログラムの全体構成をフロー図で表すと図Aのようになります。最初に周辺モジュールの初期設定を行い、最後に液晶表示器の初期化をして開始メッセージを表示しています。
ラズパイからの受信は割り込みで常時受け付けられ、コマンド受信完了でフラグがセットされますから、それをメインループで最初にチェックします。受信があった時には受信処理関数Process()を呼び出します。
Process()関数では、コマンドで指定された周波数を取り出し数値に変換して保存し、液晶表示器の2行目に表示します。続いて、チャネルAのレベルを計測し、デシベル値に変換し、さらに文字に変換して送信バッファに保存します。同じようにチャネルBのレベルを計測し、デシベル値を送信バッファに保存します。最後にラズパイに一括で送信します。
メインループの次は、タイマ2の割り込み処理で0.5秒ごとにセットされる表示フラグをチェックし、オンの場合には、チャネルAとチャネルBのレベルを計測し、液晶表示器の1行目にデシベル値で表示します。

3-2 プログラム詳細
プログラムの最初は宣言部でリストAです。ここではコンフィギュレーションの設定とグローバル変数の定義、関数のプロトタイピングをしています。宣言部詳細は省略しています。
ラズパイとの送受信バッファはキャラクタ型として定義し、文字列で送受信しています。

次はメイン関数部でリストBとなります。
入出力ピンのモードの設定と、ログアンプ入力用にアナログピンの指定をします。UART1はラズパイとの通信用ですので115.2kbpsの速度に設定します。さらに受信の割り込みを許可します。
I2C2は液晶表示器用ですから、100kHzの速度に設定します。ADCはプログラムで変換制御する設定とし、リファレンスは電源とグランドとします。
タイマ2は0.5秒周期の割り込み生成用で、これで液晶表示器に計測レベルを表示するようにします。
最後は液晶表示器の初期化と開始メッセージの表示で、この後UART1とタイマ2の割り込みを有効化しています。
続いてメインループに入り、最初にコマンド受信があったかどうかチェックしています。受信があった場合にはProcess()関数を呼び出して受信データの処理をします。
次に表更新のフラグ(dFlag)がオンかどうかをチェックし、オンであれば、チャネルAとチャネルBのレベルを計測し、デシベル値に変換してから、さらに文字に変換して表示バッファに格納します。
最後に液晶表示器の1行目に2チャネルのレベル値を一括で表示します。

次が受信データ処理関数Process()の詳細でリストCとなります。
まず、受信したコマンドがNコマンドかをチェックし、Nであれば処理を実行します。コマンドから周波数の文字列を取り出し、表示バッファにコピーします。さらに周波数を数値に変換していますが今回はこの数値は未使用です。その後周波数を液晶表示器の2行目に表示します。
続いて折り返し用のレベルを計測します。チャネルAの計測を実行し、結果をデシベル値に変換します。さらにこれを送信バッファに文字に変換して格納します。
続いてチャネルBも同様に計測してデシベル値を文字に変換して送信バッファに格納します。
最後に一括でラズパイに送信しています。

次がタイマ2の割り込み処理部とレベル計測関数部でリストDとなります。
タイマ2の割り込み処理では計測更新フラグ(dFlag)をオンとしているだけです。
レベル測定関数では、指定されたチャネルのA/D変換を1msec周期で250回実行し結果をすべて加算します。最後に250で割って平均値とした値を返しています。
100Hz以下の低い周波数では長期間の平均をとらないと値が安定しないため、250msec間レベル値を測定してその平均値をレベル値としています。高い周波数ではここまでの長期間の平均をとる必要はないのですが、それほど測定時間に影響しないので同じとしています。

この他にUARTの割り込み処理関数などがありますが、詳細は省略します。
以上がレベル測定ボードのファームウェアの全体となります。
これをラズパイに接続して使います。
第4章 ラズパイのアプリケーションの製作
次はラズパイで動作させるアプリケーションプログラムの製作です。こちらは、ラズパイに標準実装されているRaspbianを有効活用して製作します。
4-1 プログラムの全体構成
今回のラズパイのプログラムは、レベル測定ボードを単独で使う使い方ではなく、波形生成ボードと組み合わせて、周波数特性をブラウザにより計測するという目的のアプリケーションとしています。
このアプリケーションの全体構成は、図Aのようにしました。
基本的な使い方として波形生成ボードとレベル測定ボードの2つを同時に同じラズパイに接続して使うという前提になっています。
プログラムの基本はWebIOPiというアプリケーションを活用し、プログラム部はPythonスクリプトで記述しています。さらにグラフ生成にはPythonのライブラリであるmatplotlibを使っています。

まず、レベル測定ボードのPICマイコンとはシリアルインターフェースで接続しますが、ここはGPIOシリアル経由で接続します。そして波形生成ボードの方をUSBシリアルケーブルでUSBに接続して使います。
WebIOPiというアプリケーションを使って、ラズパイがネットワーク経由でブラウザから呼び出されたとき、Analyzer.htmlというHTMLファイルで周波数グラフと周波数の設定窓とボタンの表示ページを提供します。
ブラウザで周波数などの入力をしたあと、Startボタンをクリックすると、WebIOPi経由でMacro.pyのPythonのマクロ関数を実行します。このマクロ関数では、フォームで入力された周波数データを含むコマンド文字列をFreq.txtというファイルに保存してから、Analyzer.pyというPython関数を起動します。
Analyzer.pyでは、保存されたFreq.txtのコマンドから波形生成ボードへのコマンドを構成してPICマイコンにシリアル通信で送信します。同時にレベル測定ボードにも同じ周波数の測定要求コマンドを送信します。
これで波形生成ボードから指定された周波数の正弦波が出力され、被測定装置に入力されます。その被測定装置の出力をレベル測定ボードに接続しておきます。これでレベル測定ボードが出力信号レベルを計測し、デシベル値に変換したあとGPIOシリアルでラズパイに返送します。
ラズパイのAnalyzer.pyでは、この折り返しのレベル値の受信を待ち、受信ができたらそれで周波数特性グラフを更新作成します。HTMLファイルのJavascriptで周期的にHTMLのグラフ表示が更新されるようになっていますのでブラウザの表示も更新されます。
Analyzer.pyでは、さらに次の周波数を、指定された周波数ステップに応じて計算して求め、再度波形生成ボードへのコマンド送信からのループを繰り返します。これを指定された終了周波数になるまで繰り返します。
4-2 HTMLファイルの詳細
ブラウザに表示するページを提供するHTMLファイルの詳細です。まず提供するページの詳細情報は図Bのようになっています。
表題の下はテーブル構成になっていて、3つの枠の最上段に入力フォームを設定しています。それぞれの入力フォームにはIDを付与してJavascriptで項目を指定して値を取り出せるようにしています。
StartボタンとStopボタンも同じ枠内に表示し、これらのクリックでマクロ関数を呼び出すことでPythonプログラムが起動されます。
その下の枠内にグラフを表示し、IDを「G」としています。ここにgraph2.pngの図を表示するようにしています。Javascriptにより2秒間隔でこの図の表示を繰り返しています。
最下段の枠にShutdownボタンを表示し、これをクリックした場合には、マクロ関数でシェルコマンドのshutdownを実行しています。

このページを実現したHTMLファイルのHeader部がリストAで、ここでJavascriptを記述しています。
最初にJavascriptとwebiopiのJavascriptであることを宣言しています。
次にwebiopiとして使う関数の宣言定義をしています。続くStartAp()関数がStartボタンを押したときに実行される関数です。ここで入力された周波数などのデータをFormから取り出し、PICマイコンに送信するコマンドの形式に構成してから、これをパラメータとしてマクロ関数StartUp()を呼び出しています。
次のStop()関数がスイープをいったん停止させるボタンで、Stop()マクロ関数を呼び出しています。
最後がShutdownボタンの処理で、確認ダイアログを表示してYesの場合だけシャットダウン処理をするマクロ関数ShuCmdを呼んでいます。

次が、HTMLファイルのBody部でリストBとなります。ここで実際に表示する内容を記述しています。
最初は見出しの表示でちょっと大き目の文字にしています。
その後はテーブル構造にして枠ごとに機能を分けています。最初の枠がフォームで周波数の入力をする窓を表示し、さらにStartとStopのボタンを表示しています。ボタンごとに呼び出すマクロ関数を指定していて、これで次のPythonプログラムの起動をします。
次の枠にはグラフを表示しています。
最下段の枠がシャットダウン機能でShutdownボタンの表示と呼び出す関数の指定をしています。

4-3 マクロ関数スクリプトMacro.pyの詳細
HTMLファイルから呼び出されるマクロ関数のPythonスクリプトがMacro.pyですが、内容はいたって簡単でリストCですべてです。
HTMLファイルからStartボタンクリックでStartUpマクロが呼ばれたら、パラメータとして渡されるコマンド文字列をそのままテキストファイルと保存してからMesure.pyスクリプトを起動します。
StopボタンクリックでStopAP()マクロが起動され、停止フラグをセットしてファイルに書き込んでいます。Analyzer.pyスクリプトで常時このファイルをチェックしてフラグがセットされていればいったん停止します。
ShutCmdマクロが呼ばれた場合には、シャットダウンのシェルスクリプトを実行しています。

4-4 コマンド送信とグラフ作成スクリプトAnalyzer.pyの詳細
次はPICマイコンにコマンドを送信し、さらにレベルデータを受信してグラフを作成するPythonスクリプトです。リストDが前半のグラフを作成する部分となります。
最初に必要なライブラリをインポートしています。この中で「mplt.use(“Agg”)」という記述がありますが、これはmatplotlibでコンソールなどに実際にグラフを表示させることなくグラフを生成するために必要な記述となっています。続いてパラメータやグラフを読み込んだり保存したりするためのパスとファイル名の指定です。
次のmakeGrpah()がグラフを表示する関数です。最初にグラフ作成のインスタンスを生成してからY軸とX軸の表示指定をしています。Y軸はデシベル値をそのまま使いますが、X軸は周波数を対数形式で表示させますので、目盛り線も対数で表示するようにしています。
最後にチャネルAとBの2本のグラフを赤と青で表示してからファイルとして保存しています。
保存後はすべてのリソースを解放して残らないようにしています。これをしないとリソースが食いつぶされてそのうちラズパイ自身が動作できなくなってしまいます。

次が後半部でリストEとなります。
ここでは最初にシリアルインターフェースのインスタンスを2つ用意しています。GPIO経由がレベル測定ボード用で、USB経由が波形生成ボード用です。
次にマクロ関数で保存されたコマンドをファイルから読み出し、開始、終了の周波数など、それぞれのパラメータに展開しています。
時間間隔のデータはここでは使いませんでした。これは全体の計測周期が1秒以上かかってしまうので時間間隔の設定が無意味になってしまったためです。
次は実際のメインループで、周波数を順次アップさせて繰り返すループで終了周波数になるまで繰り返します。さらに途中で停止フラグがセットされても停止します。
先に波形生成ボードへのコマンドを作成し送信して、正弦波の出力を制御します。続いてレベル測定ボードへもコマンドを送信し、折り返しのレベル値の受信を待ちます。
受信できたらチャネルごとのレベル値に変換してリストに追加してからグラフ作成関数を呼び出します。戻ってきたら作成されたグラフファイルを別名でコピーします。表示には作成途中の表示が出ないようにコピー側を使います。
グラフ作成が完了したら、次の周波数に進みますが、このとき指定されたステップに基づいて次の周波数を求めています。
以上がラズパイのプログラムの全部です。

4-5 アプリケーションの実装
アナライザとしてラズパイに必要なプログラムができたところで、次はラズパイをアナライザとして使うために必要なインストール作業と設定となります。必要な作業は次のようになります。
- Raspbianのインストール
NOOBS ver2.4.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 - matplotlibのインストール
グラフを作成するために必要なPythonのライブラリです。下記1行だけでインストールができます。
sudo apt-get install python-matplotlib - 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ファイルをリストFのように4か所追加修正します。

さらにwebiopiが自動起動するように下記1行のコマンドを実行します。
sudo update-rc.d webiopi defaults
6.作成したアプリケーションプログラムを下記ディレクトリにすべて格納する
/home/pi/GENERATOR/
以上の作業でラズパイの電源をオンにすれば、周波数特性アナライザとして自動起動して動作するようになります。
第5章 アナライザの使い方
ラズパイのアプリも完成したらいよいよ動作開始です。ラズパイと波形生成ボード、レベル測定ボードを接続して計測を開始する手順を説明します。
5-1 接続方法
まずはラズパイと波形生成ボードの接続方法です、USBシリアル変換ケーブルで接続します。このとき使用する変換ケーブルはUART側がTTL接続となっているものを使います。ラズパイ側のUSBにはコネクタが4つありますが、どれに接続しても問題ありません。波形生成ボード側は写真Aのように黒のGNDピンが基板の内側になるように接続します。USBから電源も供給しますから、レベル測定ボードの電源ジャックなどはありません。

次にレベル測定ボードとラズパイはヘッダピン接続ケーブルを使ってGPIOと接続します。こちらは写真Bのようにヘッダピン接続ケーブルを使います。ケーブルは自作しても良いですし市販のものでも構いません。写真ではたまたま市販の6ピンのものを使いましたので1ピン余分な状態となっています。こちらの場合もやはりGPIOから電源を供給しますので、接続方向やラズパイの列を間違えないようにしてください。

ラズパイとレベル測定ボードを接続し、ラズパイに電源を供給して、ラズパイの起動が完了すれば、同じネットワークに接続しているパソコンやスマホからブラウザのページが開けるようになります。
ブラウザで開く場合のURLは「ラズパイのIPアドレス:8070」とポート番号を付加して指定すればよいだけです。
本稿ではすべてブラウザに「Google Chrome」を使っていますが、「Internet Explorer」でも同じようにできます。
5-2 周波数特性アナライザとしての使い方
これで準備が整いましたから、周波数特性を計測したい回路や機器を波形生成ボードとレベル測定ボードの間に接続します。
まず何もしない状態で波形生成ボードから1kHzの正弦波が出力されていますから、この出力レベルをボード上の可変抵抗で調整して適当なレベル値になるようにします。レベル値はレベル測定ボードの液晶表示器で確認できます。
この状態にしたら、ブラウザでスイープする開始周波数と終了周波数、周波数ステップを入力してStartボタンをクリックするだけです。
あとはすべて自動で進み、2秒間隔でグラフ表示が更新されていきます。終了周波数になれば自動的に停止します。
実際に測定した例をいくつか示します。図AはLCフィルタの例でハイパスとローパスの両方の特性です。10Hzから10MHzの範囲で1/1ステップで測定しています。素直な特性になっていることがわかりますし、通過周波数も明確に確認できます。

図Bは455kHzの中波ラジオ用のセラミックフィルタの特性を計測した例です。シャープできれいな特性であることが確認できます。このようなシャープな特性はスイープ周波数範囲を狭くして周波数可変ステップも1/10か1/100に細かくしないと正確な特性が得られません。
