Raspberry Pi に WiringPi のインストール

Raspberry Pi に WiringPi のインストール

WiringPi は Raspberry Pi 用GPIOライブラリで
GPIOを利用するプログラムをC言語で作成するときに使える

またC言語だけでなく
Python
PHP
Ruby
Perl
などでも使えるラッパーがあるのでC言語以外でも使える

WiringPi にはC言語ライブラリ以外に
gpioユーティリティが付属している

これを使うことで
コマンドでGPIOの制御ができる

まずは準備
WiringPi を使うには
lib2c-dev という I2C の開発ライブラリが必要

 sudo apt-get install libi2c-dev

次に WiringPi のインストールだけど
apt-get でインストールはできない

ソースファイルのダウンロード
コンパイル
インストールという手順になる

まずはパッケージ管理ソフトで
ソースファイルを入手するために
git をインストールする

sudo apt-get install git-core 

次にソースファイルのダウンロード

git clone git://git.drogon.net/wiringPi

これで wiringPi ディレクトリが作成され
この中にファイルが展開される

次にコンパイル

 cd wiringPi/
./build 

コンパイルが完了すると
ライブラリやgpioユーティリティがインストールされる

念のためバージョンも確認

gpio -v


確認できる

結果は

gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B, Revision: 2, Memory: 512MB, Maker: Sony 

これで、WiringPi はインストールできたけど
注意点としては
GPIOポートの指定方法が2つあること

1つはGPIOのポート番号を使う方法

もう1つは
WiringPi が独自に決めた番号で設定する方法

GPIOポートの場合だと
順番にならんでいないし番号もとびとび

WiringPi のほうだと0から順番に指定できるけど
配線作業のときに置き換える必要があるので面倒

というようにどちらがいいとは言えない

ある意味好みなのと
ソースを読むときに、この種類の違いを覚えておくと
動かない理由を探ることができる

Raspberry Pi とGPIOポート

Raspberry Pi とGPIOポート

raspberry pi のGPIOポートに
LED
スイッチ
モーターを制御するICなど様々な電子部品を接続することができる

なおGPIOポートは
デジタル出力なので
0か1のデジタル信号になる

各端子に出力する電圧が0Vなら0
3.3Vなら1になる

電圧の高低でデジタル情報を表すので
0ならL、つまり Low
1ならH つまりHigh
となる

Raspberry Pi には複数のGPIOポートがあるけど
ピン番号とGPIOポートの番号は一致していないので注意

GPIOポートについては
http://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking
にまとめられてるので参考に

そして
私の場合、ハンダ付けができないため
ブレッドボードを使用

ブレッドボードはユニバーサル基盤みたいにたくさん穴があるけど
さすだけで使えるのでこれを使う

基本的にはんだができないので
はんだを使わないものから実践

なお、秋葉原にハンダ付けカフェというものがあり
そこでも使えるみたい

営業日については
https://www.google.com/calendar/hosted/switch-science.com/embed?src=switch-science.com_adlqek3ketk3pl2sqjufv1fcos@group.calendar.google.com&ctz=Asia/Tokyo
を参考に

ブレッドボードは、ハンダ付けはいらない代わりに
ジャンパーワイヤーを使うことになる

書籍には
秋葉原とかで買えますって書いてあるけど
基本的に私の場合オンラインで購入したい

これは、引越しとかもあるし
東京在住でない人も実践できるから

あと、抵抗を買うときにはΩだけではダメで
何に使うかによっていろいろ変わるらしい

まずはLEDを光らせる通称Lチカに挑戦

一番迷うのが抵抗

これは
カラー抵抗値の写真早読み表!

を参考にさせてもらいました

抵抗については
150~330Ω程度
となっているので
ハック ラズベリーパイ Raspberry Pi 電子工作入門キット。

を購入し、その中から
赤のLED
ジャンパワイヤーのメスオスx2本
ブレッドボード
270Ωの抵抗

を使いました

抵抗は色で判断するしかないので
http://part.freelab.jp/s_regi_list.html
を参考に

見分けの方法ですが
金色の線をを右側にして
左側から3番めの線が橙色なのが 10KΩです

入っている部品は
10KΩ が4本
270Ω が4本
となっているので消去法で270Ωをみつけました

さらに、LEDにも極性
つまり+と-があります

LEDは足の長いほうが+で
アノードと呼ばれ
足の短いほうがーで
カノードと呼ばれます

ちなみに、抵抗には極性がないらしいです

これでブレッドボードを実践します

