Fritzing でLチカ

Fritzing でLチカ

さっそくLチカしようとしたけど

ソフトウェアセンターでインストールしたものだと
バージョンが古く
Raspberry Pi が使えない

このため
http://fritzing.org/download/api/1.0/update/315
から最新版の
Version 0.9.0b をダウンロード

展開したフォルダの中で

./Fritzing 

とすれば最新版が起動する

frtzing

この中でブレッドボードを選ぶと
ブレッドボードが表示される

fritzing2

右側のパーツから
Raspberry Pi
LED
抵抗
を選ぶ

Raspberry Pi は
Microcontroller のところにあるので
それを選ぶ

抵抗は
Basic のところに
220Ω register
とあるので
これを選ぶ

LEDは
Output のところに
Red(633nm) LED があるので
これをつかう

設置については
各種アイコンをドラッグ&ドロップすればOK

fritzing3

ドラッグ&ドロップすると
回路図のほうにも反映されている

fritzing4

とりあえず配置できたので
配線は次回

Ubuntu で無料CAD

Ubuntu で無料CAD

fritzing
が無料で使えるCADソフトということで
これをインストール

とはいっても Ubuntu の場合
ソフトウェアマネージャーを起動して
検索に
fritzing
と入力すればでてくるので、あとはインストール

Fritzing はブレッドボード入力機能があるらしく
ラズパイマガジン(日経BP Next ICT選書)
で紹介されていたので
インストールしてみました

起動すると、ブレッドボード画面がでてくる

breadboard

詳しい使い方は次回以降にします

adb shell の使い方

adb shell の使い方

まずは動作確認

しかしいきなりエラー

An internal error occurred during: "Launching New_configuration". Path for project must have only one segment.

とエラーがでたので
検索し
http://stackoverflow.com/questions/9357111/whats-the-meaning-of-this-in-eclipse-path-for-project-must-have-only-one-segm
を参考に
Project > Properties > Run/Debugg settings

Launching New_configuration を選択し
delete
これで起動はしたけど
エラーで止まる

次にエラーログをみたら
near “integer” :syntax error
となっていたので調べたら
sql 文が違っていた

これを修正したけど
arning: Activity not started, its current task has been brought to the front
となる

これを調べたら
http://androidfaq.e1blue.net/android/status/27
によれば
ソースに変更なしで再実行するとでるらしい

とりあえず sqlite で確認したかったので
実機の Nexus 7 をUSB接続し

adb devices

で確認

ここで何も表示されていないのなら
いろいろ設定する必要がある

とりあえず、できているという前提で続ける

adb shell

を実行すると
Nexus7 の中に入れる

このままだとDBファイルの閲覧ができないので
ユーザを切り替える

やり方は

run-as アプリのパッケージ名

ということで

run-as net.developapp.mydbapp

を実行

そしてDBファイルの存在を調べるため

ls net.developapp.mydbapp /data/net.developapp.mydbapp/databases/    

を実行

これで myapp.db というsql ファイルの存在を確認

残念ながら sqlite3 が Nexus7 にはないので
一度
/sdcard へコピーし
これをPCに転送してから中身を確認する

そのままコピーしようとしても

sh: can't create /sdcard/myapp.db: Permission denied

となってしまい、権限のためコピーできない

このため、一般ユーザに戻し
次に

cd  /data/data/net.developapp.mydbapp/databases/databases

で移動し

run-as net.developapp.mydbapp cat databases/myapp.db > /sdcard/myapp.db

というようにすれば
コピーできる

あとは
adb シェルからログアウトして

 adb pull /sdcard/myapp.db 

でファイルをコピー

これで
Ubuntu で

sqlite3 myapp.db 

とすれば中身をみることができる

Nexux7 での
SQLiteの取得と内容確認

http://ymlib.com/YMWorld/Android/P0/W0/P007/YMWAndroid007.html
を参考にさせていただきました

Androidカメラの顔検出機能

Androidカメラの顔検出機能

顔検出機能を使うには、Cameraへ
setFaceDetectionListener
をセットして
startFaceDetection()
を使う

