Quantcast
Channel: neuralassemblyのメモ
Viewing all 50 articles
Browse latest View live

PandaBoard ESにUbuntu12.04 Serverを載せてmjpg-streamerを動かした話

$
0
0

はじめに

Raspberry Pi用赤外線カメラPi NoIRの映像をandroidで表示してみた」で、
Raspberry Piの赤外線カメラの映像をandroidにストリーミングしてみましたが、
Raspberru Piの性能では解像度320x240、フレームレート10fps程度が安定に動作する限界でした。
USBカメラを用いてもこれは大差ないと思います。

2014/3/21(金)に秋葉原で開催されるAndroid Bazaar and Conference 2014 Spring (ABC2014S)
でもこのような動画のストリーミングを用いた展示を行おうと考えているのですが、
320x240の10fpsでは動画のクオリティとしては少し物足りないです。

そのため、Raspberry Piよりも高性能なボードが必要になります。
気になるのはBeagleBoneBlackだったのですが、ABC2014Sではコンセントが使えるので、
より高性能なボードを使って確実な動作を目指すことにしました。
そこで用いたのが、職場で余っていたPandaBoard ESです。

以下、PandaBoard ESにUbuntuを導入し、mjpg-streamerを動かすまでの解説です。



OSのインストール

Omap4用のUbuntu 12.04 Serverをこちらの解説に従いインストールします。
SDカードへの書き込みは私の場合PC上のUbuntuで下記のように行いました。
/dev/sdeの部分は環境に応じて書き換えます。
$ sudo dd bs=4M if=ubuntu-12.04-preinstalled-server-armhf+omap4.img of=/dev/sde

書き込んだSDカードをPandaBoard ESに差します。
さらに、シリアルケーブルでPCとPandaBoard ESを接続し、
115200bpsでPCからPandaBoardにシリアル接続しておきます。

以上の準備の元、電源を投入すると、インストールが始まります。

デフォルトのネットワークインターフェイスはここでは有線のeth0を選択しましたが、
後でWifiドングルの設定を行うので、ここではネットワークの設定をスキップしました。

途中、インストールするパッケージを聞かれますので
  • Basic Ubuntu server 
  • OpenSSH server
を選択しました。

Wifiの設定

まず、ネットワークの接続にWifiを用いたかったのでその設定をします。
Ubuntuをインストールするとボード上のWifiデバイスがwlan0として使えるのですが、
技適の問題があることと、パフォーマンスがあまり良くないらしい(ただし試してない)ことの
2点より、市販のWifiドングルを用いることにしました。

用いたのはIO-DATAのWN-G150Uです。

まず、ボード上のWifiデバイスを無効にするために、 /etc/modprobe.d/blacklist.conf の末尾に
下記の内容を追記します。

blacklist wl12xx_sdio

記述したら再起動し、Wifiドングルをさします。

$ ifconfig -a

を実行し、wlan0が存在することを確認します。
wlan1となっていたら、 /etc/udev/rules.d/70-persistent-net.rules を編集して
wlan0として認識されるようにします。

次に、 /etc/network/interfaces の末尾にに下記の内容を追記します。
これは192.168.1.9という固定IPアドレスとするための設定なので、
環境に応じて書き換えます。

auto wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet static
address 192.168.1.9
netmask 255.255.255.0
gateway 192.168.1.1

次に、/etc/wpa_supplicant/wpa_supplicant.confを作成し例えば下記のように記述します。
接続先のSSID、暗号化プロトコル、パスフレーズなどは環境に応じて変更します。

network={
ssid="YOUR SSID"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk="YOUR_PASSPHRASE"
}


最後に、/etc/resolv.confを作成してDNSサーバーを記述します。例えば下記の通り。
本当はresolvconfに自動生成させるらしいのですが
Server版のためかうまくいかなかったので手作業で記述しました。

nameserver 192.168.1.1

以上の設定がうまくいくと、再起動によりWifiでネットワークに接続されているはずです。

mjpg-streamerのインストール

まず、OSを最新にします。

$ sudo apt-get update
$ sudo apt-get upgrade

そして、mjpg-streamerのビルドに必要な下記をインストールします。

$ sudo apt-get install build-essential libjpeg8-dev libv4l-dev imagemagick subversion

それが済んだら、下記のようにmjpg-streamerのダウンロードからビルドまで行います。

$ cd ~/
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make

mjpg-streamerの起動

起動の前に、/etc/modprobe.d/blacklist.conf の末尾に

blacklist snd_usb_audio

を記述して再起動しておきます。一部のUSBカメラとUSBオーディオのドライバとの相性が悪いためです。
このあたりに書いてあります。

起動は下記のような流れで行います。解像度640x480のフレームレート15fpsとしています。
30fpsでもPandaBoard側は問題なく動作しますが、受信側にそこまでの性能はないと考え
控えめに15fpsとしました。

$ cd ~/mjpg-streamer
$ export LD_LIBRARY_PATH="$(pwd)"
$ sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"

動作確認