Raspberry Pi の 
Pin1 左上のところへ+の抵抗とつけたジャンパケーブルをさして

Pin 6 右上から3番めがGNDになるので
ここへLEDの-部分にさしたジャンパケーブルをさします

これで Raspberry Pi の電源を入れると
LEDが点灯します

次回は WiringPi を入れてLEDの操作をしていこうと思います

なお書籍で部品まで詳しく掲載されているものとして
Raspberry Piクックブック (Make:PROJECTS)

がありました

機会をみてショップのリンクなどを書いていこうと思います

AndroidでHTML5 のWebStorageの利用

AndroidでHTML5 のWebStorageの利用

HTML5からは、WebStorageAPIがあり
Javascriptを使うことでページを更新してもデータを永続化できるのがメリット

AndroidのWebViewの中でWebStorageを使うには
WebSettingsクラスの
setDatabaseEnabled()
setDomStorageEnabled()
を使う

これらにtrueをセットすることで
WebStorageの有効化ができる

さらに
setDatabasePath()へ保存先を指定すれば
データの保存も可能になる

private void setupWebStorage(WebView webview){

WebSettings ws = WebView.getSettings();

//DB有効化
ws.setDatabaseEnabled(true);
ws.setDomStorageEnabled(true);

//DB保存場所の指定
if(Build.VERSION_CODES.JELLY_BEANS_MR2 <= Build.VERSION_SDK_INT){
File databaseDir = getDir("databases", Context.MODE_PRIVATE);

保存場所がないなら新規作成
if(!databaseDir.exists()){
databaseDir.mkdirs();
}
ws.setDatabasePath(databaseDir.getPath());
}
}

assetsフォルダのHTML表示

assetsフォルダのHTML表示

アプリにHTMLやCSS
Javascriptや画像などのリソースを含めておき、WebViewで表示することができる

これをやるには
loadUrl()の引数に指定するURLを
file:///android_asset/ファイル名
とする

mWebView.loadUrl("file:///android_asset/index.html");

というかんじ

これは、利用規約やプライバシーポリシーの表示
アプリの解説やFAQなどに使うことが多い

また、PhoneGapなどでもこの方法は使われる

ただし、追加するごとにアプリサイズが大きくなるので注意

ファビコンの取得

ファビコンの取得

ファビコンは、WebページやWebサイトのシンボルマークとして設置できるアイコンのこと

Webサイトを閲覧していると
ブラウザのURL欄の左側にでているのがわかる

ファビコンを取得するには
WebIconDatabaseクラスに
ファビコンの保存先を指定して
WebChromeClientクラスの
onReceivedIconハンドラ経由で取得する

onCreate()の中へ処理を追加

setupWebIconDatabase();

mWebView = (WebView)findViewById(R.id.web);
mFaviconView = (ImageView)findViewById(R.id.imgFavicon);
mTitleView = (TextView)findViewById(R.id.title);

mWebView.getSettings().setJavascriptEnabled(true);
mWebView.setWebViewClient(newWebViewClient());
mWebView.setWebChromeClient(new WebChromeClient(){

@Override
public void onReceivedTitle(WebView view, String title){
mTitleView.setText(string);
}

@Override
public void onReceivedIcon(WebView view, Bitmap icon){
Log.d(TAG, "onReceivedIcon");
mFaviconView.setImageBitmap(icon);
}

@Override
public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed){
Log.d(TAG,"onReceivedTouchIconUrl, url = "+ url);
}
});
mWebView.loadUrl("アイコンのURL");

次に、ファビコンアイコンの保存先を
setWebIconDatabase()で指定

@SupportWarnings("deprecation")
private void setWebIconDatabase(){
if(Build.VERSION_SDK_INT <= Build.VERSION_CODES.JELLY_BEANS_MR2){
//アイコンを保存するディレクトリを取得
File databaseDir = getDir("icon", Context.MODE_PRIVATE);

if(!databaseDir.exists()){
//ディレクトリがないなら作成
databaseDir.mkdirs();
}

//正常につくれたら、WebIconDatabase保存先として指定
android.webkit.WebIconDatabase.getInstance().open(databaseDir.getAbsolutePath());

Log.d(TAG,"IcondatabaseDir = "+ databaseDir);
}
}

Android 4.4からは
WebIconDatabaseクラスは非推奨になったけど
それ以下のバージョンだと、使わないと
onReceivedIconUrlハンドラが呼ばれなくなる

onReceivedTouchIconUrl()は
ファビコンではなく
apple-touch-iconを取得するためのハンドラ

