« FEZ Domino Tips (3) - USB Host機能の使い方 | トップページ | Ubuntu 10.04をVMware Player 3.1で動かす »

Arduino Ethernet Shieldのパワーオンリセット

ひさびさにArduinoネタを一つ。私のブログにもかつて書いたのですが、ArduinoにEthernet shieldを載せて電源ONした際にリンクアップしないケースが結構あります。この場合、リセットボタンを押すと正常に起動してくれますが、いちいちマニュアルリセットするのは面倒です。この問題の対策について質問をいただきましたので、自分が行っている対策を記載します。

対策には、Ethernet shield側に部品の追加(半田付け)が必要です。電源ピン周りの配線を行いますので、配線を間違うと電源をショートして本体を破損する可能性もあります。そのため、作業は慎重に&自己責任でお願いします。


なぜ電源オン時に起動しないのか - パワーオンリセットの必要性 -

マイコンチップなどは、電源(パワー)オン時に内部状態の初期化を行うために、リセット信号の入力を要求する場合があります。この動作をパワーオンリセットと呼びます。Ethernet shieldでTCP/IPの処理を行っているW5100チップは、以下に示すパワーオンリセット信号を要求します(データーシートの抜粋)。

W5100_RestTiming

上記のように、電源オン後、2μsの期間リセット信号をLowレベルに落とす必要があります。冒頭の問題が発生する原因は、Arduinoがこの2μsのリセット信号を生成していないためです。

以下にArduino Duemilanoveのリセット信号まわりの回路を示します。

ArduinoRestCircuit

赤で囲った部分に注目してください。MCU(ATmega)のRESETピンを10KΩの抵抗でプルアップしてあるだけです。このRESET信号はヘッダコネクタを介してEthernet shieldに繋がっており、W5100チップのRESET信号になっているのですが、この回路だと、電源オンと同時にRESET信号がHigh状態になってしまい、2μsのリセット期間Low状態を保持することができないため、W5100チップが正しく初期化できません。このため、リンクアップしないという異常動作が発生します。リセットSWを押すことで、スイッチを押している間RESET信号がLowレベルに落ちるため、この動作でやっとW5100が初期化され正常動作がスタートします。

じゃあ、MCU (ATmega)はなぜこのリセット回路で問題がないかと言うと、ATmegaは電源オンを検出した際に内部でリセットパルスを生成する機能を持っているためです。言い換えると、W5100はこの機能を持っていないため、外部からリセット信号を入力する必要があります。


RESET信号の作り方

RESET信号を作る方法としては、GLEDシールドの制作で使ったように専用のリセットICを使う方法があります。この方法は一番確実なのですが、Arduino本体もしくはEthernet shieldにリセットICを載せる場所が必要となり実装が困難です。そのため、簡易的なコンデンサー追加の方法を紹介します。

以下の回路図に示すように、リセット回路にコンデンサ(C)を追加します。コンデンサを加えることによって、電源オン(VCC印加)時、コンデンサーを充電する時間分リセットピンの電圧上昇を遅延させることによってリセット状態を作ることができます。

EtherSheildRest

リセットピンの電圧上昇速度は、C(コンデンサ容量) x R(充電電流の制限抵抗)に比例します。このCRを時定数と呼び、1 CR単位時間でコンデンサーをで3.2V(63.2%)まで充電、4 CR単位時間で4.9V(98.2%)まで充電できます。CR単位時間と充電量の関係は以下のグラフとなります。このあたりの詳細はこちらを参照ください。

CR_Curve

W5100チップはリセット端子の電圧が0.8V(VIL)以下をリセット状態とみなすため、0.2CR単位時間までがリセット入力状態となります。今回はC = 0.047uF, R = 10KΩですので、0.047E-6 x 10E3 x 0.2 x1000 = 0.09msとなります。

すなわちCR回路によって、電源ONから90μsの間、W5100チップのREST信号を有効にすることができます。この値は、W5100のリセット信号入力時間である2μsを十分満足します。仮に、もっと長いリセット時間を作りたい場合は、CRの値を大きくすればよいことになります。

最後に、なぜダイオードが入っているかについて説明します。リセット回路に追加したコンデンサーは電源OFF直後は電荷を蓄えており、RESETピンがHighの状態になっています。コンデンサが1μF x 抵抗100KΩ程度のリセット回路の場合、数秒間コンデンサの電荷が抜けずRESETピンがHighのままになります。そのため、コンデンサの電荷が残っている状態で電源を再度ONにした場合、RESETピンがLowに落ちずリセットがかからない場合が発生します。ダイオードを入れることによって、電源OFFの際に、コンデンサーの電荷を電源ライン側にすばやく放電させることによってこの問題を防止できます。

