Aruduino

2013年9月 7日 (土)

Aruduinoで作るオシロスコープ(4)

九工大簡易オシロスコープ Kyutech Arduino Scope のトリガー機能について実験しながら勉強(お遊び)中です。

これまでにトリガーについてわかったことは↓です。

  1. TRIG mode = normal は、TRIG level、TRIG slope の条件を満たすと画面左から描画し、その後も描画し続け、また、条件に合致すると画面左から再描画するということを繰り返しているらしい。
  2. TRIG mode = single は、TRIG level、TRIG slope の条件を満たすと一画面分だけサンプルを取り、画面左から描画して停止する。次に条件を満たす波形が来ても再描画することはない。最初に条件を満たした波形だけを表示しているらしい。
  3. TRIG mode = auto は、 トリガーと関係なくひたすらAD変換した値を描画し続けているらしい。
トリガー以外で大事なことは↓でした。
  • Arduino のアナログ入力はプラスの電圧のみなのでマイナスに振れる場合は工夫が必要。
まだ、わからないこと(わからないと気がついていること?)は↓です。
  • 簡易オシロスコープ Kyutech Arduino Scopeのページにある「トリガ用機能回路」 って何?何してるの?
  • トリガの外部入力はちゃんと機能するの?
  • delayは、トリガーイベントから実際に掃引開始するまでの遅れらしいけど、確かめていない。
トリガーの外部入力の確認と1,2,3の再確認を兼ねて外部からパルスを入れて、これをトリガーにしてみました。Kyutech Arduino Scope は、Arduino UNOで動かし、パルスの発生には、Arduino Leonardo を使いました。Arduino Leonardo のデジタルピンを1m秒の間Highにして、5Vピークの矩形波を簡易オシロスコープ Kyutech Arduino ScopeのページにあるEXTトリガ入力へ入れてみました。測定対象は、 Aruduinoで作るオシロスコープ(3) のときと同じWaveGeneの出力をPCのヘッドフォン端子から出力し、抵抗分圧で作った約2.5Vの仮想グランドで嵩上げしたものをKyutech Arduino Scopeチャネル1で測定しました。結果はこうなりました↓。
TRIG mode = auto は、 Arduino Leonardo からの入力とは関係なくひたすらPCのヘッドフォン端子から出力される正弦波を描き続けました。上の3が正しいことが確認できました。
TRIG mode = normal はArduino Leonardo から矩形波を入れると描画されて波形が停止し、次にまた矩形波を入れると再描画されて波形が停止しました。上の1.のとおりと確認できました。
TRIG mode = single はArduino Leonardo から矩形波を入れると描画されて波形が停止し、次にまた矩形波を入れても再描画されることはありませんでした。上の2のとおりと確認できました。そのときのスクリーンショットです↓。

Kyutechscopeext

チャンネル2で、外部トリガーをモニタしています。外部トリガが立ち上がったところでチャンネル1のWaveGeneからの正弦波の掃引が始まっています。そして、波形上部の赤い部分に表示されているとおり一画面分描画したところで掃引が停止しています。

ここで、横軸の目盛を変えてみます。一目盛200マイクロ秒にしてみます。

Kyutechscopeexthorz

チャンネル2(CH2)の外部トリガの波形を見てみると、横軸の一目盛は200マイクロ秒なので、900マイクロ秒分しか描画されていないことがわかります。矩形波は、1ミリ秒(1000マイクロ秒)Highになるように作っていますので、どうやらdelayで指定されているとおりトリガ検知から100マイクロ秒後から掃引されていりうようです。試しに、delay を 200マイクロ秒に変えてみました↓。

Kyutechscopeexthorzdelay200u

チャンネル2(CH2)の外部トリガの波形を見てみると800マイクロ秒分しか描画されていません。delay は定義のとおりに機能しているようです。

残る課題は↓です。
まず「トリガ用機能回路」のコンデンサと抵抗の真ん中の部分をKyutech Arduino Scope自身でモニタしてみました。常に2.54Vとなっていてトリガがあってもなくても、波形が流れていても流れていなくても何も変わらないようです。ここで、2.54Vが気になります。トリガレベルに設定(デフォルト)されている値です。上のスクリーンショットの TRIG level です。さらにきになるのは、Arduino互換機を作りたい(1) で紹介した記事(Arduino’s AnalogWrite – Converting PWM to a Voltage )です。Arduinoの AnalogWite()は、アナログ出力といってもPWM(パルス幅変調)です。この記事は、これをCR回路で平滑化するというものです。「トリガ用機能回路」ってこれではないでしょうか?つまり、九工大のサイトにある回路図のD6は、デジタルI/Oピンとして使っているのではなくAnalogWite()でPWMを出力していて、これをCRで平滑化して、その電圧をA0で読み取ってトリガにしているのではないでしょうか?

ということで、チャンネル2(CH2)でCとRの中間点(D6、A0もつながっている)をモニタしながらTRIG level を変えてみました。

Kyutechscopelevel3v

TRIG level は、3Vです。Kyutech Arduino Scope のチャンネル2、つまり、「トリガ用機能回路」のCRの中間点も3Vになりました(一目盛が1Vで最下段が0Vです)。TRIG levelに設定した電圧がここに現れることから予想が正しいことが確認できました。ところで、なぜこんなことをしているのでしょうか?推測ですがArduinoの機能(AnalogRead())でトリガ波形をモニタしてトリガ電圧を超えたら(fallingのときは下回ったら)何かをするという処理は時間が掛かり過ぎるのでトリガ電圧が印加されているA0ピンとトリガ波形が入ってくるA1、A2ピン(外部トリガならA3ピン)の電圧をAtmega328P-PUの「高速な」何らかの機能で比較してトリガ条件を満たすことを高速に検知しているのではないでしょうか。いずれ確かめてみたいと。

