ラベル beaglebone black の投稿を表示しています。 すべての投稿を表示
ラベル beaglebone black の投稿を表示しています。 すべての投稿を表示

2015年4月7日火曜日

こわれたのは地味な君

夜桜@ミッドタウン

朝、PIRの安定化に効果があれば、とコンデンサなど付けてみていた。

ら。

BBBが急死。またしても「だから電源を入れたまま作業するなと何度言えば」なのだけど、思い当たる原因がない。とりあえずUSB給電だと立ち上がるので大きなダメージはなさそうだけど、Vdd5vは死んでいる。

会社の昼休みに回路図を見てみたら「起動するけどVd5vが出ていない」という症状から、どうもACアダプタのところについている保護回路NCP349が死んだっぽい。でも、それならBBBとしての機能は損なわれないので、一安心。

で、家に帰ってみると推定通り、Sys5vが出ている。これならBBBとしての回路には影響がない。

やれやれ。

ただ、一応、念のためACアダプタの電圧を当たってみたら…出てないw

ACアダプタから5vが出ていないww

たしかに300mVしか出てないwwwwwwww

…失礼しました。秋月の安物とはいえ、ACアダプタが死ぬという経験は滅多にしたことがなかったので取り乱してしまいますた。購入リストによれば、1年半ほど前に間違ってArduino用として秋月店頭で買ってきたモノ(だって店員が5vで良いって言ったんだもの)。あの頃はまだSIerのサラリーマンだったなー(遠い目

一緒に買ったArduinoは元気に時を刻み続けているのですが、こっちは一足先にご臨終です。短い間だったけど、お疲れ様。

2015年2月18日水曜日

BBBにI2CでLCDつないでみた

BBBも混雑しはじめてきたw

いやー、嫌ですね、技術屋って略号ばっかりで…と言われそうなタイトルですが。とりあえず、いろいろググっていたら、シェルスクリプトだけでI2C液晶が時計になってしまう記事を見かけたので、さっそく試してみました。


まず、i2cの初期化をします。初期化について参考にさせていただいたのはこちらです。
記事はRev.A5AでうちのはRev.Cなのが原因かどうか、少しパラメータなどが違っていました。

まず、P8-17/18ピンのi2c端子I2C1を有効にしますが、その前にポートの状態を調べておきます。


つぎに、ポートを初期化します。
echo BB-I2C1 > /sys/devices/bone_capemgr.9/slots
もう一度ポートの状態を確認します。


良いようです。はい。ここで注意。配線したのはI2C1ですが、今設定して変化したのはi2c-2って書いてある行です。上の記事によれば、1と2の番号とデバイスが入れ替わっているのだとか。よーわからんのですが、Beagleboneにはこういう要素が多いような気がします。ともかく、先人のおかげでハマらないですみました。ありがとうございます。

というわけで、秋月の液晶「 I2C接続小型LCDモジュールピッチ変換キット」をBeagleboneと接続します。GND, 3.3V、あとは10kΩでプルアップしたSDAとSCL。基本これだけでいいのですが、RESET端子を3.3Vにつないでおきます。オープンにしたままだとリセットされないことがあるので。

接続したら、確認します。


液晶のデバイス番号3eが見えますね。秋月の資料には「スレーブアドレスは、0x7Cです」と書いてありますが、これはread/writeビットを最下位に置いて読んでいるためです。これ、メーカーなどによって読み方 / 指定の仕方が違うので悩むんですよね…。ともかくBBBでは3eです。

では、今度はBeagleBone Black のハードウェアハック(5)を参考にしてデジタル時計を動かしてみます。viでコードをコピペするのですが、記事とはi2csetのパス(i2cset=/usr/sbin/i2ctest)と接続しているポート(bus=2)が異なるのでそこは書き換えたのですが…記事の通りでは真っ黒い四角が並ぶだけでした。上記秋月の資料と比較してみると、コントラスト設定値として0x3fが指定されてて液晶が真っ黒になってしまうのと、意味はわからないですがICONってのがOFFになっていること、が原因のようでした。秋月の資料と同じデータ順にして、ばっちり動きました。


スクリプトでこんなことできちゃうんですね。すげー。

改めて、初期化とスクリプト時計の執筆者の方々に感謝申し上げます。おかげさまで今夜はすっきりぐっすり眠れそうです。

ありがとうございました。

2015年1月12日月曜日

Play!アプリとBoneScriptの通信 - 3.BoneScript

「BBBとは?」みたいな余計な説明がなくて中身が濃い。

というわけで、Play!アプリとBoneScriptの通信、完結編です。

  1. 構成
  2. Playアプリ
  3. BoneScript

■BoneScript■

以前、BoneScriptで7セグメントLEDを駆動したら、毎秒170桁しかダイナミック点灯させることができずにちらつきました。その際には各セグメントのon/offもループしていたのでおよそ毎秒7x170回はループしていた、ということになります。ダイナミック点灯は無理でも毎秒10回程度のサンプリングなら余裕ですね。8bit時代のBASICマイコンで空のFOR〜NEXTループを回すと250回ぐらいだったかなぁ(遠い目)。

ということで、以下ソースです。


特に目新しいことはしていません(できません)。line 11で100m秒ごとのインターバルを設定してchechPIRを呼び出し、digitalReadのコールバックとしてprintStatusを呼び出しています。

printStatusでは100m秒ごとにサンプリングして入力がHIGHならcountDetectedをインクリメントし、「1分間のうち何秒間、PIRセンサがHIGHを返してくるか(なおPIRセンサは負論理で動きを検出するとLOWになるのですが、トランジスタでレベル変換した時に正論理に変わってます)」を求めています。結果はCSVとしてファイルに書き出し(line no 56 - 62)、JsonとしてWeb APIに送っています(line no 64 - 94)。

その処理自体は簡単なのですが、起動直後の中途半端な「分」を無視したり(prevMinute==99)、「睡眠記録」として作ったので昼の12時でファイル名が切り替わるようにしたりで(line no 44 - 54)、ちょっと面倒になっています。

なお、日付書式の変換には下記で公開されている「formatDate」を使わせていただきました。ありがとうございます。上記ソースを試す場合には末尾にformatDateをコピペしてください。
Qiita : 日付フォーマットなど 日付系処理

■今後の予定■

現状ではセンサーを追加したらDBの定義からやり直さなければいけないですが…それはなんぼ何でもIoTっぽくないので、定義を抽象化するなりシリアライズして「思いついたらすぐセンサーを追加してグラフ化」という路線を目指してみましょうか。

そういえばXivery申し込んだんだけど、返事が来ない…まぁXiveryを使っていたら、Play!でグラフ化するなんてことをやろうとは思わなかったでしょうから、むしろ感謝すべきかなw

2015年1月10日土曜日

Play!アプリとBoneScriptの通信 - 1.構成

余分なジャンパが苦闘の痕跡を示すのだった

表題の通り、PIRセンサーの状態をBeaglebone black上のBoneScriptで読み取ってHeroku上のPlayアプリへ送り、D3.jsを使ってグラフ表示する方法をまとめました。

  1. 構成
  2. Playアプリ
  3. BoneScript

■アナログは苦手■

前回の記事の後PIRセンサの調子が悪くなってしまい、対応に追われました。どうもPIRモジュールの温度特性が良くないようで、プルアップ抵抗などを調整してうまく動くようにした後、外出や就寝で暖房がきれると徐々に特性が悪化してしまいます。

今回使っているPIRの最終段はオープンコレクタなのですが…コレクタ側に100Ωの保護抵抗が入っているためlowでも電圧がすっきり落ちてくれません。プルアップで調整するのも面倒になってきたので、これは2SC1815でバッファ入れて解決しました。ベースを10k、コレクタを1kΩで3.3vからプルアップし、エミッタをGND、コレクタからBBBのGPIOにつないでます。



あともう一つ、PIRからのノイズなのか、そのままだとGNDに200mVぐらいのスパイクノイズが乗ってしまってます。これも使い始めたころはなかったのですが、室温が15度を切るようになったから悪化したように思います。なので、4.7μFのケミコンと0.1μのセラコンを入れたところ見違えるように安定しました。

いやはや。

■ハードウェア構成■

センサには秋月の焦電型赤外線センサモジュールを用い、Beaglebone blackの5v電源出力とGNDを接続、上記回路で安定させてからBBBのP8_19に接続しています。非常に単純です。

なお、別のところでも書きましたが、最初は以前秋月で売っていたParallaxのPIR Rev.Aを使ってみたのですが…室内での人の動きと無関係に信号が出ていて、どうやっても改善しなかったので諦めました。現在秋月での扱いが終了しているのは、何か問題があったからではないか?と邪推している今日このごろ。貧乏サラリーマンの数百円を無駄にした恨み、思い知るがいい(違

■まずPlay側■

あっちこっちのサンプルの寄せ集めですが、こんな構成になっています。
controllers---Application.java
              Secured.java
models--------SensorData.java
              SensorDataRest.java
views---------graph.scala.html
              index.scala.html
              login.scala.html
              main.scala.html
Secured.javaなんてファイル名はまさにこのサンプルそのまま、笑ってやってください。

このアプリをHeroku上で稼働させています。データベースには同じくHerokuのPostgreSQLを用いています。どっちも無料枠内。PaaS万歳。

グラフ表示アプリには必要最小限の認証を付けました。でないと「留守・就寝中を世界に向けて発信する」アプリになってしまいますので。

グラフの表示にはD3.jsを使っています。ブラウザ上のD3からPlayアプリのAPIを叩いてJsonで過去24時間分の1分ごとのデータを受け取り、15分単位に集計してグラフを表示します。

■BBB側■

Beaglebone black Rev.Cはほぼ素のママで、BoneScriptを動かしています。0.1秒ごとにサンプリングして1分間のうち何秒間センサが動きを検出したかを集計し、1分ごとにHeroku上へとJSON形式のデータを送っています。

今のところ、送信エラー時のリトライは行っていません。Herokuは24時間に一度勝手にインスタンスがリスタートするので、エラーが出たらバッファにためといて再送するような仕組みを入れておくべきなのですが…。

■次回■

Play!のソースについてご説明します。公開しました。

2014年9月20日土曜日

Beaglebone Black Rev.CをMacOS Xでリカバリ


■うっかり■

SDカード上にubuntuを入れていじってみよう、と思ったら間違えてeMMC Flasherを選んでしまったために、今までBeaglebone上で作っていたものが全部消えてしまいました。

まぁ大したものは入っていなかったのですが、初めてnode.jsで書いた「7セグメントLED時計(ちらつきまくり)」のソースなども消えてしまったので、ちょっと悲しい。

ということでリカバリーまでの約2日間のドタバタを記録しておきます。

■その前にうまく行った方法を■

ウダウダと試行錯誤を書いて、最後に「これでうまく行きました」というのは不便なので、最初に出荷当時の状態に戻す方法を書いて起きます。

-Latest Firmware Imagesを落とす。
ここから。http://beagleboard.org/latest-images
BeagleBone Black (eMMC flasher)
Debian (BeagleBone Black - 2GB eMMC) 2014-05-14
※日付などは変わっている可能性もありますが、eMMC flasherの下のDebian BBB用をダウンロードします。時間帯によってはダウンロードに2時間かかったりするので、お出かけ前などにどうぞ。ダウンロードしたら解凍しますが、xzコマンドは標準では入っていないし、面倒なのでThe Unarchiverを使います。

-SDカードに焼く
イメージをSDカードに焼くにはPi Fillerがよく使われるのですが、上のimageはPi Fillerではダメでした(焼くことはできても、BBBに入れてUser Boot起動できない)。

なのでコマンドラインで焼きます。ターミナル.appを起動しSDをセットして
diskutil list
▶これでSDのドライブ名が出てきます。つながってるドライブ全部出てきますが、容量などを参考に判断してください。うちは /dev/disk4 でした。もしマウントされている場合には以下のコマンドでunmoutします。
sudo diskutil unmountDisk /dev/disk4
▶Unmount of all volumes on disk4 was successfulと表示が出ればOKです。では、焼きます。
sudo dd if=BBB-eMMC-flasher-debian-7.5-2014-05-14-2gb.img of=/dev/disk4
▶時計見ていなかったのですが30-60分くらいで終わります。ActiviyMonitorでディスク読み書きを表示させておくと、終わればI/Oが急に落ちるのでわかりやすいですw

-eMMCへのインストール
では、micro SDを取り出してshutdownして通電していないBBBにセットし、user bootスイッチを押したままUSBや電源アダプタを接続します。しばらく押したままにして、Ether近くのLEDが「ナイトライダー状態」(光の点滅が左右に走る)になったらスイッチを離します。

あとはそのまま放置で、朝起きたら電源が落ちて終わっていました。micro SDを抜いてから電源を入れなおすとちゃんと立ち上がりました。

ログインは ssh root@192.168.7.2 です。

■追記:2015-05-09■

内蔵eMMCではなくSDカードにインストールした場合(Flasherでないimageを使います)、以下のコマンドで空きパーティションの容量を使うことができるようになります。
cd /opt/scripts/tools
git pull
./grow_partition.sh
sudo reboot

■設定など■

出荷時と少し変わっているのか、dateで見ると日付設定されていました。買った時には電源入れるたびに設定しなおしが必要だったのですがw もし設定されてない場合は
ntpdate -b -s -u pool.ntp.org
以下のページを参考にしました。なお、ここはBBBに関する宝の山なので、ブックマークしておきましょう:-)
http://derekmolloy.ie/automatically-setting-the-beaglebone-black-time-using-ntp/

あとはいろいろ細かい設定ですが、私はとりあえずheartbeatがウザいので消します。
echo none > /sys/class/leds/beaglebone:green:usr0/trigger
アップデートとアップグレード
apt-get update
apt-get upgrade
ロケール設定、以下のコマンドからAsia/Tokyoを選んでください。
dpkg-reconfigure tzdata
などなど。

Cloud9も http://192.168.7.2:3000/ でちゃんと見えます。良かった良かった。

■ubuntu+cloud9失敗の記■

注意:以下の操作をすると eMMC(内蔵flash)の中身がきれいサッパリ消えます。その点、理解した上で、試してみてください。

-imageのダウンロード
これを使いました。

https://rcn-ee.net/deb/flasher/trusty/BBB-eMMC-flasher-ubuntu-14.04-console-armhf-2014-07-06-2gb.img.xz
例によってThe Unarchiverでxz形式を解凍し、img形式とします。

-SDカードへ
前記と同様の手順でSDカードに焼きます。

-BBBにインストール
前記と同じ手順です。BBBの電源を落としてからSDカードをセットし、user bootスイッチを押しながら電源を入れ、光が左右に流れたらスイッチを離ししばらく放置します。点滅が終わったら、インストール完了です。SD抜いて電源を入れ直します。id=ubuntu, pw=temppwdでログインできます。macのターミナルからだと
ssh ubuntu@192.168.7.2

-うざいHeartbeatが消えない
ubuntuでは
echo none > /sys/class/leds/beaglebone:green:usr0/trigger
とやっても消えません。以下のコマンドでどぞ。
echo none | sudo tee /sys/class/leds/beaglebone\:green\:usr0/trigger 
あとはlocaleの設定やupdate/upgradeなどのお約束。

ここまでは問題ありません。

-Cloud9が起動しない
この辺を参考にして、Python, Node.js, Cloud9をインストールしたのですが、IDEは起動できても実行できなかったりCloud9が落ちたりでダメでした。

・PythonとNode.jsのインストール
apt-get install python
apt-get install build-essential

・Cloud9のインストールと起動
git clone https://github.com/ajaxorg/cloud9.git
cd cloud9
npm install
bin/cloud9.sh -l 0.0.0.0
とりあえずCloud9を動かすのが目的というわけではないので、今回はこれ異常の追求はできません…いつかまた…。

2014年6月30日月曜日

Beaglebone Blackで7セグメントLEDデジタル時計

同梱

■約5日で到着

欲しいと思ったのが3月、5月上旬に発売されると聞いてMouser.comに発注したのが4/23、秋月やAdafruitへの入荷を見送って待ち続けてきましたが、Adafruitに再度入荷したので我慢できずに6/25に注文。6/29の11時ごろ配達されたのですが、買い物に出かけていて留守、やっと本日11時半ごろ入手しました。いえー。



■というわけで、7セグメントデジタル時計をまた作った

事前にブレッドボード上に回路を組んであり、Bonescriptでも一応書き終わっていたものの、初めての環境だとやっぱり色々ありますね…。ピン配列の資料を見て、「じゃ、P8の3番以降を使おう」と決めてあったのですが、実際に走らせると「そこのピンはMMCが使っているからダメよ」とエラーが。

間違った配線の図

じゃ、どうすりゃいいのよ、とそれらしい資料を探し出すのに小一時間かかりました。Getting Startedにあったんですけどねorz

やっと1桁表示できたw

それからソフトのバグをプチプチ潰しつつ、「せっかくの時計なんだからちゃんとntpで時間合わせしないと」と思ったのが運の尽きでちょっとハマったり。出来上がったのが、以下のムービーです。


ムービーのフリッカーを合わさって、ほとんど判読不能ですね…。実物はもうちょっと読めるのですが、ともかく実用にはなりません。Cloud9上で90桁/秒程度、コマンドライン上で170桁/秒程度です。170だと普通に読み取れますが、チラついてることが誰にでもはっきりわかるレベルです。

BCDデコーダが手元にないので7セグメントを1ピンずつループまわしてドライブしました。TC4511あたりを使えばもう少し早くなるかもしれませんが、それでも1Ghz ARM上のnode.jsだとこのへんが限界かもしれません。少なくとも、高速化のためにあれこれいじるよりCで書いた方がラクだと思います。

■設定など

SDカードを買い忘れてしまったので、まだなーんにもやってませんw

とりあえず、日付を毎回合わせるのは面倒くさいので、ぐぐって見つかったこちらのページ(Thank you!!)を参考にターミナルで
    ntpdate -b -s -u ntp.jst.mfeed.ad.jp
と実行。何の問題もなく設定された。なお、あんまり当然すぎて書いてないのだと思いますが、この設定はUSBとMac(PC)つないだだけではダメみたいです。DHCPのあるネットにEthernetをつないでからrebootし、USBのコンソールから入ってifconfigでen0のipアドレスを調べ、一度USB経由で接続したシェルからログアウトして、再度en0のIPアドレスにroot@<アドレス>では入ります。