« 2013年8月 | トップページ | 2015年4月 »

2013年9月

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月 6日 (金)

超簡単!無線マイコン TWE-Lite DIP 動いた!

超簡単!無線マイコン TWE-Lite DIP がやって来た! で紹介した TWE-Lite DIP (トワイライト・ディップ)を動かしてみました。 TWE-Lite DIPには、デフォルトでTWE-ZEROアプリケーションソフトウエアという専用ソフトが予めインストールされています。プログラムを書かなくてもこれを使っていろいろなことができます。基本は、2台のTWE-Lite DIP (トワイライト・ディップ) 間での通信となります。TWE-ZERO自体が無線を通してやってくれることは

  1. デジタル信号の無線通信(DI → DO)
  2. アナログ信号の無線通信(AI → PWM)
  3. UART(非同期)シリアル信号の無線通信(TX → RX)

となります。2台をA、Bとすると、

デジタル信号の無線通信(DI → DO)というのは、

  • Aのデジタル入力ピン(4つ)の状態を、Bのデジタル出力ピン(4つ)に自動的に反映させる
  • Bのデジタル入力ピン(4つ)の状態を、Aのデジタル出力ピン(4つ)に自動的に反映させる

ということです。

アナログ信号の無線通信(AI → PWM)というのは、

  • Aのアナログ入力ピン(4つ)の状態を、Bのアナログ出力ピン(4つ)に自動的に反映させる
  • Bのアナログ入力ピン(4つ)の状態を、Aのアナログ出力ピン(4つ)に自動的に反映させる

ということです。ただし、アナログ出力は、マイコンのご多分にもれずPWM(パルス幅変調)になります。

そして、UART(非同期)シリアル信号の無線通信(TX → RX)というのは、

  • AのTXピン(1つ)の状態を、BのRXピン(1つ)に自動的に反映させる
  • BのTXピン(1つ)の状態を、AのRXピン(1つ)に自動的に反映させる

ということです。

デジタル信号の無線通信(DI → DO)を使った一番簡単な応用例は、Aのデジタル入力ピン1にスイッチをつないで、Bのデジタル出力1にLEDをつなぐものです。

こんな感じです↓

Twelite02

結線は以下のとおりです。

  1. VCCピンを電源のプラス極へつなぎます。TWE Lite DIP の動作電圧は、2.3〜3.6Vですので単3乾電池2本直列を電源にしています(2台とも)。
  2. GNDピンを電源のマイナス極へつなぎます(2台とも)。
  3. 使用しないアナログ入力ピンは、VCC(電源)につなぎます(アナログ入力ピンの状態が変化するのをTWE-Liteが検知するとパケットが送出されるのですが、アナログピンが未結線状態だと値が安定しないため、頻繁に無用のパケットが送出されてしまうこととなるため、これを防ぐための処置です。アナログ入力ピンの状態変化にともなうパケット送出を抑制するように設定を変更することもできます)。
  4. 2台のうちの1台のモード設定ビット(M1)をGNDにつなぎます。TWE-Lite DIPには、親機、子機、中継器の3つのモードがあり、通信には1台の親機と最低1台の子機が必要です。デフォルトでは子機に設定されていますので、1台のみを設定変更して親機にします。3つのモード設定ビットのうちM1ピンをGNDへ接続し、他の2つ(M2ピン、M3ピン)は何もつながないままとします。これらのピンは、プルアップされていて、LowでオンとなるためGNDにつなぐM1ピンのみがオンとなります。これは親機になることを意味します。
  5. 親機のデジタル入力1(DI1)ピンとGNDの間にタクトスイッチを接続します。デジタル入力1(DI1)ピンはデフォルトでは、Highになっています。タクトスイッチを押すとGNDにつながってLowとなります。
  6. 子機のデジタル出力1(DO1)ピンとVCC(電源)の間に抵抗とLEDを直列に接続します。デフォルトでは、デジタル出力1(DO1)ピンは、Highになっていますので電源との間に電位差はなく、LEDは消灯しています。デジタル出力1(DO1)ピンがLow(0ボルト)になると電位差が生じてLEDが点灯します。

この状態でプログラムを作る必要もなく、動作します。

スイッチを押す前の子機の様子は上の写真です。

親機のタクトスイッチを押したところ↓

Twelite03

このときの子機のアップ↓

Twelite04

親機のタクトスイッチを押すことで、親機のデジタル入力1(DI1)ピンがGNDに接続されてLowになります。これを、TWE-ZEROアプリケーションソフトウェア(デフォルトで搭載されている)が、自動的に子機へ転送し、子機のデジタル出力1(DO1)ピンをLowにします。これによって、デジタル出力1(DO1)ピンと電源プラス極(VCC)の間に電位差が生じてLEDがt点灯しました。

簡単に無線通信ができました

超簡単!無線マイコン TWE-Lite DIP がやって来た!

32ビットマイコン搭載の東京コスモス電機の無線モジュール「トワイライト・ディップ秋月さんから届きました。「トワイライト」は、無線モジュールですが、32MHz動作の32ビットRISCマイコン(RAM32kバイト、フラッシュROM160kバイト、EEPROM4kバイト、UART、I2C、SPI、ADC、PWM、パルスカウンタ等の各種I/O))を搭載しています(Arduinoよりスペック上?)。マイコンを搭載しているため、外部に制御用のコントローラを必要とせずにセンサーなどの超小型機器の無線化ができるとのこと。通信距離も見通しで1kmだそうです。すごい!センサーをどこにでもばらまける時代が来たんですね。TWE-Lite DIP (トワイライト・ディップ)は、このTWE-Lite(トワイライト)を2.54mmピッチ28ピンDIP型ICの形状にし、専用ソフトウエアを搭載したものです。専用ソフトウェアが搭載されているためプログラミングなしで無線通信を楽しむことができます。もちろん、自分でプログラムを組んで無線機能付きのマイコンとして使用することもできます。優れものです。しかも安い!

姿はこんな感じです。

Twelite01

マッチ棒のようなものはアンテナです。ハンダ付けが汚いのとアンテナが曲がっているのはくつしたねこが犯人です。TWE-Lite DIPは、完成品と半完成品のキットがあります。完成品はアンテナ、ピンヘッダがハンダ付けされていて、キットはアンテナ、ピンヘッダを自分でハンダ付けします。くつしたねこは、キットにしましたが少し後悔。通信機器のアンテナは命ですのでプロ(か機械)におまかせすべきだったかも。

ちなみに、無線通信で遊ぶので2個買っています。

つづく

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月 | トップページ | 2015年4月 »