わかったことを改めてまとめるとこうなります。

  1. TRIG mode = auto は、 トリガーと関係なくひたすらAD変換した値を描画し続ける
  2. TRIG mode = normal は、TRIG level、TRIG slope の条件を満たすと画面左から描画し、その後も描画し続け、また、条件に合致すると画面左から再描画するということを繰り返している
  3. TRIG mode = single は、TRIG level、TRIG slope の条件を満たすと一画面分だけサンプルを取り、画面左から描画して停止する。次に条件を満たす波形が来ても再描画することはない。最初に条件を満たした波形だけを表示している。スペースキーを押すと次のトリガイベントを待つ。
  4. 「トリガ用機能回路」は、TRIG levelに指定したトリガ電圧を作っている。
  5. トリガの外部入力を使うことで測定対象のCH1、CH2以外の信号源をトリガにできる
  6. delayは、トリガーイベントから実際に掃引開始するまでの遅れ
  7. Arduino のアナログ入力はプラスの電圧のみなのでマイナスに振れる場合は、グランドを持ち上げる工夫が必要

2013年9月 2日 (月)

Arduino互換機を作りたい(3)

Atmega328P-PUの自動リセット回路を検討します。

Atmega328P-PUは、作って遊べるArduino互換機(鈴木哲哉さん著)やAtmega328PのデータシートによるとRESETピンを2.5μ秒以上Lowにするとリセットされるようになっています。

一方、ArduinoのIDE(統合開発環境)は、ArduinoをRESETする際にシリアルのDTRをアサート(Onにする。負論理なのでLowにするとOn)します。

つまり、シリアルのDTRをAtmega328P-PUのRESETピンへ接続することが必要です。

ところで、これだけ読むと単にシリアル変換アダプタのDTRをRESETへ接続すれば良さそうなものですが、以下の書籍のどの回路図をみてもDTRとRESETの間にコンデンサが入っています。

さらに、Arduino UNO Rev.3の回路図を見ても入っています。0.1μF(100nF)のコンデンサがいます。作って遊べるArduino互換機には、このコンデンサでパルスに変換していると書かれています。

ちょっとLTSpiceでシミュレーションしてみました。

Pwlsetting_2

上のスクリーンショットのようにPWL(Piecewise Linear)でDTRの電圧の変化を定義してシミュレーションしています。

ここでは、時刻0には、5Vで、続く1m秒の間0Vを継続し、次の1μ秒で0Vに落ちて、以後0Vのままという設定でシミュレーションしました。LTSpiceのPWLの設定は、Simon Bramble の LTspice Tutorial: Part 5 に詳細が解説されています。もっと高度な定義もできるようです。

シミュレーション結果はこんな感じです。

Resetcaponly

ブルーの線は、DTRの電圧の変動を表していて、グリーンの線がRESETピンに現れる電圧です。1m秒まではブルーしか見えませんがグリーンも全く同じ形で重なっています。

DTRがLowとなった瞬間にRESETも0Vになりますが、徐々にコンデンサに充電されて数ミリ秒後には、元通り5Vになっています。これは、DTR=Highのときには、コンデンサの両端共に5Vで同一電圧であったためコンデンサの両端は電位差がなく充電されていなかったものが、DTRが0Vになったことで、コンデンサの両端の間に5Vの電位差(DTR側0V、RESET側5V)が生じコンデンサへの充電が開始されてコンデンサの両端の間に電圧が生じたためですね。

こういう動作をするコンデンサを意図的にここに入れているということは、単にリセットする際にRESETピンをLowにするだけでは、何か都合が悪いか、お行儀が悪いということでしょうね。Lowにして、2.5μ秒以上Lowを維持して、その後、Highになるとリセットされるという方が納得がいく気がするのですが。

ということで、改めてAtmega328Pのデータシートを見てみると「11.4. 外部リセット」にこんな記述がありました。

外部リセットはRESETピンのLowレベルによって生成されます。

(中略)

印加された信号の上昇がリセット閾値電圧(VRST)に達すると(遅延タイマを起動し)、遅延タイマは遅延時間(tTOUT)経過後にMCUを始動します。

どうやらリセットという言葉は再起動までは含まないんですね。(「リセット」という言葉自体は再起動を含んでいるようです。ただ、文脈によって「リセットを開始する」ということを「リセットする」と書いてあったり、再起動まで含めて「リセットする」と書いてあったりするので混乱してしまいました。こちらは英語版のATMEGA328Pのデータシートですが、p.48のFigure 11-4. External Reset During Operationに描かれているRESETのタイミングを見ると一目瞭然です。)再起動させるためには、RESETをHighにする必要があるようです。これで、コンデンサの存在理由がすっきり。

ということで、DTRをRESET(1番ピン)に接続して、負論理(LowでOn)なので、5Vにpull upして、さらに手動リセット用のタクトスイッチも追加するとこう↓なります。

Reset2

でも回路図をじーっと見つめているとふとした疑問が。。。コンデンサが充電されて5Vになった後でDTRがHighになったらどうなるのでしょう?コンデンサの両端の間の電圧5Vは、コンデンサのDTR側を基準にした電位差ですので、ここがGNDに対して5VになったらコンデンサのRESET側は、5V+5Vで10Vでは?

え、ホント?ということで、またまたLTSpice登場です。

Resetcaprevert

DTRが時刻0には5Vで、1m秒の間5Vを継続し、その後、1μ秒で0Vになって、それを3m秒継続して、次の1μ秒で5Vに戻るというシナリオです。

やはりDTRがHigh(5V)に戻った瞬間RESETピンは、10V近くになっています。

