IE11ではformでautocomplete=”off”にすると送信されるまでに時間がかかるようだ

夜、得意先から携帯に電話が入った。
先週くらいから、WebアプリでPDF出力する時にフォームの送信ボタンををクリックしてからクルクル回るまでの間が5秒くらいかるようになった。
今まではすぐにクルクル回って5秒後にはPDFが出力されていた、今は妙に遅い、という内容であった。

実際のサーバにアクセスして調べてみた。
IE11でアクセスすると遅い、確かに遅い。
(この時点では未検証だったのだが、Crhome/Firefoxは遅くはない)。

サーバのメモリ、CPU使用率を見てみたが、特に問題ない。
回線帯域を調べてみたが、飽和はしていない。

別にテスト機があるので、データベースのダンプを入れて試してみると、同様に遅い。

ここで、念のため、Chrome/Firefoxでアクセスしてみると、遅くない。
どうも、ブラウザ依存のようだ。

Webアプリの作業履歴を確認した。
先週、フォームのテキストボックスでオートコンプリートをオフにする、という目的で
タグにautocomplete=”off”を追加している。

追加部分をコメントアウトして確認するとすぐクルクル回って5秒くらいでPDFが出力される。
念のためautocomplete=”off”にして試すと遅くなる。
どうも、この追加した記述が怪しいようだ。

とりあえず、オートコンプリートはオフにならないけれど、追加部分をコメントアウトして様子をみることにした。

このフォームは1000個以上のフォーム要素があるので、多すぎるのが原因なんだろうな。
ちなみに、Chromeだとボタンを押して3-4秒くらいでPDFが出力される。
Chromeって早い。

AM2302(DHT22/RHT03)を5個使って温度・湿度を測定

2014-11-27 15.00.05 2014-11-27 14.58.13 [概要]
AOSONG社のAM2302(DHT22,RHT03とも呼ばれているらしい)を5個使って室内の温度・湿度の測定値を蓄積してみた。使ったのは、SainSmartUno+EhternetShield+ブレッドボードと自作のWebサービス。
[測定プログラム]
AM2302の測定値取得には以下のWebサイトのコードを利用させたいただいた。作者の方に感謝。
(Arduino温湿度測定ロガー・湿度センサーの比較)
http://www.geocities.jp/bokunimowakaru/diy/arduino/humidity.html
[測定値蓄積Webサービス]
同時に複数の測定値を蓄積してグラフ化したかったのでWebサービスを自作した。Webサービスは公開して、みんなに使ってもらえるようにしたい。連続稼働テストの様子を見ながら、その時が来たら公開したいと思う。
現在は最速で約7秒間隔で(温度+湿度)*5個=10個の測定値をまとめて送信している。
Webサービスは1台運用なので、サーバが停止している、ArduinoからWebサービスに送信できない、といった障害が起こると、測定値はどこにも蓄積されない。つまり、失われる。
商用化する場合は、障害への対応が(サーバ側、センサー側とも何かしら)できる必要がある。

2014-11-30_temperature 2014-11-30_humidity [測定値のグラフ表示]
とりあえず、Highchartsを使うことにした。有償で商用利用できるのだが、現状どうするか決めていないので、試用させていただく。
http://www.highcharts.com/

