2015年8月31日月曜日

土鍋炊飯のカイゼン

ご飯と漬け物…日本人に生まれて(ry


土鍋でご飯を炊くのは簡単です。

うちの場合だと、「約10分で沸騰する程度の強火で加熱、勢いよく蒸気が噴き出してきたらとろ火にして5分」、火加減も何にもなし。

とはいえ、「10分で沸騰する程度の火力」ってのも実は結構難しいです。やってみなければわからないし、普通のガスコンロはアナログ式なのでせっかく正しい火加減がわかっても、次回もそれが再現できるとは限らない。

というわけで、我が家では発想を転換いたしました。

「10分で沸騰する程度の火力」ではなく「全開で10分で沸騰する量の米+水」を算出しました。算出というか土鍋の比熱や熱伝導率がどのくらいかわからないので、試行錯誤ですけどね。土鍋なら火が強すぎて早く沸騰しても弱すぎて時間がかかっても、それほどひどい仕上がりにならないので安心して試せます。私の場合は3回目で成功しました。

多少季節変動はありますが、昨日今日で一気に変わるわけではないので調整も容易です。

お試しあれ。

2015年8月29日土曜日

Azure SQL Databaseが爆速に?!

仕出し弁当450円。いつもはヘルシー弁当だけど気合い入れてみた。


■要約■

遅くて使い物にならなかったAzure SQL Databaseの監査機能をonにしたら、何故か実用的なスピードで動くようになりました。

■前提■

本業?で、10年モノのSAStrutsアプリのサービス化、なんてのを担当してました(過去形)。「オンプレミスをAzureへ」というありがちな作業でしたが、Azureには仮想マシンなどの他にほぼ無料で使えるWeb AppsというWebアプリデプロイ環境があって、.warを投げ込めばtomcatなどでデプロイしてくれます。20MB限定で無料でSQL Serverを使えるので、ちょっとしたサービスなら無料で動かすことができます。

が、無料データベースは9月12日で終了することが決まっています。

ということで、有料のAzure SQL Databaseを使います。一番安いインスタンスなら月500円程度で使えるので、まぁお得。でもオンプレミスからAzureへ大量のデータをエキスポートするには恐ろしく時間かかりますので、そのときだけ少し高めのS2などのインスタンスにしておいて、完了後にシボるのがコツですw

■で、本題■

前記アプリをAzure SQL Databaseと接続して動かしてみたのですが、すっっっさまじく遅い。トランザクションでツマるならまだしも、何回かfetchするとツマって数十秒〜数分戻って来なくなります。何しろ、ログアウトしてEventなどを残すだけで4分26秒もかかってしまいました。「こりゃアプリの動作を見直ししないと、使い物にならないなぁ」と思い、何はともあれログを取ってみることにしました。

Azure SQL Databaseでログを残すには、「監査」機能をonにして、接続先を
<サーバ名>.database.windows.net
から
<サーバ名>.database.secure.windows.net
へ変更する必要があります。

そうしたら…アプリがサクサク動くようになってしまいました。

トラブルを解消しようとログを取ったら現象が出なくなる、というのはよくあることですけども…。

ぼったくり店のように一歩歩くごとにお金をむしりとるAzureさんのこと、何か落とし穴がないか調べてみたのですが、「監査機能は無料で使えます」という記事しかありませんでした。万一の為にそのページの魚拓を残して、パフォーマンス向上については保留としました。パフォーマンス向上は喜ばしいことなのですが、安いと思って飛びつくと値上がりするのはMS世の常なので、注視していきたいと思います。はい。

なお、監査機能をonにすると同時に、デフォルトではログがすべてストレージに残る設定になります。ストレージは有料なので、ご注意を。

この記事は2015年8月28日時点での調査結果であって、マイクロソフト社の公式の見解ではありません。またこの記事は倉橋浩一個人の見解であり、勤務先とは何ら関係ありません。この記事の記載などから予期せぬ結果が生じたとしても私は一切関知いたしませんので、予めご了承ください。Azureのご利用は計画的に、ね♡

■余談■

上に書いた通りならオンプレミスからAzureへの移行もあっという間なのですが、問題はオンプレミスがMS SQL Server 2005で動いていたこと。AzureはSQL Server 2014相当なので、そのままでは移行できません。

まず、オンプレミスの2014に載せ替えます。大まかな手順としては、

  1. SQL Server Management Studio 2014をインストールする
  2. Azureストレージを用意しておく。すでにあれば、それを流用して問題ないです。
  3. 旧DBに接続し、タスクメニューからデータ層アプリケーションへのエクスポートを選ぶ。エクスポート先としてはAzureのストレージを選びます。
  4. Wizardを進んでいくと山のようにエラーが出ますので、一つずつツブして行きます。例えば、ストアドプロシジャなどで[db名].[スキーマ名].[テーブル名]と書いているところがあれば[スキーマ名].[テーブル名]に書き換える、テーブルには必ずclustered indexが必要、など。
  5. めでたくデータ層アプリケーションが作成できて、それがそのままAzureのストレージにアップロードできたなら、あなたはラッキーです。
  6. できなかったあなたは、ここで旧DBをdetachします。で、MSSQLディレクトリの下にあるデータベースファイルをSQL Server 2014の動いているマシンにコピーし、SQL Server 2014でこれをatachします。
  7. データ層アプリケーションをAzureのストレージにアップロードする。
  8. Azureでデータベースをストレージからインポートすれば、できあがりです。
例によってさくっと書いてますが、「detachしてコピーしてatach」ってのは数日間試行錯誤を重ねた後、ググりにググってググった末に出てきたブログ記事で、「まさかーw」と半笑いで試したら本当に出来てしまって、大笑いです。

上記の6番はオフィシャルな手法ではないと思いますので、この記事を信じるかどうかはあなた次第、at your own riskでお願いします。この記事の結果何らかの損害等が生じたとしてもそれは著者の関知するところではありません。

ああmySQL, postgreSQLの世界に戻りたい。

2015年8月24日月曜日

やっとESP8266(WROOM-02)入手


■追記9/16■

ファームウェアのダウンロード先が違っていました。またコマンドラインなどの表示が崩れていました。ご迷惑をおかけして申し訳ありませんでした。

なお、後日、もう一枚のESP-WROOM-02を組み立てたら、コマンドやArduino IDEファームウェアの書き込みはできるものの、起動してすぐにexceptionやコアダンプの山が出てくる状態になりました。

原因は電源でした(ESP-WROOM-02の電源はかなりシビア?)。某林さんを初め、この現象で悩んでいる方は少なくないようですので、ご参考になれば幸いです。

■お礼■

facebookで某林伸夫さんから教えてもらって、仕事帰りにaitendoに駆け込み入手しました。2個入りとボード2枚で1320円。情報ありがとうございました。

■準備■

さっそくハンダ付け。何も考えずにピンヘッダ付けちゃいましたけど、幅が広いのでブレッドボードで使うのが難しいです。横方向にジャンパ伸ばせばいいんだけど、壮大に間違える自信があるw なので、写真にあるように100円で買ってきたミニブレッドボードを2枚橋渡しして使っていますが(aitendoで1枚100円大安売りしてました。買っといてよかったw…と思ったけど、安いのには理由がある。クソ堅くてピン刺さらないいいいいいw)、ピンソケットを付けた方が試作には便利かも。あ、サンハヤトの新しいブレッドボードなら届きますね。


■さて■

何はともあれ環境整備、最近失敗が多いので、人様の成功例を真似しました。今回はこの記事(ESP-WROOM-02 の Arduino 環境で I2C 制御)を参考にさせていただきました。ありがとうございます。I2C用のプルアップ2本だけだと思っていたのですが、10kΩは5本必要。ずいぶん抵抗使うなぁと思ったんですが、おかげさまで一発で成功しました。

なおリセット/ISPについてはいつもの抵抗入りジャンパ線でGNDに落とすだけ、プルアップはしていません。

電源は最初余裕を見て秋月の超高効率三端子レギュレータを使いましたが、そのあと3.3v100mAの安い三端子レギュレータ(HT7533…秋月では販売終了)に交換しても問題なく動作しました。ESP-WROOM-02の平均消費電流は80mAとのことなので、ちょっとギリギリですが。

Arduino IDEは1.6.5を使います。まずArduino IDEを起動しPreference / 環境設定画面のAdditional Boards Manager URL'sに「http://arduino.esp8266.com/stable/package_esp8266com_index.json」をコピペしてOKをクリック、Toolsメニュー>Board>Board Manager>esp8266 platformを選ぶとインストールされます。

この後、ボードの種類を選びますが、aitendoなど素のespの場合にはGeneric ESP8266 Moduleです。

■ファームウェアアップデート■

この後、WiFiのサンプルを試したのですが、うまく動きませんでした。ので、ファームウェアをアップデートします。バージョンを確かめようとシリアルモニタからATコマンドを叩いてみたのですが、返ってきません。どうやら一度Arduinoとして動作させるとATコマンドインタフェースが消えてしまう模様。そのためだけにツールをアップロードするのも面倒なので、もうサクッとアップデートしてしまいます。Windowsはそのためのツールがあるようなので、そっちをどうぞ。Mac / Linuxではコマンドラインから操作します。

まずesptool.pyライブラリ(分かりにくいけどATTACHMENTSのところ)をダウンロードします。それぞれのzipを解凍したら、esptoolをインストールします。

$ cd <ダウンロードディレクトリ>
$ cd esptoos-master
$ sudo python setup.py install

次にライブラリをインストールしますが、そのためにはUSBで接続したデバイス名が必要です。Arduino IDEのツールメニュー>ポートを見れば /dev/tty.usbなんたら という名前が表示されているはずですので、それを控えておきます。私のところは /dev/tty.usbserial-AH016T8K です。

$ cd <ダウンロードディレクトリ>
$ cd esp_iot_sdk_v1.3.0_15_08_08 ←ダウンロードしたバージョン次第
$ cd esp_iot_sdk_v1.3.0/bin ←これも


以下は実際には1行です。また、上が1.3なのに下が1.2ですが…これは何故か1.3の中に入っているものが1.4と1.2で、1.4はβ版(b1)なのでこうなりました。ダウンロードしたものの中身に合わせてください(以下のコマンド、実際には1行です)。

$ esptool.py -p /dev/tty.usbserial-AH016T8K write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.1024.new.2.bin 0xfc000 esp_init_data_default.bin 0xfe000 blank.bin

すると以下の表示が出てきます。エラーなしにLeavingが出てくれればOKです(というかエラーになったことがないので不明…エラーとしてあり得るのは、usbシリアルの名前が違う、ファイル名が違う、ディレクトリが違う…などでしょうか)。

Connecting...
Erasing flash...
Writing at 0x00000400... (100 %)
Erasing flash...
Writing at 0x00041000... (100 %)
Erasing flash...
Writing at 0x000fc000... (100 %)
Erasing flash...
Writing at 0x000fec00... (100 %)
Leaving...$

これで書き込み終わりました。念のため、さっき動いたスケッチをもう一度書き込んでみて、同じように動作するか確認しておきましょう。

■さて。WiFi■

これもサンプルを試しました(ええそうよ失敗したくないのよ私は)。Arduino ideで ファイルメニュー>スケッチの例>ESP8266WebServer>AdvancedWebServer を開き、WifiルータにあわせてSSIDとパスワードを設定します。シリアルモニタを開くとIPアドレスなどの情報が表示されますので、そのURLをブラウザで叩くと表示されました。このグラフは単に乱数で生成されたものですが、SVGで非常に簡単にグラフができていますので、サーバ側単体でデータ表示する場合の参考になると思います。


…と書くと一発で動いたみたいですが、実際には上記ファームウェアアップデートの前に試してみたら、動きませんでした。v1.2のファームウェアを入れたところ、一発で起動してそのまま8時間安定して動きました。

でそのファームウェアやバージョンの差異ごとにパラメータが違ったりで、インストール後にまったく反応しなくなることもあり、結局最終的に上記パラメータにたどり着くまで2時間ほどかかりました。

■お約束のハマりどころ■

Arduinoとの互換性は高いのですが、微妙な違いもあります。私がハマったのは、もはや私の宿敵ともよぶべきI2C。最初に試した、超小型液晶AQM0802はそのままスケッチをコピペして動いたのですが、その後、手持ちのLCDライブラリやHDC1000用ライブラリは動いたり動かなかったり。

どうもI2CでendTransmissionした後、標準のArduinoでは送信を終了してから戻り、ESPでは終了を待たないで戻ってしまうのが原因ではないかと思い、調査中です。

2015年8月21日金曜日

ArduinoとAPDL9930(9960じゃなくて)

近接撮影。余計なものつながりすぎですね…

ebayは安いです。でも怖いところです。

APDL-9960というセンサーがあります。「SparkFun RGB and Gesture Sensor - APDS-9960」RGBの各明るさとジェスチャーを検出してくれる素子で、モジュールにしたものがSparkfunで$14.95です。デモのビデオを見ると、なかなか良い感じで使えそうです。

もうちょっと安いものはないかと探していたら、似たような型番のものが見つかりました。APDL9930を使ったもので、業者のWebには「CJMCU-9930 Approach and Non-contact RGB & Gesture Sensor Detection Module」と書いてあります。送料無料で一個$3.99と安いので買ってみました。


が。

ブツが届いて、さて使ってみようとチップのメーカーの情報を探してみたら、APDL9930は「Digital Proximity and Ambient Light Sensor」、明るさと近接センサとのこと。

RGBもジェスチャもありません。販売会社にやられましたw しかも4つも買ってしまった私ww もう笑うしかありませんわ…orz

■でも使ってみる■

Arduinoにつないで見ます。よく見かけるSparkfun製の作例ではVLには何もつないがれていないのですが、CJMCU9330では3.3vを接続しないとセンサのためのLEDランプが点灯せず近接センサ機能が動きません。

消費電流は近接センサ動作中の実測で平均1.2-2.0mA程度でした(近づくと電流が多くなります)。これならArduinoの3.3vラインからとっても問題ないですね。

CJMCU-9930Arduino
VL3.3v
GNDGND
VCC3.3v
SCLA5
SDAA4
INT2

次にライブラリですが9960用では動きません。9960用を9930用に改良したものが公開されているので、それを使います。

サンプルとして提供されている「AmbientLightInterrupt」で明るさセンサとしての働き、「ProximityInterrupt」で近接センサとしての動作を確認できます。なお2番ピンはインタラプトとして使えるピンなら何番でも良いように見えるのですが、ソースをみると単にPIN MODEを指定するのに使っているだけで、ライブラリに渡したりしていない様子。

試しにAPDS9930_INTを他の値にして接続を変えて試してみましたが2以外だと動かないですね。ご注意ください。

■ebay■

今回は業者のミスリードなんだか単なるボケなんだからわからないけど、いずれにしても間違っているタイトルに釣られてしまいました。

しかしまぁびっくりする程値段安いですし、中国からの発送なので$3.99のものを一つだけ買っても送料無料だったりします。到着までたまに1ヶ月近くかかることもあるようですが、たいていは1-2週間で届くようです。まぁものすごく簡素な包装でびっくりしますけどもね。そのうち、ハガキにセロテープで貼っただけ、なんてのが届きそうで楽しみにしていますw

さて。

ワタシがやらかしたようにタイトルに飛びつかず、事前にチップの情報など確認した上で利用すれば、安くてなかなか便利じゃないかと思います。はい。

2015年8月16日日曜日

合計1000円以下のArduino+Etherからサーバへデータを送る:サーバ編

エラーメッセージがベタっと出てきて頭を抱える

■初めに■

前の記事でArduinoなどから簡単に使える400円のEthernetインタフェースを使ってみたもののhttpsに対応していなくて挫折、というネタを書きました。httpsに対応していないと外のサービスは使えないことが多いけど、でも400円でEtherがつながるのはやっぱり捨てがたい。ということで、どこのご家庭にもあるBeagleboneやRaspberry piを中継サーバとし、Arduinoからhttpで送ったデータを一度Beagleboneで受け、あらためてhttpsで外のサービスに送る…という工作をしてみます。

■サーバ側■

ごく単純にRESTを受けるだけのサーバアプリを作ります。

Beagleboneを使いましたが、Raspberry pi / pi2でも同じです。というかnodeが入っていればLinuxはもちろんMacOS Xでも同じ。

参考にしたのはこの辺(ありがとうございます)
http://qiita.com/hoshi-takanori/items/2128a6cf1dbb533379a2
http://yutapon.hatenablog.com/entry/2014/04/29/124657

まず作業ディレクトリを作り、その中に移動します。
mkdir restRelay
cd restRelay
次に以下のソースファイルを作ります。
app.js:
var express    = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.get('/', function (req, res) {
  res.send('Hello, World!');
});
app.post('/weather', function(req, res) {
  console.log(req.body);
  res.send('ok');
});
app.listen(2999);

package.json:
{
  "name": "restRelay",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "body-parser": "^1.12.2",
    "express": "^4.12.3"
  }
}