Atmega328Pのデータシートの図11-1 リセット回路構成には、「スパイク除去」という回路がRESETピンとRESET回路の間にあり、これが保護してくれて不具合の心配はないのかと思って調べたらこちらにAtmegaがハングすることがあるとの記述が。

対策として、RESETをpull upしている抵抗 と並列にダイオードを逆向きに入れるという手があることが書かれていました。

つまり、こういうことですね↓

Resetcapdiode

回路図とシュミュレーション結果です。DTRの電圧変動のシナリオはコンデンサーだけのときと同じです。だいぶ軽減されています。RESETピンの電圧が5V+シリコンダイオードの順方向電圧(0.6V)を超えるとダイオードを経由して電源V2へ一気にコンデンサーが放電して極端な高電圧になることを防いでくれるということでしょうか。ところで、Atmega328Pのデータシートの図11-1 リセット回路構成を見ていると、RESETピンの内側で30kΩ~60kΩでpull upされています。ひょっとして、外でpull upしなくていいのでは?という気もしますが、Arduino UNO Rev.3の回路図を含めてどこで見かける回路図でもpull upしてますので(なぜ必要なんでしょう?という疑問はありつつも)、ここはそのままにすることに。

ということでまとまった回路図は↓です。

Resetavccupdated2

(追記:2013/9/4)

上のシミュレーションと回路図では手持ちのシリコンダイオードを使っていますが、順方向電圧降下が小さいショットキーバリアダイオードの方がさらに良いかと。

(追記ここまで)

(追記:2013/9/4その2)

シミュレーションにかなり適当(いい加減)なところがあることに気が付きました。DTRが立ち上がってきた時にRESETピンの電圧がどの程度上昇するかは、DTRが立ち上がるスピード、コンデンサーの応答、これらと密接に関連しますが、ダイオードを追加した回路の方であればダイオードの両端の電位差が順方向降下電圧を超えるまでの時間、超えてから電気が流れ始めるまでの時間に依存するはずですが、これらについては全く吟味していません。例えば、DTRが5Vになる時間がコンデンサの放電開始よりも早く、ダイオードの通電よりも早ければダイオードを入れた意味はなく、RESETピンの電圧は、10Vになるはずです。それから、ダイオードの選定ですが、手持ちの小信号用ダイオードを何も考えずに入れていますが大丈夫でしょうか?1N4148のデータシートを見ると「Non-repetitive Peak Forward Surge Current」という気のなるデータが。Pulse Width = 1.0 microsecond のとき、4.0A との記述が。DTRが立ち上がってきたときにダイオードを流れる電流がこれを超えるとまずそうです。コンデンサーに蓄積されている電荷Q = 0.1μF x 5V = 0.5μC (で、あってます?)。仮に1m秒で放電するなら0.5μC x (1/1m秒) = 0.5mA となります。大丈夫そうです。でも、1m秒かけて放電するという根拠は(くつしたねこの知識の中には)まるでないので、仮に1μ秒だったら0.5Aとなります。もう一桁くらい余裕がありそうですが、さてどうなんでしょう。こちらでは、同じダイオードを入れてからはトラブルがないとのことですので、とりあえず真似ておきます

(追記ここまで)

手動リセットの場合のシミュレーションもしておきます。LTSpiceに機械接点のスイッチは無いようですので、電圧制御スイッチ(Voltage controlled switch)で代用してみました。電圧が設定した閾値を超えるとスイッチがオンになり、閾値以下となるとオフになる部品です。使い方の詳しい説明は、キットと初歩の電子工作 LTSPICE入門 アーカイブ ー LTSPICE入門(27) 電圧制御スイッチについて で詳しく解説されています。それで、シミュレーション結果はこれ↓です。

Resetcapdiodesw

スタートから1m秒後にスイッチがオンになり、さらに1m秒後にスイッチがオフになるシナリオです。問題ないようです。

つづく

(追記:2013/09/03)

これまで20番ピン(AVCC)は何も考えないで電源にだけつないでいました。このピンは、ADコンバータの電源を供給するピンです。電源なのでパスコン入れるかなと思って一応データシートに何か書いてあるか見てみました。そして、ATMEGA328Pのデータシートには、こんな記述がありました。

1.1.7 AVCC

AVCC is the supply voltage pin for the A/D Converter, PC3:0, and ADC7:6. It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter.

ローパスフィルタを経由して、VCCにつなげとのことです。ということで、AVCCを電源につなぎつつ、グランドとの間にバイパスコンデンサをつなぐことにして、修正した回路図がこれ↓です。

Resetavccupdated

(追記ここまで)

それでは、また!

2013年9月 1日 (日)

Arduino互換機を作りたい(2)

製作するArduino互換機のクロック供給回路はできた(はずなの)で、次はPCとの通信部分です。

うちのPCにRS-232Cは無いので、USBシリアル変換回路を載せます。最終的にはFTDIのFT232RLチップを載せるつもりですが手持ちがないのと、最初はブレッドボードに組みたいので、まずはスイッチサイエンス社のFTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) を使うことにします。この製品もFT232RTを使っています。変換アダプタの回路図はこちらです。 が、使い方の詳しい説明が見つからないのでFT232RLのデータシートをあたることに。気になるのはVCCIOピンの扱いです。データシートの説明からVCCIOは、外部のロジック回路とインターフェースする電圧の決定に使われるようです(VCCは、FT232RTそのものを駆動する電源です。スイッチサイエンスの変換アダプタでは、USBのVBUSに接続されています)。

