Showing posts with label Arduino. Show all posts
Showing posts with label Arduino. Show all posts

June 9, 2012

Arduino における正確な ADC について

Arduinoにおいて、正確なADCを行うにはコツがいるようだ。
AVccの揺れを補償してやる必要がある。

http://hacking.majenko.co.uk/node/57
http://code.google.com/p/tinkerit/wiki/SecretVoltmeter
によると、
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}
という関数を作って、
unsigned int ADCValue;
double Voltage;
double Vcc;

Vcc = readVcc()/1000.0;
ADCValue = analogRead(0);
Voltage = (ADCValue / 1024.0) * Vcc;
という形で、対処してやる必要があるようだ。

_BV()はビットシフトするマクロでREFS0,MUX3,MUX2,MUX1,ADSCは
arduino-1.0.1\hardware\tools\avr\avr\include\avr\iom328p.hに定義されている。


ADC周りのレジスタについては
http://www9.plala.or.jp/fsson/NewHP_elc/AVR/Avr_ADC.html
を参照のこと。

これを踏まえて、readVccにコメントを付けるとするなら、
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);// ARefに1.1Vを出力し,基準電圧1.1Vをアナログ入力チャンネルに指定
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // 変換開始
  while (bit_is_set(ADCSRA,ADSC));// 変換完了待ち
  result = ADCL;// 変換結果取得(下位8bit)
  result |= ADCH<<8;// 変換結果取得(上位2bit)
  result = 1126400L / result; // 1126400 / ( 1024 * 1.1 / AVcc ) = AVcc*1000(mV)
  return result;
}
という感じか。

April 9, 2012

Arduino と W5200 ( WIZ820IO )を接続する3

コレの続き。
W5200へのアクセステスト
34時間目にしてついにスタック!
n=3で2回スタックしたし、一週間も持たずにスタックするとかやっぱり信用出来ない。。。

W5200そのもの、あるいはWizNetのライブラリ、もしくはWebServerスケッチかなぁ?

WebServerスケッチとそれ以外の原因の切り分けのために
W5100搭載のEtherシールドをつけたやつも並行して実験しておこうかな。
結果:
W5200は約50時間(147,714回)でスタック!
リセットして再度実験して50分(2,939回)で再度スタック!
リセットして再度実験して4日と8時間(260,602回)で再度スタック!
リセットして再度実験して2日と20時間(181,085回)で再度スタック…
リセットして再度実験して6日と16時間(359,543回)で再度スタック……
リセットして再度実験して4日と10時間(262,735回)で再度スタック……
W5100は20日以上トラブル無く稼働中(854,712回)!
時間と回数が合わないのは1回が取得+1秒ウェイトである上に、
数十万個のファイルがスクリプトを回しているディレクトリ下に作成されていて、
そのあたりも原因っぽい。こんな長時間まわすと思ってなかった…

どうもWebServerスケッチではなく、W5200かW5200用ライブラリがおかしい。
そしてW5100は安定しておるように見える。

どっから手をつけたもんかなー。
W5200の個体差というか、ハズレ個体なのかもしれんので、
もう一個買ってみるかー。

追記:4/16
実験結果更新


追記:4/22
実験結果更新

March 30, 2012

Arduino と W5200 ( WIZ820IO )を接続する2

ちょっとまえにこんなことをやっていた。
それの続き。

まずはおさらい。

Wiz820ioのピンアサインはこれ。














Wiz820ioとArduinoの接続は以下の表の7本。
Arduino Wiz820IO
3.3V VIM3.3
GND GND
RESET nRESET
D10 nSS
D11 MOSI
D12 MISO
D13 SCLK













入手はココ
ソフトのArduino1.0用ライブラリのDLはココ

で、前回は接続してライブラリが動く、ところまで確認した。
課題として残っていたのは、
「Wiz820ioに負荷をかけると一時間程度で死んでしまう」という点だった。
今回はこれを解決する。

解決の糸口としては、
「ライブラリに問題があるんじゃね? by マイコン風雲録さん」
が有力な気がするので、ここから手を付ける。

まず、素のW5200ライブラリだとどんな感じなのか、もう少し詳しくチェックする。
ExamplesのWebServerをロードして、Linuxから
$ watch --interval=1 wget 192.168.1.177
で一秒に一回データを取りに行き続けることで負荷をかける。

結果:
12時間ぶっ続けで負荷をかけても異常なし。
あれ????
1月にやった時は確かに不安定だったんだけどな????
前回、今回の差分とすれば、母艦がWindowsかLinuxか、という点と気温ぐらいしか…
(Arduinoは1.0のままだし、WizNetもライブラリの更新とかしてない、タイムスタンプ的には。)
Linuxに切り替えるのも面倒だし、気温依存とか考えたくもないな…

よし。あれは気のせいだった!「勝ったッ!第3部完!」
いや、えー…気のせいじゃないと思うんだけどなぁ…

諦めきれずArduinoへの電源供給をACアダプタに切り替えて、再度実験したところ、
3時間弱、10630回アクセスした所でスタックした!!!!
おー。ACアダプタがキーなのかはわからんが、ともかく不具合は再現するな。
よーしよしよし。イイコだ。不安定だな!!!!

