速習レッスン Makersには欠かせないマルチ測定ツールAnalog Discovery2 (4)  オシロスコープと発振器 その4

オシロスコープはアナログとディジタルの両方を観測して問題点を解決できる

 据え置き型のオシロスコープでは、中級機種以上ではディジタル入力をサポートしています。これは、近年超高周波を含めて、ディジタル回路の解析が必要になったからです。一般的なUSB2.0は480Mbpsという高周波の世界の信号を扱います。

 マイコンでは、標準的な回路間のインターフェースにI2CやSPIが使われます。仕様書をじっくり読んだ後でも、いろいろなモードがあって、マイコンとセンサなどを接続したときに、正常に通信しているかを確認するのは大変困難です。

 そういう時、通信プロトコルは決まっているので、オシロスコープがデータを解釈して表示する機能がオプションで用意されていることが多くなりました。Mixed Signal Oscilloscopes (MSO)、Mixed Domain Oscilloscopes (MDO)などと呼ばれますが、その機能や表示能力は様々です。

 Analog Discovery2は最初からI2C、SPI、UARTなど低速なインターフェースを観測できます。USB2.0は高速なので対応していません。

I2C-LCDを事例に信号を観測する

 Raspberry Piに液晶ディスプレイをつなぎ、信号を観測します。I2Cインターフェースでつなぐ液晶ディスプレイはAQM1602A(16x2行)もしくはAQM0802A(16x2行)です。電源電圧は3.3Vと5Vのどちらでも動作しますが、消費電力が少ないために、信号線を条件によっては十分駆動できません。

 Raspberry PiのI2Cバスは2系統あって、物理的ピン3番がクロックのSCL、ピン5番ピンがSDAの'1'が使われます。接続して、ターミナルから sudo i2cdetect -y 1 とすれば、バスにつながっているスレーブ・デバイスのアドレスを表示します。

 しかし、AQM1602Aはつないだだけでは正常に反応しません。その理由は、Raspberry Piのピン3番とピン5番が1.8kΩの抵抗でプルアップされているからです。I2Cの二つの信号は、10kΩぐらいでプルアップする事例が多いのですが、1.8kΩではLOW(例えば0.1V)にするためには、

 ( 3.3 - 0.1 ) / 1.8k = 1.8mA

の電流が必要ですが、AQM1602Aは流せないのでLOWにできないと思われます。

 I2Cではマスタ(ここではRaspberry Pi)のコマンドを受け取ったらSDAラインにACKを返します。ACKはLOWです。けれど、ACKが返ってきたとマスタは判断できないので、通信は失敗します。

 詳しくは、こちらのページを参照してください。その対策方法もそのページに書いてあるように、バス・リピータを途中に入れます。バス・リピータPCA9515ADをセットにしたAQM0802Aも購入できます。

Raspberry PiとAQM1602Aの接続

 通信できないのでは、オシロスコープでは観測できないので、SDA信号を3kオームの抵抗でプルダウンします。これで、強制的にACKをLOWにします。もちろんHIGHの信号自体も電圧が下がってしまいますが、最小2.31V以上であれば、ロジックのHIGHレベルとみなされます。

 次のように接続して、SDAとSCL信号をそれぞれAnalog DiscoveryのChannel1とChannel2につなぎます。また、同じく、Digital I/Oの0,1をそれぞれつなぎます。

Analog DiscoveryのScopeでアナログ信号とディジタル信号を見るための設定

 Scopeを立ち上げると、アナログの2本の信号が表示されます。

 メイン・メニューのViewからDigitalを選びます。

 アナログ信号の下に新しいエリアができます。Click to Add channelsの前にあるプラスの記号をクリックします。

 プルダウン・メニューの中にあるI2Cを選びます。

 I2Cの信号が、Analog Discoveryのどの端子かを指示します。

 

 見やすように画面を調整します。テスト・プログラムを走らせます。LCDには数字の’1’を連続して書き込みます。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import time
i2c = smbus.SMBus(1) # 1 is bus number
addr02=0x3e #lcd
_command=0x00
_data=0x40
_clear=0x01
_home=0x02
display_On=0x0f
LCD_2ndline=0x40+0x80
# 初期化+画面初期化 LCD AQM1602
i2c.write_byte_data(addr02, _command, 0x38)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, 0x39)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x14)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x73)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, 0x56)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, 0x6c)
time.sleep(0.2)
i2c.write_byte_data(addr02, _command, _home)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, _clear)
time.sleep(0.1)
i2c.write_byte_data(addr02, _command, display_On)
time.sleep(0.1)

#test
while 1:
         i2c.write_byte_data(addr02, _data, 0x31)
         time.sleep(0.2)

 下側のディジタル信号表示エリアには、I2Cの信号を解析した結果の16進コードが表示されています。

 上のアナログ信号エリアでは、中途半端な電圧になっているSDAの信号レベルが読み取れます。

 アナログとディジタル信号のプロトコル解析能力により、トラブルを早期に発見できます。

 

Makersには欠かせないマルチ測定ツールAnalog Discovery 2

(1) オシロスコープと発振器 その1 プローブの校正

(2) オシロスコープと発振器 その2 トリガ

(3) オシロスコープと発振器 その3 測定例

(4) オシロスコープと発振器 その4 MSO

(5) オシロスコープと発振器 その5 表示/演算機能

(6) オシロスコープと発振器 その6 ネットワーク・アナライザ

(7) オシロスコープと発振器 その7 インピーダンス・アナライザ