カメラが顔認識できる数は、
デバイスにより異なるため
まずは、何人まで認識可能か調べる

int maxFaces = param.getMaxNumDetectedFaces();

これで、可能な数を変数へ格納

次に、顔認識を検出するリスナーをセット
setFaceDetectionListenerをセットすることで
顔認識が検出できるようになる

mCamera.setFaceDetectionListener(
new FaceDetectionListener(){

@Override
public void onFaceDetection(Face[] faces, Camera camera){

//顔を検出したら顔認識マーカー表示ビューへ値を渡す
mFaceMarkerView.faces = faces;

mFaceMarkerView.invalidate();
}
});

顔認識がセットできたら、顔認識の開始
顔認識の開始には
startFaceDetection()を呼び出す

mCamera.startFaceDetection();

次に、顔認識座標を画面へ反映する

今回は、カスタマイズビューを作成し
顔認識座標を描画する

if(faces !=null){

for(int i=0; i<faces.length; i++){

//変更したいのなら前のカメラの状態を保存
int saveState = canvas.save();

//カメラデバイスから取得される値は
1000
~-1000のため
Matrixを使い座標を変換できるようにする
Matrix matrix = new Matrix();
matrix.postScale(getWidth() / 2000f, getHeight() / 2000f);
matrix.postTranslate(getWidth() / 2f, getHeight() / 2f);
canvas.concat(matrix);

//検出した顔を中心に短形と認識精度を表示
float x= (faces[i]rect.right + faces[i].rect.left)/2;

float y =(faces[i].rect.top + faces[i].rect.bottom)/2;

String score = String.valueOf(faces[i], score);

//精度描画
canvas.drawText(score, x, y, point);

//顔認識座標を四角で描画
canvas.drawRect(faces[i].rect, point);

//Canvasを元の状態へ戻す
canvas.restoreToCount(saveState);

}
}

なお、顔認識情報は
顔認識した人数分だけ
faces配列へ格納される

Facesクラスへ格納される情報は、以下のように区分される

int id
顔認識ID

Rect rect
顔と認識した範囲

int score
顔の認識率

Point leftEye
左目の中心座標

Point rightEye
右目の中心座標

Point mouth
口の中心座標

A/D変換器とセンサー

A/D変換器とセンサー

アナログな電圧の変化をデジタルデータに変換するには
A/D変換器
を使う

これを使えばアナログセンサーの値を読み取り
シリアル通信でデータを受け取れる

今回使用するパーツは
MCP3208-CI/P

この部品は SPI 対応していて
最大 8個 のデバイスをつなげることができる

センサーには
LM35DZ

を利用する

また、抵抗の値を変えられるように
半固定抵抗をつかう

今回は
半固定ボリューム (10kΩ) (10個入)

を使用

とりあえず部品はこれでOKなので
次は配線していく

配線はラズパイマガジンを参考に行った
ラズパイマガジン(日経BP Next ICT選書)

配線があっているか調べるため
温度の測定

http://nlinux.jp/2014/raspi/

から書籍に載っている パスワードを入力すれば
ファイルがダウンロードできるので
第4部 ホントに初めての回路図講座
のところの
4bu-part1.zip
をダウンロードして解凍

これを SFTP で raspberry Pi へ転送する
使うのは
abc.c

まず、今回は Wiring Pi を使うので

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 

次に
Raspberry Pi のSPIを有効にするため

gpio load spi

次に、ダウンロードした
4bu-part1.zip
を解凍すると中にある
adc.c を FileZilla などのFTPソフトで
Raspberry Pi で転送する

これで

gcc -o adc adc.c -lwiringPi

でコンパイル

構文は

gcc -o 任意の名前 ソースファイルの名前.c -lwiringPi

C言語なので、拡張子は .c になる

あとは

./adc 

と実行すれば温度が表示されるようになる

このときに温度センサーに触れると
表示される温度が上がっていくのがわかる

回路図メモ

回路図メモ

各種抵抗とか
各種コンデンサー
各種コネクタは
使う目的や用途により異なる

これは、Webサイトをつくるときに
HTMLタグ
API
ライブラリ
を使い分けるようなもの

