ブログ

ορεσικα ψομαναι κυσο βλογ

mbedにPocketGeiger Type5を接続する

mbed触りだしてみました

使いやすいですmbed。オンラインIDEで使いたいボードなりチップを選ぶとピン配置図が出て配線が簡単に確実にできます。とても賢い人達が作っているのがわかります。某マイコンボード陣営が内部分裂でグダグダやってる内に嫌気が差してmbedに移るユーザもいるのではないでしょうか。

触ってるのはこれ

www.switch-science.com

BTつきのモノとかいくつか買ってみたのですが、いま私が主に触ってるのはLPC1114FN28です。プログラムをアップロードした後は石だけ取り出して電源を与えるだけでも動き出すという素敵な構成で、石単体なら200円ちょっとで手に入ります。すごい。

PocketGeiger Type5をつないでみる

mbedに慣れる目的で、PocketGeiger Type5をLPC1114FN28につないで放射線センサデータを取れるかどうか試してみました。といっても、arduino用のコードがすでにRadiation-Watch.orgから入手できるので、移植は私程度のクズでも簡単にできるはずです。

f:id:XX-Prime:20150503174907p:plain

オンラインIDEでLPC1114FN28を選んでPinoutを見てみると、dp25とdp26が空いているのでこれらをデジタル入力として使うことに決めました。PocketGeiger Type5からは信号線として放射線検出信号とノイズ信号の二本がデジタル出力として出ており、これらを取り扱う必要があります。

arduinoからmbedへ移植

arduinoのソースはほぼプログラミング言語Cそのものですが、以下の三点がarduino独自の方言です。

  1. ピン設定
  2. シリアル通信
  3. タイマー

この方言をmbed用のCに翻訳するだけで移植は完了します。

1. ピン設定(と読み取り)

これは簡単です。

arduino

//設定

//信号検出ピンの設定
pinMode(signPin,INPUT);
digitalWrite(signPin,HIGH);
//ノイズ検出ピンの設定
pinMode(noisePin,INPUT);
digitalWrite(noisePin,HIGH);

//読み取り

// 信号のローデータ 通常:High 検出時:Low
int sign = digitalRead(signPin);

// ノイズのローデータ 通常:Low 検出時:High
int noise = digitalRead(noisePin);

をmbedでは

//設定

DigitalIn signPin(dp25);
DigitalIn noisePin(dp26);
signPin.mode(PullUp);
noisePin.mode(PullUp);

//読み取り

// Raw data of Radiation Pulse: Not-detected -> High, Detected -> Low
int sign = signPin;

// Raw data of Noise Pulse: Not-detected -> Low, Detected -> High
int noise = noisePin;

と書きます。mbedは関数すら呼ばずにピンの状態を変数に直接代入しているようにみせてます。すごい。

2. シリアル通信

これも簡単です。

arduinoでは

Serial.begin(9600);

//シリアルで送信
Serial.println(msg);

 などとしますが、mbedでは

Serial pc(USBTX, USBRX); // tx, rx

pc.puts(msg);
pc.puts("\r\n");

などとします。\rを付けずに\nだけ付加しているmbedプログラムをよく見かけますが、多くの環境(というかシリアル通信端末プログラム)で\rがないと改行後に左端にカーソルが移動せずに出力が乱れてしまいます。

3. タイマー

これも簡単。

arduinoでは

//現在の時刻を取得
currTime = millis();

ですが、mbedでは

Timer t;

    t.start();

    currTime = t.read_ms();

 とすれば一対一対応します。

動かしてみたが、止まる。

移植はすぐ終わったのですが、いざ動かしてみると短時間で動作を停止してしまうことがわかりました。どうやらノイズピンに信号があると動作停止するようです。移植元のarduinoソースコードを真面目に読んでみたところ、怪しげな部分を見つけました。

