raspberry piリモート操作

raspberry piリモート操作

今回は、MacBookAirからリモート操作

MacBookAirの場合、標準でSSHクライアントがあるので
ターミナルを起動し

ssh pi@raspberrypi のIPアドレス

でリモート操作できる

ちなみに、Ubuntuでも同じ

また、ファイル転送にはSFTPを使う

今回使ったのはCyberduck

アプリストアからでもインストールできるけど
こちらは有料で結構値段がするので
とりあえずサイトから無料のほうをダウンロード

ダウンロードできたらCyberduckを起動し
接続方法を
FTP
から
SFTP
へ変更

あとは、サーバーの欄へ Raspberry PiのIPアドレス

ユーザー名には pi

パスワードは自分で設定したRaspberry Piのユーザーパスワード

これで接続すればつながる

Ubuntuなら、sftpコマンドや
Filezillaなどが使える

ファイル転送なら
Androidでも可能で、AndFTPを使えば転送できるし
SSHでのリモート操作も
ConnectBot
を使うことで操作可能

ただし、リモート操作には
スマートフォンだと画面が小さいためタブレットがおすすめ

画像の任意の領域のクリック判定

画像の任意の領域のクリック判定

これは、Viewの拡大、縮小などに使われる

画像の任意の領域のタッチ判定するには
Viewクラスを拡張する

class MyView extends View{

というように、extends View で継承する

次に、画像の読み込みに
Bitmap

PaintクラスとPathクラスで短形の描画

Regionクラスであたり判定
というように、使う

private Bitmap mBitmap;
private Path mPath = new Path();
private Paint mPaint = new Paint();
private Region mRegion = new Region();

で、メンバ変数と初期化宣言

そして、画像の読み込みと枠の設定

読み込みでは、例外発生に備え
try catchで行う

public MyView(Context context){

super(context);

//画像の取得
try{
InputStream is = getResources().getAssets().open("test.jpg");
mBitmap = BitmapFactory.decodeStream(is);

}catch(Exception e){
}


//クリックしたときの赤い枠の設定
//色の指定
mPaint.setColor(Color.RED);
//枠の幅
mPaint.setStrokeWidth(3);
//枠の描画方法
mPaint.setStyle(Style.STROKE);

//枠の大きさ設定
Rect rect = new Rect(100, 100, 300, 300);

mPath.addRect(new RectF(rect), Path.Direction.CW);
mRegion.set(rect);

}

そして、描画処理

protected void onDraw(Canvas canvas){

canvas.save();

canvas.drawBitmap(mBitmap,0,0,null);
canvas.drawPath(mPath, mPaint);

canvas.restore();
}

そして、タッチイベントの実装
今回は、トーストを表示する

@Override
public void onTouchEvent(MotionEvent e){

if(e.getAction() == MotionEvent.ACTION_UP){

if(mRegion.contains((int) e.getX(), e.getY())){

Toast.makeText(getContext(), "タッチしたよ",Toast.LENGTH_SHORT).show();
}
}
return false;
}

onTouchEvent()では、
Regionクラスの
contains()を使うことであたり判定をしてる

そして、タッチした座標が
e.getX()
e.getY()
で取得できてるので
領域内ならトーストを表示するようにしている

Raspberry Piのデスクトップ環境

Raspberry Piのデスクトップ環境

raspberry piのデスクトップ環境を起動するには
ログインしてから

startx

で起動する

このあたりは、Backtrack5 とかと似ている

デスクトップ環境の終了は、ログアウトボタンからログアウトする
もしくは
ショートカットキーで
ctrk + Alt + Backspace
でデスクトップ環境を終了できる

raspberry Piの日本語化

raspberry Piの日本語化

raspberry piは最初は日本語環境がないため
日本語フォント
日本語入力メソッド
をインストールする必要がある

まず、電源を入れて

pi

とユーザー名を入れて、パスワード入力

ログインできたら

sudo raspi-config

で設定画面を表示

ここで、
Internationalisation Options >
Change Locale
で表示される画面で

ja_JP .EUC-JP EUC-JP

ja_JP .UTF-8 UTF-8
にチェックがついているのを確認

これで、okを押すと次の画面で
デフォルト言語を聞かれるので
en_GB.UTF-8
から
ja_JP.UTF-8
へ変更する

言語設定には時間がかかるため、気長に待つ

変更が適用されると
設定画面のトップページの
Setup Options
の画面になるので、Finishを選択して終了する

言語設定はできたので
次に、日本語表示に必要な日本語フォントをインストール

sudo apt-get install ttf-kochi-gothic xfonts-intl-Japanese xfonts-intl-Japanese-big xfonts-kaname

次に、日本語入力メソッドをインストール
日本語入力メソッドは、ATOKとかみたいに、日本語を入力するためのソフト

sudo apt-get install uim uim-anthy

これで、デスクトップ環境では日本語が使えるようになるけど
今度は、端末画面が文字化けする

なので、対策としてjfbterm をインストールする

sudo apt-get install jfbterm

これで準備できたので、設定反映のため、シェルにログインしなおす
つまり、一度ログアウトして、再度ログインする

再度ログインすると、設定が有効になりデフォルト言語が日本語化する
ただし、文字化けするため

jfbterm

で切り替える必要がある

日本語ではなく英語にしたいというのなら

export LANG=en

とすればログアウトするまで英語設定になる

長押しの検出

長押しの検出

長押しの検出は、onLongPress()で処理を記述する

ガラケーのボタン押しっぱなし処理のようなものを作るときとかの実装に使えそう

まず、

implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener

を追加

そして、アクセスしやすいように、メンバ変数の宣言

GestureDetector mGestureDetector;

次に、onCreate()の中でインスタンス作成

mGestureDetector = new GestureDetector(this,this);

次に、タッチイベント実装
ここで、タッチイベントの判別振り分けをする

public boolean onTouchEvent(MotionEvent e){
mGestureDetector.onTouchEvent(e);
return false;
}

そして、それぞれのタッチイベントを定義する
今回は、長押しのときだけ検出するので
onLongPress()のときに
トーストで表示

public boolean onLongPress(MotionEvent e){
Toast.makeText(this, "長押し検出しました",Toast.LENGTH_SHORT).show();
return false;
}

これで、画面長押しすると、トーストで表示される

ちなみに、他の動作をメモると

//シングルタップ
@Override
public boolean onSingleTapUp(MotionEvent e){
return false;
}

//ダブルタップ
public boolean onDoubleTap(MotionEvent e){
return false;
}

//画面を押したとき
public boolean onDown(MotionEvent e){
return false;
}

//スワイプ
@Override
public boolean onFing(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
return false;
}

//スクロール
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
return false;
}