アダプタボード上のジャンパJP1の2番ピン、3番ピンをショートするとVCCIOがUSBバスパワー(VBUS)の5Vにつながり、CMOSレベル(5V)でインターフェースされることになります。また、VCCIOは、外部ロジックへのコネクタJP2の4番ピンにも出ていますので、外部ロジックはこの4番ピンからUSBバスパワー(VBUS)を電源として利用できます。Atmega328P-PUは、5Vなので、今回はこのパターンが使えそうです。

それから、FT232RLのコアは、3.3V動作で、VCCに印加された5Vから内部のレギュレターで作っています。これは、FT232RTの3V3OUTピンに出ていますが、変換アダプタのJP2には引き出されていません。でも、JP1の1番ピンにつながっていますので、これをArduino互換機本体側で使うこともできそうです。ただし、FT232RLのデータシートによれば取り出せる最大電流は、50mAとのことなので、何かを駆動するのは難しそうですが、USBバスパワーとACアダプタ電源の自動切り替えをする場合には、切り替え回路でACアダプタから電力が供給されているかどうかを調べるコンパレータの参照電圧としては使えそうです。AREFの参照電圧にも使えそう。

なお、JP1のジャンパの1番ピン、2番ピンをショートするとVCCIOが、内蔵レギュレターで作られた3.3Vが出力されている3V3OUTピンにつながり、TTLレベル(3.3V)でインターフェースされることになります。

その他のピンの結線ですが、FT232RTのデータシートの「7.4 USB to MCU UART Interface」から、データ転送に使用するRXは、相手のTXと、TXは相手のRXと結線します。また、ハードウェアハンドシェイクに使用するRTSとCTSも互い違いに接続します。と思ったら、Atmega328P-PUには、RTSとCTSがありません。さらに、USBシリアル変換アダプターもRTSはコネクタJP2に引き出されていません。RTSは出力ですが受け手がいない(AtmegaにCTSがない)ことと引き出されていないものは対処する必要もないので放っておくとして、CTSはどうしましょう。データシートを見るとCTSは負論理(LOWだとON)みたいですので、GNDに落として常に送信可(Clear to Send)であるということにしておきます。CTSは入力ですので、相手(のRTS)がいないにしても自分で見る可能性があると思うので。

ここまでわかったことから、USBシリアル変換アダプターとAtmega328P-PUの接続は

  • USBシリアル変換アダプターのRX(受信データ)をAtmega328P-PUのTX(送信データ)
  • USBシリアル変換アダプターのTX(送信データ)をAtmega328P-PUのRX(受信データ)
  • USBシリアル変換アダプターのVCCIOをAtmega328P-PUのVCC、AVCC
  • USBシリアル変換アダプターのCTS、GNDをAtmega328P-PUのGND

へ接続することとなります。

絵にするとこうなります。電源をUSBバスパワーとすることも補足しています。

Usb

ここまでの回路は以下の書籍も参考にさせていただきました。

 

なお、最初の2つは、CTSは宙ぶらりんのままとしています。3つめの書籍は、GNDへ落としています。3つめを真似させていただきました。 

さて、DTR(Data Terminal Ready)が未結線のままです。これはATMEGAのRESETに関係しているのですが、これはまた今度。

Arduino互換機を作りたい(1)

Arduinoで作る簡易オシロスコープ(Kyutech Arduino Scope )なかなか面白いので、専用のArduino互換機が欲しくなってきました。このまま、Arduino UNO を専有されているのもなんだし。ということで、Arduino & 電子工作の勉強も兼ねて互換機製作にとりかかろうかなと。

ということで、まずは簡単な設計を。
目標としては、Kyutech Arduino Scope が動けばいいかな。
Kyutech Arduino Scopeの動作条件は、5VでかつAtmega328が載っているということなので、マイクロコントローラは、手持ちもあるAtmega328P-PUを採用。
最初は電源周りの設計をと思ったんだけどUSBバスパワーにするかACアダプタにするか迷っているので、5V電源はあるものとして、Atmega328P-PUへ電源をつなぐところから。
Photo
たのしい電子工作 Arduinoでガジェットを作ろう (高橋隆雄さん著)という書籍に出ていた互換機の回路図を参考にさせていただきました。ただし、書籍では21番ピンのAREF(アナログ・デジタル変換の参照電圧)ピンをVCC(7)、AVCC(20)とともに5V電源に接続する設計になっていましたが、低い電圧を精度良く測るために使いたくなるかもというとで電源には繋がないことにしました。後でソケットヘッダーへ出します。Arduino UNOはデフォルトでは、内部の5Vを参照電圧として、10ビット、1024段階で入力電圧を表現しますが、他に内部の1.1Vを基準にする方法と、AREFに入力した外部参照電圧を基準にする方法とがあるようです。Tutorial: Arduino and the AREF pin に詳しい説明があります。参照電圧を変えたい場合は、
  • analogReference(INTERNAL);  - 内部 1.1V 参照電圧を選択
  • analogReference(EXTERNAL); - AREF pin に入力された外部参照電圧を選択(DC 0V から 5Vである必要がある)
  • analogReference(DEFAULT);   - 内部 5V 参照電圧に戻す
を呼べばよいようです。
こんな楽しそうなサイト(Arduino’s AnalogWrite – Converting PWM to a Voltage )がありました。ArduinoのAnalogWrite()は、本当のアナログ電圧を出力するわけではなく、PWM(パルス幅変調)で、電圧そのものを変えるのではなく、電圧をかけている時間の長さを調整することで擬似的なアナログ出力をしています。このサイトの記事では、このPWMの出力を抵抗とコンデンサのローパスフィルターで平滑することについて詳しく扱っています。これでArduino互換機自身で参照電圧を作ってAREFにいれてみようかな。
ただ、Kyutech Arduino Scope が対応しているかどうかは確認していません
水晶振動子とグランドの間のコンデンサの容量の決め方は、水晶振動子の仕様の用語解説:<6> 負荷容量 ( CL ) - Load Capacitance –にありました。手持ちの水晶振動子は、秋月電子のこれで負荷容量は、20pFです。基盤側の浮遊容量を上のページの例にある5pFにすると上の回路のコンデンサは30pFになるのですが、  浮遊容量は作ってみなきゃわからないのと、かなり幅があるようなので、書籍の値 22pF のままにすることにしました。マージンはどのくらいあるものなのでしょう?

