PIC AVR 工作室別館 arduinoの館->TopPage->資料倉庫->ロジアナ

ロジアナ

オープンソースのArduino用ロジアナスケッチと、オープンソースのPC用GUIソフトを使って、 ArduinoやArduino互換機を、簡易的なロジアナにします。

例によって、秋月互換基板使いました。(このロジアナとして使うなら、実は秋月互換基板が都合いいんですってよ、奥様!!)

入手方法と、リセット回路周りの設定などについて、纏まった情報がなかったので、その辺を中心にまとめます。

ちなみに写真の右側が、秋月製Arduino互換基板で、左側は中華製のDDSファンクションジェネレータです。

ロジアナとは

ロジアナは、Logic Analyzerの略で、デジタル信号の解析に使用する機械です。複数のデジタル信号をいっぺんに眺めることができます。

デジタル信号を見るにあたって、ロジアナによって8チャンネルとか、16チャンネルとか、たくさんの信号を周期的に取り込んで、 信号をグラフィック表示したり、トリガ条件を設定して信号を取り込んだりできます。

オシロスコープが、アナログの信号を1~2本同時に眺められるのに対して、大量のデジタル信号を同時に眺められるのが特徴的です。 廉価なものの場合、多くのロジアナはオシロよりも高速なサンプリングができるようです。 (高価なオシロは、むしろロジアナよりも高速なサンプリングができます)

また、パラレル信号を同時に並べて眺めるだけでなく、「SPI」「I2C」「UART」「USB」といった、デジタル通信(シリアル通信)の電文を、 単なるオン/オフ信号の羅列ではなく、「データ値」の並びに翻訳して表示したりといったことが可能です。

Arduinoなどで何かデジタル信号を扱う電子回路を組んだときに、ちゃんと設計どおりに動いているかを確認したり、 上手く動かない場合に、その原因を探るときなどに活用します。

Arduino用のロジアナについて

Open Bench Logic Sniffer互換のArduinoロジアナ

ここで扱うArduino版のロジアナもロジアナとしては同様です。Arduinoを信号入力デバイスとして扱い、キャプチャした信号をPCに転送、 転送された信号を元に、PC側ソフトでGUI表示したり、各種通信プロトコルに基づいてデータ値として表示したりします。

多くのロジアナは、このように、信号をキャプチャするための「基板部分」と、表示や信号の解析を行うための「PC側ソフト」で構成されます。

ただし、キャプチャに使用するArduino自体が、16MHzクロックで動く低スペックマイコンなので、 あまり高速な信号をキャプチャすることはできません。mega328版のArduinoでも、最大で4MHz程度までのようです。

性能

このため、主に400kHz以下で使うI2Cや、115200bps以下で使うUARTといったプロトコル解析には向いてますが、 SPI通信となると、Arduinoでも速度が速すぎて、最高速で通信している場合はキャプチャが間に合わないでしょう。 SPIの場合は、通信速度を少し落とした状態で、ようやくキャプチャができる程度と、そこそこ低スペックです。

また、mega328に搭載されているSRAM 2048Bのうち、半分の1024Bしかキャプチャできません。 また、キャプチャできるチャンネル数は、ポートBで入力可能な5チャンネル(D8~D12)に限られます。

せめて8チャンネルあれば…という気持ちはあるものの、まぁ、普段積み基板になってるArduinoやArduino互換基板が、 投資額ゼロでちょっと便利なロジアナ代わりになるかと思えば、これはこれで満足できるものではないかと。

導入手順(1)スケッチ

githubで公開されている、以下の3つのファイルをダウンロードして、スケッチ格納フォルダに適当なフォルダを作って、 3つのファイルを保存します。

https://github.com/gillham/logic_analyzer

Arduino IDEでこの「logic_analyzer.ino」を開いて、Arduinoボードに書き込みます。

なお、スケッチの書き込みが済んだら、以下で触れるように、リセット信号の無効化が必要になります。忘れずに行ってください

導入方法(2)PC側ソフト