パッケージをインストールします。
npm install
サーバ起動
node app

まず簡単にブラウザから試してみます。ブラウザに サーバ名:2999 と入力して、以下のような表示が出ればOKです。
JSONのテストは別のコンソールからcurlで。
curl -H "Content-Type: application/json" \-d '{"temperature":30.0, "humidity":52.3, "pressure":1023.4}' \http://localhost:2999/weather
これで「ok」が返ってきて、サーバ側に
{ temperature: 30, humidity: 52.3, pressure: 1023.4 }
が表示されていればOKです。

いやー、簡単ですね。こんなに簡単なRESTサーバ見たことないです。Play! Framework良い勝負。

で。

…こう書くと10分ぐらいで終わったみたいだけど、curlのパラメータを
-d '{temperature:30.0, humidity:52.3, pressure:1023.4}' \
って書いたらsyntax errorが出てしまい、悩みまくりました。
SyntaxError: Unexpected token t
    at Object.parse (native)
    at parse (/root/restRelay/node_modules/body-parser/lib/types/json.js:88:17)
    at /root/restRelay/node_modules/body-parser/lib/read.js:108:18
    at done (/root/restRelay/node_modules/body-parser/node_modules/raw-body/index.js:239:14)
    at IncomingMessage.onEnd (/root/restRelay/node_modules/body-parser/node_modules/raw-body/index.js:285:7)
    at IncomingMessage.g (events.js:180:16)
    at IncomingMessage.emit (events.js:92:17)
    at _stream_readable.js:944:16
    at process._tickCallback (node.js:419:13)