2013年8月25日 (日)

Aruduinoで作るオシロスコープ(3)

九工大さんの簡易オシロスコープ Kyutech Arduino Scope で相変わらず遊んでます。GR-SAKURAで生成した矩形波だけ見ていても、トリガーが理解できないのでちょっと違う波形を見てみたいと。真っ先に思いつくのは正弦波だけど、どうやってArduinoに入力しよう。。。と探していたら、やはり世の中には素晴らしい人が。efuさんという方がテスト信号発生ソフトの WaveGeneというものを作って公開してくださっていました。こちらからダウンロードさせていただきました。Windows上のアプリから内蔵スピーカやヘッドフォン端子から様々な波形を出力することができるものです。

起動するとこんな感じです。 

Wavegenesin100hz
ここでは、100Hzの正弦波をLチャンネルから出力しています。
PCのヘッドフォン端子の3.5mmステレオミニジャックにケーブルを挿してステレオミニプラグケーブル経由で Arduino に信号を入れます。プラグの根本からGND,R,Lですので、根本のGNDをブレッドボード上で Arduino のGNDと接続し、先端のLに Kyutech Arduino Scope の CH1のプローブを接続します。
そして見えたのはこんな感じ。

Scopesin100hznobias

がーん!
正弦波の上半分しか見えていません。。。。Arduinoのアナログ入力は、0Vからプラス5Vなのでこなるんですね。
それはそうとトリガーとは何?の方をもう少し追求。

Scopesin100hznobiasnormal254v

これ↑は、TRIG mode を normal に変更したところ。「waiting」のまま動かず。WaveGeneはちゃんと正弦波出してます。やっとトリガーの秘密に近づいたか?
これって、トリガーが引かれなくて「waiting」してるってことですよね?ということは、TRIG level 2.54Vというのが気になります。slop 「rising」ともあるし。これって、電圧が2.54Vを下から上に届いたらトリガーを引く、測定するってことでは?
ということで、TRIG level を変えてみました↓。

Scopesin100hznobiasnormal030v

振幅が、0.4V-0.5V程度なので、TRIG level = 0.30Vにしてみたところです。「running」になって波形が表示されました。電圧が、下から上がってきて(slope=rising)0.30Vになったときにトリガーが引かれて測定が開始されたみたいですね。risingの意味を確かめるために slope=fallingに変えてみます↓。電圧が上から下へ落ちてきて0.30Vになったときに測定が開始されると期待。

Scopesin100hznobiasnormal030vfallin

期待どおりのようです。
ちょっとここで、振幅が小さくて波形がみすぼらしいので調整。CH1のvolts/divを 1.0V/div から 0.1V/div へ変更します。ついでに TRIG level も 0.12Vに変えてみます。slopeはrisingです。

Scopesin100hznobiasnormal012vscalin

見やすくなりました。上の画像では、0.12Vから描画されていませんが、実際の画面では、0.12Vから描画されたり上の画面のように遅れたりを交互に繰り返しています。原因はよくわからず。わかったのは、normal では、完全に波形を止めて観察しているわけではなくて、継続的にTRIG level と TRIG slopeを満たすと描画が開始されるようです。それで、「running」なんですね。
スペースキーを押すと、測定が止まり表示される波形も固定されます↓。

Scopesin100hznobiasnormal012vscal_2

止めると、TRIG levelの 0.12Vで(始まる波形で)止まるようです。
さて、ここで100Hzっていうのもなんだな~ということでWaveGeneで生成する正弦波の周波数を1KHzにしてみます↓。

Wavegenesin1000hz

上は、wavegenのスクリーンショットです。

Scopesin1000hznobiasnormal012vscali

じぇじぇ。凄いノイズですね。下側のグラフは、FFTしたものですがなんか凄いことになってます。正の電圧しか測れないArduinoのアナログ入力に0Vを中心とした交流信号を送り込むのはこの辺でやめておきましょう。

ということで、こんな↓回路を組んで入力交流信号に直流電圧の下駄を履かせることに。

Biascircuittrim

LTSpiceで作った回路図です。V1は、Arduino の5V端子を使います。V2が信号源でPCのヘッドフォン端子のLチェンネル。単純な抵抗分圧回路で5Vから2.5Vを作って入力がマイナスにならないようにします。先程のKyutech Arduino Scopeの測定だと、正弦波の上半分で振幅は0.5Vないくらい。全部見えても1V程度と推定。ちなみに、PCの音量は最大が50のところを40で出力しています。コンデンサは、直流成分がPCへ流れ込まないように。こういうときの静電容量の決め方がわからないので、LTSpiceでシミュレーションしてみました。

Biascircuitsim

これは、0.1μFのときの波形。これより小さくすると振幅が小さくなり、これより大きくても変わらないで、0.1μFに決定。こういう決め方は邪道な気もするけどとりあえずっと。
それが測定結果です↓。

Scopesin1000hzbiasnormal254vauto

うまくいったみたいです。正弦波が見えています。
これは、TRIG mode=autoです。autoだと波形がどんどん流れていってるみたいですが正弦波だと規則的なので確信持てず。
他の波形を試す前に、TRIG mode=normal にしてみます↓。