SUMPの公式サイトで公開されているOpenbench Logic Snifferは、 既に古いバージョンのなので、以下のページで最新版を入手します。

https://www.lxtreme.nl/ols/

これを書いている時点の最新版は、「ols-0.9.7.2-full.zip」です。

Java製ソフトなので、Javaの実行環境が必要です。 JavaのVM環境を、 別途入手してインストールしておいてください。

ダウンロードしたOLSのアーカイブを解凍すると、中に、「run.bat」(Windows用の起動スクリプト)や、 「run.sh」(同Linux用)が入っているので、これを実行すれば、一旦黒い画面が表示された後に、GUI版のOLSが起動します。

導入方法(3)リセット回路の無効化

リセットを無効化しておく必要がある

ArduinoをOLSと繋いで動かすためには、Arduino側の自動リセット回路を無効化する必要があります。

一般的なArduino基板の場合、120Ωの抵抗を、「リセット端子」と「5V端子」の間に繋ぎます。 これにより、PC側からの「DTR」信号を使った自動リセット機能(通常はスケッチ書き込みの際のブートローダ起動に使われる)が、 機能しなくなります。

Arduino基板上のリセット信号は、AT-MEGA328/168のリセット端子と直接配線されているだけでなく、 0.1μFのコンデンサでDTR信号に繋がっています。Arduinoは、これを使って、スケッチ書き込み時のトリガ信号として使われます。 このDTR信号を無効化するための120Ω抵抗です。

ちゃんと120Ω抵抗を使うようにという注意事項が書かれていました。 抵抗値が大きいと十分に機能しなかったり、小さいとArduino基板やCPUチップを壊してしまう恐れがあるので、 注意してください。

秋月製互換機だと楽チン

秋月製のArduino互換基板の場合、「リセット」「TX」「RX」の各信号は、 2×3コネクタのジャンパスイッチ(シルクでX4と書かれている端子)で切断できるようになっています。 このため、120Ωの抵抗を使わず、単に「リセット」に繋がるジャンパスイッチを取り外すだけですみます。

同様に、一部のArduino互換基板でも、こうした対応ができるものがあるでしょう。

さて、「リセット」端子の処理が済んだら、PCと繋いでロジアナとして動かせるようになります。

接続と設定

キャプチャ条件の設定

OLSを起動したら、ファイルメニュー「Capture」→「Device」で「OpenBench LogicSniffer」を選択しておきます。 (多分、デフォルトでこれが選択されている)

そして、「Capture」のすぐしたのアイコンをクリックします。

すると、キャプチャ条件を設定するサブウィンドウが開きます。 (以下の画像は、見づらかったら、右クリックで保存して、グラフィックビュアーなどで見てください。等倍で見れます)

「Analyzer port」に、Arduinoロジアナを接続しているcomポート番号を指定します。(ここではcom5を指定)

「Port Speed」は、デフォルトの115200bpsのままにします。

「Device Type」は、「Arduino Generic Logic Analyzer」を選びます。ここまで設定したら、上の「Acuisition」タブをクリックして開きます。

キャプチャのサンプリング速度を選びます。10Hz~4MHzから選べます。単位がHzになってますが、sps(Samples per second)です。 計測したい信号の分解能を考慮して、すくなくとも、元の信号の5~10倍くらいにはしておきたいところです。 特に、UARTなどの場合、このパルス幅の精度がイマイチだと、信号解析に支障が出る恐れがあるので、UARTでは10倍以上に設定したいところです。

実験用の信号源を用意する

信号源に、適当なArduinoを使って、4ビット幅で0~15のパラレルデータを出力してみることにします。

以下のスケッチを、適当なArduino基板にぶっこんで、ロジアナ化したArduinoと、D8~D12まで、同じ端子同士を結んでください。 1ミリ秒ごとにカウントアップして、0~15までの値のテスト信号が伝達されます。D12は常時ゼロ(low)出力です。

/* sample signal on D8-D12 */

