Raspberry Pi純正カメラを買おうとしたらハマった
最近Raspberry Pi Camera V2という、今年の春モデルの純正カメラモジュールを買いました。
買おうと思った時はAmazonにあればポチろうかなーくらいで考えていました。
しかしながらこんなところでハマってしまいました。 純正カメラにも何種類かあり、どれを買えばいいかわからず、 教えてくれる人もまとめてくれているブログも見つからなかったので書いておきます。
本当は、使ってみたを書こうかと思ってブログを書き始めましたが、それはまた違うときに。
DaylightとPiNoir
こちらの2つはわかりやすいと思います。PiNoirは赤外線カメラで夜間の撮影に向いています。
基板の色もPiNoirは黒です。かっこよい
Raspberry Pi PiNoir カメラモジュール V2 - スイッチサイエンス
RS製とElement14製の違い
この2つの違いを理解する(調べる)のに時間がかかりました。
わかれば難しくないですが、製造しているメーカーが主に2社あり、どちらも純正品として販売されているということでした。
RS製の方が高いので純正なのかなと何となく思ったのですが、そういうことでも無いみたい。
それぞれのメーカーからDaylightとPiNoirが出ています。
どちらを買うか
調べてみると、使用しているカメラセンサーはどちらもSONY IMX219PQという高性能なものを 使用しているのですが、製造方法とか生産地が違うため値段に違いが出ているようです。
なので性能に差はない(はず)です。
ブログ執筆時点で、Daylightのamazonでの価格はRS製が4,893円、Element14製が4000円と価格差は約900円です。
特に生産メーカーにこだわりが無いようでしたら安い方を買えばいいでしょう。
わたしはElement14製を買いました。使い始めていますが今のところ全く困っていません。
見分け方
箱を見れば一目瞭然ですが、ネットショッピングだと基板の写真しかないことがあります。
そんな時の見分けるポイントです。
商品名
RS製は特筆されておらず、Element14製は商品名にそう書いてあることが多いです。
基板の写真
商品名で区別が付かなかったら基板の写真を見てみましょう。
Made in PRC(中国製)の印字がされていればElement14製です。
以上、Raspberry Pi純正カメラモジュールを買うときにハマった話でした。
保存したセンサーデータをGETして表示してみる(AngularJS)
前回の記事でAngularJSで書かれたbluradminというbootstrapアプリケーションをインストールしました。
イケてるbootstrapのダッシュボードをEC2上で動かす - ブログを書くまでがなんちゃら
今回は下図のようにAPIで取得した値を表示するところまで書きます。
ちなみにラズパイから取得した値をPOST、GETするところはAWS APIを使っています。
そちらは以下ブログを参考にさせていただいて実装できました。
Raspberry PiからAPIでDynamoDBに保存したデータを取得してみる【GET】: Raspberry Piでやってみた
API呼び出しすると以下のような出力になります。
# curl -H 'x-api-key:"APIキー"' "APIエンドポイントのURL"/prod/raspi/distance?limit=2 {"Items":[{"value":{"N":"111.5"},"date":{"S":"2016-08-24T01:29:12Z"},"type":{"S":"distance"}},{"value":{"N":"111.9"},"date":{"S":"2016-08-24T01:29:06Z"},"type":{"S":"distance"}}],"Count":2,"ScannedCount":2,"LastEvaluatedKey":{"date":{"S":"2016-08-24T01:29:06Z"},"type":{"S":"distance"}}}
データを取得するfactoryを作成する
AngularJSのモジュールは用途、使い方によってserviceとかfactoryとかに分けるみたいです。 色々試してみてfactoryで実装できたので今回はそちらを使いますが、 同じようなことがserviceでもできるようです。
// getDist.js function() { 'use strict'; angular.module('BlurAdmin.pages.dashboard').factory('getDist', getDist); function getDist($http) { var factory = function() { return $http({ method: 'GET', url: 'https://hi3xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/raspi/distance?limit=10', headers: { 'x-api-key':'d99xxxxxxxxxxxxxxxxxxxxxxxxxA94i' } }); } return factory; } })();
作成したfactoryを使って値を表示する
// DashboardPieChartCtrl.js (function () { 'use strict'; angular.module('BlurAdmin.pages.dashboard') .controller('DashboardPieChartCtrl', DashboardPieChartCtrl); /** @ngInject */ function DashboardPieChartCtrl($scope, $http, $timeout, baConfig, baUtil, getDist) { var pieColor = baUtil.hexToRGB(baConfig.colors.defaultText, 0.2); var factory = new getDist(); var distdata; factory.then(function(data, status, header, config) { distdata = data.data.Items[0].value.N; $scope.charts = [{ color: pieColor, description: '距離センサー1', stats: distdata + " cm" } ]; }); function getPersentage(dist) { return dist / 180 * 100; } // 中略 function updatePieCharts() { $('.pie-charts .chart').each(function(index, chart) { $(chart).data('easyPieChart').update(getPersentage(distdata)); }); } // 中略 } })();
ハマったところ
データ取得方法でGETとJSONPどちらを使えばよいのかわかっていなかった。
- 他ドメイン名からJSON形式で値を取得するときはJSONPメソッドで取得しなくてはならないみたい。
- それを知り、JSONPメソッドを使っていたが全くうまくいかない。
- そもそも取得する値がJSON形式ではない?のが原因か?
- 原因不明。今後の課題。
- 結局GETで取得できた。
$httpのthenを書く場所が間違っていた。
- getDist.js内の
return $http({ ....
にthenの処理も書いていた。 - 原因全く分からずお手上げ。teratailを初めて使ってみる。AngularJS - factory内でAPIからの値取得(44775)|teratail
- teratailすげーーーーーー。
- controllerでfactoryを展開してからthenの処理を書かなくてはいけなかった。
取得したデータから特定の値の取り出し方がわからなかった。
参考にした本
AngularJS アプリケーションプログラミング 大型本 – 2015/8/19 山田 祥寛 (著) Amazon CAPTCHA
今回AngularJSを見るのも初めてでしたが、それでもよく理解できるような良い参考書でした。
そもそもこんなことしなくても。。。
いろいろな可視化サービス出てるよねw
Webエンジニア向けIoT Visualizationサービス色々 ( #iotlt vol15 : 5分) // Speaker Deck
bluradminがかっこよかったから使いたかっただけ。
これからまたハードの方をいじり始めようかな。