Scopesin1000hzbiasnormal254vnormal

前と同じようにTRIG levelのあたりで繰り返し表示しているようです。
TRIG mode=singleにしています↓。TRIG level も 2.60Vに変更しました。

Scopesin1000hzbiasnormal260vsinglew

これは、まだwavegeneから正弦波を入れていない状態です。waitingとなっています。TRIG level に達していないので測定が開始されていないんですね。
wavegenから正弦波を入力します↓。

Scopesin1000hzbiasnormal260vsingles

ただちに stopped となって波形が表示されました。TRIG level=2.60Vとslope=risingの条件が整ったので波形を止めて表示しているんですね。
CH1のvolts/divとpositionを調整して見やすくするとこんな感じです↓。

Scopesin1000hzbiassingle266vstopped

ということで今日わかったことは
  • Arduino のアナログ入力はプラスの電圧のみなのでマイナスに振れる場合は工夫が必要。
  • TRIG mode = normal は、TRIG level、TRIG slope の条件を満たすと画面左から描画し、その後も描画し続け、また、条件に合致すると画面左から再描画するということを繰り返しているらしい。
  • TRIG mode = single は、TRIG level、TRIG slope の条件を満たすと一画面分だけサンプルを取り、画面左から描画して停止する。次に条件を満たす波形が来ても再描画することはない。最初に条件を満たした波形だけを表示しているらしい。
  • TRIG mode = auto は、よくわからないが トリガーと関係なくひたすらAD変換した値を描画し続けているような感じがする。
ということでした。

今日は、ここまで。

2013年8月11日 (日)

Aruduinoで作るオシロスコープ(2)

Aruduinoで作るオシロスコープ(1)でセットアップした九工大さんの簡易オシロスコープ、Kyutech Aruduino Scope でちょっと遊んでみた。オシロスコープのトリガーというものが、全くわかっていないのでちょっといたずらしてみることに。何かわかるかな?

トリガー回路(ここの「Aruduinoの回路」に描いてある回路です )の結線を抜いて、どうなるのか見てみることに。
前回同様に、GR-SAKURAの13番ピンを10m秒毎にHigh/Lowと変化させて、これをチャネル1で測定。


すべて結線(GR-SAKURAの電源投入前)
「サンプリングモードとトリガーの効き」欄(画面左上):real freerun
トリガーレベル:trig /- 2.54V(画面左及び右のTRIG、level欄)
D6(A0)点の電圧:2.30V(テスタで測定したR,Cの中間点の電圧値)


すべて結線(GR-SAKURAの電源投入後)
「サンプリングモードとトリガーの効き」欄(画面左上):real triggered
トリガーレベル:trig /- 2.54V
Highの電圧:3.30V(マウスカーソルを合わせて表示させた)
D6(A0)点の電圧:2.30V(テスタで測定したR,Cの中間点の電圧値)
時間軸の設定を50ms以上とすると、波形表示部の先頭がHighだったりLowだったりと不安定に入れ替わる。


A0(のみを)を抜いた時
「サンプリングモードとトリガーの効き」欄(画面左上):real triggered
トリガーレベル:trig /- 3.23V(time/div = 2ms/div デフォルトのとき)で安定
  • 時間軸の設定を50ms/divとすると、0V~3.5Vの間を不安定(激しく)変化する(100ms以上も同様)
  • 時間軸の設定を20ms/divとすると、3.16Vで安定
  • 時間軸の設定を10ms/divとすると、3.19Vで安定
  • 時間軸の設定を5ms/divとすると、3.16Vで安定
  • 時間軸の設定を1ms/divとすると、0.73V~2.46Vの間を不安定に変化する
  • 時間軸の設定を500us/divとすると、0.50V~2.46Vの間を不安定に変化する(電圧が低い状態にある確率が高い)
  • 時間軸の設定を200us/divとすると、0.32V~2.46Vの間を不安定に変化する(電圧が低い状態にある確率がいっそう高い)
Highの電圧:3.23V(マウスカーソルを合わせて表示させた)
D6(A0)点の電圧:2.30V(テスタで測定したR,Cの中間点の電圧値)
時間軸の設定を50ms以上とすると、波形表示部の先頭がHighだったりLowだったりと不安定に入れ替わる。


D6(のみ)を抜いた時
「サンプリングモードとトリガーの効き」欄(画面左上):real triggered
トリガーレベル:trig /- 2.32V(時間軸の設定の影響無し)
Highの電圧:3.30V(マウスカーソルを合わせて表示させた)
D6(A0)点の電圧:2.30V(テスタで測定したR,Cの中間点の電圧値)
時間軸の設定を50ms以上とすると、波形表示部の先頭がHighだったりLowだったりと不安定に入れ替わる。


A0、D6両方を抜いた時
「サンプリングモードとトリガーの効き」欄(画面左上):real triggered
トリガーレベル:trig /- 3.23V(time/div = 2ms/div デフォルトのとき)で安定
  • 時間軸の設定を50ms/divとすると、0V~4.2Vの間を不安定(激しく)変化する(100ms以上も同様)
  • 時間軸の設定を20ms/divとすると、3.14Vで安定
  • 時間軸の設定を10ms/divとすると、3.21Vで安定
  • 時間軸の設定を5ms/divとすると、3.16Vで安定
  • 時間軸の設定を1ms/divとすると、0.71V~2.46Vの間を不安定に変化する
  • 時間軸の設定を500us/divとすると、0.50V~2.46Vの間を不安定に変化する(電圧が低い状態にある確率が高い)
  • 時間軸の設定を200us/divとすると、0.34V~2.46Vの間を不安定に変化する(電圧が低い状態にある確率がいっそう高い)