//10000回ループを回ったら、計測値を計算して、シリアルで出力する
if(index==10000) //Arduino Nano(ATmega328)で160-170ms程度
{

  //省略
  
  //ノイズが10000回のループの中でまったく検出されないとき
  //ノイズが検出されたときは、処理をしない
  if(noiseCount == 0)
  {
  
    //省略
  
    //シリアルで送信
    Serial.println(msg);
  
    index=0; // <-えっ???ここで?
  }
  
  // 省略
  
}
index++;

 つまり、ノイズがない時だけ、indexが正常に0に初期化されるロジックになっているので、ノイズがあるとindexが初期化されずに増加しすぎておかしな挙動につながる、と思われます。よって

  if(noiseCount == 0)
  {
  
    //省略
  
    //シリアルで送信
    Serial.println(msg);
  
    //index=0; // <-ここをやめて
  }

  index=0; // <- ここにする
  

 としました。これでmbedでも正常に動作し続けることを確認できました。

f:id:XX-Prime:20150503182752p:plain

なぜarduinoでは問題が起こらないのか?

起きてるような気もしますが、とりあえずわかりません。intのサイズの違いかなあ。

追記(2015/05/05)

Radiation-watch.orgの問い合わせフォームから、上記のコード部分について質問してみたところ、やはりバグであることが判明しました。現在ダウンロードできるarduinoコードは修正済みのものなので、もし現在古いコードを使っている方は新しいもので置き換えることをお勧めします。ノイズピンに信号があった場合の計測値の精度が若干向上します。

arduinoで問題が起こらなかった理由も、Radiation-watch.orgのご担当の方の説明で判明しました。arduinoのintが2バイトであるため、index変数の初期化に失敗しても短時間でオーバーフローして、ある意味で勝手に再初期化が行われるために明確なバグとして発覚していなかったというのが真相です。mbedはintが4バイトなので、オーバーフローまでarduinoの65535倍の時間がかかるために、動作が止まったことがハッキリと認識できたわけです。私がもし賢かったら、移植の際にintのサイズを合わせるためにmbedではshort intを使っていたはずで、その場合はバグが発覚することもなかったでしょう。バカで良かった。

コード

改変部分をあえてコメントとして残してある部分もあります。

 

まとめ

mbedすげー。

Arduino yunで放射線センサのデータをxivelyとM2Xにアップロードする

xivelyだけでは不安

xivelyはたまにサービスが止まるので、センサデータをxivelyだけに上げるのは良いアイディアとは言えません。M2Xにも同時に上げてデータロストに備えましょう。

yunのプログラムスペースはやはり小さい

複数クラウドへの同時データアップロードの例として、pocket geiger type5の測定データをarduino yunでxivelyとM2Xの両方に上げるプログラムを書いてみました。当初はxivelyと同様にarduino側のProcessクラス経由のcurlを利用してM2Xにもアップロードしようと試みましたが、パラメータの文字列を用意するためにメモリが足りなくなって断念し、結局linux側のシェルスクリプトにM2Xへのアップロード機能を移しました。また、放射線データ保存用の配列も、デフォルトでは200要素ありましたが、150まで減らしてやっとうまく動作しました。しかしここまで苦労するなら素直に全部linux側でやってしまったほうが良いような気もします。

つかいかた

スケッチの下の方でコメントになっているシェルスクリプトを、yunの/root/にm2x_up.shという名前で作成して実行権限を付与します。スクリプト内の

M2X_DEV_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
M2X_API_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
M2X_RADIATION='radiation' # radiation stream
M2X_RAD_ERROR='radiation_error' # radiation error stream

を自分用のM2Xの適切な文字列に変更します。

次にスケッチ内の

#define APIKEY "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define FEEDID "000000000"

を自分用のxivelyの適切な文字列に変更してyunにアップロードします。うまくいけば一分に一回の頻度でxivelyとM2Xの両方に放射線センサのデータが上がります。

データ例

以下の様な感じで、両方共アップロードがうまくいっているようです。

f:id:XX-Prime:20150426221329p:plain

f:id:XX-Prime:20150426221340p:plain