さすがにn=2で何かを語るのもあれなので、
そのまま、もう一回トライ。
おおおお、24時間たっても異常なし。

一番面倒なタイプの障害っぽい雰囲気。なんだこれ。。。
商用電源が揺らいだ、とかそういうのかなぁ?一応実験施設なので電源は安定してると思うんだが。

これ、シリアルコンソールつないでエラーだしておくと詳細分かる可能性があるな。
あと、W5200のresetをAVRのデジタルIOにつないでおいて、
スタックした場合にW5200のみリセットして初期化、とかそういうので切り分けてみようかな。

(追記:4/2)
とりあえず、34時間でスタックしたので、やっぱW5200だめっぽい。
特定個体の問題である可能性もあるので、もう一個買ってみよう。
というか、W5200ってリビジョン変わったりしてるんだろうか?

(追記:4/9)
とりあえず、W5100とならべて、10日ぐらいテストしてる。
http://mogtechblog.blogspot.jp/2012/04/arduino-w5200-wiz820io-3.html
もりもりW5200が固まるので難儀している。
ハズレ個体かもしれないので、他に買ってみるかなー。
なにか情報ないもんかなぁ。。。

January 5, 2012

Arduino と W5200 ( WIZ820IO )を接続する


追記(2012/03/24):
なんか急にアクセスが増えてきたので、フォローをしておくと、
http://avr.paslog.jp/article/2361305.html
こんな話もあって、この対策を取ると安定する可能性がある。まだ試せてない。
3.3V系のArduinoとつないで動かす場合に下記の問題が発生しない、という話もある。
その辺をまとめて丸っと検証したいが時間がないなう。
追記(2012/03/30)
ココで検証はじめました。
やっぱりなんか怪しい。
ArduinoのOfficialEthernetShieldにはWizNet社の W5100 が採用されている。
W5100のパッケージは0.4mmピッチのQFP80pinである。
私は不器用なので基板を自作する際、0.4mmピッチは実に辛い。

ところでW5100 はSPI接続とバス接続のいずれかが選択できるようになっているが、上記シールドではSPI接続を選択している。
よって実はArduinoとW5100は高々7本のラインでしか接続していない。
しかし0.4mm,80pinものハンダ付けを”強いられているんだ!!”

これは不合理なので同社製の W5200 に乗り換えたい。
こちらはW5100のSPI接続専用版で0.5mmピッチのQFN48pinである。(多少スペックが上がっていたりもする)
QFNである点はイマイチだが0.5mmピッチになり、かつpin数も半分程度になる。
ぜひW5200に乗り換えるべきである。

さて、ここで問題になるのは2点。
・標準ライブラリこそがArduinoの売りであるためEthernetライブラリからはW5100と同等にみえなければならない
・動くか判らんうちから基板をおこすのは怠い

まず後者を金で解決する。こことかここで評価用基板( WIZ820IO )がうっている。
OfficialEthernetShieldと比べると半値以下だ。

そして前者の解決策はここにある。
そう、ベンダー自らArduinoでW5100と同様に使えるようライブラリを提供してくれているのだ。
Downloadタブの中に"Library for Arduino + Ethernet ( IDE ver1.0 )"があるのでこれをDLして所定の位置に展開・上書きすれば良い。

ただしこれを上書きしてしまうと、W5100へのアクセスが出来なくなりそう。
W5100とW5200の切り替えが出来ると良いなぁ、とおもうのでそのうち手を入れて適当に公開することにしよう。

というわけで、SPI系をまるっと接続したら即動いた。 拍子抜け過ぎる。
写真の左、Etherのケーブルが刺さってるコネクタだけのように見えるのがWIZ820IOである。


追記(2012/01/06):
どうも挙動が安定しない。
ExampleのWebServerをそのまま入れて、watchコマンドで5秒に一回取得してみると、1時間ぐらいで死んでしまう。こまった。
オフィシャルの方でも実験してみて再現するならEthernetライブラリの問題。
しないならW5200あるいは入れ替えたW5200用Ethernetライブラリの問題。


追記(2012/01/06):
W5100で同様の実験を行っているが、9時間異常なし。
W5200あるいはW5200用Ethernetライブラリに問題があると見ていいんだろうなぁ。。。ガクリ。

追記(2012/01/07):
丸一日以上異常なし。
W5100は安定しておる。


July 27, 2011

Ubuntu10.10 での Arduino開発環境導入

ちょっと遊んでみたくて環境を構築した。

すでにaptに登録があるので
$ sudo aptitude install arduino
で依存関係一式は入る。

しかし、古いので新しいのを公式から落としてくる。
今回はLinux 64 bitを落として展開する。
展開後のディレクトリをホームディレクトリ以下にでも置く。

起動するときはフルパスで~/arduino-0023/arduinoあたりを直接たたく。
起動時のパスで各種の利用ディレクトリを決定するため、シンボリックリンクだとうまくいかないことがある。