Highの電圧:3.30V(マウスカーソルを合わせて表示させた)
D6(A0)点の電圧:2.30V
時間軸の設定を50ms以上とすると、波形表示部の先頭がHighだったりLowだったりと不安定に入れ替わる。

ここまでにわかったこと
  • D6は今回のような測定対象、測定の仕方では結線してあってもなくても違いがわからない。今のところ役割がよくわからない。
  • A0は、結線しないとトリガーレベルが不安定になる。結線してないんだからA0はノイズを拾っているだけだが、A0の値=「トリガーレベル」なのかどうなのか今ひとつわからない。A0を結線しているときにトリガー回路のR,Cの中間点の電圧と等しければ、A0の値がトリガーレベルで、結線してないときは不定だけれど不安定さが条件によって変わるとも言えそうだが、RC中間点のテスタの測定値はA0結線時のトリガーレベルと微妙に違っている。
さて、どうしよう。
これまで、D6(A0)点の電圧は、R,Cの中間点の電圧値をテスタで測っていたけれど、ここを自分自身で測定したらどうなるか。
こうなりました。

Kyutechscopeself

おー、2.54Vでトリガーレベルと同じではありませんか。どうやら、A0の測定値が「トリガーレベル」らしいですね~。しかし、相変わらず「トリガー」は理解できないままに。

名案が浮かばないので、とりあえず、これまでは10ミリ秒毎にHigh/Lowが交代する波形をGR-SAKURAで出してましたが、スピードを速めて遊んでみることに。

100μ秒までは、どうやらちゃんと追随できるらしく面白い展開はなし。そして、10μ秒でついに測定波形が乱れる↓

Kyutechscope10micro

測られれいるGR-SAKURAの方が高速なので、これは、Arduino Uno のせい?
それに、今気が付いたけど左上の「サンプリングモードとトリガーの効き」欄が「real triggered」ではなくて「equiv triggered」になっている。。。これは何?時間軸のtime/divを1ms/div以下にするとequiv になって、2ms以上だとrealみたい。real freerun,real triggered,equiv triggered で3つめ。ひょっとして、10ms交代のときも途中で変わってたのかな?ということで、10ミリ秒交代に戻ってみると↓

Kyutechscope10ms

変わってました。それも同じ1ms/divで。信号の性質とは関係ないんだ。。。

実験開始前より深みにはまった模様。スケッチを読んだりGoogleに聞くとか、教科書読むっていうカンニングをする前にできることをまた考えよう。

(追記)

忘れていた。トリガ回路のRCは、R x C が 0.1秒程度になるように選ばれている。ということは、自分自身の RC の中間点を測定しているときに0.1秒あたりの時間スケールでみてみると何か見えるのだろうか?ということでやってみたが、波形上は特に変わったことはなく、常の2.54Vのままだった。。。しかし、「サンプリングモードとトリガーの効き」欄にまた新たな仲間が。。。。「scan freerun」だそうな↓

Kyutechscopeselfscanfreerun_2

4つめです。これは何でしょう?おまけに。scan freerun になると FFT の signal 欄でチャネルが選べるようになりました。。。さらに深みへ。

次回は、RCの値でも変えてみるかな。。。でも違いが見えない可能性が高い気が。。。

ところで、R x C が秒というも驚きなので簡単次元解析。

R は、R = E/I はオームの法則なのでくつしたねこも覚えている。えーと、Cはというとファラドだけど、これはちゃんと覚えてない。。。けれど、1ボルトあたりに溜め込める電荷というくらい感じだったと思うので、電流の時間積分 ÷ 電圧 ということに。で、

R x C = (E / I) x (I x 秒 / E) = 秒

ということですか。

(追記の追記)

次はこんなことしてみようか。

  • R,Cの値を変える
  • 外にRCの回路を作ってパルスを入れて測ってみる
  • EXTトリガを使ってみる
  • 正弦波とか他の変な波を入れてみる(どうやって作ろうか)
  • 主題とはずれるけど tone()を使って矩形波をつくる
  • analogwrite()のanalogってどんな?ということでanalogwrite()の波形も見よう

2013年8月 4日 (日)

Arduinoで作るオシロスコープ(1)

九州工業大学さんがすばらしいものを公開してくださっています。Arduino簡易オシロスコープ(Kyuteck Arduino Scope) 。コンデンサひとつと抵抗4つの簡単な回路をブレッドボード等に組んで、九工大さんが公開しているArduinoスケッチとProcessingのGUIをダウンロードすれば、くつしたねこのような素人には十分なオシロスコープが完成。

回路の方はこんな感じです。

Kyutechscopecircuit

下に伸びている2本のジャンパー線がプローブ代わり。
次はプログラムです。

九工大さんのサイト からダウンロードして、Arduinoのスケッチをビルド、Arduinoに転送。次に、GUIのProcessingのスケッチを起動すれば無事......あっ、起動しない.....こんなエラーメッセージがでました。

serial does not run in 64-bit mode.

processing.app.SketchException: serial is only compatible with the  32-bit download of Processing.

なんと、Processing は、64bit版ではシリアル通信に対応してないんですね。ということで、Processingダウンロードサイト へ行って、Windowsの32bit版をダウンロードしました。WindowsとLinuxの場合は、32bit版をインストールする必要があるようです。確かめていませんがmac版はProcessinの設定でどちらを使うか指定できるようです(こちら )。

32bit版を入れたら無事起動しました!

Kyutechscope

この画像は、GR-SAKURAの13番ピンを10ミリ秒毎にHigh/Lowを交互に繰り返して出力したところを測定したものです。GR-SAKURAのスケッチは、こんな感じです。

/*GR-SAKURA Sketch Template Version: V1.07*/