【測定期間】2014/11/30 00:00:00~2014/11/30 23:59:59
【湿度個数5センサー分】26000個(3.2秒)
【温度個数5センサー分】14000個(2.4秒)
()の数値はhtmlデータの生成時間、実際に描画する時間が数秒程度以上かかる。 (全データを吐き出させると湿度、温度毎にそれぞれ63800個になる。同じ値が連続する場合は、途中の測定値を間引いて個数を減らしている。描画間隔を5分とかに拡大して、平均値をプロットさせようと思うが、現状は生データを素直に出力させている)
11/30のデータだがグラフは12/30-12/31のようになっている。これは、JavaScript出力させていている Date.UTC(2014,10,30…
の月の部分を0始まりなのに誤って1始まりとして以下のように記述したため。
Date.UTC(2014,11,30…

HighchartsはJPG/PNG形式などでグラフを保存できるのだが、今回テスト表示したグラフでは画像が作成できずエラーメッセージが表示された。センサーを1個にすれば画像が作られたが5個になると無理っぽい。

実際に動かすといろいろなことがあって面白い。

さて、肝心の温度・湿度センサーの評価だが、個々のセンサーにより値が異なるが、全体の傾向は同じである。個体差があること、誤差があることを考慮したうえで使うのであれば問題はないと思う。温度はカタログ精度は±0.5℃、真値はわからないけど、緩めて±1℃と思えば使えそうかなと思う。湿度も同じように精度を緩めればいけるかな。

温度と湿度を測定できるようになったので、次は、このブレッドボードに照度センサー、気圧センサーを付けて測定してみようと思う。温湿度センサーは5個は多いと思うけど、スペースがあったら置いておきましょうか。

CC3000WiFiモジュールピッチ変換基板の写真

2014-10-20 10.10.29
スイッチサイエンスで購入したCC3000WiFiモジュールの基板。
ヘッダピンが届いたので、明日Arduinoで使ってみる予定。
ネットで見る限りは、普通にみなさん使えているようですね。
トラブルなく使えることを期待してます。

うまく動いてくれよぉ。

NDAuty v0.3.3+1を公開しました

NDAutyはナンバーディスプレイアダプタ(アロハND3/USB/PC1)用の動作確認 兼 簡易メール/Web通知プログラムです。ND4/ND5は未確認です。

アロハUSBにおいてモニタのOFF/ON機能を使っても1週間程度でACK関係の不具合が再発するとの連絡あり。
アプリケーションを再起動すれば問題なく動作することから、アプリケーションの再起動を行う機能を実装。
本来は、根本原因を探るべきなのだが、環境がなく検証が難しいため、問題解決を優先する。
ベースがv0.3.3のためログファイルへの書き出し機能がないなど機能面は不足しているが、再起動のコードのみを追加してリリースする。
[不具合修正]
  • なし
[仕様変更]
[機能追加]
  • アプリケーションの再起動を行う機能を実装
    ツール>設定>共通>次の時刻にモニター終了・開始動作を行うの下に
    「 □モニターの終了・開始ではなくアプリケーションの再起動を行う」
    という設定を追加していますので、これにチェックを入れると再起動ができるようになります。

    NDAutyがメールの処理中であっても、設定画面を開いていても関係なく、アプリケーションが再起動されます。

    細かい仕様上の注意ですが、NDAutyを初めて起動した時刻が再起動時刻で、再起動後の時刻が指定時刻を過ぎてしまった場合に、指定時刻の直後に設定されている直後の時刻に再起動されません。
    再起動されないのは1回限りですので、現象が起こった後の時刻からは正常に再起動されます。
    また、NDAutyを起動した時刻が再起動時刻でない場合は、この現象は起こりません。
[その他]
  • なし
[ソースからコンパイルされる方へ]
  • Module1.vbのAPPLICATION_DEBAG_MODEにTrueをセットすると、デバッグ用に設定画面の右下の「OKをdisableに」が利用できるようになります。 設定項目を追加した時などにご利用ください。
    (ミスタイプでDEBAGになっていますが、過去の情報との互換性のため踏襲しています)
[既知の不具合/仕様]
  • モニタ中にUSBケーブルを抜き差しすると、モニタ中表示のままですが、実際にはナンバーディスプレイのモニタは終了しています。
    USBケーブルを抜き差しする時は、いったんモニタを停止し、USBケーブルを接続後にモニタを開始してください。
  • アロハUSBはモニタ中にUSBケーブルを抜き差した後、プログラムを終了させるとエラーが出るようですが、ND3では再現しないため未対策です。
[注意事項]
v0.3.1から、差出人メールアドレスに電話番号を入れる機能を利用できます。
携帯電話会社のメールアドレスを差出人アドレスにして、送信先メールアドレスも携帯電話会社の場合は、携帯電話事業者に「なりすまし」とみなされてメールが受信できないことがあります。
その場合は、利用者の責任において「なりすまし拒否設定」を解除するなどして対応してください。
検索サイトで「なりすまし拒否」などのキーワードで検索してください。

[ダウンロード]

ソースコード(VB.NET)(実行プログラムなし)

実行プログラム(exe)


【開発環境】
VisualStudio2010 VB.NET
x86,Releaseビルド
Windows7 Ultimate(32/64bit版)でメール送信ができることを確認しています。
アロハUSBでの動作確認は利用者の方から寄せられた情報に基づき、対応と書いています。
機種依存と思われる不具合があったらお知らせください。
実機がない場合は、対応できないことがありますので、ご容赦ください。

NDAuty v0.3.5を公開しました

NDAutyはナンバーディスプレイアダプタ(アロハND3/USB/PC1)用の動作確認 兼 簡易メール/Web通知プログラムです。ND4/ND5は未確認です。

アロハUSBにおいてv0.3.3で発生していたACK関係の不具合が再発したとの連絡があり、コードレベルで調査したが、原因は不明。
ログファイルにACK送信時刻を記録するようにして、ログファイルを調査し一体何が起こっているかの原因を探ることとしたい。
また、v0.3.4では不要なコードを削除してコードをコンパクトにしていたので、本バージョンでそれらのコードを復活してv0.3.4に近づけた。
[不具合修正]
  • なし
[仕様変更]
  • アロハUSBにおいてv0.3.3で発生していたACK関係の不具合が再発したとの連絡があったので、ログファイルにACK送信時刻を記録するようにした。
    ログファイルを調査し一体何が起こっているかの原因を探りたい。
    また、v0.3.4では不要なコードを削除してコードをコンパクトにしていたので、本バージョンでそれらのコードを復活してv0.3.4に近づけている。
[機能追加]
  • なし
[その他]
  • なし
[ソースからコンパイルされる方へ]
  • Module1.vbのAPPLICATION_DEBAG_MODEにTrueをセットすると、デバッグ用に設定画面の右下の「OKをdisableに」が利用できるようになります。 設定項目を追加した時などにご利用ください。
  • v0.3.4からForm1に「テスト」ボタンを配置しました。 テストをクリックすると、専用画面が開き模擬着信が利用できます。 従来Form1の左下に配置していた「テスト着信」のボタンは無くなっています。
[既知の不具合/仕様]
  • モニタ中にUSBケーブルを抜き差しすると、モニタ中表示のままですが、実際にはナンバーディスプレイのモニタは終了しています。
    USBケーブルを抜き差しする時は、いったんモニタを停止し、USBケーブルを接続後にモニタを開始してください。
  • アロハUSBはモニタ中にUSBケーブルを抜き差した後、プログラムを終了させるとエラーが出るようですが、ND3では再現しないため未対策です。
[注意事項]
v0.3.1から、差出人メールアドレスに電話番号を入れる機能を利用できます。
携帯電話会社のメールアドレスを差出人アドレスにして、送信先メールアドレスも携帯電話会社の場合は、携帯電話事業者に「なりすまし」とみなされてメールが受信できないことがあります。
その場合は、利用者の責任において「なりすまし拒否設定」を解除するなどして対応してください。
検索サイトで「なりすまし拒否」などのキーワードで検索してください。

[ダウンロード]

ソースコード(VB.NET)(実行プログラムなし)

実行プログラム(exe)


【開発環境】
VisualStudio2010 VB.NET
x86,Releaseビルド
Windows7 Ultimate(32/64bit版)でメール送信ができることを確認しています。
アロハUSBでの動作確認は利用者の方から寄せられた情報に基づき、対応と書いています。
機種依存と思われる不具合があったらお知らせください。
実機がない場合は、対応できないことがありますので、ご容赦ください。

NDAuty v0.3.4を公開しました

NDAuty v0.3.4を公開しました。
NDAutyはナンバーディスプレイアダプタ(アロハND3/USB/PC1)用の動作確認 兼 簡易メール/Web通知プログラムです。

[不具合修正]
  • v0.3.3で追加した「次の時刻にモニター終了・開始動作を行う」を利用した時、モニターを停止して開始する際に画面上のログがクリアされるのでクリアしないようにした。
    なお、手動で停止・開始ボタンをクリックした時は画面上のログはクリアされます。
    (*)今回のv0.3.4からログファイルへの保存機能を追加しており、ファイルに保存したログは「ログクリア」ボタンをクリックしてもクリアされません。
[仕様変更]
[機能追加]
  • 開発者向け:「テスト」ボタンをクリックすると着信をシミュレーションするウィンドウを表示して動作確認ができるようにしました。
  • 設定>録音>に
    簡易録音機能を追加しました。
    ナンバーディスプレイアダプタは音声情報を直接取得できないので、
    電話回線から音声信号を取り出すのに「電話回線用通話録音アダプタ」などを使ってPCに音声を取り込む必要があります。
    もし、PCに音声入力端子がなければ「USBオーディオ変換装置」などが必要です。
    録音ファイルはwav形式のファイルになります。mp3形式で保存するには「午後のこ~だ」も必要です。

    開発環境で使ったものは以下の通りです。
    • 電話回線用通話録音アダプタ:ミヨシ MCO電話回線用通話録音アダプタ 6極2芯 tra-l62wh(Amazonで税込¥1,545)
    • USBオーディオ変換装置:iBUFFALO BSHSAU01BK(Amazonで税込¥1,218)
    (*)録音ファイルをメールで送信する機能はv0.3.4では未実装
  • 設定>着信時動作>に
    「サウンドを再生する」を追加。着信があったら指定したサウンドを再生します(*1)
  • 設定>着信時動作>に
    「画像を表示する」を追加。着信があったら指定した画像を表示します(*1)
  • 設定>共通>起動>に
    「着信着信を受信したら本アプリケーションを一番上に表示」を追加。
  • 設定>共通>全般>に
    「ログ情報をファイルに保存」を追加。
    ndauty.logというファイルにログ情報を保存することができます。
(*1)拡張子の既定値は設定していますが、実際には拡張子の制限はないのでサウンド・画像に関わらず指定ができます。
ファイルの再生はシステムに登録されているアプリケーションによって実行されます。

[その他]
  • 細かい見た目の調整、言葉の微調整をしています
[ソースからコンパイルされる方へ]
  • Module1.vbのAPPLICATION_DEBAG_MODEにTrueをセットすると、デバッグ用に設定画面の右下の「OKをdisableに」が利用できるようになります。 設定項目を追加した時などにご利用ください。
  • v0.3.4からForm1に「テスト」ボタンを配置しました。 テストをクリックすると、専用画面が開き模擬着信が利用できます。 従来Form1の左下に配置していた「テスト着信」のボタンは無くなっています。
[既知の不具合/仕様]
  • モニタ中にUSBケーブルを抜き差しすると、モニタ中表示のままですが、実際にはナンバーディスプレイのモニタは終了しています。
    USBケーブルを抜き差しする時は、いったんモニタを停止し、USBケーブルを接続後にモニタを開始してください。
  • アロハUSBはモニタ中にUSBケーブルを抜き差した後、プログラムを終了させるとエラーが出るようですが、ND3では再現しないため未対策です。
[注意事項]
v0.3.1から、差出人メールアドレスに電話番号を入れる機能を利用できます。
携帯電話会社のメールアドレスを差出人アドレスにして、送信先メールアドレスも携帯電話会社の場合は、携帯電話事業者に「なりすまし」とみなされてメールが受信できないことがあります。
その場合は、利用者の責任において「なりすまし拒否設定」を解除するなどして対応してください。
検索サイトで「なりすまし拒否」などのキーワードで検索してください。

[ダウンロード]

ソースコード(VB.NET)(実行プログラムなし)

実行プログラム(exe)


【開発環境】
VisualStudio2010 VB.NET
x86,Releaseビルド
Windows7 Ultimate(32/64bit版)でメール送信ができることを確認しています。
アロハUSBでの動作確認は利用者の方から寄せられた情報に基づき、対応と書いています。
機種依存と思われる不具合があったらお知らせください。
実機がない場合は、対応できないことがありますので、ご容赦ください。

NDAuty v0.3.3を公開しました

NDAuty v0.3.3を公開しました。
NDAutyはナンバーディスプレイアダプタ(アロハND3/USB/PC1)用の動作確認 兼 簡易メール/Web通知プログラムです。

[不具合修正]
  • NDAutyを24時間以上モニター稼働すると以下の不具合が発生する。
    • ACKが送られず、着信時にメールが2通届く
    • 着信メールの遅延配送が徐々に長くなる
    指定時刻にモニターを終了・開始する機能を追加した。
    ツール>設定>初期設定>「次の時刻にモニター終了・開始動作を行う」にチェック
    時刻は、24時間制で記述する。
    (例)8:00,20:00
    複数時刻を記述する場合は半角カンマで区切る。

    モニターの停止・開始で改善することから、現時点ではシリアルポート関係モジュールの不具合と予想していますが、断言はできません。
[仕様変更]
[機能追加]
[その他]
[ソースからコンパイルされる方へ]
  • Module1.vbのAPPLICATION_DEBAG_MODEにTrueをセットすると、デバッグ用に模擬着信ができます。Form1の左下に「テスト着信」のボタンが表示されます。
[既知の不具合/仕様]
  • モニタ中にUSBケーブルを抜き差しすると、モニタ中表示のままですが、実際にはナンバーディスプレイのモニタは終了しています。
    USBケーブルを抜き差しする時は、いったんモニタを停止し、USBケーブルを接続後にモニタを開始してください。
  • アロハUSBはモニタ中にUSBケーブルを抜き差した後、プログラムを終了させるとエラーが出るようですが、ND3では再現しないため未対策です。
[注意事項]
v0.3.1から、差出人メールアドレスに電話番号を入れる機能を利用できようになった。
携帯電話会社のメールアドレスを差出人アドレスにして、送信先メールアドレスも携帯電話会社の場合は、携帯電話事業者に「なりすまし」とみなされてメールが受信できないことがあります。
その場合は、利用者の責任において「なりすまし拒否設定」を解除するなどして対応してください。
検索サイトで「なりすまし拒否」などのキーワードで検索してください。

[ダウンロード]
バイナリとソースは以下のものをダウンロードしてください。

WordPressのメディアライブラリはexeをアップロードできないのでzipで固めています。

ソースコード(VB.NET)

実行プログラム(exe)


【開発環境】
VisualStudio2010 VB.NET
x86,Releaseビルド
Windows7 Ultimate(32/64bit版)でメール送信ができることを確認しています。
アロハUSBでの動作確認は利用者の方から寄せられた情報に基づき、対応と書いています。
機種依存と思われる不具合があったらお知らせください。
実機がない場合は、対応できない場合がありますのでご容赦ください。

N008 ArduinoでTFTカラーLCDディスプレイモジュール(SainSmart ST7735)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

サインスマート(SainSmart) 1.8″ TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3
(2014/09/07時点¥ 1590 税込)
電源は3.3V/5VともOKでした。
TFTカラーLCDディスプレイモジュールとはSPI接続です。

参考にした記事

サンプルスケッチは、ArduinoIDEのメニューから次のコードを利用。
ファイル>スケッチの例>TFT>Arduino>TFTDisplayText

作者の方々に感謝いたします。

ST7735とArduinoの接続ピン情報
ST7735 Arduino UNO
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D13
SDA    D11
DC     D09
RES    D08
CS     D10
------------------

ST7735 Arduino MEGA
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D52
SDA    D51
DC     D09
RES    D08
CS     D10
------------------
組み立てた様子
2014-09-09 08.51.31
ジャンパーピンの「オス-メス」を持っていないので、「オス-オス」「メス-メス」を接続して「オス-メス」を作りました。
少々配線が長いですが、ジャンパーピン7本だけで接続ができます。
この本数で接続して使えるのは楽です。
SPI接続は初めてでしたので、ピン情報を調査しました。
SPI接続のピン情報は以下のサイトを参考にしました。

液晶画面には1から順番に999999まで表示し、また1に戻って表示するようにしました。
intは16ビット長でしたので、longにしてプログラムを書いています。


実行直後の画面
2014-09-09 09.31.55
背景色が真っ白になるので、ディスプレイ表面の保護シートにかかれている「7」の数字がよく見えます。これって何なんだろう。



スケッチ
/*
  Arduino TFT text example
  
  This example demonstrates how to draw text on the 
  TFT with an Arduino. The Arduino reads the value 
  of an analog sensor attached to pin A0, and writes 
  the value to the LCD screen, updating every
  quarter second.
  
  This example code is in the public domain

  Created 15 April 2013 by Scott Fitzgerald
 
  http://arduino.cc/en/Tutorial/TFTDisplayText


(2014/09/09 append CXY-LABO)
Reference
http://arduino.cc/en/Reference/SPI

Pin connection

ST7735 Arduino UNO
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D13
SDA    D11
DC     D09
RES    D08
CS     D10
------------------

ST7735 Arduino MEGA
------------------------
VCC    POWER 5V or 3.3V
GND    POWER GND
SCL    D52
SDA    D51
DC     D09
RES    D08
CS     D10
------------------
*/

#include <TFT.h>  // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs   10
#define dc   9
#define rst  8  

// pin definition for the Leonardo
//#define cs   7
//#define dc   0
//#define rst  1 

// create an instance of the library
TFT TFTscreen = TFT(cs, dc, rst);

// number length to print to the screen
#define DISP_LEN (6+1)

// char array to print to the screen
char sensorPrintout[DISP_LEN];

void setup() {
  // Put this line at the beginning of every sketch that uses the GLCD:
  TFTscreen.begin();

  // clear the screen with a black background
  TFTscreen.background(0, 0, 0);
  
  // write the static text to the screen
  // set the font color to white
  TFTscreen.stroke(255,125,255);
  // set the font size
  TFTscreen.setTextSize(2);
  // write the text to the top left corner of the screen
  TFTscreen.text("Sensor Value :\n ",0,0);
  // ste the font size very large for the loop
  TFTscreen.setTextSize(4);

//SPI.setClockDivider(1);
}

long i=1;
long loop_end =pow(10,DISP_LEN-1)-1;
char fmt_buf[10];  // prepare enough buffer
void loop() {
  i++;
  if(i>loop_end){i=1;}
  sprintf(fmt_buf,"%%0%dld",DISP_LEN-1);  // if you wand to print ' ' padding, remove 0
  sprintf(sensorPrintout,fmt_buf,i);  // i is long then format is %##ld

  //String sensorVal = String(i);
  // convert the reading to a char array
  //sensorVal.toCharArray(sensorPrintout, DISP_LEN);

  // set the font color
  TFTscreen.stroke(255,255,255);
  // print the sensor value
  TFTscreen.text(sensorPrintout, 0, 20);
  // wait for a moment
  //delay(250);
  // erase the text you just wrote
  TFTscreen.stroke(0,0,0);
  TFTscreen.text(sensorPrintout, 0, 20);
}



前の記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)
この記事: N008 TFTカラーLCDディスプレイモジュール(SainSmart ST7735)
次の記事: 未定

N007 Arduinoでデジタル・コンパスモジュールGY-271(HMC5883L)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

デジタル・コンパスモジュール(HMC5883L)はAmazonで購入
HMC5883L 使用 3軸 デジタル・コンパス モジュール (3-5V 動作)
(2014/09/09時点¥ 540 税込)
電源は3.3V/5VともOKでした。
GY-271(HMC5883L)のI2C addressは0x1Eでした。

HMC5883Lセンサーモジュール(購入品)
2014-09-08 19.02.27
チップは基板実装済みだけど、基板に端子を半田付けしないといけない。

HMC5883Lセンサーモジュール(端子をはんだ付け)
2014-09-08 19.09.14


参考にしたソフトウェア

動作確認の際に利用させていただいたサイトとサンプルスケッチ

サンプルスケッチをArduino IDE 1.0.5-r2でコンパイルすると、関数名を変更しなさいと指摘されたので、以下のように変更した。
  1. Wire.receive()をWire.read()に名称変更
  2. Wire.send()をWire.write()に名称変更

作者の方々に感謝いたします。

GY-271(HMC5883L)とArduinoの接続ピン情報
GY-271 Arduino UNO
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   A5(SCL)
SDA   A4(SDA)
DRDY  -
------------------

GY-271 Arduino MEGA
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   D21(SCL)
SDA   D20(SDA)
DRDY  -
------------------
組み立てた様子
2014-09-08 19.37.47

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-08 19.38.12
3種類の数値が表示されているので動作OKです。
動作確認だけですので、数値の細かい意味は理解していません、実際に使う際に考えます。


スケッチ
/*
An Arduino code example for interfacing with the HMC5883

by: Jordan McConnell
 SparkFun Electronics
 created on: 6/30/11
 license: OSHW 1.0, http://freedomdefined.org/OSHW

Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

#include <Wire.h> //I2C Arduino Library

#define address 0x1E //0011110b, I2C 7bit address of HMC5883

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
  
  //Put the HMC5883 IC into the correct operating mode
  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.write(0x02); //select mode register
  Wire.write(0x00); //continuous measurement mode
  Wire.endTransmission();
}

void loop(){
  
  int x,y,z; //triple axis data

  //Tell the HMC5883 where to begin reading data
  Wire.beginTransmission(address);
  Wire.write(0x03); //select register 3, X MSB register
  Wire.endTransmission();
  
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(address, 6);
  if(6<=Wire.available()){
    x = Wire.read()<<8; //X msb
    x |= Wire.read(); //X lsb
    z = Wire.read()<<8; //Z msb
    z |= Wire.read(); //Z lsb
    y = Wire.read()<<8; //Y msb
    y |= Wire.read(); //Y lsb
  }
  
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print("  y: ");
  Serial.print(y);
  Serial.print("  z: ");
  Serial.println(z);
  
  delay(250);
}


前の記事: N006 加速度センサーモジュールGY-521(MPU-6050)
この記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)
次の記事: N008 TFTカラーLCDディスプレイモジュール(SainSmart ST7735)

N006 Arduinoで加速度センサーモジュールGY-521(MPU-6050)を使う

N***の記事は、購入したデバイスの動作確認を掲載しています。接続は簡単なので、特別な事情がない限り、配線図はないです。

Amazonで以下の商品を購入
MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール
(2014/09/09時点 ¥430税込)
電源は3.3V/5VともOKでした。
I2C addressは0x68でした。

MPU-6050センサーモジュール(購入品)
2014-09-08 18.57.51
チップは基板実装済みだけど、基板に端子を半田付けしないといけない。

MPU-6050センサーモジュール(端子をはんだ付け)
2014-09-08 18.22.35


参考にしたソフトウェア

動作確認の際に利用させていただいたソフトウェア
加速度+ジャイロのGY-521(MPU-6050)を使ってみた
作者の方々に感謝いたします。

GY-521(MPU-6050)とArduinoの接続ピン情報
GY-521 Arduino UNO
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   A5(SCL)
SDA   A4(SDA)
XDA   -
XCL   -
AD0   -
INT   D2
------------------

GY-521 Arduino MEGA
------------------
VCC   POWER 5V or 3.3V
GND   POWER GND
SCL   D21(SCL)
SDA   D20(SDA)
XDA   -
XCL   -
AD0   -
INT   D2
------------------
組み立てた様子
2014-09-08 18.54.32

サンプルを動作させた時のコンソール画面
スクリーンショット 2014-09-08 18.51.20
温度と9種類の情報が表示されているので動作OKです。
115200bpsで接続すると文字化けしまくったので9600bpsにしています。
対応策もあるようですが、今回はモジュールの動作テストだけですので、9600bpsでよしとします。


スケッチ
// MPU-6050 Accelerometer + Gyro
  #include <Wire.h>

  #define MPU6050_ACCEL_XOUT_H       0x3B   // R
  #define MPU6050_WHO_AM_I           0x75   // R
  #define MPU6050_PWR_MGMT_1         0x6B   // R/W
  #define MPU6050_I2C_ADDRESS 0x68

typedef union accel_t_gyro_union{
  struct{
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  }
  reg;
  struct{
    int16_t x_accel;
    int16_t y_accel;
    int16_t z_accel;
    int16_t temperature;
    int16_t x_gyro;
    int16_t y_gyro;
    int16_t z_gyro;
  }
  value;
};

void setup(){
  Wire.begin();
  int error;
  uint8_t c;
  Serial.begin(9600);
  Serial.print("InvenSense MPU-6050");
  Serial.print("June 2012");
  error = MPU6050_read (MPU6050_WHO_AM_I, &c, 1);
  Serial.print("WHO_AM_I : ");
  Serial.print(c,HEX);
  Serial.print(", error = ");
  Serial.println(error,DEC);
  error = MPU6050_read (MPU6050_PWR_MGMT_1, &c, 1);
  Serial.print("PWR_MGMT_1 : ");
  Serial.print(c,HEX);
  Serial.print(", error = ");
  Serial.println(error,DEC);
  MPU6050_write_reg (MPU6050_PWR_MGMT_1, 0);
}

  void loop(){
  int error;
  float dT;
  accel_t_gyro_union accel_t_gyro;
  error = MPU6050_read (MPU6050_ACCEL_XOUT_H, (uint8_t *) &accel_t_gyro, sizeof(accel_t_gyro));
  Serial.print(error,DEC);
  Serial.print("\t");

    uint8_t swap;
#define SWAP(x,y) swap = x; x = y; y = swap
  SWAP (accel_t_gyro.reg.x_accel_h, accel_t_gyro.reg.x_accel_l);
  SWAP (accel_t_gyro.reg.y_accel_h, accel_t_gyro.reg.y_accel_l);
  SWAP (accel_t_gyro.reg.z_accel_h, accel_t_gyro.reg.z_accel_l);
  SWAP (accel_t_gyro.reg.t_h, accel_t_gyro.reg.t_l);
  SWAP (accel_t_gyro.reg.x_gyro_h, accel_t_gyro.reg.x_gyro_l);
  SWAP (accel_t_gyro.reg.y_gyro_h, accel_t_gyro.reg.y_gyro_l);
  SWAP (accel_t_gyro.reg.z_gyro_h, accel_t_gyro.reg.z_gyro_l);

  dT = ( (float) accel_t_gyro.value.temperature + 12412.0) / 340.0;
  Serial.print(dT, 1);
  Serial.print("\t");

  float acc_x = accel_t_gyro.value.x_accel / 16384.0; //FS_SEL_0 16,384 LSB / g
  float acc_y = accel_t_gyro.value.y_accel / 16384.0;
  float acc_z = accel_t_gyro.value.z_accel / 16384.0;

  Serial.print(acc_x, 2);
  Serial.print("\t");
  Serial.print(acc_y, 2);
  Serial.print("\t");
  Serial.print(acc_z, 2);
  Serial.print("\t");

  float acc_angle_x = atan2(acc_x, acc_z) * 360 / 2.0 / PI;
  float acc_angle_y = atan2(acc_y, acc_z) * 360 / 2.0 / PI;
  float acc_angle_z = atan2(acc_x, acc_y) * 360 / 2.0 / PI;

  Serial.print(acc_angle_x, 2);
  Serial.print("\t");
  Serial.print(acc_angle_y, 2);
  Serial.print("\t");
  Serial.print(acc_angle_z, 2);
  Serial.print("\t");

  float gyro_x = accel_t_gyro.value.x_gyro / 131.0;  //FS_SEL_0 131 LSB / (°/s)
  float gyro_y = accel_t_gyro.value.y_gyro / 131.0;
  float gyro_z = accel_t_gyro.value.z_gyro / 131.0;

  Serial.print(gyro_x, 2);
  Serial.print("\t");
  Serial.print(gyro_y, 2);
  Serial.print("\t");
  Serial.print(gyro_z, 2);
  Serial.println("");
}

// MPU6050_read
int MPU6050_read(int start, uint8_t *buffer, int size){
  int i, n, error;
  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  n = Wire.write(start);
  if (n != 1)
    return (-10);
  n = Wire.endTransmission(false);   // hold the I2C-bus
  if (n != 0)
    return (n);
  // Third parameter is true: relase I2C-bus after data is read.
  Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
  i = 0;
  while(Wire.available() && i<size){
    buffer[i++]=Wire.read();
  }
  if ( i != size)
    return (-11);
  return (0);  // return : no error
}

// MPU6050_write
int MPU6050_write(int start, const uint8_t *pData, int size){
  int n, error;
  Wire.beginTransmission(MPU6050_I2C_ADDRESS);
  n = Wire.write(start);        // write the start address
  if (n != 1)
    return (-20);
  n = Wire.write(pData, size);  // write data bytes
  if (n != size)
    return (-21);
  error = Wire.endTransmission(true); // release the I2C-bus
  if (error != 0)
    return (error);
  return (0);         // return : no error
}

// MPU6050_write_reg
int MPU6050_write_reg(int reg, uint8_t data){
  int error;
  error = MPU6050_write(reg, &data, 1);
  return (error);
}


前の記事: N005 照度計測モジュール(BH1750FVI)
この記事: N006 加速度センサーモジュールGY-521(MPU-6050)
次の記事: N007 デジタル・コンパスモジュールGY-271(HMC5883L)