スワイプの検出

スワイプの検出

スワイプの検出は
MotionEventを定義すれば実装できる

まず、定数を宣言

private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

private GestureDetector mGestureDetector;

次に、onCreate()の中でインスタンス取得

mGestureDetector = new GestureDetector(this, mOnGestureListener);

この
mOnGestureListenerは後で作成

次に、onTouchEvent()の実装

@Override
public boolean onTouchEvent(MotionEvent e){

return mGestureDetector.onTouchEvent(e);
}

そして、スワイプ動作の検出
これは、onFing()の中で処理すればいい

private final SimpleOnGestureListener mOnGestureListener = new SimpleOnGestureListener(){

@Override
public boolean onFing(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY){

try{

if(Math.abs(event1.getY() - event2.getY()) < SWIPE_MAX_OFF_PATH){
return false;
}
if(event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
Toast.makeText(MainActivity.this, "左スワイプ", Toast.LENGTH_SHORT).show();
}
else if(event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs()velocityX > SWIPE_THRESHOLD_VELOCITY){

Toast.makeText(MainActivity.this, "右スワイプ", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
//nothing
}

}
return false;
}
};

このように、定数で座標を設定し、それに対する範囲の判定をすることで
スワイプのときの動作をすることができる

raspberry Pi設定

前回、raspberry Piのインストールができたので

今回はIpアドレスの確認とソフトウェアのインストール

まず、raspberry  PiをLANケーブルにつないだ状態で電源を入れる

すると、サーバーみたいな画面になるので

ユーザー名 piを入れ

パスワードを入れてログイン

IPアドレスを調べたいので

hostname -I

でIPを確認

もし、ネットワーク全体を調べたいのなら

ifconfig

で表示できる

ソフトウェアのインストールは

ubuntu と同じように

sudo apt-get install パッケージ名

でインストールできる

今回は、Linuxではおなじみのテキストエディタ vim をインストールするので

sudo apt-get install vim 

ちなみに、アップデートも ubuntuと同じように

sudo apt-get update

でパッケージリストを更新して

sudo apt-get upgrade

でパッケージ更新

ちなみに、アンインストールしたいときには

sudo apt-get autoremove パッケージ名

で依存するパッケージごと削除できる

単純に、指定したものだけ削除するなら

sudo apt-get remove パッケージ名

とすればいい

画面回転の検出

画面回転の検出

画面回転の検出は
Configurationクラスの
orientation変数を使う

値が
ORIENTATION_LANDSCAPEなら横

ORIENTATION_PORTRAITなら縦になる

判定はif()などで行う

例えば、縦、横に回転したときに
トーストで表示するのなら

if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
Toast.makeText(this, "横になったよ", Toast.LENGTH_SHORT).show();
}
else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this,"縦になったよ", Toast.LENGTH_SHORT).show();
}