#include <rxduino.h>

#define INTERVAL 10

void setup()

{

    pinMode(PIN_LED0,OUTPUT);

    pinMode(13,OUTPUT);

}

void loop()

{

    digitalWrite(13, HIGH);

    digitalWrite(PIN_LED0, HIGH);

    delay(INTERVAL);

    digitalWrite(13, LOW);

    digitalWrite(PIN_LED0, LOW);

    delay(INTERVAL);

}

Kyutech Arduino Scope右上にある「HORZ」の「time/div」(左のグラフの水平目盛の単位)を10msに設定しています。クリックして矢印キーで設定変更することができます。GR-SAKURAのスケッチで10ms毎にHigh/Lowを交代させて、Kyutech Arduino Scopeに綺麗に10ms毎の波形が出ています。楽し~

九工大さん、ありがとうございますm(__)m

さて、これからの課題は、高速な GR-SAKURA を低速なArduino Uno R3で測定しているのは少し間抜けなのでは.....ということと、そもそも、くつしたねこはオシロスコープの使い方を知らないということ

2013年7月28日 (日)

GR-SAKURA:おら3.3Vで動くだ!

さて、1週間放置されていたGR-SAKURA。Aruduino Uno R3 が5Vなのに対して、搭載するマイクロコントローラのルネサスRX63Nが3.3V動作らしい。本当かなということで、テスタで測ってAruduino Uno R3と較べてみることに。

テスト環境はこんな雑な感じで

Testenv_2

左上の桜色がGR-SAKURAで、左下が Aruduino Uno R3。テスターは十数年使っているもので精度だめなんじゃない?と思っていたら3.30Vジャストで表示されました。互いの誤差が打ち消し合ってるかもしれませんが

クラウドWebコンパイラ上で書いてみたスケッチはこんな感じです。

/*GR-SAKURA Sketch Template Version: V1.07*/
#include <rxduino.h>

void setup()

{
 //Arduino互換ピンのデジタル0-13をすべて出力モードに設定
 int i;
 for(i=0;i<=13;i++) {
 pinMode(i,OUTPUT);
 }
 //LED0を出力モードに設定
 pinMode(PIN_LED0,OUTPUT);

}

void loop()
{
 //Arduino互換ピンのデジタル0-13をすべてHIGHに設定
 int i;
 for(i=0;i<=13;i++) {
 digitalWrite(i, HIGH);
 }
 //LED0を点灯して準備完了の合図
 digitalWrite(PIN_LED0,HIGH);
}

このスケッチをビルドして、GR-SAKURAにコピーするとLED0が点灯して準備完了。Aruduino互換のデジタル入出力ピン0番から13番がHIGHに設定されたはずです。

測ってみると。。。

Pin0

最初の画像でも見えちゃってますが、ぴったり3.3V。ピン0から13全部同じでした。本当に3.3Vでした(あたりまえか)

次の画像は、VINピンを測ってみたものです。

Vin

GR-SAKURAのVINピンは、0.00Vになっています。では、Aruduino Uno R3はどうでしょう?

Arvin

4.52Vでした。

そうそう、Aruduino のスケッチはこんなです。後でデジタルピン測りますので。

void setup()
{
    //Arduino互換ピンのデジタル0-13をすべて出力モードに設定
    int i;
    for(i=0;i<=13;i++) {
        pinMode(i,OUTPUT);
    }
}
void loop()
{
    //Arduino互換ピンのデジタル0-13をすべてHIGHに設定
    int i;
    for(i=0;i<=13;i++) {
        digitalWrite(i, HIGH);
    }
}
GR-SAKURAには、LED0 - LED3 の4つの青色LEDがありましたので、LED0を準備完了通知に使いましたが、Aruduino にはありませんので該当するコードは削除しています。Aruduino Uno は、PIN 13にオンボードのオレンジ色のLEDが接続されていますので、これが点灯したら準備完了とみなすことにします。コード上もちゃんと最後にPIN 13がHIGHになり、LEDも点灯するはずですので。

さて、今回は電源をUSBから取っていました。では、ACアダプタをつないだらどうなるでしょう。


Arvin9v

9VのACアダプタをAruduino Uno R3につないだところです。今度は、VINは 8.23Vになりました。Aruduino Uno は、VINは電源に直結されていて、GR-SAKURAは結線させていないようです。GR-SAKURAのハードウェア仕様 によればジャンパーのJ3をつなぐと接続されるようですが「危険」とのコメントがありますね。ちなみに、GR-SAKURAの入力電圧は、5Vですので、Aruduinoから来た方は手持ちの9VのACアダプタをつなぐのは控えた方がいいかもです。

次は、5Vピン。まずは、GR-SAKURAです。

5v

0Vですね。こちらもジャンパーのJ2をつなぐと5Vが供給されるようです(GR-SAKURAのハードウェア仕様 )。Aruduino 用のシールド等を使うときのはJ2が役立ちそうです。

一応、Aruduino Uno の5V ピンも測っておきましょう。

Ar5v

5.04Vでした。ちゃんと5Vかかってますね。

次は、3.3Vピンです。まずは、GR-SAKURAから。

3v

3.30Vですね。こちらはデフォルトでも当然供給されています。

ついでに、Aruduino Unoはというと。

Ar3v

3.29Vということで、こちらもちゃんと3.3V給電されています。

GR-SAKURAのアナログピンとRESETも測ってみましたが全部 0.0 Vでした。
最後に順番が前後しますが、Aruduino Uno のデジタルピンです。

Ardigital

0から13番ピンまで全部測ってみましたが、5.04V でした。

テスター当てまくったらなんとなく意味なく安心な気分になったので今日はここまで

その他のカテゴリー