回路図の場合
部品
配線
にわけると見やすい

また、回路図の書き方は
基本的にCADに影響される

あと
各種IC
単機の部品は、1つずつ記号があるけど
複雑な機能をもってたり、
沢山のピンがあったりすると
部品を記号で表すのが難しいし、見にくい

なので、四角い箱を書いて
使うピンが書かれた記号にする

回路図は、英語では
Schematic
という

あと、BOMリストと呼ばれる部品表も重要で
これがちゃんとできてないと
スペックがあわないとか
部品が揃わないことがある

これは、回路図ではボタンとはいっても
用途により違うから
料理するときに、
鍋とはいっても中華鍋とか
土鍋とか種類があるように
スイッチとはいっても
タクトスイッチみたいに、押しっぱなしでOn/OFFもあるし
家の電気のスイッチみたいに、
押したらずっとONとかいうのもある

このため、用途により変わるから
部品表は重要になる

I2C と SPI の違い

I2C と SPI の違い

I2C と SPI は、ほとんどおなじ

制御するデバイス
大抵は Raspberry Pi になるけど
こっちをマスターといって

制御される側の部品のことを
スレーブという

この呼び方の違いは
利用する部品がどちらに対応しているかにより異なる

仕組みは
どっちもクロック信号に載せてデータをやりとりする

このデータ交換は
I2c なら1本の信号線を使い

SPIなら2本の信号線を使う

これは I2C が双方向で
SPI が片方向となっているため

ちなみに
I2C のデータ線はSDA という

SPIの場合
マスターからスレーブ方向を MOSI
スレーブからマスターが MISO
という

そして、マスターとスレーブとの間で
MOSI 同士
MISO 同士
をつなげる

SPIの場合、かなりわかりにくく
自分からでていくのが
SDO とか Dout
といって

自分に入ってくるのを
SDI とか Din
と書いているときもある

こう書いてある場合
Out と In で接続する

例えば
マスターの SDO を
スレーブの SDI に接続する

I2C でも SPI でも
複数のスレーブとつなげることができるため
どれと通信するか識別する必要がある

I2C を使っている場合なら
スレーブ側にアドレスを持つので
マスターからアドレスを指定して制御する

SPIなら、専用の信号線があるので
各スレーブが持つ CS や SS を
マスターがロー、つまりGNDにして
デバイスを選択することになる

なお、マスターはスレーブの数だけ信号線が必要になる

Raspberry Pi に搭載されているのは
2本で CE とかかれている

Androidカメラの露出やオートフォーカスの制御

Androidカメラの露出やオートフォーカスの制御

カメラでオートフォーカスを使うには
autoFocus()
を使う

露出を変更したいのなら
setExposureCompensation()
を使う

これらをやる前に、まずは
カメラプレビューを実装しておくこと

次に、端末がオートフォーカス対応か判定する

public static boolean isSupportFocus(Context context){

return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS);

}

これで、結果がtrueなら使えるし
falseなら使えない

判定ができたらオートフォーカスを使うため
Camera.autoFocus()を使う

private void setCameraAutoFocus(){

if(mCamera !=null && mIsSupportFocus){

mCamera.autoFocus(new AutoFocusCallback(){

@Override
public void onAutoFocus(boolean success, Camera camera){
//AutoFocusのリセット
mCamera.cancelAutoFocus();

//AutoFocus開始
mCamera.autoFocus(null);
}
});
}
}

そして、露出情報の取得
露出を変更する前に
デバイスに搭載されているカメラの
露出情報を取得する

これで取得した値を元に
現在の露出値や
露出値の上限、下限を設定

//下限の設定
mMinExposure = mCamera.getParameters().getMinExposureCompensation();

//上限の設定
mMaxExposure = mCamera.getParameters().getMaxExposureCompensation();

//現在の露出値の算出
mExposureValue = mCamera.getParameters().getExposureCompensation();

そして、事前に取得した露出情報を露出の値を変更する

mExposureValue++;

//露出値の上限以上なら補正
if(mExposureValue > mMaxExposure){
mExposureValues = mMinExposure;
}

