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で扱われている)を入手しておくとよいでしょう。

利用できるプロトコル

Openbench Logic Snifferは、色々なプロトコルの解析機能が搭載されています。これを使うと、信号の波形を目で眺めるだけでなく、 通信電文を数値や文字コードに変換して表示するなどして、わかりやすくできます。

よく使う範囲では、

などがサポートされています。

それぞれ通信に使う信号線を、ロジアナ化したArduinoの入力端子「D8~D12」に繋いで、 適当なトリガ条件を設定して、通信波形を取り込み、「解析処理」を実行すると、波形グラフ上にデータの値を表示したり、 解析結果を「csvファイル」で保存することができます。

その際、通信プロトコルによって、どのように取り込めばいいのかといった条件設定に、ちょっとしたコツがあったりします。 「UART」と「SPI」を例に、取り込む方法と注意点、そして取り込んだ結果を眺めていきます。

得に、UARTの場合は「タイミング」が、SPIの場合は「トリガの掛け方」が、ポイントになると思います。

UARTの場合

タイミングが重要

UARTの、一般的な「8n1」(8ビット、パリティー無し、ストップビット=1)の1バイト分の電文は、 10ビット分を一まとまりとして送信されます。このデータ読み取りのタイミングは、立下りの瞬間を基準として、 タイミングを計って10回(10ビット分)サンプリングされます。

10%以内に抑える

UARTは、タイミングがずれると、データが化けてしまうので、ある程度のオーバーサンプリングを行う必要があります。

1バイト=10ビットの通信なら、間に10%の誤差が含まれてしまうと、最終ビット付近では隣のビットの情報を読み出してしまうわけです。

例えば、9600bpsの場合、毎秒約10kビットのデータが流れるので、最低でもその10倍くらい…100ksps程度で取り込む必要があるでしょう。

(これだと、誤差が最大10%となり、単純計算では最終ビット付近の情報がぎりぎり化けそうに思えますが、 クリスタル発振子(または発信機)を使っているマイコンの「内蔵ハードウェアUART」の場合なら、 実際は「1ビット分の誤差×10ビット=10ビット分の誤差」とはならず、もっと小さい範囲にとどまるので、 とりあえず10倍(100ksps)程度でサンプリングしておけば、正常に読み取れるはずです)

可能なら、もう少し細かいサンプリングレートにしておいたほうがようでしょう。また、ソフトウェアUARTの場合は、 ソフトの内部処理で誤差を含んでしまうので、やはりもう少しビットレートを上げておいたほうがよさそうです。

なお、単に読み出すだけでなく、信号波形の「通信品質を確認したい」などといったテストの場合は、 当然、もっと高いレートでサンプリングする必要があります。

取り込み方

実際にサンプリングを行ってみましょう。まず、計測したデータソースを用意して、配線します。

もう1個別のArduinoを用意して、次のサンプルプログラムを書き込んでおき、このArduinoのシリアル出力端子「D1」を、 ロジアナ化したArduinoの「D8」に繋ぎます。(GND線も当然配線しておく)

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  for (int i='A'; i < 'E' + 1; i++) {
    Serial.write(i);
  }
}

void loop() {
}

電源投入、もしくはリセットすると、「A」から「E」までの5文字を、9600bpsで出力します。これをキャプチャしてみます。

Openbench Logic Snifferを起動して、キャプチャ条件を設定するサブウィンドウが開いたら、「Triggers」のタグを開いて、 トリガ条件として、「Mask」の「0」のところ(D8端子)にチェック(レ点)を入れて、「Value」の「0」のレ点をオフに設定します。

つまり、「D8」端子が「LOW」になったら取り込みが開始されます。

信号元用のArduinoのリセットボタンを押して、シリアル端子からデータを出力させます。 すると、最初のデータ「A」の文字の「スタートビット」(立下り信号)でトリガが掛かって、取り込みが開始されます。

(クリックで別窓で開きます)

解析

この信号を解析をしてみましょう。ファイルメニューから「Tools」→「UART analyzer」とたどります。

すると、画面左側が、端子やビットレートなどの設定項目に、右側が解析結果表示になっています。

条件を設定しましょう。「RXD」を「Channel0」(D8端子)に、ビットレートを「9600」に設定します。 それ以外はデフォルトでいいと思いますが、念のため、「8n1」になっているか確認しておきましょう。 右下の「Analyze」ボタンをクリックすると、このように解析結果が表示されます。

(クリックで別窓で開きます)

上半分は、通信速度など、通信全般のサマリ情報です。下半分は、通信電文の詳細です。