PCのブラウザで、PandaBoardが動いているIPアドレスの8080ポートを見ると(http://xx.xx.xx.xx:8080/)、
映像が配信されていることがわかります。

この映像をandroidで受け取るには、いつも通り簡単MJPEGビューアを使います。
このアプリのソースはこちらにあります。

アプリを起動したら、メニューから「設定」を選択し、解像度を640x480に、ポート番号を8080に設定します。

ABC2014Sでは望遠カメラをストリーミングし、観光地にある望遠鏡のように
上下左右に動かすデモを行う予定です。
Wifiを使うので、うまくいくかは当日にならないとわからないのがつらいところ。

mjpg-streamerの自動起動

mjpg-streamerを自動で起動するためには、例えば下記のようにします。

mjpg-streamerをビルドしたディレクトリが/home/username/mjpg-streamer
であると仮定します。このディレクトリにstart-mjpg-streamer.shというファイルを作成し、
下記の内容を記述します。

#!/bin/sh

cd /home/username/mjpg-streamer
export LD_LIBRARY_PATH="$(pwd)"
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"


次に、このスクリプトを/etc/rc.localに記述することで、自動起動します。

(中略)

sudo sh /home/username/mjpg-streamer/start-mjpg-streamer.sh &

exit 0 ←この行はもともとある行

おしまい。

んー、やっぱり後でBeagleBoneBlackでも試そう。


仮面ライダー鎧武っぽいドロイド君を作った話

$
0
0

はじめに

これまでガンダムAGE1タイタス風に改造したドロイド君をSNSのアイコンにして来ましたが、テレビ放映も終わってしばらくたつし、そろそろ変更したいと考えていました。

見た目のインパクトから、今回の素材は仮面ライダー鎧武をチョイスしてみました。

個別写真


ドロイド鎧武

武装:AC01 仮面ライダー鎧武 オレンジアームズ
肩パーツ:BB戦士ガンダムAGE2
腕パーツ:BB戦士ガンダムAGE3

腕がちょっと手抜きですが…
ドロイド鎧武、変身途中

後述するように、もともとのオレンジアームズをいったんばらしているので、この程度までしか変形できません。
ドロイドバロン

武装:AC02 仮面ライダーバロン バナナアームズ
肩パーツ:BB戦士ガンダムAGE2
腕パーツ:BB戦士ガンダムAGE1

こいつをSNSのアイコンにしたくて作り始めました。

ドロイドバロン、変身途中。


本家と一緒に


AC04 パインアームズを装着した鎧武と。
AC06 マンゴーアームズを装着したバロンと。



作り方

アームズチェンジシリーズのアームズをニッパーで一旦バラバラにした後、下図のように真鍮線で結合します。


ドロイド君本体の方にこの真鍮線がはまる溝をつくってはめ込みます。

腕はガンダムAGE風ドロイド君と同じく本体にポリキャップを仕込んで取り付けます。


上記のような作り方をしているので、アームズチェンジできます。

これが…


こうじゃ。カッコイイ。


おわりに

新しいSNSのアイコンを作りたいという目的は達せられたので満足です。

ただ、わりとお高いアームズチェンジシリーズをニッパーでバラバラにしなければならないので、作る際ちょっと心理的に抵抗がありました。本当は斬月も欲しいのだけど次は作らないかも。

あと、この2体は2014年3月21日に秋葉原で行われるAndroid Bazaar and Conference 2014 Springで展示する際のブースのマスコットとして登場予定です。

ではでは。

こちらもどうぞ

スタービルドストライクガンダムっぽいドロイド君を作った話

$
0
0

はじめに

ガンダムビルドファイターズの後半の主人公機、スタービルドストライクガンダムをベースにしたドロイド君をつくったのでそのまとめ。

個別写真


スタービルドストライクドロイド君

背負い物:HG BUILD CUSTOM 1/144 ユニバースブースター プラフスキーパワーゲート
青い羽根:HGBF 1/144 スタービルドストライクガンダム プラフスキーウイング
腕:BB戦士 ビルドストライクガンダム フルパッケージ

その他写真


背負い物が重いのでスタンド必須
SEEDポーズ
鎧武ドロイド、バロンドロイドと一緒に


作り方

ほとんどプラモのパーツをくっつけているだけなので、作るのは割と簡単です。今回は腕だけでなく、背負い物のために背中にもポリキャップを仕込んでいます。あと、スタンドを利用するために底に3mm径の穴を開けました。


FXバーストドロイド君もそうですが、クリアパーツをいっぱいつけるとカッコいいですね(小並感

ではでは。

こちらもどうぞ






Raspberry Piの低消費電力化を目指した話

$
0
0

はじめに

これまで、


Android Bazaar and Conference 2013 AutumnMaker Faire Tokyo 2013などで展示してきました。

三輪ロボットにはnode.jsが動作するRaspberry Piが搭載されており、Firefox OS/enchantMOON/android/iOSなど、OSに依存しない操作がWeb技術により可能になっています。

Raspberry Piはモバイルバッテリーで稼働させているのですが、展示を行う上ではこのバッテリーの消費が早いのが問題でした。

Raspberry PiではLinuxのディストリビューションであるRaspbianが動作しており、シャットダウンと再起動にそれなりに時間がかかります。そのため、展示を見に来て下さっている方がたくさんいる状況でモバイルバッテリーの残量を示すLEDが赤くなると、どのタイミングでバッテリーを交換すべきか悩んでしまうわけです。

そこで、せめてモバイルバッテリー一つで展示1日(典型的には10:00~17:00)をもたせられないか、検討してみることにしました。

検討するのは

  • 電力消費の小さいWifiドングルを探す
  • Raspberry Pi上のレギュレータ(RG2)をDC-DCコンバータに変更する

の2点です。

電力消費の小さいWifiドングルを探す

最も電力を消費しそうなのはWifiドングルなので、消費電力の小さいものを探すのが効果がありそうに思いました。さらに、私がこれまで用いていたのはPCI GW-US54Miniというかなり古いものなので、これも電力消費が大きい原因の一つと思われました。

なお、この三輪ロボットは図の赤矢印で示すように、Raspberry Piと、テザリング機能をオンにしたXperia rayとの間でWifi通信を行っています(見ての通りとても近い)。


検討するWifiドングルは、NOOBS v1.3.4でインストールしたRaspbian (2014-01-07) のデフォルト状態で利用可能だった下記の4つです。
IO-DATAのものが2つありますが、これらにはハイパワータイプと超小型タイプという違いがあります。なお、下図で最も左にあるのが、これまで用いてきたPCI GW-US54Miniです。古いだけあって大きいですね。


計測は、Raspberry Piに安定化電源で5Vを供給し、その電流量を読むことで行います。電流量は、Raspberry Piを起動し、命令を受け付ける待機状態になった頃に読みます(実際の展示でも、待機している時間が長いと思われるため)。


なお、結果を示す前に注意ですが、以下のデータは、上の写真で示したように、非常に近い距離でWifi通信を行う際のものです。通信の距離が遠くなると電流量は大きくなりますし、そうなった際に電流量の大小関係は逆転する可能性があります。そのため、以下のデータは私のケースのみに当てはまる、あくまで目安と考えて下さい。

変更前
変更後
PCI GW-US54Mini 0.58A IO-DATA WN-G150U 0.45A
IO-DATA WN-G150UMK 0.39A
LOGITEC LAN-W150NU2AB 0.50A
BUFFALO WLI-UC-GNM2 0.50A

結果は上記のように、IO-DATA WN-G150UMKが最も電流量の小さいWifiドングルでした。なお、実際には電流量の揺らぎが大きいので、平均的な値を記しています。

どのWifiドングルもRalinkのチップを使っているようなので、あまり違いが出ないのではないかと予想していたのですが、IO-DATAの2つは電流量が小さくなりました(上で記したように、あくまで私のケースでは、ですが)。

というわけで、以後、IO-DATA WN-G150UMKを用いることにします。

Raspberry Pi上のレギュレータ(RG2)をDC-DCコンバータに変更する

(注!)本項の内容は、Raspberry Piを破壊する可能性がある(文字通り壊さないと実現できないのですが…)ため、自己責任でお願いします。

実は上でのWifiドングルの交換でほとんど満足してしまっているのですが、後で思い返して気になるのも嫌なので、もう一つのレギュレータの交換についても試してみます。

今回検索して初めて知ったのですが、Raspberry Piを低消費電力化するには、RG2というレギュレータを交換する、というのが定番のようで、既にいくつかの報告があります。

用いたのは、取扱いが容易そうだった
です。

作業は
  1. 表面実装されたRG2を取り外す
  2. DC-DCコンバータを取り付ける
の順で進めます。

1.の作業は「Replacing the Raspberry Pi's Main Voltage Regulator」にて細かく解説されています。RG2のヒートシンクも兼ねているTABですが、ヒートシンクにはんだをモリモリと盛れば熱が効率的に伝わり簡単に取り外せます。

2.のDC-DCコンバータ取り付けですが、下図のように3点(PSピンをGNDに接続するので正確には4点)を接続しました。DC-DCコンバータはユニバーサル基板の裏に隠れています。


接続がちょっと安直すぎるかなと思いましたが、SDカードへのOSのインストール、Xを起動してのクライアントとしての利用、など一通りの機能は問題なく動作しました。

三輪ロボットでの電流量を調べた見たところ、下記のようになりました。

変更前
変更後
純正Raspberry Pi +
IO-DATA WN-G150UMK
0.39A 改造Raspberry Pi +
IO-DATA WN-G150UMK
0.34A

およそ50mAだけ電流量が減っていることがわかります。他のWifiドングルでも試してみましたが同様の結果が得られました。

Replacing the Raspberry Pi's Main Voltage Regulator」でもやはり50mA程度の減少が報告されていますので、こんなものでしょう。

効果は?

既に示したように、Wifiドングルの変更とDC-DCコンバータの利用により、待機状態の電流量は0.58A→0.34Aと大幅に減少しました。それに伴って待機時のモバイルバッテリーの持ちが良くなっていることは確認済です。

ただし、実際の展示では

  • 三輪ロボットの操作時(=通信時)に電力消費が増える
  • 展示会場ではWifiの干渉によりさらに電力消費が増えると考えられる

などの理由により、「モバイルバッテリーで展示1日もたせる」という当初の目的が満たされているかはわかりません。

この点についてはAndroid Bazaar and Conference 2014 Springの展示にて検証してみたいと思います。

(追記 2014.3.22)
展示にて検証したところ、10:00~17:00まで、一つのモバイルバッテリー(5400mAhのQE-QL201)で動作可能でした。ちょうど展示終了の17:00間際にLEDがオレンジ→赤と変わったので、あと1、2時間はいけたのではないかと思います。

低消費電力化した効果があって良かったです。

おまけ

この三輪ロボットはシールド交換の要領でBluetooth + androidによる操作も可能になっています(動画はこちら)。下図のようにPIC24FJ64GB002+Bluetoothドングル(これもちょっと古いBuffalo BSHSBD02BK)で実現していますが、こちらの電流量もせっかくなので調べてみたところ、

  • 0.04A

でした。ちょうど一桁違う感じですね。






Android Wear (LG G Watch) で三輪ロボットを操作してみた

$
0
0

はじめに

Android wear (LG G Watch) で三輪オムニホイールロボットを操作してみました。
動画はこちら。




仕組みなど

アプリはAndroid SDK (API 20)に含まれているサンプルwearable/DataLayerをベースに作成します。時計と電話の間のデータのやり取りには下記のページのようにいくつかありますが、ここではwearから電話への一方向だけデータを送ることができればよいので、MessageApiを用います。

参考


解説用に簡単なサンプルを作成してみました。Android Studioでインポートして利用できます。

Wear側のアプリ

タッチ位置を電話のアプリにMessageApiにより送ります。



電話側のアプリ

Wearから送られたWearのタッチ位置を表示します。必要に応じて、この値に基づく命令をBluetoothやWifi経由で制御対象に送信すると、動画のような挙動が実現します。

なお、Wearから電話との間の通信には遅延があるので、Wear側でデータ送信の回数を減らす工夫をした方がよいでしょう。サンプルでは全てのデータを電話に送信しています。



Android Wear (LG G Watch) でカメラからの映像を見ながら三輪ロボットを操作してみた

$
0
0

はじめに

Android wear (LG G Watch) で、カメラからの映像を見ながら三輪オムニホイールロボットを操作してみました。動画はこちら。




経緯など

Android Wear (LG G Watch) で三輪ロボットを操作してみた」にて、Android wear搭載のLG G Watchで三輪ロボットを制御しました。

このロボットにはRaspberry Piとそのカメラモジュールが搭載されており映像を配信しているのですが、せっかくなのでLG G Watchでもその映像を表示してみよう、というのが今回のお話。

仕組みなど

動画の後半にも示されているように、LG G WatchだけではなくペアリングされたAndroid端末とその上で動くアプリが必要です。システム全体の模式図は下図のようになります。


スマートフォン側のアプリが三輪ロボット上のカメラからの映像を受け取り、それをWear側のアプリに送ります。カメラからの映像は640x480、15fpsで送られてきますが、Wear側へはそれを280x280、5fps程度に変換してから送っています。スマートフォンとWearはBLEで接続されていますので、データ量を極力減らさないとまともに動作しません。

アプリのスクリーンショットはこちら。

Wear側のアプリ



スマートフォン側のアプリ



ソース(準備中)

操作命令送信のサンプルは「Android Wear (LG G Watch) で三輪ロボットを操作してみた」にあります。

映像受信のサンプルは、もう少し安定性を高めてからここで公開予定です。

余談

今回実現したのは、2013年に「i'm Watch」というAndroidベースのスマートウォッチで実現したことの焼き直しです。下にリンクがあります。

それと比べると、Android Wearを搭載した、Googleにより正式に認証を受けた端末で実現した、というのが今回の違いです。

「i'm Watch」でのデモは「i'm Watch」という時計でしか実現できなかったのに対し、今回のデモは今後増えていくであろうAndroid Wear搭載の時計ならばどれでも動作する(はず)、というメリットがあります。

こちらもどうぞ

三輪オムニホイールロボットの操作について
Raspberry Piでの映像配信について
時計での模型操作について(i'm Watchという時計でのデモ)

Raspberry PiとArduinoで16x32 RGB LEDパネルにカメラモジュールの映像を表示してみた

$
0
0

はじめに

5月頃に秋月で「RGBフルカラードットマトリクスLEDパネル 16x32ドット」を購入し、長いこと放置していたのですが、少し時間ができたので試してみることにしました。

最近ずっと仕事で使っていたRaspberry Piで試すことにします。ただし、Raspberry Piに直接接続するわけではなく、

RaspberryPi―(シリアル通信)→Arduino→RGB LEDパネル

という構成にしました。そうすることで、Adafruitで公開されているArduino用のライブラリを流用することができます。

なお、この構成で始めた後に、やはりAdafruitでRaspberry Pi用のチュートリアルが出てることを知りました。そちらのチュートリアルでは画像ファイルをスクロールする例を取り扱っていますが、本ページでは、それとは異なる構成でRaspberry Piのカメラモジュールの映像をRGB LEDパネルに表示するところまでを試してみます(下図)。


準備

まず、AdafruitのArduino用のチュートリアルを元に、Arduinoで動作することを確かめてください。ArduinoのIDEでFile→Examples→RGBmatrixPanelとたどった時に「16x32」が含まれているサンプルは動作します。

用いるArduinoはチュートリアルにあるようにArduino Unoで良いですが、私は「Arduino Pro Mini 328 5V 16MHz」+「FT232RL搭載小型USB-シリアルアダプタ 5V」の組み合わせを用いました。ソースを少し変更するだけでArduino Megaでもいけるようですが、こちらでは試していません。

C++ & OpenCVの場合

それでは、Raspberry Piでの準備に入っていきます。Raspberry Piのカメラモジュールの映像を取得し、それをRGB LEDパネルに表示することを目指しますが、そのためにC++とOpenCVの組み合わせを用いることにします。

最初はPythonと画像処理ライブラリのPillowの組み合わせで試していたのですが、思った速度が出なかったので、C++とOpenCVの組み合わせに切り替えました。Python+Pillow版についてはページ末尾にメモを残しますので、興味のある方はどうぞ。

さて、Raspberry Pi、Arduino、RGB LEDパネルを下記のように接続しておきます。この場合、Arduinoの電源はRaspberry PiのUSBから供給されます。



さらに、Raspberry Piではカメラモジュールを使えるようにしておきましょう。「sudo raspi-config」で設定を起動し、「5. Enable Camera」→「Enable」とたどれば良いのでした。

次に、Raspberry PiでOpenCV、および後に必要なcmakeをインストールします。

sudo apt-get update
sudo apt-get install libopencv-dev cmake

次に、このRaspberry Piのカメラモジュールに対してOpenCVを用いることができるよう、「RaspiCam : C++ API for using Raspberry camera with/without OpenCv」をインストールします。まず、SourceForgeからraspicam-0.1.1.zip (129.5 kB)をダウンロードし、下記のコマンドでインストールします。

unzip raspicam-0.1.1.zip
cd raspicam-0.1.1
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig

このRaspiCamを用いると、Raspberry Piのカメラモジュールで取得した画像に対してOpenCVを利用できるので良さそうです。私は普段OpenCVを使っているわけではなく、RaspiCamも今回初めて触ったので、「良さそう」という程度しか言えないのですが。

次に、RGB LEDパネル用に私が用意したファイルを準備します。

cd
git clone https://github.com/neuralassembly/raspi_16x32RGBLED
cd raspi_16x32RGBLED
make

makeを実行した後、しばらく待つとビルドが完了します。画像ファイル表示用のimage2LEDmatrix、カメラモジュール表示用のcamera2LEDmatrixの2つの実行ファイルができています。 

さらに、Arduino用のserial2LEDmatrix.inoというC言語ファイルが存在します。このserial2LEDmatrix.inoをWindowsなどであらかじめArduinoに書き込んでおきましょう。 

このスケッチは、下図のように16x32x3バイトの階調(各階調は0~Fで表示)をシリアル通信で受け取り、「.」(ピリオド)を受け取ったタイミングでLEDパネルの内容を更新するように記述されています。



以下、image2LEDmatrixとcamera2LEDmatrixの使用法を解説してきます。

画像ファイルの表示 

image2LEDmatrixはSDカード上の画像をRGB LEDパネルに表示するプログラムです。練習兼動作検証用に書きました。

任意サイズの画像を与えることができます。画像の形式は、JPEGやPNGなど、OpenCVが読み込みに対応しているものです。動作モードは下記の2モードあります。

./image2LEDmatrix filename 0

末尾の0は省略することができます。こちらは下図のように画像の全体をスケーリングして表示します。なお、このページの画像は、見やすくするために全てRGB LEDパネルに紙をかぶせて撮影しています。


一方、下記の用に末尾に1をつけて起動すると、下図のように画像の左右または上下を捨て、なるべく画像を大きく表示します。

./image2LEDmatrix filename 1


Raspberry Piのカメラモジュールの映像の表示

カメラモジュールの映像を表示するには、下記のコマンドを実行します。

./camera2LEDmatrix

すると、下図のようにカメラモジュールの映像がRGB LEDパネルに表示されます。真面目に計測していませんが、体感で5fps以上は出ているのではないかと思います。


やってみるとわかりますが(いや、やる前にわかるか)、解像度があまりにも小さいことと、LEDが明るすぎることとがあいまって、何が映っているかわからないことが多く、ちょっと厳しいです。

普通に周囲の映像を映すと、ほとんどのLEDがかなりの輝度で輝くので、1.0A以上の電流がパネルに流れてしまいます。

そのため、使いこなすには何らかの画像処理が必要そうです。せっかくOpenCVを使っているので、エッジ抽出、ビット反転、時間差分などを試したのですが、解像度の小ささから、何が起こっているのかわからず、イマイチでした。

何か面白い応用があれば、お知らせ頂ければ幸いです。

(おまけ)Pythonの場合

上で、C++とOpenCVでの例を紹介しましたが、その前にはPython + Pillowで試していました。この方法にはいくつか欠点があったため途中でやめてしまったのですが、メモとして記録を残しておきます。

準備

まず回路ですが、Python用いてArduinoとシリアル通信する場合は、こちらのstackoverflowにかかれているように、ArduinoのRESETとGNDの間に220μF程度のコンデンサを挟む必要があります。ただし、このコンデンサはスケッチ書き込み時は外してください。
(追記:すいません、コンデンサなしでも問題なく動くかもしれません。追試の必要あり)


次に、Raspberry Piでpipとpython-devとlibjpeg8-devをインストールします。

sudo apt-get update
sudo apt-get install python-pip python-dev libjpeg8-dev

次に、Pillow をインストールします。

sudo pip install pillow

以上の準備のもと、次に、RGB LEDパネル用に私が用意したファイルを準備します。

git clone https://github.com/neuralassembly/raspi_16x32RGBLED_Python

raspi_16x32RGBLED_Pythonの中に、画像ファイル表示用のimage2LEDmatrix.pyとカメラモジュールの映像表示用のcamera2LEDmatrix.pyとが入っています。

これらを用いるのは、C++版でも用いたserial2LEDmatrix.inoをArduinoに書き込んでおいてください。これは https://github.com/neuralassembly/raspi_16x32RGBLEDに含まれています。

画像ファイルの表示

C++版と同様に、画像全体表示

python image2LEDmatrix.py filename 0

および、画像の切り出し表示

python image2LEDmatrix.py filename 1

に対応しています(末尾の0は省略できます)。画像ファイルのサイズも任意ですが、画像リサイズのアルゴリズム(PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC、PIL.Image.ANTIALIAS)がイマイチなため、縮小後の画像があまり綺麗に表示されないことがあるのが欠点です(OpenCV版ではINTER_AREAを用いました)。

そのため、Python版ではWindowsのgimpなどで事前に画像を横32x縦16にリサイズしておいた方が良い場合があります。

Raspberry Piのカメラモジュールの映像の表示

カメラモジュールの映像を表示するには、下記のコマンドを用います。この辺りを参考にしました。

python camera2LEDmatrix.py

残念ながら、こちらはでは、2秒に1回程度しか映像が更新されません。そのため、Pythonをあきらめ、C++とOpenCVによる方法に移行したのでした。




Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた

$
0
0

はじめに

Intel Edisonは特に使い途が思いつかなかったので手を出していなかったのですが、2014月11月末のMaker Faire Tokyo 2014にて初めて実物を見たことと、スイッチサイエンスさんのブースで「スイッチサイエンス版Eaglet (MFTバージョン)」を購入したことをきっかけに、試してみることにしました。

目指すのは、いつもやっている「Webカメラを接続してmjpg-streamerで映像を配信する」こととします。

結果を先にお見せすると下図のような感じでです。Intel Edisonで配信した映像がAndroidタブレットに表示されていることがわかります。

なお、本ページで言う「Intel Edison」は、ほとんどの場合「Intel Edison Breakout Board Kit」を指していますのでご了承ください。


UVCを有効にしたkernelを含むイメージを作成

EdisonのデフォルトのkernelはUSB Video Class (UVC)が有効になっていないので、それを有効にしたkernelと、それを含むOSイメージを作成する必要があります。この作業はUbuntuで行いました。作業の概略はIntel Edison BSP User Guideにまとめられています。

まず、Ubuntuに必要なパッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib

次に、Intel Edison Download Centerより、edison-src-weekly-68.tgzをダウンロードします。そして、

$ tar zxf edison-src-weekly-68.tgz

により解凍します。edison-srcというディレクトリができますので、以下の順でまずはデフォルトのイメージを作成してみます。なお、この際環境変数PATHにカレントディレクトリ「.」が含まれているとエラーが出ますので、あらかじめPATHから「.」を削除しておきます。

$ cd edison-src
$ ./device-software/setup.sh
$ source poky/oe-init-build-env
(ここで、自動的にedison-src/buildにcdされる)
$ bitbake edison-image

なお、最後のコマンドを実行すると、途中で様々なファイルのダウンロードが行われますが、環境やタイミングによりダウンロードエラーが起こることがありますので、エラー出ずにビルドが終了するまで繰り返します。

私の場合、成功時に下記のようなメッセージが現れてビルドが完了しました。

NOTE: Tasks Summary: Attempted 2802 tasks of which 29 didn't need to be rerun and all succeeded.

Summary: There were 79 WARNING messages shown.

ビルドが完了した後、以下のコマンドにより、書き込み用のファイル群をまとめます。

$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh

以上により、書き込み用のファイルがディレクトリedison-src/build/toFlashにまとめられます。この時点で書き込みテストを行いたい場合は、先の記述を見てください。

ここでは、kernelにおいてWebカメラを有効にする作業を行います。kernelの設定ファイルは
edison-src/device-software/meta-edison/recipes-kernel/linux/files/defconfig
です。下記のmenuconfigが面倒な場合はこちらのdiffファイルを元にこの設定ファイルを変更します。

menuconfigにより設定を行う場合は以下のようにします。まず、
edison-src/build ディレクトリにて

$ bitbake virtual/kernel -c menuconfig

を実行します (Xが必要)。

そこで、
Device Drivers→
MultiMedia Support→
Media USB Adapters でスペース→Enter
USB Video Class (UVC) で M
→Save
→Exit (複数回)
と辿ることで設定ファイルが

edison-src/build/tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config

として書き込まれます。これをkernelの設定ファイルの格納場所にコピーします。
edison-src/buildディレクトリにいるとして、

$ cp ../device-software/meta-edison/recipes-kernel/linux/files/defconfig ../device-software/meta-edison/recipes-kernel/linux/files/defconfig.orig
$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../device-software/meta-edison/recipes-kernel/linux/files/defconfig

さて、以上が済んだら、edison-src/build ディレクトリにて下記コマンドによりイメージの作成を行います。

$ bitbake virtual/kernel -c configure -f -v
$ bitbake edison-image
$ cd ../..
$ ./edison-src/device-software/utils/flash/postBuild.sh

以上で、edison-src/build/toFlashに書き込み用のファイルができました。

書き込む前に、Ubuntuにて、

$ sudo apt-get install dfu-util

を実行してdfu-utilをインストールしておきます。その後、下記のコマンドを実行します。

$ cd edison-src/build/toFlash
$ sudo ./flashall.sh

このコマンドによりアップデートの待機状態になるので、Intel EdisonのJ16コネクタとUbuntuマシンをUSB接続してIntel Edisonに電源を投入すると、アップデートが始まります。J3コネクタにてシリアルコンソールに接続しておくと、進行状況がわかって安心です。

なお、UbuntuマシンとIntel Edisonとを既に接続済みだった場合はIntel Edisonをリブートすると、起動時に更新が始まります。

再起動が終わったら、Intel EdisonのJ16コネクタにUSBカメラ(要変換コネクタ)、J21ピンに7V~15Vの電源を接続します。J3コネクタのシリアルコンソールでログインすると、/dev/video0ができていることがわかります。

なお、この状態でIntel Edisonを再起動すると、カメラが認識されなくなります。一度電源を切ってから再投入することで認識されるようです。

mjpg-streamerのインストールと起動

ここからは主にシリアルコンソールで接続したIntel Edison上の作業になりますが、まず、「configure_edison --setup」コマンドにより、あらかじめIntel EdisonをWifi接続しておきます。詳細はスイッチサイエンスさんのページが詳しいです。

また、あらかじめUbuntuマシンでmjpg-streamerのソースをダウンロードしておきます。このダウンロードにはSubversionが必要なのですが、Intel Edison用のSubversionのパッケージが見当たらず、ソースからインストールするのは面倒だったため、Ubuntuであらかじめダウンロードしておく、というわけです。

(Ubuntuマシンで)
$ sudo apt-get install subversion
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして、できたmjpg-streamerディレクトリをWifi経由でIntel Edisonへ移動しておきます。

ここからIntel Edisonでの作業です。


# opkg update
# opkg install libjpeg-dev libv4l-dev
# cd mjpg-streamer
# vi Makefilie

ここで、Makefileの39行目でinput_testpicture.soをビルド対象に含めている部分を下記のようにコメントアウトします。

# PLUGINS += input_testpicture.so

input_testpicture.soのビルドにはImageMagickが必要なのですが、ImageMagickのIntel Edison用のパッケージがなく、またその名前の通り、input_testpicture.soはテスト時以外なくても困らないためです。

以上のもと、ビルドします。

# make

ビルドが完了したら、下記のコマンドにより、mjpg-streamerを起動します。

# export LD_LIBRARY_PATH="$(pwd)"
# ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "./output_http.so -w ./www"

あとは、ブラウザで

http://Intel EdisonのIPアドレス:8080/

にアクセスすると、映像が配信されていることがわかります。

Androidの場合は簡単MJPEGビューアを使ってもよいです。

終わりに

Intel EdisonでWebカメラの映像を配信してみましたが、Raspberry PiやBeagleBone Blackと比べた場合のメリットは、5GHz帯のネットワークにデフォルトで接続できることでしょうか。Raspberry PiやBeagleBone Blackで5GHz帯のネットワークにつなぐにはGW-450Dを使う方法がありますが、kernelの再構築が必要であるなど、やや面倒です。

とは言え、Intel Edisonの方でもWebカメラを使うためにイメージの再構築が必要であったり、7V~15Vの電源が必要だったりと、これはこれで使いにくい感があります。

以上です。


Intel Edisonで映像配信中のカメラのパン・チルトを制御してみた

$
0
0

はじめに



にて、Intel EdisonにてWebカメラを有効にし、mjpg-streamerで映像を配信してみました。

今回は、Intel Edisonを使ったデモとして、そのWebカメラにサーボモーターを2つ取り付け、Web経由でパン・チルト(垂直方向と水平方向)を制御してみました。

全体像は下図のようになります。カメラの他は、Intel Edison Breakout Board、レギュレータやレベルシフタを含む周辺回路、バッテリー(Eneloop Pro6本)が見えます。

コントローラーはPC、タブレット、スマートフォンなどのブラウザです。



動作状況の動画はこちらになります。




カメラ雲台の準備

カメラとサーボモータ2つを接続する方法ですが、なるべく楽をしたかったので、秋月電子通商にある


を用いました。



この組み立て方は


にあります。これを見るだけでも大変そうなのはわかりますが、実際に手元に届いてみると

  • ニッパ、ピンバイス、ヤスリによるパーツの加工が必須
  • 必要なネジが全然足りない(と思う)
  • 2つのサーボSG-90の品質が悪く、最初から正常動作しないことがある

のように、なかなか骨のあるキットです。

ちなみにサーボSG-90は秋月やamazonなどでも追加注文できますが、店によってはバージョン違いなのかサーボのケースサイズやサーボホーンの径が異なり、さらに加工が必要になったりします。なお、私の場合、SG-90を計12個入手して、正常動作したものは10個でした。

さらに、このキットに付属するWebカメラはMJPEGモードに対応していないので、「Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた 」で紹介した方法では映像配信できません。

私は手元で余っていたLogicool C210を加工して取り付けました。Logicoolのものなら大抵大丈夫だと思います(今にして思えば、もっと画質の良いものにすれば良かったかも)。


回路の接続

作成したカメラ雲台を下図のようにIntel Edisonと接続します。


いくつかコメントします。

USBカメラを使うため、電源は7V~15VをJ21に入力します。バッテリーを用いたかったので、Enelooop6本を用いることにしました。容量の大きいEneloop Proにしましたが、これはお好みで。

サーボモーターは5Vで駆動するため、レギュレータTA4805Sで5Vを作ります。これは手元にあったものをそのまま用いました。

Intel Edisonからは下記の5つの信号を引っ張りだしました。Intel Edisonを外した状態で、Breakout Boardにケーブルを直接半田づけしました。

  • J17-1:サーボ用PWM
  • J18-1:サーボ用PWM
  • J18-2:GPIO。プルアップされた入力として用いて、シャットダウンスイッチに利用します。
  • J19-2:1.8V
  • J19-3:GND
各ピンの情報はIntel Edison Breakout Board Hardware GuideのPDFファイルを参考にしてください。

サーボモータ用に出力するPWM信号は1.8Vなので、サーボモータに与えるために5Vにレベル変換します。これも手元にあった「8ビット双方向ロジックレベル変換モジュール」を用いました。

PCとの接続は、J3のシリアルコンソールにより行います。

libmraaライブラリの準備

ここからはIntel Edison上での作業になります。あらかじめ、「Intel EdisonでWebカメラを有効にしmjpg-streamerで映像を配信してみた」に基づいてWebカメラの映像配信を有効にしておいてください。エントリ作成当時はポート8080を用いていましたが、ポート9000を用いるように変更しましたので、ご注意ください。

さて、スイッチサイエンスさんのページ「Intel Edison opkgのフィードを設定する」および「libmraaを使ってC++で開発する」を参考に、GPIOにアクセスするためのlibmraaライブラリをインストールします。

# vi /etc/opkg/myfeeds.conf

このファイルに下記の内容を記述して保存します。

src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src all http://iotdk.intel.com/repos/1.1/iotdk/all
src i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src x86 http://iotdk.intel.com/repos/1.1/iotdk/x86

書けたら、下記のコマンドを実行します。

# opkg update
# opkg upgrade
# opkg install libmraa0

これでlibmraaのインストールが完了しました。

node.jsで用いるモジュールの準備

node.jsによるWeb連携で用いるconnectモジュールとsocket.ioモジュールをインストールします。

# npm install connect@2.27.4
# npm install socket.io@0.9.17

使っているスクリプトの関係上、バージョンを指定して最新のものではないファイルをインストールしました。

これらのモジュールは/home/root/node_modules以下にインストールされます。

なお、libmraaライブラリに対応するmraaモジュールは/usr/lib/node_modules/mraaとしてインストールされていますが、これを/home/root/node_modulesにリンクしておかないと、自作のnodeスクリプトを/etc/rc.localから起動するときに失敗します。そのため、下記を実行しておきます。

# ln -s /usr/lib/node_modules/mraa /home/root/node_modules/mraa

ソースのダウンロード

ソースのダウンロードのために、gitをインストールします。

# opkg update
# opkg install git

次に、ソースをダウンロードし、pantiltという名前のディレクトリに保存します。

# cd
# git clone https://github.com/neuralassembly/Edison_pantilt.git pantilt

以下、いくつか解説を加えていきます。

シャットダウンスイッチ

シャットダウンスイッチを有効にするためには、下記のコマンドを実行します。

# python /home/root/pantilt/shutdown.py &

この状態で、回路上のタクトスイッチを2~3秒程度長押しすると、poweroffコマンドが実行され、シャットダウンが始まります。

中身は下記のようなPythonプログラムになっています。GPIO15はJ18-2のことであり、プルアップ抵抗つきの入力として設定しています。GPIO番号とピン番号の対応はこちらを参照。

import mraa
import time
import subprocess

switch = mraa.Gpio(15)
switch.dir(mraa.DIR_IN)
switch.mode(mraa.MODE_PULLUP)

state = 0

while True:
if switch.read() == 0:
if state == 2:
state = 0
args = ['poweroff']
subprocess.Popen(args)
else:
state += 1
else:
state = 0

time.sleep(0.5)

このshutdown.pyスクリプトを起動時に有効にするには、mjpg-streamerの自動起動の際に作成した/etc/rc.localに上記のコマンドを追記してください。

サーバーの起動

サーバーを起動するには、下記のコマンドを実行してください。

# node /home/root/pantilt/pantiltserver.js &

その状態でブラウザで


  • http://(Intel EdisonのIPアドレス):8080/


にアクセスすると、操作用のアプリが開きます。使用されているポートは下記の通りです。

  • 8080:ページの閲覧
  • 8888:socket.ioによるソケット通信
  • 9000:mjpg-streamerによる映像配信

JavaScriptで記述したpantiltserver.jsの中では、下記のようにJ17-1およびJ18-1ピンに対してPWM信号を出力しています。

var mraa = require('mraa');
var p0 = new mraa.Pwm(0); // J17-1
var p1 = new mraa.Pwm(14); // J18-1

p0.period_us(19500);
p0.enable(true);
p1.period_us(19500);
p1.enable(true);

// For upper servo
var duty0min = 0.03; // min
var duty0max = 0.11; // max
var duty0 = (duty0min + duty0max)/2;

// For lower servo
var duty1min = 0.031; // min
var duty1max = 0.115; // max
var duty1 = (duty1min + duty1max)/2;

p0.write(duty0);
p1.write(duty1);

サーボモータに50Hzの信号を与えるのですが、細かな周期やパルス幅はオシロスコープの波形を見たりサーボモーターの振る舞いを見ながら微調整しました。Duty比は0~1の実数で指定します。

このpantiltserver.jsをIntel Edison起動時に自動実行する場合は、やはり/etc/rc.localに上記コマンドを追記してください。

ブラウザ上のアプリ

ブラウザのアプリは下図のように映像の下と右にjQuery UIによるスライダを配置してサーボモーターへの指令をJavaScriptで送るようにしています。iOSのSafari/ChromeやAndroidのChrome/Firefoxなどで動作を確認しています。画面の回転にも対応しています。



このアプリは、主に下記のファイルで構成されています。

  • index.html
  • js/pantilt.js
  • js/socket.io.js:node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.jsと同じもの
  • js/jquery/:jQuery UI用ファイル
  • css/pantilt.css

js/pantilt.js内で、映像の取得と命令の送信を行っています。

終わりに

Intel Edisonを用いた簡単なデモということで、カメラのパンチルトを制御してみました。

mraaモジュールを用いるとJavaScriptで直接GPIOにアクセスできるので、Web連携が容易であるという印象を持ちました。ただし、ドキュメントがあまり充実していないように思われるのが残念なところです(Pythonの入力ピンのプルアップ抵抗を有効にする方法を調べるために、mraaのソースをgrepしたりしました)。そのあたりは今後に期待でしょうか。

あとは、7V以上の電源の確保と1.8VのGPIO入出力のレベルシフトがやや面倒、というところです。

他のボードとの比較で言えば、Raspberry Piで同じことをやろうとする場合、Webカメラでは性能が出ないので、Raspberry Pi用のカメラモジュールを用いる必要があります。さらに、Raspberry PiではハードウェアPWMが一つしか使えないので、全く同じことをするのは少し面倒です。

BeagleBone Blackでは全く同じことを実現できるはずですが、私はBeagleBone BlackでのGPIOプログラミングは未経験なのでノーコメントです。

以上でした。

Intel Edison備忘録

$
0
0

はじめに

Intel Edisonについての過去の投稿の内容を久しぶりにアップデートをしようとして、ログイン方法すら思い出せず途方にくれることがありました。
そこで、自分用のメモを残すことにしてみました。

用いるのはIntelが配布しているYocto Linuxとします。

ユーザー名とパスワード

  • ユーザー名:root
  • パスワード:なし

タイムゾーンの設定

参考:えびめも
# rm -f /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

時刻の設定

参考:えびめも
# date -s "2014.12.3-15:55:00"

usb0のネットワークを変更する

usb0ではデフォルトで192.168.2.15/24が使われますが、これが既存のネットワークとかぶる場合、/etc/systemd/network/usb0.network内下記の行を書き換えます。
Address=192.168.2.15/24

名前、Wifi接続などの設定

参考:スイッチサイエンス
# configure_edison --setup
これを複数回実行すると、ネットワークの設定が/etc/wpa_supplicant/wpa_supplicant.conf にどんどん追記されていくので、削除したい場合はファイルを直接編集します。

IPアドレス固定

参考:Intelのフォーラム
/etc/wpa_supplicant/wpa_cli-actions.shにて、下記のようにudhcpcを起動している部分を見つけてコメントアウトし、2行追加します。下記の例は、192.168.1.2に固定する場合を示しています。
if [ "$CMD" = "CONNECTED" ]; then
  kill_daemon udhcpc /var/run/udhcpc-$IFNAME.pid
#  udhcpc -i $IFNAME -p /var/run/udhcpc-$IFNAME.pid -S
  ifconfig $IFNAME 192.168.1.2 netmask 255.255.255.0
  route add default gw 192.168.1.1
fi

proxy設定

参考:OpenWrt
/etc/opkg/opkg.confに、下記の例のような行を追加します(サンプルが中にあるので真似します)。
option http_proxy http://proxyサーバー名:ポート番号/
option ftp_proxy ftp://proxyサーバー名:ポート番号/
これで、下記が通るはずです。
opkg update
opkg upgrade
他のコマンド用に、.profile にも下記を記入して保存します。
export http_proxy=http://proxyサーバー名:ポート番号/
export https_proxy=https://proxyサーバー名:ポート番号/
export ftp_proxy=ftp://proxyサーバー名:ポート番号/

sshによるログイン可能に

参考:スイッチサイエンス
外部からIntel Edisonにsshでログインできなくなった場合、/lib/systemd/system/sshd.socket 内の1行を下記のようにコメントアウトします。
#BindToDevice=usb0

Lapdock for Motorola Atrixを使ってRaspberry Pi 2をモバイルPCにしてみた

$
0
0
最近、仕事でRaspberry Piのデスクトップ環境を使う機会が増えているのですが、HDMI液晶ディスプレイ、キーボード、マウスを常に用意しておくのは場所をとるのであまり嬉しくありません。

省スペース化する何かいい方法はないかと調べてみると、海外で販売されているスマートフォン用ドック「Lapdock for Motorola Atrix」をRaspberry Piで使うというのがメジャーなようで、ksksueさんによる下記のページが非常によくまとまっていましたので参考にさせて頂きました。
Lapdock for Motorola Atrixは、ebayを検索し、「Buy It Now(ヤフオクでいういますぐ落札)」でInternational Shippingが可能なものを探すとイスラエル発送のものが最安値だったのでそちらで注文しました。

またこのLapdockをRaspberry Piに接続するためにはいくつか必要なケーブルやコネクタなどがあり、これらも全て上記のページで紹介されているものを購入しました。


LapdockとRaspberry Piの接続の概略は下図(A)のようになります。旧型のRaspberry Pi Model A/BではLapdockのUSBをRaspberry PiのUSB端子に接続するだけでRaspberry Piが起動しました。これはLapdockのUSB端子にスマートフォン充電用の5Vが供給されているからですが、Raspberry Pi Model A/BがUSB端子からの給電で起動するのは今回初めて知りました。

しかし、Raspberry Pi Model A+/B+やRaspberry Pi 2では下図(A)のように別途5Vの電源を接続しなければRaspberry Piは起動しません。すると、図(A)の通りLapdockとRaspberry Piとで2系統の電源が必要になり、あまりスマートではありません。

そこで、図(B)のように、LapdockのUSB端子からの信号を電源とUSB信号の2つに分配し、外部電源をLapdockの1系統に統一することにします。Lapdockにはバッテリーも搭載されているため、アダプタを接続しない状態でもRaspberry Piに給電することができ、モバイルでの利用も可能になります。


参考にしたのはYouTube動画「Raspberry Pi Laptop with Atrix 4G Dock (by Adafruit Industries)」ですが、この動画の通りにケーブルを分割するのは少し面倒です。なるべく作業を楽にするため、簡単な補助基板を作成することにしました。必要なものは下記のとおりです。
これらを下図のように配線します。なお、AタイプのUSBコネクタですが、4つの端子を基板にはんだづけするだけではグラグラして不安定なので、ホットボンドで基板に固定しました。


補助基板が完成したら、Raspberry Piの5V電源とUSB端子との両方に接続しますが、どちらも市販の「USB(A)オス-USB(Micro B)オス」ケーブルを用いることができます(冒頭の図をよく見ると接続の様子が見えます)。

以上でRaspberry Piをモバイルで利用することが可能になりました。必要な物品の一覧は下図のようになります。最もかさばるのは左上に見えるLapdockのアダプタですが、バッテリーで動作させるならばこのアダプタは不要です。また、柔らかく短いHDMIケーブルがあるとなお良さそうです。


もちろん、Raspberry PiだけではなくBeagleBone BlackやOdroidなども起動できます(下図はOdorid U3)。スタバでLinuxボードでドヤリングしたい方は是非。


Windows 10 IoTが載ったRaspberry Pi 2でLチカサンプルを動かしてみた

$
0
0

1. はじめに


4/30に、Raspberry Pi 2用のWindows 10 IoTが公開されました。インストールしてLチカサンプルを動かすところまで試してみましたので、手順をメモします。公開されているチュートリアルに書かれた通りに解説します。

下図が最終的に動かしたサンプルですが、LEDの点滅と連動して画面上の丸も点灯し、その下のスクロールバーを動かすことで点滅の速さも変更できました。


2. Raspberry Pi 2用マイクロSDカードへのWindows 10 IoTのインストール


手順→「Windows IoT - SetupBoard

必要なもの

  • Windows 10 Insider Preview(build 10074)以降を搭載したPC(マイクロSDカードの読み書きができること)

    実機が必要です。私は古いLet's Note (CF-W8) にインストールしましたが、後にVisual Studio Community 2015 RCを入れることを考えると、パワーのあるPCの方が良いかもしれません。なお、このLet's Noteではタッチパッドに触れるとブルースクリーンになるなど、Windows 10にはまだ問題は多そうでした。なお、「Windows IoT - SetupBoard」では「build 10069以降」と書かれているのですが、後にインストールするVisual Studio Community 2015 RCではbuild 10074以降が要求されています。

  • Raspberry Pi 2およびHDMIディスプレイ

    有線LANでネットワークに接続します。マイクロSDカードは8GB以上。キーボードとマウスは特にささなくても問題なさそうです。

Windows 10 IoTをマイクロSDカードに書き込む


PC上のWindows 10で下記の手順でマイクロSDカードを準備します。
  1. こちらから、Windows_IoT_Core_RPI2_BUILD.zipをダウンロードし、展開します
  2. 展開したフォルダにFlash.ffuというファイルがあることを確認します
  3. PCに8GB以上のマイクロSDカードを接続します(私は16GBのものを用いました)
  4. 管理者権限でコマンドプロンプトを起動し、Flash.ffuがあるフォルダまでcdコマンドで移動します
  5. 移動先で、diskpartコマンドを実行し、DiskPartを起動します
    > diskpart
  6. DiskPart上でlist diskコマンドを実行し、マイクロSDカードのディスク番号を調べます(下図では3)
    DISKPART> list disk
  7. exitコマンドでDiskPartを終了します。
    DISKPART> exit
  8. 調べたディスク番号を使って、Flash.ffuをマイクロSDカードに書き込みます。下の図の赤丸で示されている通り、「ディスク3」だったら「PhysicalDrive3」を指定する、という要領です。
    > dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDrive3 /SkipPlatformCheck
  9. 書き込みが100%に達したら、Windowsの安全な取り外しを行ってからマイクロSDカードを抜き、Raspberry Pi 2にセットします。


3. Raspberry Pi 2の起動とWindows 10からの接続


手順→「Windows IoT - SetupBoard」および「Using PowerShell to connect and configure a device running Windows IoT Core

Raspberry Pi 2にマイクロSDカードをセットしたら、有線LAN、HDMIディスプレイを接続した上で電源を投入します。数分待つと、最終的に手順のページでも見られる下記のページまでたどりつきます。なお、相性の悪いディスプレイでは画面が乱れるということがあったため、相性の良いディスプレイに変更することで対処しました。


なお、画面右上に見える電源ボタン、右下に見える設定ボタンは、Raspberry Pi 2に接続したマウスでクリックすることができるのですが、マウスにも相性があるようで、手持ちのマウスで操作できるものは多くはありませんでした。

下図左側がRaspberry Pi 2を操作できなかったマウス、右側が操作できたマウスです。メーカーによる傾向などはあまりありません。


ただし、マウスで操作できなくても、Lチカ自体は行えますので先に進みます。

さて、この状態のRaspberry Pi 2に、Windows 10 PCからリモート接続してみることにします。

  1. PowerShellを管理者権限で起動します(検索窓にPowerShellと入力すると現れます)
  2. PowerShell上で下記を実行し、WinRMを起動します。
    > net start WinRM
  3. PowerShell上で下記を実行します。Raspberry Pi 2のIPアドレスはディスプレイに表示されています。確認には「Y」と答えます
    > Set-Item WSMan:\localhost\Client\TrustedHosts -Value (Raspberry Pi 2のIPアドレス)
  4. PowerShell上で下記を実行すると、Raspberry Pi 2上のWindows 10 IoTにログインできます。デフォルトパスワードは「p@ssw0rd」です。
    > Enter-PsSession -ComputerName (Raspberry Pi 2のIPアドレス) -Credential (Raspberry Pi 2のIPアドレス)\Administrator

この状態でRaspberry Pi 2に対して様々な設定が行えますので、「Using PowerShell to connect and configure a device running Windows IoT Core」を参考にしてみてください。

ここでは、Windows 10 PCに対するVisual Studio Community 2015 RCのインストールに入っていきます。

4. Visual Studio Community 2015 RCのインストールと設定


手順→「Windows IoT - Setup your PC for Raspberry Pi 2」および「Enable your device for development

Windows 10がインストールされたPCに、Visual Studio Community 2015 RCをインストールしていきます。
  1. Steps to install Windows 10 development tools for Visual Studio 2015 RC」の左下にある「Get the tools」ボタンをクリックします。VSToolsForWindows.exeがダウンロードされますので、インストールします。Community版がインストールされますが、Professional版が良い場合は、リンク先の解説に従ってください。

    なお、「Universal Windows App Development Tools」というものをインストールしなければならないのですが、VSToolsForWindows.exeを「typical」でインストールしたら自動的にインストールされました。インストール後にコントロールパネルの「プログラムのアンインストールまたは変更」で「Microsoft Visual Studio Community 2015 RC」のインストール項目を調べてみると、 下図のように確かに「Universal Windows App Development Tools」がインストールされていました。


  2. 次に、Windows appの開発用にWindows 10をアンロックします。まず、検索ウインドウでGpedit.mscと入力し、現れたローカルグループポリシーエディターを管理者権限で起動します(エラーがでますが気にせず先に進みました)。そして 「ローカルコンピュータポリシー」→「コンピューターの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「アプリパッケージの展開」と辿り、中にある「Allows development of Windows Store applications and installing(略)」と「信頼できるすべてのアプリのインストールを許可する」を有効にします


  3. 最後に、Windows_IoT_Core_RPI2_BUILD.zipに含まれていたWindowsDeveloperProgramForIoT.msiをインストールします。なお、これにより「Windows IoT Core Watcher」というアプリケーションがインストールされ、自動起動するはずなのですが(スナップショットが「Windows IoT - Setup your PC for Raspberry Pi 2」にあります)、私の環境では起動しませんでした。それでもVisual StudioからRaspberry Pi 2へのアプリケーションのインストールはできましたので、ここでは気にせず先に進むことにします。

5. サンプルアプリケーションのダウンロードと実行


手順→「Blinky Sample」および「‘Hello, World!’ Sample

Lチカのサンプル「Blinky」のC#版を試してみます。「Blinky」ページに作るべき回路が示されているので、あらかじめ作成しておきます。3.3VピンとGPIO 5でLEDと抵抗の直列接続をはさむ回路になっており、GPIO 5がLOWのときにLEDが点灯する回路です。

ファイルは、「ms-iot/samples」の「Download ZIP」ボタンにより全てのサンプルをダウンロードしてしまうのが簡単でしょう。

展開後に現れる「samples/Blinky/CS/Blinky.csproj」がVisutal Studio Community 2015 RCで開くべきプロジェクトファイルになります。

開いたときの様子が下図です。図のように、MainPage.xaml.csにメインの処理が記述されています。


これをRasbperry Pi 2で実行するには、「‘Hello, World!’ Sample」に示されているように、ターゲットを設定する必要があります。

下図のように、「Device」を「Remote Machine」に変更します。


すると、下記のようなダイアログが現れるので、

  • Address:Raspberry Pi 2のIPアドレス
  • Authentification Mode:None
と変更して、Selectをクリックします。



その状態でアプリケーションを実行すると、それなりの時間待たされた後、アプリケーションがRaspberry Pi 2にインストールされ、冒頭の写真のように実行されます。

お疲れ様でした。

私が執筆した「Raspberry Piで学ぶ電子工作」が好評発売中です。

Raspberry Pi 2 + kernel 4.1.6 で5GHz対応WifiドングルGW-450Dを動かした

$
0
0

はじめに

Raspberry PiなどのLinuxボードをAndroid Bazaar and ConferenceやMaker Faireなどで展示する際、Wifiの混線を避けるために5GHz対応のWifiドングルGW-450Dを使うことがよくあります。

kernelの再構築が必要な場合が多いなど面倒ではありますが、ネットを探せばその方法はたくさん見つかりますので、それほどハードルは高くありません。

しかし、今回kernel 4.1.6でGW-450Dを動かそうとしたところ、これまで知られた方法ではうまく動作しない部分があったので対策法をメモします。

なお、本ページの解説は「Sionの日記 | RaspberryPi:GW-450Dを使う」で解説されている手法に準拠しています。Sionさんに感謝します。

なお、対象はRaspberry Pi 2とします。


必要なパッケージをインストール

2015/9/2現在、RaspbianおよびNOOBSの最新版のkernelは3.18.11です。これをrpi-updateにより更新すると、kernel は4.1.6となりました。

将来リリースされるであろうRaspbianおよびNOOBSのkernelはバージョン4.xとなるでしょうから、このバージョンでGW-450Dを動かせるようにしておきます。

まず、パッケージを最新にし、さらにkernel再構築に必要なパッケージもインストールしておきます。
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install gcc make bc screen ncurses-dev
さらに、kernelを最新にします。
$ sudo rpi-update
$ sudo reboot
2015/9/1の時点ではkernel 4.1.6になりました。

ソースの入手

それでは、kernelのソースをダウンロードするところから始めます。以下のコマンドで、kernelのブランチをrpi-4.1.yと指定していますが、これは上でkernelが4.1.6となったからです。用いるkernelが異なる場合は適宜j変更してください。
(2015.9.11 執筆直後の方法だと、学習リモコン用のlircが動かないことに気づいたので、ビルド方法をなるべく公式準拠になるよう変更しました)
$ cd /usr/src
$ sudo su
# git clone --depth 1 https://github.com/raspberrypi/linux.git -b rpi-4.1.y
# git clone --depth 1 https://github.com/raspberrypi/firmware.git
# cd linux
# modprobe configs
# zcat /proc/config.gz > .config
# cp ../firmware/extra/Module7.symvers Module.symvers
(Model B+の場合、Module7.symversをModule.symversに読み替えます)

カーネルのコンパイルから再起動まで

kernelのビルド、インストールは下記のようにします。make oldconfigの際に、新しい設定項目をどうするか聞かれた場合は、yかMを指定しました。

ビルドには数時間かかるので気長に待ちます。最後に再起動しています。
# make oldconfig
# make -j 4 zImage modules dtbs
# make modules_install
# cp arch/arm/boot/dts/*.dtb /boot/
# cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
# cp arch/arm/boot/dts/overlays/README /boot/overlays/
# cp /boot/kernel7.img /boot/kernel7.img.old
# scripts/mkknlimg arch/arm/boot/zImage /boot/kernel7.img
# reboot
(Model B+の場合、kernel7.imgをkernel.imgに読み替えます)
以上で自前ビルドのkernelでRaspberry Pi 2が動作するようになりました。ここから、GW-450Dのドライバーのインストールに入ります。

ドライバの入手

http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml
より、gw-450d_driver_linux_v3002.zipをダウンロードし、/usr/srcに移動しておきます。

そして、ドライバを下記のように展開します。
$ cd /usr/src
$ sudo su
# unzip gw-450d_driver_linux_v3002.zip
# cd gw-450d_driver_linux_v3002
# tar xf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# cd mt7610u_wifi_sta_v3002_dpo_20130916
展開が終わったら、パッチをダウンロードして適用します。
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel41.patch
# patch -p0 < gw-450d-rpi-kernel41.patch
このパッチ当てがkernel 4.1でGW-450Dを動かす上で重要なのですが、解説はページ末尾で行い、まずは手順の解説を全て終わらせます。

以上が終わったら、コンパイルを行います。
# make
コンパイルが終わったら、モジュールをインストールします。kernelのバージョンは各自読み替えてください。
# cp -p os/linux/mt7650u_sta.ko /lib/modules/4.1.6-v7+/kernel/drivers/net/wireless
# depmod -a
次に、設定ファイルのコピーを行います。
# mkdir -p /etc/Wireless/RT2870STA
# cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
最後に、ネットワークの設定を記述します。
# vi /etc/network/interfaces
(以下を記述)
allow-hotplug ra0
auto ra0
iface ra0 inet manual
wpa-ssid "your-ssid"
wpa-psk "your-passwd"
以上が終わったら、GW-450Dをさし、Raspberry Pi 2を再起動します。

GW-450Dでネットワークにつながっていると思います。

パッチの解説

最後に、用いたパッチgw-450d-rpi-kernel41.patchの解説を簡単にしておきます。

変更されるファイルは下記の4つです。
common/rtusb_dev_id.c
os/linux/config.mk
include/os/rt_linux.h
os/linux/rt_linux.c

順に見ていきます。

common/rtusb_dev_id.c

GW-450Dの情報を追加する変更です。これはどのバージョンのkernelでも行います。
@@ -36,6 +36,7 @@
/* module table */
USB_DEVICE_ID rtusb_dev_id[] = {
#ifdef MT76x0
+ {USB_DEVICE(0x2019,0xab31)}, /* GW-450D */
{USB_DEVICE(0x148F,0x7610)}, /* MT7610U */
{USB_DEVICE(0x0E8D,0x7610)}, /* MT7610U */
{USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */

os/linux/config.mk

これは、HAS_WPA_SUPPLICANTやHAS_NATIVE_WPA_SUPPLICANT_SUPPORTを有効にしています。これもどのバージョンでも行う変更です。
@@ -23,12 +23,12 @@

# Support Wpa_Supplicant
# i.e. wpa_supplicant -Dralink
-HAS_WPA_SUPPLICANT=n
+HAS_WPA_SUPPLICANT=y


# Support Native WpaSupplicant for Network Maganger
# i.e. wpa_supplicant -Dwext
-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

#Support Net interface block while Tx-Sw queue full
HAS_BLOCK_NET_IF=n

include/os/rt_linux.h

これは、fsuidとfsgidの型を変更しています。これはkernel 3.18.xでも必要な変更です。こちらを参考にしました。
@@ -277,8 +277,8 @@

typedef struct _OS_FS_INFO_
{
- int fsuid;
- int fsgid;
+ kuid_t fsuid;
+ kgid_t fsgid;
mm_segment_t fs;
} OS_FS_INFO;


os/linux/rt_linux.c

最後が、kernel 4.1.x でGW-450Dを動かす変更です。長くなるので全てを引用することはしませんが、典型的な変更点は下記の通りです。

関数ポインタ f_op->read がNULLを返すようになったので、かわりに __vfs_read を用いるように変更しています。この変更を行わないと、/etc/Wireless/RT2870STA/RT2870STA.dat の読み込みなどに失敗します。
他にも、f_op->writeを__vfs_writeに変更していますので、詳細はパッチgw-450d-rpi-kernel41.patchを見てください。

こちらこちらを参考にしました。

@@ -1082,9 +1082,8 @@

int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
{
- /* The object must have a read method */
- if (osfd->f_op && osfd->f_op->read) {
- return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
+ if (osfd->f_op) {
+ return __vfs_read(osfd, pDataPtr, readLen, &osfd->f_pos);
} else {
DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
return -1;


「Raspberry Piで学ぶ電子工作」好評発売中です。


Raspberry PiをノートPC化するPi-Topが届いた

$
0
0

はじめに

2014年10月頃、Raspberry PiをノートPC化するPi-Topがクラウドファンディングで資金を調達するというので話題となりました(参考:Techcrunch)。

その後、資金調達に成功し、2015年2月頃には一般向けに販売を開始しました(参考:fabcross)。

当時は2015年5月頃の発送を予定していたようですが、延期が重なり、2015年11月に実際に送られて来ましたので組み立てて使ってみました。

こちらが通常のRaspbianが動作している様子です。

価格

価格は下記の通りです。

  • Raspberry Pi 2 込みで299.99ドル
  • Raspberry Pi 2 なしで264.99ドル

さらに、日本までの送料が80ドルかかります。価格が高すぎるということはクラウドファンディング時から言われていましたね。

なお、Raspberry Pi 2は筐体の中に固定され、取り外しも面倒なので、Pi-Top専用のRaspberry Pi 2を用意するのが無難だと思います。私はPi 2込みのものを注文しました。

開封から組み立てまで

箱がこちら。結構大きいです。


箱を開けた瞬間、緑の天板が目につき、その予想外の大きさに圧倒されました。内容物は何段かにわかれて収納されています。


組み立てに必要なパーツを全て取り出したのが下図です。緑色のUSBのドングルはWifiデバイスですが、技適は通っていないと思われるので、お手持ちのものを利用するのが良いと思います。

また、Pi-Top OSと呼ばれる独自OSが入ったmicroSDも付属します。後述するように、通常のRaspbianでも制限はありますが動作します。

なお、短くて柔らかいHDMIケーブルが付属するのですが(下図で上から3番目のケーブル)、これ単体で売って欲しいと思いました。


組立自体は説明書の通りに行えば難しくないのですが、細いケーブルを取り扱う部分があるので、注意は必要です。

なお、下図のStep 3-3はスクリューを付属の六角レンチで回すのですが、どこかにねじ込んでいるわけでもなく、意味があるのか疑問でした。


また、Step 8-5でキーボードをBall Head Screwsにはめ込むのですが、ここでキーボードの下に来るケーブルをうまくまとめないと、キーボードが上に盛り上がって非常に不格好になります。

それを直すためにキーボードをBall Head Screwsから外すのはそこそこ大変なので、ここは組立中で最もストレスを感じました。

なお、このキーボードの盛り上がりを完全になくすのは難しいのでは?という気がしています。組み立てた方ならわかると思いますが、本ページのPi-Topの写真は、キーボードの中央部が若干盛り上がっています。


起動

組み立て終わったら、付属のPi-Top OSの入ったmicroSDで起動してみます。


起動画面の後、ログイン画面になるのですが、ここでできるのは、下記の通りです。
  • Wifiのセットアップ(Viewでパスワード入力可)
  • ネットワークログイン(Pi-Topサイトのアカウントでログインできるらしい)
  • ユーザーの作成
  • ゲストアカウントでのログイン(Read Onlyで、設定ファイル等変更できない)
Pi-Topサイトのアカウントでログインできるようなのですが、実際にログインしようとすると、下図のように「logging in」の状態のまま先に進みません。

なお、ネットワークに接続していない状態では、Read Onlyなゲストアカウントでの作業になりますので、実用的ではありません。Raspbian wheezyベースであることはわかるのですが、いつものユーザーpiでのログインはできませんでした。


色々試行錯誤した結果、以下の方法でPi-Topサイトのアカウントでログインできるようになりました。あらかじめPi-Topサイトのアカウントを持っていることが条件です。
  • まず、Wifiに接続します。Viewボタンをクリックするとパスワードを入力できたと思います
  • 右下の設定アイコンをクリックし、Create Accountにより、アカウントを作成します。その際、ユーザーネーム、パスワード、メールアドレスは適当に設定します(このアカウントは最終的には使われなくなります)
  • すると一時的にログインできますが、そのまま再起動すると、またログインできなくなってしまいますので、再起動はしないようにしましょう
  • そこで、ターミナルを起動し、下記のコマンドを実行し、OSを更新します
  • curl -sL https://www.pi-top.com/download/patch1 | sudo bash -
  • コマンドを実行すると、自動的にログアウトされ、もう一度ログインを求められます。この段階で、Pi-Topのアカウントでログインできるようになっています
ログインしてみるとわかるのですが、Pi-Topのアカウントは認証に使われるだけで、ログインすると普通のRaspbianと同様、ユーザーpiなのですね。ですので、OS更新前に一時的に作成したアカウントのデスクトップがそのまま引き継がれていたりします。

それなら最初からユーザーpiでログインさせてくれれば良いのに、と思います。

なお、このPi-Top OSを用いると
  • バッテリーの残量がわかる
  • 電源ボタンの長押しでシャットダウンコマンドが実行された後に電源が切れる
というメリットがあります。

使ってみた感想

そのようなわけで、Pi-Top OSはネットワークに接続されていないとログインできず不便なので、使い慣れたRaspbianで使っていますが、特殊な設定も必要なく普通に使えます。

ただし、Overscanの設定をDisableにしないと、画面端に黒い帯が現れて画面の広さが狭くなってしまうので、設定するのが良いでしょう。以前からあるraspi-configを用いる場合は「8 Advanced Options」→「A1 Overscan」から、NOOBS 1.4.2 (Jessie)からの新設定アプリケーションでは「System→Overscan」からDisableに設定できます。

以前、「Lapdock for Motorola Atrixを使ってRaspberry Pi 2をモバイルPCにしてみた」というエントリを書きましたが、その方法に比べると余計なケーブルが必要なく、とてもシンプルなのは良いと思います。

ただ、気になる点もいくつかあります。

まず、サイズがおよそ340mm×210mm×47mm (最厚部)程度と大きく、実際に目にするとかなりの迫力です。

また、キーボードのクオリティがやや低いです。押しても反応しにくいキーがあり、私の場合、「k」キーを押した際に 7/10 くらいの確率でしか入力されませんでした。まあこれは慣れである程度はカバーできるだろうとは思います。


また、下図のようにRaspberry Piの40ピンのGPIOが全て塞がってしまうのが気になります。下図の左側の基板から、34ピンだけ引き出せそうなのですが、現時点ではその仕様が公開されていないようです。

テスターで導通を見れば良いのかもしれませんが、急ぐわけでもないので公開を待とうかと思います。


また、Pi-Top OSではなくRaspbianを用いると、
  • バッテリーの残量がわからない
  • 電源ボタンを長押しするといきなり電源が落ちる
という問題があります。Raspbianでこれらを改善する方法も公開して欲しいと思いました。

現時点では、Raspianで
  • 「sudo poweroff」を実行→シャットダウンプロセスが終わったら電源ボタン長押し
として電源を切るのが安全なようです。

おわりに

上で述べたように色々問題もあるのですが、せっかく購入したので使ってみようかと思います。


「Raspberry Piで学ぶ電子工作」好評発売中です。


Raspberry PiをノートPC化するPi-Topで電子工作(LチカとI2C通信)してみた

$
0
0

はじめに

前回のエントリ
にて、Pi-TopではRaspberry PiのGPIOが全てふさがれている、と述べました。そのままではRaspberry Piの特徴の一つである電子工作との親和性の高さが失われてしまいます。

ただし、内部の左側にあるHubという基板にはGPIOから引き出されたと思われるメスピンがあり、その仕様がわかれば電子工作ができると思われました。

その仕様はいずれ公式に発表されるだろうと考えて放置していましたが、どうにも公開される雰囲気がないので、テスターを用いて自分でピン配置を調べ、実際に簡単な電子工作を行なってみました。

下図は定番のLチカを行なっている様子です。


ピン配置

※注:ここから先の情報を試す場合、操作を誤るとPi-Topが破壊される恐れがありますので、全て自己責任でお願いします。

まず、下図のようにfront/back/upper/lowerを定義します。



そうしたとき、Pi-TopのHub基板のピン配置は以下のようになっていました。各GPIOとGNDはRaspberry Piと直結されています。

3.3V/5V/16Vのピンは、Pi-Topの電源やバッテリー側から供給されています。どれくらいの電流を流すことができるかわかりませんので、あまり負荷をかけないほうがよいでしょう。


Raspberry PiのGPIOのピン配置と注意深く比較すると、全てのピンが引き出されていることがわかります。重複しているGNDは一つのみ引き出されています。

注意点を以下に述べます。
  • SPIに関わるピンは既にPi-Topに使われているようです。動作検証のため、SPI CE1 (GPIO 7)でLチカしてみたところ、Pi-Topが強制的に再起動され、冷や汗をかきました
  • 試していませんが、UART RXD/TXDのピンはシリアルコンソール用に使われているはずです
  • ID_SDとID_SCはRaspberry Piにもあるピンですが、使ったことはありません
  • I2Cのピンは、下図のように0x0bのアドレスを持つPi-Top Hub基板上のデバイスによってバッテリー状態の取得に使われていました。ただし、I2Cは複数のデバイスを接続できるので、問題にはなりません


そのようなわけで、SPIとUARTのピンを使わなければ一般的な電子工作は行なえそうです。

Lチカ

まずは定番のLチカから試してみます。 冒頭のLチカの図を再掲します。上のピン配置でGPIO番号を持っているピンのうち、UART/SPI/I2Cに関わるピン以外の全てでLチカができることを確認しました。下図はGNDピンとGPIO 4を使っています。


用いた回路とプログラムは「Raspberry Piで学ぶ電子工作」の4章で紹介したものを流用しています。

まず、回路はこちら。

そしてプログラムがこちら。
import RPi.GPIO as GPIO
from time import sleep

LED = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)

try:
while True:
GPIO.output(LED, GPIO.HIGH)
sleep(0.5)
GPIO.output(LED, GPIO.LOW)
sleep(0.5)

except KeyboardInterrupt:
pass

GPIO.cleanup()
これをled.pyという名前で保存した場合、ターミナルで下記のコマンドにより実行できます。
sudo python led.py

I2C通信によるLCDの利用

次に、I2C通信によりLCDに文字を表示してみました。下図のようになります。3.3V/GND/I2C SDA/I2C SCLの4ピンを使っています。


LCDをより大きく撮影した様子がこちら。


これは、「Raspberry Piで学ぶ電子工作」の7章で紹介したプログラムを以下のコマンドで実行した様子です。詳細は書籍をご参照ください。
sudo python 07-02-LCD.py 'Hello,  Pi-Top!'

おわりに

そのようなわけで、SPI通信以外のピンは通常のRaspberry Piと同様に利用できることがわかりました。

では、このPi-Topは電子工作に向いているかというと、「ちょっと怖い」というのが正直なところです。

例えば、手がすべるなどしてジャンパーワイヤをPi-TopのHub基板に落としてしまうと、なんらかのショートがおこり基板を壊してしまうことがあり得ます。写真を見ていただくとわかりますが、いかにも何かを落としてしまいそうな位置に基板があるのです。

壊れたのがRaspberry Piならば交換できますが、Pi-TopのHub基板となると交換はちょっと厄介そうです。決して安いものではありませんので。

そういう意味では、Raspberry Pi公式タッチディスプレイの方が、壊しにくい位置に基板があるという点で電子工作向きかな、と思います。あるいは、Pi-Topに続き資金調達に成功したpi-topCEEDでも良いかもしれません。

こちらもどうぞ



「Raspberry Piで学ぶ電子工作」好評発売中です。



Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた

$
0
0

はじめに

Raspberry PiをノートPC化するPi-Topが届いた」にて、Pi-Topに触って見ましたが、Pi-Top OSと呼ばれるOSを用いており、ログイン時にPi-Topサイトのアカウントでログインしなければならないことが不満でした。その主な理由は下記の通りです。
  • ログインした後は普通のユーザーpiなので、Pi-Topアカウントでログインする必然性がないこと(CEED universeというものと連携させたいのでしょうが)
  • ログイン時にインターネットに接続していなければならないこと
  • ログイン時に相手側サーバーがダウンしていたらログインできないこと
  • インターネット接続にProxy接続は許されないこと
そのようなわけで、通常のRaspbianのようにユーザーpiでログインできるようにしてみます。さらに、このPi-Top OSを通常のRaspbianに近い外観で使用できるようにもしてみましょう。

ただし、一旦コンソールにログインし、startxコマンドでXを起動する形式です。


準備

まず、Pi-Top OSにログインし、LXTerminalを起動して、
$ su - pi
を実行し、ユーザーpiにログインして見てください。パスワードは「raspberry」ではなく「pi-top」であると思います。そのことを確認できたら次に進みましょう。

手順

再びLXTerminalを起動して下記のコマンドを実行します。
sudo raspi-config
そこで「3 Enable Boot To Desktop/Scrach」→「Console Text console, requiring login (default)」を選択して再起動しましょう。これでコンソールへログインする形式になります。

このとき、ユーザーのIDとパスワードは先ほど確かめた通り、
  • ID: pi
  • パスワード: pi-top
です。

ログイン完了時に
Cannot open display "default display"
というエラーがでますが、これは気にしないことにします。多分.bash_profile内に書かれたコマンドのせいだと思うのですが、これを消すと別のエラーが出るためです。

このままstartxを実行するとエラーによりXを起動できないので、次のコマンドを実行し.xinitrcを無効化します。
$ mv .xinitrc .xinitrc.bak
さらに、X起動時に自動でダッシュボードが起動してしまうのを以下で抑制します。
$ mv .config/lxsession/LXDE-pi/autostart .config/lxsession/LXDE-pi/autostart.bak
あとはstartxでXが起動でき、Raspbianが利用できます。

バッテリー残量表示のアイコンがありませんが、以下のコマンドで残量が表示できるのでそれほど問題にはならないかなと思います。
$ battery

通常のRaspbianのように使ってみる

以下、このPi-Top OSを通常のRaspbian風にする設定を列挙します。

スプラッシュスクリーンの無効化

スプラッシュスクリーンを無効にすると起動が早くなります。何か処理をしているように見えて、実は45秒間の動画ファイル(/home/pi/.pi-top/media/splash.mp4)を垂れ流しているだけ、ってのはさすがにひどいと思いました。
$ sudo mv /etc/rcS.d/S01nasplashscreen /etc/rcS.d/K01nasplashscreen

LXTerminalが最大化されて起動されるのを防ぐ

.config/openbox/lxde-pi-rc.xmlをleafpadなどのテキストエディタで開き、下記の部分を見つけます。
<application name="lxterminal">
<maximized>yes</maximized>
</application>
この「yes」の部分を「no」に変更してからXを再起動すると、LXTerminalが最大化された状態で開くのを抑制することができます。なお、leafpadも最大化されてい開くかもしれませんが、こちらは、一度小さくしてから終了するとそのサイズが保存されます。

パネルの位置を上に

パネル上で右クリックして「パネルの設定」を開き、「ジオメトリ」→「位置」→「端」→「上」

タスクバーのアイコンに文字を出す

タスクバー上で右クリックして「タスクバー(ウインドウのリスト)Settings」→「アイコンのみ」のチェックを外す

メニューボタンのアイコンをRaspbianのものに

メニューボタン上で右クリックして「メニューSettings」→「アイコン」を/usr/share/raspberrypi-artwork/raspitr.pngに

壁紙をRaspbianのものに

壁紙上で右クリックして「デスクトップの設定」→「外観」で「壁紙のモード」を「原寸大のまま中央に配置する」に、「壁紙」を/usr/share/raspberrypi-artwork/raspberry-pi-logo-small.pngに、「背景色」を赤214、緑211、青222に。

以上で、Pi-Top OSが通常のRaspbianにこの程度近づきました。


こちらもどうぞ



「Raspberry Piで学ぶ電子工作」好評発売中です。


SHARPのIGZO液晶用のスタンドをタミヤの楽しい工作キットで作り、Raspberry Piで使ってみた

$
0
0

はじめに


秋月電子通商を始めとする様々なショップでSHARPのIGZO液晶の取り扱いが開始されました。


実は2015年8月のMaker Faire Tokyoで参考出展されていたようなのですが、私は今回初めて知りましたので、早速購入して試してみました。

あまり深く考えずに購入したのですが、なかなか骨のある商品でした。

タミヤの楽しい工作シリーズでスタンドを作成して表示している様子がこちら。


組み立てから電源投入まで

組み立ては詳細な説明書がついてくるので、流れ自体は難しくありません。

ただし、フレキシブルケーブルを基板に取り付けるの作業がかなり繊細なので、慎重に行なう必要があります。また、このフレキシブルケーブルは非常に断線しやすい(後述)ので、注意する必要があります。

Raspberry Piで用いる場合、/boot/config.txtにLCDの解像度に関する設定を追加する必要があります。上記の秋月電子通商の商品ページでファイルが公開されているので、それをダウンロードして用いても良いでしょう。

あとはHDMIディスプレイとして電源を投入すれば映像が映る、はずなのですが、手持ちのRaspbianのSDカードでは全く映像が表示されません。

この現象に数日悩みましたが、どうやら「NOOBSでインストールしたRaspbian」で映像が表示されないようです。「イメージ書き込みによるRaspbian」では問題なく映像が映りました。


NOOBSでRaspbianをインストールした場合、Raspbian起動前に下記のような映像が表示されますが、この映像が原因ではないかと思いました。


これに気づくまでの数日間、「組み立て時に破損してしまったのではないか?」と思い、二個目の液晶を購入してしまいましたが、その心配は不要でした(少なくともこの時点では)。


スタンドの作成

このままでは液晶を机にベタ置きで使う羽目になるので、スタンドを作成する必要があります。

既に、フォトフレームを流用する方法を紹介されている方や、きれいなスタンドを自作している方がいらっしゃるのですが、私はタミヤの楽しい工作シリーズのキットが手元で余っているので、これを使うことにしました。

それが冒頭の写真です。


どのようなパーツを使っているのかを解説すると、まず、前面側は下図のようになっており、

  • ユニバーサルプレートL
  • ユニバーサルアームセットのアームを2本
  • ユニバーサルアームセットのパイプ材(小)をスペーサーとして6個(ニッパなどで多少細らせる必要がある)
  • 3mmのビスとナットを6組

が使われています。


背面側は下図のようになっており、
  • ユニバーサルアームセットのL型アーム2個
  • ユニバーサルアームを長さ10でカットしたものを2つ
  • 3mmプッシュリベットを1つ(オレンジ色の部分)
  • 3mmのビスとナットを適宜
が使われています。

ユニバーサルプレートの穴と基板の穴の間隔が合わないため、ユニバーサルプレートへの固定は一箇所だけプッシュリベットを取りつけ、さらにタミヤのマスキングテープを貼って仮止めしています(これについては後述)。


ひとまずはこれで使えるようになりました。このIGZO液晶(1920x1200)(左)と公式タッチパネル(800x480)(右)を比較したのが下図です。

IGZO液晶の方が解像度が高いのですが、プログラムを書くなどのように文字を読み書きするためには、フォントを大きくするなどの設定が必須でしょう。


オチ

そのようなわけで、IGZO液晶をRaspberry Piで使えるようになってめでたい、で締めようと思っていました。

しかし、ブログにまとめるにあたって、基板とユニバーサルプレートをマスキングテープで仮止めたままではカッコ悪いかなあと思い、うまい固定方法を考えることにしました。

そのためにいろいろと試行錯誤している際、ビリッ、という異音がし、フレキシブルケーブルが下図のように断線してしまいました。


上述のようにIGZO液晶を2個購入していたので、2個目を使って復活させることはできましたが、断線に気づいたときはかなり落ち込みました。

そんなわけで、私のIGZO液晶の基板はマスキングテープでユニバーサルプレートに仮止めされたままです。

使いやすかったら常用しようかな、と考えていたのですが、また壊すと落ち込みそうなので、棚にしまっておくことにしました。


「Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。


JessieにアップデートされたPi-Top OSを試してみた

$
0
0

はじめに

Raspberry PiをノートPC化するPi-Topについては、これまで以下の3つのエントリで紹介してきました。
このPi-Topには、Raspbianにアプリケーションをいくつか追加したPi-Top OSというOSがバンドルされており、Pi-Top OSを用いることで
  • バッテリーの残量を知ることができる、
  • ディスプレイの輝度やボリュームなどをキーボードで変更できる
という恩恵を得られます。しかしその半面、
  • ログイン時にPi-Topの公式サイトで登録したIDをネットワーク越しに入力しなければならない
という欠点がありました。つまり、インターネットにアクセスできない環境ではログインすらできないわけです。

上記の3つめのエントリ「Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた」ではネットワークログインを無効化する方法を解説しており、個人的にはそこまで実行して初めてPi-Topを使う気になったのでした。

今回、Pi-Topチームから、Pi-Top OSのアップデートのお知らせが届きました。これまでWheezyベースだったのに対し、今回からJessieベースになったとのことで、早速試してみました。下の図は、インストール後、前回同様「Raspbian風に使う」設定を施した後の状態です。以下で解説していきます。


インストール

インストールは、これまでのOSのアップデートではなく、新しいmicroSDカードに新規にインストールする必要があります。8GBのmicroSDカードが必要ですが、運が悪いと16GBのものが必要かもしれません。

まず、Pi-Topチームからのメールに従うと、pi-topOS.zipという約2.5GBのファイルがダウンロードされます(リンクは貼らないでおきます)。

このzipファイルを解凍すると、8GBのpi-topOS-jessie.imgが現れます。すなわち、ディスクに2.5GB+8GBの空きがないとzipファイルの展開が行えませんので注意が必要です。このイメージは、8GBのmicroSDカードのイメージを吸い出しただけですね。

あとはこのイメージを新しいmicroSDカードに書き込みます。Windowsの場合、個人的にはWin32 Disk Imagerというアプリケーションを使っています。Raspberry Pi公式ページにWin32 Disk Imagerを用いたインストール法の解説があります。microSDカードを指すドライブの指定を間違うとPCの環境を破壊してしまうので注意しましょう。

8GBを書き込むのでそれなりに時間がかかります。この時、無事書き込みが完了すれば問題ないのですが、microSDカードの個体差が原因でサイズが足りずにエラーが出る場合があるかもしれません。そういった場合、16GBのmicroSDカードならば書き込みは成功するでしょう。

起動、ログイン、そしてRaspbian風に使う設定

イメージ書き込みが完了したら、microSDカードをPi-TopのRaspberry Piにさし、電源を投入します。Pi-Top購入時と同様のスプラッシュスクリーン動画→ログイン画面が見られるはずです。

そのままPi-Top OSのデフォルト状態で使うならばこれで作業は終わりです。

個人的にはPi-Top OSを通常のRaspbianのように使いたかったので、以下のように作業しました。

まず、ログイン画面でネットワークに接続し、Pi-TopのIDで一回だけログインします。そして、LXTerminalを起動し、下記のコマンドを実行します。
$ sudo leafpad /etc/xdg/lxsession/LXDE-pi/autostart
/etc/xdg/lxsession/LXDE-pi/autostartというファイルを管理者権限のテキストエディタで編集します(使うエディタはお好みで)。下記のような内容が見られるはずです。
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@omxplayer /opt/pt-splashscreen/splash.mp4
@sudo pt-hub-controller > /dev/null &
@pt-dashboard
このうち、4行目と6行目の先頭に「#」を付加して無効化します。すなわち、下記の通りです。
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
#@omxplayer /opt/pt-splashscreen/splash.mp4
@sudo pt-hub-controller > /dev/null &
#@pt-dashboard
そして再起動すれば、ログインIDを求められることなく、デスクトップが開きます。通常のRaspbianと同様の挙動です。

あとは「Raspberry PiをノートPC化するPi-Topにユーザーpiでログインしてみた」と同様にRaspbian風にする設定をしても良いでしょう。

なお、新しいPi-Top OSはJessieベースですので、新しい設定アプリケーション(Menu→Preferences→Raspberry Pi Configuration)が使えます。

ただし、Jessieには日本語フォントが含まれていませんので、そのまま日本語化するとメニュー等の文字が全て文字化けします。そのため、例えば下記のコマンドで日本語フォントをインストールしてから日本語化の設定を行うと良いでしょう。
$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
あともう一点、Wheezy版にはバッテリーの残量を知るためのコマンド「battery」があったのですが、Jessie版にはなくなっています。これはI2Cアクセスしてバッテリー残量を知るためのシェルスクリプトでした。移植は簡単で、Wheezy版の/usr/local/bin/batteryをコピーしてきてJessie版の同じ場所に配置すればそのまま使えます。

気づいたこと


カーネルのバージョンは4.1.17-v7+でした。2月3日にリリースされた新しいRaspbianと同じですね。

あと、JessieではChromiumブラウザがインストールできなくなったのですが、上の図にあるようにChromium 45.0.2454.85というバージョンがプリインストールされています。どうも「Guide: Chromium 45 on Raspbian Jessie」というページで紹介されている方法でインストールしたもののようですね。

このChromiumは、下記の特長があり、かなり好印象でした。普通のRaspbianでもインストールしてみたいと思いました。
  • Google ChromeのIDでログインできる(Wheezy版ではバージョンが古すぎるためかログインできなかった)
  • 重いページにアクセスしても安定しているように思われる(Wheezy版では頻繁に落ちる)

終わりに

Pi-Top OS自体は、あまり高く評価できるものではないと個人的には思ってますが、Jessie用のChromiumブラウザ触る機会を得られたことは、とても良かったと思います。


「Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。


Boot Camp上のWindows 7をWindows 10にアップグレードしてみた

$
0
0

はじめに

普段、Mac Book AirのBoot Camp上でWindows 7を使っているのですが、Windows 10の強制アップグレードが始まる、という話をちらほら耳にしたので、その前に試してみました。Mac Book Airモデルとしては2011年と2012年のモデルを1台ずつ行いました。

その際、正しい手順をとらないとハマることがあることがわかったので、以下にメモします。

推奨する手順


先に、推奨する手順を記します。この手順なら恐らくトラブルは起こらないのではないでしょうか?
  • まず、Windowsで動いているBoot Campヘルパーツールを最新にします。そのためには、下記の手順に従いました。
    • Mac Book AirをOS Xで起動し、「アプリケーション→ユーティリティ→Boot Campアシスタント」を実行し、Boot Campヘルパーツールを更新するためのUSBメモリを作製します。
    • Windows 7に戻り、作製したUSBメモリのSetup.exeを実行し、Boot Campヘルパーツールを最新にします。Mac Book Airのバージョンによりますが、Boot Camp バージョン5.1かバージョン6.0になるのではないかと思います。なお、RealTekオーディオドライバのインストールがいつまでも終わらない場合、一旦セットアップを終了し、USBメモリ内のRealTekフォルダを削除してからもう一度セットアップする必要があります(これは検索すれば情報が多く見つかります)。
  • あとは通常の手順でWindows 7をWindows 10にアップグレードします。タスクバーにアップデート用のアイコンがある場合はそちらからでも良いですし、こちらのリンクからでも構いません。
  • Windows 10へのアップグレードが終わったら、Bluetoothが機能しない状態になっていると思います。そこで、上で作製したUSBメモリのSetup.exeをもう一度実行すると、Boot Campの修復が行えるので、それで全てのデバイスが利用可能になります(先ほどと同様、USBメモリ内のRealTekフォルダの事前の削除が必要な場合があります)。

以上です。

Boot Camp 4.xの状態でWindows 10にアップグレードしてしまったら?

上で見たように、Boot Camp上のWindows 7をWindows 10にアップグレードする前にBoot Campヘルパーツールを最新にするのが重要です。

それを行わず、Boot Camp 4.xのままWindows 10にアップグレードしてしまったら何が起こるか、そしてどう対処すべきかを以下に記します。

Boot Camp 4.xのままWindows 10にアップグレードすると、アップグレード自体は問題なく終わるのですが、以下の様な状態になります。
  • トラックパッドが効かない
  • キーボードに対するIMEの設定変更が保存されない
  • Bluetoothが効かない
そのため、Boot Campヘルパーツールを最新にしようとするのですが、上で作製したUSBメモリ上のSetup.exeを実行しても、エラーが出てすぐ終了してしまい、ドライバの更新などが行われません。

また、旧バージョンのBoot Campをコントロールパネルのプログラムのアンインストールから削除しようとしても、「削除にはWindows 7が必要」と言われ、削除できません。

この状態に結構困ったのですが、下記の手順で解決出来ました。
  • Revo Uninstallerをインストールし、Boot Campに関するファイルとレジストリを全て削除する
  • 最新のBoot Campヘルパーツールをインストールする
Revo Uninstallerは、私は30日間の体験版を使い使用後にアンインストールしたのですが、無料版でも多分大丈夫なのではないでしょうか。また、最新のBoot Campヘルパーツールのインストール時にエラーがいくつか出ましたが、インストールは最後まで進み、Boot Campヘルパーツールは最新のものがインストールされました。もちろん、それで全てのデバイスが利用可能になりました。

おしまいです。

Windows 7からWindows 10にアップグレードしたらポータブルハードディスクが使えなくなった話

$
0
0
遅ればせながらWindows 7をWindows 10にアップグレードしています。メイン機は怖いのでサブ機から少しずつ試しているのですが、あるとき、タイトル通り「Windows 10でポータブルハードディスクが使えない」という状況に遭遇しました。

IO-DATAのHDPA-UT1.0XKというHDPA-UTシリーズのポータブルハードディスクなんですが、こちらの「Windows 8対応製品リスト」を見るとしっかり「☓」がついてますね。

実際にWindows 10に接続してアクセスすると、エクスプローラが固まってどうにもなりません。ファームウェアのアップデートも見当たらないですし、これはWindows 10対応のポータブルハードディスクを買い直し、Windows 7上でデータを退避するしかなさそう。

調べたら、こちらの方と全く同じ状況でした。

しかし、OSのバージョンアップでハードディスクが読めなくなるなんて初めての体験で驚きました。FATではなくNTFSなのが影響してるんでしょうか。

重要なデータが全てポータブルハードディスクにしまっている方がこの問題にハマったら、と考えると恐ろしいですね。
Viewing all 50 articles
Browse latest View live