void setup() {
  for (int i = 0; i < 5; i++) {
    pinMode(i + 8, OUTPUT);
  }

}

void loop() {
  for (int i = 0; i < 16; i++) {
    PORTB = i;
    delay(1);
  }
}

パラレル信号のキャプチャ

さて、キャプチャーしてみましょう。

サンプリング速度とトリガ条件

さきほどの「Acuisition」タブで、キャプチャ速度を10kHz(実験用の信号源の10倍)に設定してみます。 およそ1ミリ秒ごとに信号が変化するので、1波形あたり10サンプル程度になる計算です。(delay関数なので、少し誤差がある)

「Trigger」は、チェックを「オフ」にすると、フリーランでキャプチャします。 ここでは、トリガ条件を設定して、キャプチャしてみましょう。

「Before/After ratio」は、10%くらいのところにスライドしておきましょう。

「Type」は、Arduinoロジアナだと、選択肢は「SIMPLE」しか選べません。 「SIMPLE」とは、トリガ条件に設定できる値(ここでは5本の入力ピンのオン/オフを組み合わせた値)が、 1段だけ(Stage1だけ)設定できるという意味です。

(機種にOpen Bench Logic Snifferを選ぶと、「COMPLEX」が選択でき、トリガ条件が、4段までの複雑な条件設定が可能になります)

「Mode」のところは「Parallel」を選択しておきましょう。

「Mask」は、入力信号のうち、トリガ条件に含める端子の選択です。ここでは、トリガ条件として、4本のパラレルデータが、 0b0100、つまり、10進数で「4」になったらキャプチャを開始する、という風に設定してみます。 「D11」「D10」「D9」「D8」の4本のパラレル信号(3~0)を条件に設定したいので、「Mask」は右から4個をオンに設定します。 (チェックを入れるとマスクされないという、逆の意味に見えるのはなんとも…なところはありますが、 そういうソフト側の仕様なので…)

「Value」は、入力値がどういう値になったらキャプチャを開始するかの設定です。「4」(0b0100)になったら開始したいので、 右から3番目にチェックを入れます。なお、その下の「Hex Value」のところに直接数値で「4」と入力してもかまいません。

キャプチャ実行

こんな風に設定値を入力したら、右下の「Capture」ボタンをクリックして、キャプチャしてみましょう。

こんな具合に取り込めました。左から10%くらいのところで、トリガが掛けられていて、縦に線が引かれています。

この線のところの情報を読み取ってみると、「channel-3」から「channel-0」までの信号が、「0100」となっているのが判ります。 つまり、「channel-3、1、0」が「low」、「channel-2」が「high」の状態になった瞬間に、トリガ条件が満たされたので、 キャプチャが開始されたと判ります。なお、その10%手前から、データのキャプチャ自体は開始されています。

実は、6本の入力ができる

トリガ条件設定のマスクと値は、図のように一番右が「D8」からの入力で、左に順に「D9」「D10」…となっており、 見ての通り、実は6本の入力が設定可能になっています。

通常のArduinoをオシロにして使う場合は、D12までの5本だけしか使用できません。 しかし、素のMEGA-328や、D13にLEDが付いていない互換機などでは、D13を6本目の入力端子として利用できます。 (PORT-Bの6と7は、クリスタル接続用端子なので、いずれにしても接続できません)

ハードコピーを残すために

なお、「Channel-0」から「Channel-5」の信号名ラベルは変更できます。右クリックして、「Element Properties」を選ぶと、 ラベルなどを設定するサブウィンドウが開きます。

お好みで、「D8、D9、D10…」のように変更してもよいかもしれません。 ハードコピーを残しておいて、後で見たときに何の信号か判りやすい名前を設定してください。

続けてキャプチャと、キャプチャの中断

つづけてキャプチャするには、先ほどの設定画面を開くアイコンの、2つとなりのアイコンをクリックすると、同一条件でキャプチャします。

なお、トリガ条件が満たされるまで、キャプチャは開始されません。(待ち状態になります)