これで、縦、横の画面回転の検出ができる

タップ、ダブルタップの検出

タップ、ダブルタップの検出

タップやダブルタップの検出は
GestureDetectorと
onTouchEventを設定すれば実装できる

まず、

implements GestureDetector.OnGestureDetector, GestureDetector.OnDoubleTapListener

を追加

そして

GestureDetector mGestureDetector;

でメンバ変数宣言

次に、onCreate()の中で

mGestureDetector = new GestureDetector(this, this);

でGestureDetectorインスタンス作成

次に、タッチイベント実装

public boolean onTouchEvent(MotionEvent e){

//GestureDetector.onTouchEvent()でタッチイベントの判別、振り分けをする
mGestureDetector.onTouchEvent(e);

return false;
}

次に、シングルタップの実装
今回、はシングルタップならトーストで表示

@Override
public boolean onSingleTapUp(MotionEvent e){

Toast.makeText(this, 
"シングルタップだよ",Toast.LENGTH_SHORT).show();
return false;
}

そして、ダブルタップの処理
今回は、ダブルタップを検出したらトーストで表示

public boolean onDoubleTap(MotionEvent e){

Toast.makeText(this,"ダブルタップされたよ",Toast.LENGTH_SHORT).show();
return false;
}

タップの検出だけなら
ViewへonTouchListenerの設定だけでよい
しかし、ダブルタップとシングルタップを検出するのなら
GestureDetectorを使う

GestureDetectorは、
シングルタップ
ダブルタップ以外に、スワイプなども検出できる

ローダーの作成

ローダーの作成

ローダーを使うには、
FragmentActivityクラスのサブクラスを作成する

ローダーとは、ActivityやFragmentで
非同期にデータをロードする仕組みのこと
データを監視して、コンテンツが変化したら新しい結果を返す
WebでAjaxとかやってるとイメージしやすい

今回は、非同期でブックマーク履歴を読み込んで表示

ブックマークの取得には権限が必要
この権限は
READ_HISTORY_BOOKMARKS
になるので、
AndroidManifest.xmlへ権限を追記する

<uses-permission 
android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>

を追加

次に、レイアウトファイルの作成

<RelativeLayout
xmlns:android="http://schemes.android.com/apk/res/android"
xmlns:tools="http://schemes.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true">
</ListView>

</RelativeLayout>

次に、FragmentActivityクラスのサブクラスを作成し
LoaderCallbacksインターフェースを実装する

onCreate()をOverrideして
ListViewクラスを生成し
Adapterの指定とローダーの初期化をする

それから、LoaderCallbacksインターフェースの実装となる

これには
onCreateLoader()
onLoadFinished()
onLoadReset()
を使う

まずは、メンバ変数の定義

private SimpleCursorAdapter adapter;

次に、onCreate()のOverride

@Override
protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
null,
new String[]{Browser.BookmarkColumns.TITLE},
new int[] {android.R.id.text}
,0);

ListView listview = (ListView)findViewById(R.id.list);
listview.setAdapter(adapter);

getSupportLoaderManager().initLoader(0,savedInstanceState,this);
}

次に、onCreateLoader()の実装

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args){

return new CursorLoader(this,Browser.BOOKMARKS_URI,null,null,null,null );
}

そして、onLoadFinished()の実装

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor){
adapter.SwapCursor(cursor);
}

そして、onLoadReset()の実装

@Override
public void onLoadReset(Loader<Cursor> loader){
adapter.setCursor(null);
}

今回、LoaderCallbacksインターフェースの
onCreateLoader()では
Browser.BOOKMARKS_URIで
ブックマークのURIを指定してるけど
電話帳などの
ContentProviderのURIの指定もできる