apple-touch-iconは
Appleの独自仕様で、大きなファビコンみたいなもの

Webサイトがこれに対応してると
このイベントハンドラが動作するので
そのURLから画像を取得することになる

長押しリンクのURL取得

長押しリンクのURL取得

Webページのリンクを長押ししたら
リンクをクリップボードへコピー
とか
リンク先の保存などをするときに
長押しリンクのURL取得を利用する

WebViewを長押ししたときのイベントを取得するには
長押しを有効にして
長押しのイベントリスナーをセットする

長押しの有効には
WebViewクラスの
setLongClickable()

長押しイベントリスナーのセットには
WebViewクラスの
setOnLongClickListener()
を使う

まず、

implements OnLongClickListener

を追記

private WebView mWebView;

でアクセスしやすくする

次に、onCreate()の中で

mWebView = new WebView(this);
setContentView(mWebView);

これでビュー作成と配置

mWebView.setSettings().setJavascriptEnabled(true);

でJavascriptを使えるようにしておく

mWebView.setLongClickable(true);

で長押し有効に

mWebView.setOnLongClickListener(this);

で長押しリスナーセット

mWebView.setWebViewClient(new WebViewClient());
mWebView.loadUrl("http://www.google.co.jp/");

でWebページ表示

次に、HitTestResult からデータの取り出し

HitTestResultは
ユーザーがアクションを起こした対象の箇所の情報を保持するクラス

WebViewクラスの
getHitTestResult()
で取得できる

さらにそこから長押し対象を判定し、URLを取得する

@Override
public boolean onLongClick(View v){

if(v == mWebView){

//長押しした箇所の情報を取得
HitTestResult hittestresult = mWebView.getHitTestResult();

//長押し対象の判定
switch(hittestresult.getType()){

case hittestresult.SRC_ANCHOR_TYPE:
//長押しがアンカーリンクの処理
String url = hittestresult.getExtra();
Toast.makeText(this, "url: "+ url, Toast.LENGTH_SHORT).show();
break;
}
}
return false;
}

今回は、HitTestResult.SRC_ANCHOR_TYPEなので、HTMLのaタグのリンクを取得している

ほかにも
EDIT_TEXT_TYPE
EditTextの場合

EMAIL_TYPE
メールアドレスの場合

GEO_TYPE
地図情報の場合

IMAGE_TYPE
HTMLのimgタグの場合

PHONE_TYPE
電話番号の場合

SRC_IMAGE_ANCHOR_TYPE
HTMLのaタグで、imgタグを囲んでいる場合

UNKNOWN_TYPE
不明なターゲットの場合
これは、何もないところの長押しとか
通常のテキストの長押しの場合適用される

タイムラプス画像を動画へ変換

タイムラプス画像を動画へ変換

raspberry Pi で撮影した画像を動画変換するけど
処理に時間がかかるので
Ubuntu で行う

sudo apt-get install libav-tools 

で変換ツールをインストール

静止画から動画へ変換するには
avconvコマンドを使う

avconv -r 10 -i image-%04d.jpg -r 10 -vcodec libx264  -crf 29 -g 15 video.mp4

これを core i7 のCPUの Ubuntu でやったら
数秒で変換が終わった

なお変換したファイルは
Ubuntu なら VLC Media Player などで再生できる

avconv コマンドのオプションは
-r で一秒あたりのコマ数
通称フレームレートになる

今回は -r 10 にしたので
1秒間で10コマ進む

撮影するときに1分ごとに撮影しているので
10分を1秒で再生することになる

-i オプションでは変換するファイルの指定
-i image-%04d.jpg
としたので
image-0001.jpg から iamge-0061.jpg
までのファイルを指定している

Youtubeに timelapse で検索すると
いろいろでてくるので自分で挑戦して投稿するとおもしろいかもしれない

https://www.youtube.com/results?search_query=timelapse

で youtube の timelapse をみることができる

raspberry pi でタイムラプス撮影

raspberry pi でタイムラプス撮影

raspberry pi 専用カメラモジュールを使うことで
タイムラプス撮影を行える

今回使用した専用モジュールは
ラズベリーパイ カメラモジュール Camera Module for Raspberry Pi

なお、これだとカバーがないので、作成するか購入することになります

とりあえず
Raspberry Pi用カメラケース (Black)

を購入

タイムラプス撮影は
TVのCMとかで雲が流れる様子や一日の景色が
あっというまに変わっていくような映像のこと

よくみるのは朝日がでて
どんどん時間が流れて夜になるもの