このとき、キャプチャを中止するには、その1個左のアイコン(トリガ待ちの間は赤いアイコンに変わっている)をクリックします。

カーソルとメジャー機能

取り込んだデータは、カーソルを使うことで、そのカーソル位置の経過時刻や、2点間の時間、 1波形分(オフ/オン)の時間、デューティー比を表示できます。

表示されている波形の上で右クリックすると、カーソルをセットするドロップダウンが表示されます。

たとえば、「Set Cursor1」を選ぶと、カーソル1の縦線が表示されます。カーソルはドラッグして左右に移動できます。

もう1個、カーソル2を置いてみましょう。このように、2本のカーソルが置かれています。 また、波形上をマウスカーソルでうろうろすると、十字マークのカーソルの近くにある1波形分(オン~オフ)が自動的に選択されます。

図の、縦に2本ある水色の線がカーソルです。

そして、ウィンドウ右端の「3:Measurement」というタブをクリックすると、 計測用の設定ペインが開きます。このペインの最上部にある「Enabled」を「オン」に設定しておきます。

これらの時間データが、右側のペインにリアルタイム表示されます。 ペイン上半分(Measurement欄)は、マウスカーソル位置にある1波形分の時間表示です。

「Period」や「Width(H)」「Width(L)」で、それぞれ、「1波形の周期」「Highの時間」「Lowの時間」が表示されています。 また、この1波形の波長から求めた周波数が「Frequency」で表示されます。オンとオフのデューティー比は、「Duty cycle」に表示されます。

ペイン下半分(Pulse Counter欄)は、片方のカーソルから、もう片方のカーソルまでの時間やパルス数の計測です。

先ほど設定しておいた、カーソル1、カーソル2を、ペイン下半分の「Cursor A」「Cursor B」のドロップダウンで選択して、 「Channel」は「0,Channel-0」を指定しておきます。

すると、各カーソル位置の時間が、それぞれのボタン(ドロップダウン)のところに表示されて、 「ΔT(B-A)」のところには、2つのカーソルの時間の差が表示されます。

「Pulses」には、カーソルが挟んでいる波形の数が表示されます。ここでは、「Channel-0」を選択しているので、 16個と表示されています。

このカーソルで囲んだ部分の周波数は「Frequency」に、オン/オフの比は「Duty Cucle」に表示されます。

信号は、マウスカーソル付近を、スクロールホイールで拡大縮小できます。適宜、見たい部分を選択してください。

Arduinoロジアナの制約事項

Arduinoロジアナを使う場合は、このように、少し限定された機能しか使えません。 FPGAベースの「Open Bench Logic Sniffer」などを繋ぐと、さらに「立ち上がり/立ち下り」をトリガ条件として設定したり、 もっと高速なサンプリングを行ったり、トリガ条件に、4段(4ステージ)までの複雑な値を経てからサンプルをスタートする、 といったことも可能になります。

なによりも、Arduinoロジアナでは、入力バッファが1024B(1024サンプル)しかないので、あまり長い信号をキャプチャできません。 特に、下記のような、シリアル通信のプロトコル解析では、もう少し長い信号が解析できるとなぁ…という気持ちになるかもしれません。

もうちょっと高機能なものが欲しくなったら、このソフトに対応したロジアナを探してみてください。 (SeeedStudioなどからいくつか出ているのですが、国内ではなかなか入手しにくいかもしれません)

なおその際、SeeedStudioで扱っているOpenBench Logic Snifferは、本体だけだと3.3Vまでしか受けられないようなので、 合わせて、MC74LCX16245DTG搭載のバッファ(7Vまで受けられる専用品がSeeedStudoで扱われている)を入手しておくとよいでしょう。

利用できるプロトコル

(つづきます)

利用例動画

youtubeで見つけた、利用中の動画を挙げておきます。

https://www.youtube.com/watch?v=IoDWX2XUhU8

https://www.youtube.com/watch?v=vQ5TvnRdHMM