Baudrate欄に、ビットレートの設定値と実際のデータのビットレート(計測値)が表示されます。 設定値9600に対して、計測値は9740となっており、約1.5%の誤差があると表示されています。 10倍サンプリングで、クリスタル発振子の場合、大体この程度の誤差で取り込めるようです。 内蔵RC発振や、ソフトウェアUARTの場合は、もう少しビットレートを上げておいたほうがいいと思います。

「Export」ボタンを押すと、csv形式で解析結果を保存できます。

解析のサブウィンドウを閉じると、先ほどの波形画面上に、解析の結果が反映されています。 このように、データ1バイトごとに、「データ値」が見やすく表示されます。

(クリックで別窓で開きます)

なんにしても、Arduinoベースなので、1kB程度のバッファでは、10文字以内のキャプチャがせいぜいといった感じです。

SPIの場合

速度がたいへん

SPI、特に内蔵SPIモジュールを使った場合は、UARTやI2Cに比べて、通信速度が速いため、残念ながらこのロジアナでは、 キャプチャが間に合いません。(単に出力した信号を取り込めればいいというのであれば、SPIのクロック分周を、 標準の1/4から1/128などに設定すれば、クロックが125kspsとなるので、500kspsくらいでぎりぎり取り込みはできそうな気がします… まぁ、それが良いかは別として)

ここでは、ソフトウェアSPIを使った場合の波形取り込みについて触れます。

ソフトウェアSPI

Arduinoには、「shiftOut」「shiftIn」という機能があります。これらは、ソフト記述のSPIといえるものですが、 一度に送信/受信の片方しか扱えません。(内蔵SPIモジュールによるハード通信は、マスター/スレーブ双方が、 クロックにあわせて同時通信します)

まぁ、同時に送受信できないとは言っても、大半のSPI機器は、送信時は受信データを読み捨てて、 受信時は空データを出力するのが通常なので、機能的にはこれでも大抵事足ります。 また、多くのシールドでもこのソフト実装のSPIは使われています。ソフト実装なら、ピン配置の自由度が高いことや、 「SPI+CS信号」や、「SPI+CS信号+データ/コマンド」といった、4線、5線のSPI通信を行う機器も多いためです。

大事なのは、「ソフトで実装」されているので、速度が「程よく遅い」ことです。

ArduinoのdigitalWrite命令は、1回の出力に4~5μ秒ほど掛かります。最速でも、200kspsといったところです。 これを使ってSPI通信を行うと、クロック信号はもう少し遅い、100ksps台になるでしょう。 これなら、500ksps程度(※)でキャプチャーすれば、ぎりぎり取り込みが間に合うようです。

(※:どうやら、このArduino用のロジアナの場合、サンプルレートを500kspsより高く設定すると、 トリガ条件が旨く掛からないようなので、トリガを遣う場合のサンプルレート上限は、500kspsと考えておいたほうがよさそうです。 なお、1Msps~4Mspsに設定した場合、トリガ自体は掛かるのですが、トリガが掛かるはずのスタートタイミングに対して、 実際にキャプチャが始まるタイミングが少し遅れてしまうようで、信号の頭を少し取りこぼすようです)

取り込み方

SPIの通信電文は、マスター側の場合、ざっくり言うと「通信相手を選択(CS:Chip Select)」してから、 「クロックにあわせてMOSIから出力/MISOから入力」して、8ビット分送受信したら「通信相手の選択を解除」となります。

このため、通信の開始を知るには、「CS信号」を見ればよいわけです。トリガ条件には、「CS信号」の立下り(Low)を設定します。

なお、ソフトSPIの場合、上述のように「MOSI」か「MISO」のどちらかしか使わない(使えない)ので、 使わないほうの信号はキャプチャしなくてもいいのですが、Openbench Logic Snifferの解析機能は自動的に両方含まれるので、 ひとまず適当なところに配線しておきます。

ここでは、「CS」信号を「D8=0」に、「SCK」「MOSI」「MISO」をそれぞれ「D11=3」「D9=1」「D10=2」に接続すると仮定します。

信号元として、やはりもう1個Arduinoを用意して、次のようなスケッチを書き込んで使います。 なお、D7端子とGNDをタクトスイッチなどでショートすると、5バイト分の信号が出力されるという処理になっています。 スケッチ中は「SS」と記述していますが、「CS」に読み替えてください。

int ss   = 10;  // slave select
int mosi = 11;  // mosi
int miso = 12;  // miso (not in use)
int sck  = 13;  // serial clock
const int bitOrder = MSBFIRST;
int in_pin = 7;