こんな表示だったからライブラリの問題かと思って、バージョンを入れ替えたりnpm installをやり直したり。

結局JSON書式の問題でした。エラーメッセージの「token t」ってのは { の直後のtemperatureのt。普通tokenというとtemperatureって切り出されるのが普通なので、気づくのに時間がかかりました…。

合計1000円以下のArduino+Etherからサーバへデータを送る:Arduino側



今回は1個約400円の激安パチモノArduino nanoと、同じく約350円のEtherアダプタENC28J60をSPIで接続しました。

サーバ側の記事とクライアントの記事(この記事)に分けました。サーバ側についてはこちらの記事をご覧下さい。

最初に注意事項です。ENC28J60は3.3v電源で動作しますが、Arduinoから外部に供給可能な3.3vの電流容量は50mAまでです。ENC28J60は最大で250mA程度消費するとのことなので、ぜんぜん足りません。最初、それに気づかなくて、「なんでEtherのランプが点灯しないんだろ…壊れたか?」と思ってました。

というわけで、9VのACアダプタからArduinoへ電源を供給しましたが、手持ちで250mAを供給できる3.3vレギュレータは秋月で買った超高能率三端子レギュレータ、380円。本体よりも電源の方が高くなって1000円を超えてしまいました。ただ、普通のシリーズレギュレータなら3.3v1Aで100円ぐらいなので…。

電源はACアダプタの9vをブレッドボード手前のレールに接続し、Arduino nanoのVINとGNDに供給しています。同じく手前の9vレールから三端子レギュレータのVin/GNDに接続し、GND/Voutをブレッドボード奥のレールに接続しています。Arduino nanoの5vと3.3v出力はどこにも接続していません。

■接続など■

Arduinoとの接続はSPIです。

ENC28J60ピンArduino nano/unoピン
VCC3.3v電源
GNDGND
CS8
RSTReset(省略可)
SI11
SCK13
SO12

別のArduinoと接続する場合には、SO=MISO, SI=MOSIと読み替えてください。また、前述の通り、3.3vはArduino出力ではなく電源アダプタ〜三端子レギュレータからの出力です。三端子レギュレータの出力側には手持ちの関係で1000μF 35vの電解コンデンサと0.1μFの積層セラミックコンデンサを入れましたが、電解コンデンサは100μF 25v程度で問題ないかと思います。

今回はArduinoに温湿度センサーHDC1000と気圧センサーMPL115A2をI2cで接続しました。

HDC1000(秋月)MPL115A2(秋月)Arduino nano/uno
VCC(1)VDD(1)3.3v
SDA(2)SDA(7)A4
SCL(3)SCL(8)A5
RDY(4)2
GND(5)GND(3)GND
CAP(2)とGNDの間に1μFを入れる

上記HDC1000/MPL115A2のピン番号は秋月版モジュールのピン番号です。HDC1000のRDY端子はArduinoの2につないでいますが、これは今回使用したライブラリのデフォルトが2だからです。HDC1000 mySensor(0x40, 4); の2つめのパラメータを変更すれば他の端子でも使えます。

MPL115A2のCAP端子とGNDの間には1μFのコンデンサを接続します。これを入れないと動作(測定値)がものすごく不安定になります。その辺の経緯はこの辺の記事をご参照くださいませ(涙)。I2cのプルアップ抵抗はHDC1000に入っているので不要です。

■ライブラリ■

まず最初に。各ライブラリ制作者の貢献に敬意と感謝を表します。使用したENC26J60, HDC1000, MPL115A2用ライブラリは下記の通りです。

モジュールライブラリ
HDC1000https://github.com/ftruzzi/HDC1000-Arduino
MPL115A2https://github.com/adafruit/Adafruit_MPL115A2
ENC28J60https://github.com/jcw/ethercard

ENC26J60用としてはいくつか公開されています。一応一通り試してみたのですが、今回は「EtherCard」を用います。機能が多いのにRAMのフットプリントが小さくてArduino nanoでも余裕があるからです。ただ、ライブラリにありがちなことですが、必要最小限の資料しかないので「サンプルは動くけど、自前のコードが動かなくて頭を抱える」パターンでしばらく悩みました。

Adafruitさん、MPL1115A2を秋月で買ったのにライブラリだけ拝借させていただいてすみません。送料がかかるので、もうちょっとショッピングカートに欲しいものが貯まったときに注文します。

HDC1000はググって落として一発で動いたがこれということで他は試していません。

■ソース■

EtherCard収録のサンプルwebClientをベースにhttp postで動くようにしてHDC1000とMPL115の処理を追加したものです。なお、行番号69/70にdhcpSetupを呼び出しています。本来ならばこれはそのあとの#if USE_DHCPの中に入れるべきなのですが、ここで何らかの初期化が行われているようで、非DHCPで使いたい場合もこれを呼び出さないと動いてくれません。接続相手はポートとIPアドレスで指定します。IPアドレスは24〜29あたり、ポートは85のようにether.hisportに指定します。

今回、JSON形式でBeaglebone black上のアプリにPOSTしています。サーバ側についてはこちらの記事をご参照ください。

以下のソースについては、権利も義務もすべて放棄します。ただ、各ライブラリのLicenseについてはご注意ください。特にethercardはGPLです。



■余談■

今回のハマりポイントは以下の通り

  • ethercardのetherPostなどを用いる場合は、call backだけでなくloop上にpacketLoopを忘れないこと。普通call backを入れておけばresponseの処理をしてくれる処理系/ライブラリが多いのですが、このライブラリはpacketLoopで実際の送受信処理を行っているようで、入れないと動きません。
  • 上記の通り、DHCPを使わない場合でもdhcpSetupを呼び出さないと通信できません。
  • 通信相手の指定はあくまでもhisIpとhisport。POSTのパラメータとは関係ありません…って当たり前なんですが、以前使った別のライブラリはGETのパラメータを読み取って自動的に接続してくれていたので、ハマりました。
  • 今回サーバ側がわりとシビアにJSON形式を処理するタイプで、フォーマットが違うとokが返ってこないため、POSTの扱いに問題があるのではないかとしばらく悩みました。結果として正しいJSON形式に変更したら、ちゃんとokが返ってきました。

2015年8月9日日曜日

ENC28J60という不憫な子

ちょっと前までArduinoをEtherにつなぐには5000円ぐらいしたのに400円

睡眠データの収集をHerokuからParse.comへ移行しようと調査しています。いつの間にかArduino用のSDKなんて出てるんですね。残念ながら高価なArduino Yun用ですが。

私が使おうと思っているのは部品沼に数個眠っているパチArduino nano+ENC28J60という合計1000円を切っちゃうコンビです。標準のEtherシールドの価格と比べるとまさに破格です。しかし、ENC28J60はhttpsに対応していないのでparse.comなど最近のWebサービスには使えません。

とはいえ在庫があるのに使わないのはもったいないので、手持ちのArduino nanoにつないで試してみました。githubからライブラリを落としてethercard-master.zipという名前をethercard.zipに変更してからArduino ideのメニュー スケッチ>ライブラリを使用>ライブラリをインストール… で読み込ませます。そうするとライブラリ / サンプルが使えるようになります。配線は電源は3.3vとGND、各SPI(SI→11, SO→12, SCK→13, CS→8)。サンプルスケッチはArduino ideメニュー ファイル>スケッチの例>ehtercard>backsoon を選びます(他にもあります)。DHCPで良ければそのまま実行。うちはDHCP使いたくないので6行目あたりの#define STATICを0から1に変更し、10行目あたりのmyipにアドレスをセットして実行。

が。

ハブにつないでもリンクが上がらない(Linkのランプが付かない)。

いろいろ調べていると、ツール>ポートでArduinoのポートが見えなくなっていることに気づきました。ENC28J60を外すとポートが見えるようになります。これはつまり、ENC28J60の消費電流がArduinoの電源供給能力を上回ってしまった、ということ。Arduino unoにつないでも同じでした。改めて資料にあたってみると、 ENC28J60の消費電流は250mA+、一方Arduinoの供給能力は50mA(3.3v)。

そりゃ動きませんわ…。

以前mbedで試したら一発で動いたのは、FTDIから取っていた3.3vに余力があったからでしょうね。三端子レギュレータなどを使って供給すれば良いのですが、めんどくせえええ。

と言いつつ、5v電源から高能率三端子レギュレータで3.3vに落として供給してみました。三端子レギュレータ380円+積層セラミック4.7μF特価60円、明らかにENC28J60より高いw



めでたく動きました。

しかし室温30度でチップの表面温度は47度(放射温度計による計測)になり250mAも消費するチップはやっぱりちょっと使いにくいなぁ…。httpsないし最初からオスのヘッダピン付いてるのも面倒くさい…。

とりあえず簡易的なPoEアダプタが1組余っているので、それと組み合わせて成仏させてやろうかい。

2015年8月7日金曜日

私は何屋?

飲酒屋という職業があれば超プロ

Javaのヒトからは「クラス名とかが組み込み屋さんっぽいですね」と言われ。

C/C++のヒトからは「関数名がjava臭い」と言われ。

私はいったい何屋だ。

Arduino nanoとMPL115A2




久しぶりの電子工作です。以前から作らなきゃ作らなきゃと思っていた、室外の気象状況把握デバイスにようやく着手しました。気温気圧湿度。

■追記■

HDC1000、MPL115A2、どちらも動きました。下記「失敗編」では気圧がエラいことばらついていて、MPL115A2やArduinoを交換したり大騒ぎしていたのですが、結果としてMPL115A2のCAP端子につないでいたコンデンサの不良でした。20年もののタンタルが劣化していたのでしょうか。ただ、気圧測定値はかなりバラつきます。もともとこのチップの精度は1kpa以下とのことなので仕様の範囲内ではありますが…このチップ、何に使うモノなんでしょう。この精度だと高度計や晴雨計には使えないですよね。
Temperature = 29.24 degree, Humidity = 57.06%, Pressure = 1005 kPa
Temperature = 29.23 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.20 degree, Humidity = 57.15%, Pressure = 1005 kPa
Temperature = 29.17 degree, Humidity = 57.15%, Pressure = 1003 kPa
Temperature = 29.13 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1003 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.12 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1006 kPa
Temperature = 29.07 degree, Humidity = 57.25%, Pressure = 1003 kPa
Temperature = 29.10 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1006 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.19 degree, Humidity = 57.25%, Pressure = 1004 kPa
ともあれ動いてなにより。

■失敗編■

気温湿度はHDC1000、気圧はMPL115A2。どっちもArduino用のライブラリが公開されているので、さくっと作ってみる。と。
Temperature = 28.98 degree, Humidity = 48.95%, Pressure = 960.98
Temperature = 29.02 degree, Humidity = 48.97%, Pressure = 1023.90
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 986.27
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 1017.61
Temperature = 28.93 degree, Humidity = 48.85%, Pressure = 1029.64
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 957.95
Temperature = 28.96 degree, Humidity = 48.85%, Pressure = 957.45
Temperature = 29.04 degree, Humidity = 48.88%, Pressure = 1010.54
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 952.30
Temperature = 28.96 degree, Humidity = 48.75%, Pressure = 984.23
Temperature = 28.93 degree, Humidity = 48.75%, Pressure = 984.98
Temperature = 28.97 degree, Humidity = 48.66%, Pressure = 987.49
Temperature = 28.98 degree, Humidity = 48.66%, Pressure = 990.82
Temperature = 29.01 degree, Humidity = 48.68%, Pressure = 943.27
Temperature = 28.98 degree, Humidity = 48.56%, Pressure = 986.27
Temperature = 28.93 degree, Humidity = 48.46%, Pressure = 1027.91
Temperature = 28.98 degree, Humidity = 48.46%, Pressure = 959.57
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 954.06
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 943.93
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 970.07
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 1007.75
Temperature = 29.08 degree, Humidity = 48.39%, Pressure = 1056.10
Temperature = 29.08 degree, Humidity = 48.49%, Pressure = 1000.93
Temperature = 29.05 degree, Humidity = 48.39%, Pressure = 949.96
HDC1000からの気温湿度はともかく、なんすかこの巨大台風と異常高気圧orz Adafruitのライブラリとサンプルで試しても似たような状況。ってか温度も酷い。
Hello!
Getting barometric pressHello!
Getting barometric pressure ...
Pressure (kPa): 101.8867 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 123.9470 kPa
Temp (*C): 61.6 *C
Pressure (kPa): 102.9643 kPa
Temp (*C): 41.3 *C
Pressure (kPa): 122.3504 kPa
Temp (*C): 29.7 *C
Pressure (kPa): 128.0168 kPa
Temp (*C): 30.0 *C
Pressure (kPa): 106.1308 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 96.2912 kPa
Temp (*C): 40.9 *C
Pressure (kPa): 96.4242 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 95.8312 kPa
気圧の計算には同センサーが内蔵している温度センサの値を使っている。温度がダメでそれに引っ張られているのか、どっちもダメなのか。HDC1000の温度値を使って計算しなおす方向にしましょうかorz

ところで出勤前にこれやってるんですが…趣味でストレス貯めてどうする俺orz

とりあえず電源にパスコン追加したり、地道なところからやってみますかね。センサー破損の可能性も皆無ではないけど、それは部品沼が(ry

追記:
パスコン追加して、あと、RSTが5Vにつながっているという大ポカが発覚したものの、代わりありませんでした。さらに、HDC1000を外しプルアップ抵抗をつけてArduinoと直結してもダメでした。センサー故障ですね…5Vつないで壊した可能性も高いですがorz

追記の追記:
その後、新品をつないでみましたが、結果は同じでした。うーん。