これでどちらか(というかxively)が止まっても安心です。

コード

まとめ

シェルスクリプトjsonデータの構築部分がどうしてもうまく行かず、3日くらい試行錯誤したことは人として恥ずべき過去です。

Xively障害発生と復旧

サーバ障害発生

f:id:XX-Prime:20150418212254p:plain

これまでで一番長いダウンタイムかもしれません。先日、しょうもないUIアップデートがありましたが、そんなことやってるヒマがあるなら以下略。

乗り換え先は

M2Xとかどうでしょうか。

xx-prime.hatenablog.com

ちなみに私はAT&Tとは何の関係もないただのアホです。いくつか試してみて、乗り換えが容易だと思えるのがM2Xでした。

念の為に、XivelyとM2Xの両方に同じデータを上げておくと、片方が死んでいても安心です。私は放射線データだけを一つのrubyプログラムからXivelyとM2Xの両方に上げていますが、特に問題は生じていません。更に念押しするなら、3つ目のどこか別のクラウドストレージサービスを同時利用するのも良いかもしれません。クラウド利用は便利ですが、データロストの対策はしておく必要があります。

Xivelyの有料アカウントを利用している人は今回の障害の影響は受けているのでしょうか?

復旧

障害発生日時:2015年15時36分(JST)

障害復旧日時:2015年23時19分(JST)

でした。これまでも一時間程度の障害は度々発生していましたが、7時間以上というのは珍しいです。この先も障害が頻発するのかどうか注視が必要です。

3つのスイッチの状態を一つのアナログポートで検知したい

経緯

あるマイクロコントローラの、自由に使える入力ポートがアナログ1ポートしかないという状況で、ノーマリオープンのスイッチ3つの開閉状態を検知したいという状況が発生しました。スイッチは同時に閉じられることもあるので、2^3 = 8通りの開閉状態を電圧の変化として検知できるかどうかを考えてみました。だいぶ無理がありそうですが。

回路案

cacoo.com

こんなもんしか思いつきませんでした。Rとr1,r2,r3の値をどう選ぶかが問題です。ヘタに選ぶと複数の状態が同じVoutになってしまいそうです。

抵抗の選択

スプレッドシート上でいろいろと計算した結果、以下の組み合わせが良さそうだと思います。

{ \displaystyle R = 1\text{k}, r_1 = 4\text{k}, r_2 = 2\text{k}, r_3 = 1\text{k} }

これらの比率だけが意味を持つので、全体を適当に定数倍してもVoutは変わりません。この組み合わせの結果、Voutは以下のようになります。

0V付近とVcc付近の空きが大きく、右のほうの電位差が小さいなどの欠点はありますが、とりあえず8通りの電圧として分離できているようです。最小の電位差が右端2つの0.036 Vcc [V]なので、分解能が8bitもあれば十分識別できそうです。あ、抵抗の誤差をちゃんと考えないとマズそうな気もします。

もっと良い組み合わせや回路はあるか

ほぼ間違いなくもっと良いアイディアがあるのでしょうが、腐って紫色に変色している私の脳みそではこの程度が限界でした。特にVcc付近がうまく利用できてない点が激しく間抜けです。

スイッチはいくつまで増やせるか?

A/D変換のビット数に応じて、限界が決まると思います。面倒なのでここで思考を停止します。

一応計算式

間違ってるかもしれませんが

https://www.circuitlab.com/

でシミュレートしたら同じVoutになったので多分合っているのでしょう。

{ \displaystyle V_{out}(SW1のみON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1}} + 1} }

{ \displaystyle V_{out}(SW1とSW2が共にON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1} + \frac{R}{r_2}} + 1} }

{ \displaystyle V_{out}(全てON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_1} + \frac{R}{r_2} + \frac{R}{r_3}} + 1} }

こうやって具体的に例示すると見やすいですが、例えば

{ \displaystyle V(SWxのみON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_x}} + 1} }

とか