今回の回路では、コンデンサーの容量が小さいため実質的に問題はないと思うのですが、念のためにダイオードも追加しました。私は手持ちの小信号用ダイオード(1S133)を使っていますが、電流容量が小さいため(100mA)、整流用のもっと容量があるダイオードを使った方がよいと思います。


部品の取り付け

コンデンサとダイオードは、Ethernet shieldの端子部分に半田付けします。

先ずは、コンデンサーをEthernet shieldのRESETピンとGNDピンに半田付けします。基板上にスルーホールがあるため、コンデンサーの足がスルーホールに接触しないよう、熱収縮チューブで絶縁します。コンデンサー取り付け後の写真を以下に示します。

CapAdd


次に、RESETと5V(VCC)ピンの間にダイオードを取り付けます。ダイオードの極性には十分注してください。カソードをVCC側に繋ぐ形になります。この極性を間違うと、リセットボタンを押した際に電源が短絡してしまいます。

CapDiodeAdd


効果と制約事項

コンデンサーを追加することによって、私の環境では、Arduino側の外部電源ジャックを抜き差しすることによる電源ONでは、Ethernet shieldが問題なく起動します。何回か外部電源ジャックの抜き差しを繰り返していますが、いまのところ起動できなかったケースはありません。

しかしながら、ACアダプターをACコンセントから抜いて再度コンセント挿入した場合、依然としてEthernet shieldが正しく起動しません(リンクアップしない)。原因としては、ACアダプター出力電圧の立ち上がりがゆっくりで、CR回路によるリセット信号が作れないのだと思います。このケースを救済するためには、自作のGLCDシールドで行ったように、電源電圧を監視して一定レベルに電圧が上がった時点からリセットパルスを作ってくれるリセットICを使う必要があります(GLCDシールドでは、AC側の抜き差しでも確実に起動してくれます)。自分は、AC側の抜き差しはめったに行わないため、純正Ethernet shieldに関しては今回のコンデンサー追加による対策でよしとしています。

« FEZ Domino Tips (3) - USB Host機能の使い方 | トップページ | Ubuntu 10.04をVMware Player 3.1で動かす »

Arduino」カテゴリの記事

コメント

これはオシロボード内蔵のロジアナでトリガをかけてデバッグする部分です。

この直流バイアスが印加される部分は、直流バイアスで静電容量が激しく低下する性質がある(デカップリングが主目的な)積層セラミックではなくて、ポリエチレンフィルムや電解コンを使う必要があります。尚、Sink電流でリセットするので電解コンを使う場合はプルアップ抵抗側がプラスです。またデカップリングは使用する周波数によって100nより10nがインピーダンスが低く効果的な場合があります。

例えば、Arduino Duemilanoveでは、USBブリッジの*DTRとATMEGAの*RESET間に微分回路のコンデンサでパルスを作ってプルアップ電位を落とすことでリセットしていますが、オリジナルはデカップリングも含めて全てポリエチレンフィルムコンデンサですが、互換品はこの直流バイアスが印加される部分が積層セラミックコンデンサである為に誤動作の原因になっています。Up-Load中にオートリセットできずエラーが出るトラブルはおそらくこれだと思います。

欲を言えば、微分回路はノイズに弱いので、スパイクノイズに反応しない時定数のワンショットICで実現すべきです。
また、リセット専用ICを使うと、パワーオン以外に動作中の電源を監視し電圧低下の場合にリセットをかけてATMEGAのEEP-ROMの内容を保護できます。内部外部電源の切替えも専用ICを使うべきです。

お遊び用なので、電源の誤接続で壊されない対策が万全ですが、安定動作させる為の回路にまでコストがかけられないのでしょうね。
日本メーカであっても良く壊れる家電メーカにはこんな知識を持つ人は疎まれて、アマチュア作品と大差ないですよ。

コメントありがとうございました。
今読み返すと分かったような書き方になっていますが、リセット回路にセラコンを使っているあたりにアマチュア工作の馬脚が見て取れるということですね・・勉強になりました。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« FEZ Domino Tips (3) - USB Host機能の使い方 | トップページ | Ubuntu 10.04をVMware Player 3.1で動かす »

2017年2月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        
無料ブログはココログ