void setup() {
  pinMode (ss, OUTPUT);
  pinMode (mosi, OUTPUT);
  pinMode (miso, OUTPUT);
  pinMode (sck, OUTPUT);
  pinMode (in_pin, INPUT);
  digitalWrite(in_pin, HIGH); // pull up
  digitalWrite(ss, HIGH);  // default = high
}

void loop() {
  while (digitalRead(in_pin) == HIGH) {
  }
  
  for (int i = 'A'; i < 'E' + 1; i++) {
    digitalWrite(ss, LOW);
    shiftOut(mosi, sck, bitOrder, i);
    digitalWrite(ss, HIGH);
  }

  while (digitalRead(in_pin) == LOW) {
  }
  delay(1000);
}

通信モードは標準の「モード0」、ビット順は「MSBFIRST」としています。D7端子がLOWになると、「A~E」の5文字を出力します。

Openbench Logic Snifferを起動して、キャプチャ条件を設定するサブウィンドウが開いたら、「Triggers」のタグを開いて、 トリガ条件として、「Mask」の「0」のところ(D8端子)にチェック(レ点)を入れて、「Value」の「0」のレ点をオフに設定します。

キャプチャの速度は、信号元がArduino-Unoなど「AT-MEGA328・16MHz」の場合、「Acquisition」タブで「500ksps」に設定してみてください。 (これ以上速いと、トリガ直後のデータを取りこぼし、遅いと、データの分解能が悪化して、クロックとデータの変化が重なったり、 波形がつぶれて読み出しに失敗するかもしれません。8MHz版のArduinoの場合は、その分加減してください)

まぁ、トリガ条件はUARTの時とまったく同じになっています。つまり、「CS信号」を繋いだ「D8」端子が「LOW」を入力したら取り込み開始です。

信号元となるArduinoのD7端子をLOWにすると、データが出力されます。 すると、最初のデータ「A」の文字の「CS信号」(立下り信号)でトリガが掛かって、取り込みが開始されます。

(クリックで別窓で開きます)

解析

この信号を解析をしてみましょう。ファイルメニューから「Tools」→「SPI analyzer」とたどります。

解析画面の左側は条件設定で、右側は解析結果画面です。

条件設定のところで、各端子の割り振りと、「SPIモード」「データ長」「ビット順」の設定をしてから、 右下の「Analyze」で解析処理を実行します。

(クリックで別窓で開きます)

解析結果の上部に通信条件が、下部にデータの詳細が表示されます。「A」から「E」が順に拾えているのが判ります。

(クリックで別窓で開きます)

解析のサブウィンドウを閉じてもとの波形画面に戻ると、解析結果のデータ値が波形上に表示されているのがわかります。

まとめ

Arduinoは、1個といわず、大抵(互換機も合わせて)数個は持っている人が多いと思います。 このArduinoを使って、ちょこっとロジアナとして波形を眺められるというのは、なにげに便利といえば便利でしょう。 なんと言っても、身近なものを利用して、ノーコストで実験できます。

ただ、やはり速度とメモリ量に課題があります。

速度的には、最大で4Mspsの取り込みまで対応しているものの、トリガがきちんと掛かるのは500kspsまでだったり、 メモリ量は1kBかつ非圧縮なので、ごく短時間しかキャプチャできないというところが、実用上いろいろ制約になるでしょう。

ロジアナをまだ使ったことがない人が、「どんなもんかなぁ?」とちょっと使ってみて、 使い勝手や、本当に使いたい機能、本当に欲しい機能を整理したり、といった点でも、役立つのではないかと思います。

ソフト自体は使いやすく、素直なデザインなので、メモリの大きいMega2560コアのArduinoや、 Seeed Studioの「Open Workbench Logic Sniffer」を入手してしまうのもよいかもしれません。

Mega2560だと、バッファは7kBほど。Leonardoだと、2kBほどあるっぽいです。 ただ、Leonardoy用はちゃんと動作する状態まで開発が進んでいるのかは微妙な状況のようです。

Seeed Studioの「Open Workbench Logic Sniffer」は、16chなら200Msps、32chなら100Mspsまで入力でき、 216kBのバッファを搭載しているので、より大規模で高速なキャプチャが可能です。

Seeed Studioの「 Open Workbench Logic Sniffer」のページ(リンク)

もしくは、「Bus Pirate」だと、「Open Workbench Logic Sniffer」よりスペックが落ちますが、 AVRのライター機能、JTAG、低速オシロスコープ、などといった、ロジアナ以外の部分の機能が充実している計測機器なので、 手元に1個あると便利かもしれません。(Bus Pirateは、バージョンによってスペックは様々です)

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

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

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