{ \displaystyle V_{out}(SWxとSWyが共にON) = \frac{V_{cc}}{ \frac{1}{\frac{R}{r_x} + \frac{R}{r_y}} + 1} }

とか

{ \displaystyle V_{out}(SWkだけが全てON) = \frac{V_{cc}}{\frac{1}{\displaystyle {\sum_{ONになっているSWのk} \frac{R}{r_k}}}+1} }

とかいうふうに一般化した式を書くといきなり分かりづらくなって読む気が失せますね。

まとめ

雨が降って憂鬱だったので、いろんなリンクを埋め込んだり、数式を書いたりしてみたかった。反省はしていない。

 

The Art of Electronics 3rd edition が届いた

表紙ボコボコ

BookDepositoryで予約購入していたThe Art of Electronics 3rd Editionが届きました。郵便受けに無理やり押し込まれていたせいか、表紙が凹んだり折れ目がついたりしてました。配達人さん出てきなさい。背景のビニールシートっぽい袋の中に、薄いダンボール封筒が入っており、その中に本が入っていました。

f:id:XX-Prime:20150407220556p:plain

昔に2nd editionを新品で入手した時も非常に状態の悪いものを掴まされたので、私は何かの罪でも背負っているのでしょうか。だから不思議と腹は立ちません。

あの演習問題は健在

f:id:XX-Prime:20150407220939p:plain

イラストがちょっと新しくなってます。

2ndとの違い

触って5分も経ってませんが、とりあえず気づいた二点だけ挙げておきます

内容的な差

チャプターの最後にReview of Chapter というまとめページが数ページつきました。最初にこのReviewだけざっと読んで、興味をひかれた部分を詳しく読むという使い方ができるようになりました。

物理的な差

総ページ数は1192ページでした。表紙カバーは外れない仕様になったので取り扱いはしやすくなりました。鈍器級の重さは相変わらずです。地震の多い国では保管場所に注意が必要です。

4th は出ないが

PREFACE TO THE THIRD EDITIONに、

In this new third (and final!) edition we have responded to this upheaval with major enhancements:(以下略)

とあります。これが最後の改訂版です。ただ、本に収まらなかったテーマについての補助的な本『The Art of Electronics: The x-Chapters』がこれから出るようです。

また、3rd ed.に対応した副読本もこれから出るようなので気長に待ちましょう。

artofelectronics.net

(**A new 3rd Edition** companion is in preparation: “Learning the Art of Electronics”)とのことですが、これまでの経緯を考えると、まあ当分先でしょう。

Arduino Yún(OpenWRTYun)の設定情報書き出しには注意

YúnのWebインターフェースからOpenWRTYunの設定画面へ

YúnのWebインターフェースはシンプルなので、できることが限られています。しかし、Yúnの実体はOpenWRTであり立派なLinuxです。OpenWRTの設定は複雑なので初心者にはなるべく見せないように工夫されていますが、YúnのWebインターフェースからOpenWRTの設定画面を開く経路があります。初心者は読んでもろくな事がありませんのでこの先は読まずに寝るといいよ。

Yúnに普通にログインした後、CONFIGUREボタンを押します。

f:id:XX-Prime:20150406213543p:plain

次に、advanced configuration panelリンクをクリックします。

f:id:XX-Prime:20150406213737p:plain

さらにSystem->Backup / Flash Firmware タブに進み、Generate archiveリンクをクリックすると、設定情報を含んだbackup-Arduino-<日付>.tar.gzという名前の設定情報アーカイブファイルをダウンロードできます。

f:id:XX-Prime:20150406214057p:plain

このファイルを、同じページのRestore backupからアップロードすれば設定情報を復元できます。この機能はとても便利で使いやすいのですが、一点注意が必要です。

設定情報アーカイブの中身

ダウンロードしたアーカイブファイルを展開してみると、/etc/ディレクトリをトップディレクトリとして、重要そうなファイルとディレクトリが見えます。なお、アーカイブファイル自体にはパスワードのロックはかけられておらず、入手すれば誰でも中を見ることができます。