Parameters param = mCamera.getParameters();
param.getExposureCompensation(mExposureValue);

mCamera.setParameters(param);

mBtnExposure.setText(getString(R.string.exposure )+ mExposureValue);

次に、システム要件にオートフォーカスが必要なことを明記する
これで、非対応端末はインストールできる

これは、AndroidManifest.xmlへ追記する

<uses-feature android:name="android.hardware.camera.autofocus"/>

オートフォーカス連続使用の注意点として
デバイスによっては強制終了の可能性があるため
事前に
Camera.cancelAutoFocus()を呼び出し
オートフォーカスをリセットすれば安定する

あと、露出情報については
CameraParametersのメソッドをつかうことで
各露出情報を取得できる

getMaxExposureCompensation()
露出の上限

getMinExposureCompensation()
露出の下限

getExposureCompensation()
現在の露出値

Androidの写真をアルバムへ保存

Androidの写真をアルバムへ保存

写真をアルバムへ保存するには
Cameraクラスの
takePicture()を使って写真を撮影し
これで得たbyte配列のデータをJPGへ変換して保存する

まずは、カメラプレビューの実装し
次に、写真を撮影

写真の撮影にはtakePicture()を使う

mSurfaceView.setOnTouchListener(new OnTouchListener(){

@Override
public boolean onTouch(View v, MotionEvent event){

if(event.getAction() == MotionEvent.ACTION_DOWN){

if(mCamera !=null){

//前回撮影した画像を保存できない場合
if(!mIsSave){
mCamera.takePicture(null,null, mPictureCallback);
mIsSave = true;
}
}
}
return true;
}
});

次に、画像の保存先の設定

String savePath = Environment.getExternalStorageDirectory().getPath() + "SAVE_PATH";

File file = new File(saveFile);

if(!file.exists()){
file.mkdir();
}

Calendar cal = Calendar.getInstance();

SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");

String imgPath = savePath +"/"+ "IMG_"+sdFormat.format(cal.getTime())+".jpg";

ちなみに、microSDに保存するときには
権限が必要になるため
AndroidManifest.xmlへ権限を追記する

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

次に、設定した保存バスを元に
FileOutputStream の
write()で画像データを書き込む
書き込み後はギャラリーへ反映するため
ContentProviderの更新をする

try{
FileOutputStream fos = new FileOutputStream(imgPath, true);

fos.write(data);
fos.close();

//ContentProvider update
ContentValues values = new ContentValues();
values.put(Images.Media.MIME_TYPE, "image/jpeg");
values.put("_data",imgPath);

getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

}catch(Exception e){

}

takePicture()には
3つのコールバック、つまり行う挙動を指定できる

Camera.ShutterCallback
キャプチャした瞬間、コールバックを返す

Camera.PictureCallback
撮影したrawデータの画像をコールバックとして返す

Camera.PictureCallback
撮影したjpegデータの画像をコールバックとして返す

Raspberry Pi のLED抵抗の値についてメモ

Raspberry Pi のLED抵抗の値についてメモ

LEDは
かける電圧をあげていくと
一定の電圧を超えたところで
それまで流れなかった電流が一気に流れる

このときの電圧のことを
順方向電圧
という

例として

高輝度5mm赤色LED 7cd60度 (10個入)
http://akizukidenshi.com/catalog/g/gI-01318/

の画面をみると

VF:2.1V
と書いてあり
これが順方向電圧を示している
VF がそれになる

おそらくこれが耐えれる電圧
これを超えないために抵抗をつける

また
標準電流:20mA
となっているので
この場合、通常は 20mA まで電流をおさえる
ということになる

ちなみに 1A は 1000mA

もし220Ωの抵抗をいれたなら
(電圧 3.3 V – LED の電圧 2.1V) / 220Ω
となるので
0.004 A
つまり
4mAとなる

最大値の 20mA まで電流をながすと
かなりまぶしいけど
Raspberry Pi には電流に制限があり
1つの GPIO に流せる電流量は
16mA
となっているので、これはできない

さらに Raspberry Pi では
ピンヘッダー全体で流せるのが
最大 50mA
しかないので注意