これを行うには
一定間隔で撮影した写真を
つなぎ合わせて高速再生すればいい

raspberry pi で使う raspistill コマンドは
1枚の写真を撮影するコマンドだけど
-tl オプションを使うことで
このタイムラプス撮影が可能になる

タイムラプス撮影をするには、以下のオプションを使う

-o
ファイル名を指定
%d をつけることで通し番号で保存できる
さらに %04d とすれば
4桁の通し番号で保存できる

-tl
撮影間隔の指定
単位はミリ秒となる
1秒なら 1000ミリ秒
1分なら 60000ミリ秒
となる

-t
撮影時間の指定
単位はミリ
これも
1秒なら 1000ミリ秒
1分なら 60000ミリ秒

もし 640 x 480 pixel で1分おきに1時間撮影するなら

raspistill -o image-%04d.jpg -tl 60000 -t 3600000 -w 640 -h 480 

ミリ秒変換は面倒に思えるけど
一度秒単位にして 1000 をかければ算出しやすくなる

もし1時間おきに1週間撮影するなら

raspistill -o image-%04d.jpg -tl 3600000 -t 604800000 -w 640 -h 480 

となる

これで撮影できたけど
これを動画に変換する必要がある

変換に必要なツールはインストールできるけど
raspberry pi ではCPUが非力なので変換には時間がかかる

このため別の Linux マシンで行うほうが効率的

今回は Ubuntu 12.04 LTS に
FileZilla で撮影したファイル
image-0001.jpg から
image-0061.jpg までを
ダウンロード

これを変換することにする
時間がかなりかかる処理になりそうなので
変換作業は後日

端末のバックキーで前に戻るには

端末のバックキーで前に戻るには

端末のバックキーを検出するには
ActivityクラスのonBackPressed()を
Overrideする

そして、このメソッドのスーパークラスは呼ばないこと
これでアプリを終了せずに任意の操作ができる

よくブラウザでもとるキーを押したりして使うことになる

@Override
public void onBackPressed(){

if(mWebView.canGoBack()){
//前のページへ戻る
  mWebView.goBack();
}
else{
//アプリ終了
  super.onBackPressed();
}
}

今回は、WebViewクラスの
onGoBack()で履歴があるか調べ
有るなら前のページへ戻り

履歴がないなら、アプリ終了している

raspberry pi で動画撮影

raspberry pi で動画撮影

Raspberry pi 専用カメラモジュールを使うことで
1080pk
1920 x 1020 ピクセル
で動画を撮影できる

今回も使用したのは
ラズベリーパイ カメラモジュール Camera Module for Raspberry Pi

USB接続のカメラでも動画撮影できるけど
こっちだと 320 x 240 ピクセルぐらいでカクカクになる

動画撮影には
raspivid コマンドを使う

-o オプションで保存したいファイル名を指定する

.h264 拡張子で保存すればH.264 形式の動画ファイルになる

そして -t オプションで撮影する時間をミリ秒単位で指定する
1秒は 1000ミリ秒なので
10秒撮影したいのなら
-t 10000
となる

構文としては

raspivid -o 保存したいファイル名.h264 -t 撮影したいミリ秒

となる

コマンドの例としては

raspivid -o video.h264 -t 10000

これで video.h264 ファイルが作成される

撮影した動画を raspberry pi で再生するには
omxplayer コマンドを使う

これは標準でインストールされているので
そのまま使える

omxplayer 再生したい動画ファイル名
で再生できる

今回なら

omxplayer video.h264 

なお、これはディスプレイにHDMIで接続してあれば
リモートでも表示することができる

今回はSSHで ubuntu からログインして再生したけど
問題なく再生できた

H.264 形式の場合
Raspberry Pi のGPUに
H.264 再生支援機能があるのでなめらかに再生できる

ただ、標準で動画撮影すると
高解像度なため、10秒程度で20MBになってしまう

このため -w で幅 -h で高さを指定して
解像度を調整する

もし 320 x 320 の解像度にするなら

raspivid -o video.h264 -t 10000 -w 320 -h 320

また -b オプションでビットレートの設定ができる

指定する単位はビットなので
10MBits/s
なら
-b 1000000

50KBits/s
なら
-b 50000
となる

例を書くと

raspivid -o video.h264 -t 10000 -w 320 -h 320 -b 50000

ただし、ディスプレイに表示されるのは変換前の状態なので
変換した状態で表示したいのなら
-e オプションをつけて実行

raspivid -o video.h264 -t 10000 -w 320 -h 320 -b 50000 -e