f:id:XX-Prime:20150406214800p:plain

configディレクトリにあるwirelessというファイルが問題のファイルです。このファイルを開くと以下の様な内容になっています。

f:id:XX-Prime:20150406215515p:plain

ssidとそのプリシェアードキー(パスワード)が平文で書いてあります。ssidは見えても特に問題ではありませんが、パスワードが平文で入っていることは覚えておいたほうが良いです。「俺のYúnの設定情報はこんな感じだから参考にしてね」とか言って、このアーカイブファイルをおっぴろげてしまうとパスワードをおっぴろげてしまいます。

提案

Generate archiveリンクの横に、「このリンクをクリックしてダウンロードされる設定ファイルには、パスワード情報が含まれているので取り扱いに注意してね。」という注意書きを入れると良いと思います。赤いボールド体で。

ま、俺しか見てないこんなブログで提案しても意味ないんですが。

とりあえず俺が忘れないようにメモっておきました。

まとめ

Yúnの設定情報アーカイブファイルの中に無線LANアクセスポイントのパスワードが平文で入っている事を知らないナイスガイは、ナイスガイとは呼べません。

Arduino YúnのWi-Fi機能を復活させる

Arduino Yúnとは

Arduino Yúnは、Wi-Fiおよび有線Ethernet通信機能が実装されているArduinoボードの一種です。私がSwitch Science社から買った時点(去年の何月か忘れた)では、技適の関係でWi-Fi通信機能が使えないように改変された状態で売られていました。私が入手したのはそれです。

Yúnが技適を取得

http://mag.switch-science.com/2015/03/06/try-arduino-yun-1/

を見ると、YúnのWi-Fi部分が日本の技適を取得できたらしく、今ではWi-Fiの機能が使える状態(Switch Science社による独自改変なし)のYúnが販売されているようです。ということは、私のYúnのWi-Fi機能を復活させても問題ないのではないか、と解釈して復活させることにしました。厳密には法に抵触する恐れがあるので、夢も希望もあるまっとうな人々にはお勧めできません。こんな駄文を読んでないで早く寝るといいよ。夢も希望も失った私のような人は続きをどうぞ。

復活方法

まず、マイクロSDカードを一枚用意します。容量は32MB以上あればOKです。これを適当なカードリーダーでWindowsに接続して、FAT32でフォーマットします。

次にYúnの最新イメージを

http://arduino.cc/en/Main/Software#toc8

からダウンロードします。現時点で1.5.3が最新版のようです。ダウンロードしたzipファイルを展開して、約16MBのバイナリファイルをマイクロSDカードにコピーします。ディレクトリは作らずカードのルート直下にbinファイルが配置される必要があるようです。

このマイクロSDカードをYúnのカードスロットに挿してYúnを再起動します。YúnにWebブラウザでアクセスしてログインすると、以下の様なイメージフラッシュ用のRESETボタンが現れるのでこれを押します。

f:id:XX-Prime:20150402222558p:plain

3分くらい待ってから再びYúnにログインすると、めでたく以下のようにWi-Fiインターフェースが見えるようになります。これでようやくYúnらしい使い方ができるようになりました。

f:id:XX-Prime:20150402223028p:plain

スクリーンショットを取るのを忘れましたが、Wi-Fi復活前の画面はETH1だけが見える寂しいものでした。

なお、この手順はYúnの最新イメージをフラッシュする方法そのものなので、技適取得後のYúnを購入した方も、新しいイメージやカスタムイメージをフラッシュするにはこうします。sshでフラッシュコマンドを実行する方法もありますが、Webインターフェースからボタンクリックでフラッシュするのが一番楽です。

ParseがIoT用SDKをリリース。最初はYúnをサポート。

www.itmedia.co.jp

Yúnを持っている人は試してみるのも良いのではないでしょうか。

まとめ

Wi-Fi機能が停止されたYúnを購入して号泣していたナイスガイには、Wi-Fi機能の復活をお勧めしたいです。