デバイスの現在値取得

デバイスの現在値取得

デバイスの現在値は
LocationManager.requestLocationUpdate()

LocationListener
を設定することで
定期的に現在値の緯度経度を
GPSを使うことで取得できる

まずは、LocationManagerインスタンス取得

Context.getSystemService()で
LocationManagerのインスタンス取得できる

mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

次に、プロバイダーの設定
現在地の取得につかうロケーションプロバイダーを設定

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_MEDIUM);
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);

String provider = mLocationManager.getBestProvider(criteria, true);

次に、ロケーションの取得

これは、LocationManagerクラスの
requestLocationUpdate()
を呼べばロケーションの取得が開始される

mLocationManager.requestLocationUpdate(provider, 0, 0, this);

そして、ロケーションが更新されると
onLocationChanged()が呼ばれる

@Override
public void onLocationChanged(Location location){

//ロケーションが変更されたときの処理
//今回は、緯度経度をTextViewへ表示
TextView latitude=(TextView)findViewById(R.id.latitude);
TextView longitude = (TextView)findViewById(R.id.longitude);

latitude.setText(String.valueOf(location.getLatitude()));
longitude.setText(String.valueOf(location.getLongitude()));
}

なお、利用するロケーションプロバイダーにより、権限が必要になる

android.permission.ACCESS_FINE_LOCATION
GPS、基地局、Wi-Fiを使い
正確な位置情報へのアクセスを許可

android.permission.ACCESS_COARSE_LOCATION
基地局、Wi-Fiのネットワーク位置情報を使い
概ねの位置情報へのアクセスを許可

android.permission.ACCESS_MOCK_LOCATION
テスト用位置情報へのアクセスを許可

また、ロケーションプロバイダーには
2タイプあり
精度や検出精度が違う

LocationManager.GPS_PROVIDER
検出時間はGPSを使うため遅い
さらに、バッテリーも多く消費する
精度は高性能だけど
屋内やビルの間だと精度が落ちる
これは
正確な位置情報を得るときに使う

LocationManager.NETWORK_PROVIDER
検出時間は、ネットワーク情報を使うため
GPSより速くなる
また、GPSを使わないため、消費電力も低め
ただし、
電波の基地局、Wi-FiのAPをアクセス基準にするため
精度は低くなる
こちらは、大まかな位置情報を得るときに使う

またCriteriaクラスを使い
バッテリー消費や検出条件からロケーションプロバイダーを選択する事もできる

バッテリー消費なら
Criteria.POWER_LOW
バッテリー消費低

Criteria.POWER_MEDIUM
バッテリー消費中

Criteria.POWER_HIGH
バッテリー消費高

GPS精度にするなら
Criteria.ACCURACY_LOW
GPS精度低

Criteria.ACCURACY_MEDIUM
GPS精度中

Criteria.ACCURACY_HIGH
GPS精度高

これらを設定して
LocationManagerの
getBestProvider()を呼ぶことで
最適なプロバイダーを取得できる

次に、ロケーションの更新

requestLocationUpdate()を使ったときに
LocationListenerを継承することで、
以下のメソッドが追加実装される

これらは、プロバイダーのGPS精度を示す

onLocationChanged(Location location)
ロケーションが変更されたとき

onProviderDisabled(String provider)
ロケーションプロバイダーが無効化されたとき

onProviderEnabled(String provider)
ロケーションプロバイダーが有効化されたとき

onStatusChanged(String provider, int status, Bundle extras)
ロケーションプロバイダーが変更されたとき

緯度経度は、onLocationChanged()のパラメーターである
locationへ格納され
緯度は、location.getLatitude()
経度は、location.getLongitude()
で取得できる

WebIOPi の簡易webサーバー

WebIOPi の簡易webサーバー

WebIOPi はwebサーバー機能を搭載しているため
ブラウザからGPIOポートの制御が可能

スマホやPCのブラウザで
http://192.168.1.198:8000/
というように

http://raspberry Pi のIPアドレス:8000
でアクセス

IDとパスワードを聞かれるので
ユーザ名 webiopi
パスワード raspberry
を入力するとページが表示される

Screenshot_from_2014-09-16 22:37:42

ここで GPIO Header をクリックすると
現在のGPIOのポートの状態が表示される

INとなっているのが入力ポート

OUT となっているのが出力ポートになる

このIN/OUT をクリックすると状態が
IN/OUT で切り替わる

これでLEDのコントロールをする予定だったけど
GPIO4 が ONEWIRE になってしまい
反応しなくなってしまった

このため
ボタンの検出を行うことにした

ブレッドボードにタクトスイッチを設置
ボタンの左上を 3.3V とつなぐ
右下と GPIO 25 をつなぐけど
このときに、間に 10KΩの抵抗をいれる

抵抗の見分けには
http://part.freelab.jp/s_regi_list.html
を参考にする

色が茶 黒 橙 となっているのが10KΩ

そして抵抗と GND を接続

これで配線はOK

次に
http://192.168.1.198:8000/app/gpio-header
にアクセスして
GPIO 25 を IN にする
これはOUTになっているところをクリックすればOK

webiopi3

この状態でボタンをおすと
GPIO 25 のところが
色が黄色になるのがわかる

webiopi4

ボタンはできたけどLEDはできなかった

今後いろいろ実験していくので解決したら投稿する予定

WebIOPi インストール

WebIOPi インストール

離れた場所から機器を遠隔操作するには
テレビのリモコンみたいに無線を使う

無線で行うには
受信機
送信機
が必要になる

通常は回路設計とか欲しいけど
raspberry pi ならネットワークインタフェースを使うことで
送信機
受信機
をソフトで実現できる

受信機はサーバーみたいなもの
これはGPIO制御プログラム
もしくは
WebIOPi を使う

送信機はクライアントみたいなもの
一番簡単なのはブラウザでのアクセス

今回はWebIOPi を使う

WebIOPi はオープンソースの
Raspberry PI 用GPIO制御フレームワーク

WebIOPi は python で書かれていて
Webサーバー機能が標準搭載されている

このためブラウザでアクセスすれば
GPIOポートの制御ができる

また、REST API 対応しているので
java script でREST APT へアクセスすることで
GPIO ポートの制御ができる

まずはWebIOPi のインストールだけど
ver 0.7 だと一部機能が使えないとのことなので
ver 0.6系をインストール

今回はソースからインストールするので
必要なファイルをダウンロード

 wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz 

次にファイルの展開、コンパイル、インストール
インストールするときにはスクリプトをつかうので

依存関係にあるものは自動でインストールされる

tar zxvf WebIOPi-0.6.0.tar.gz 
cd WebIOPi-0.6.0/
sudo ./setup.sh 

次に WebIOPi の起動

sudo /etc/init.d/webiopi start

これでも起動できるけど毎回電源をいれたら
自動で起動させたいのなら

sudo update-rc.d webiopi defaults 

を実行する

さらに一般ユーザ権限の pi でもコンテンツアップロードできるように
webサーバーのDocument Root の
オーナーを変更しておく

sudo chown pi -R /usr/share/webiopi/htdocs/

次に raspberry pi のIPアドレスを調べておく
ssh で遠隔操作しているなら問題ないけど

IPがわからないのなら

ifconfig

で調べることができる

これで準備できたので
スマホやPCのブラウザで
http://192.168.1.198:8000/
というように

http://raspberry Pi のIPアドレス:8000
でアクセス

IDとパスワードを聞かれるので
ユーザ名 webiopi
パスワード raspberry
を入力するとページが表示される

Screenshot_from_2014-09-16 22:37:42

Androidのジャイロセンサーの値の取得

Androidのジャイロセンサーの値の取得

Androidのジャイロセンサーの値取得するには
Sensor.TYPE_GYROSCOPE
に対応するセンサーを取得し
SensorEventListenerを設定することで変化を検出できる

まずは、SensorManagerの取得

これは、
Context.getSystemService()
によりSensorManagerのインスタンスを取得することでできる

mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

次に、ジャイロセンサーの登録

SensorManagerクラスの
registerListener()でジャイロセンサーのリスナーを登録

@Override
protected void onResume(){

super.onResume();

//ジャイロセンサーのリスナー登録
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE);

if(sensors.size()>0){
Sensor s = sensors.get(0);
mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI);
}
}

ジャイロセンサーの解除は
SensorManagerクラスの
unregisterListener()で行う

@Override
public void onPause(){

//ジャイロセンサーリスナー解除
mSensorManager.unregisterListener(this);
super.onPause();
}

そして、ジャイロセンサーの値取得
これは、
SensorEventListenerを継承し
onSensorChanged()へ
センサーの値が変更されたときの処理を実装することでできる

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy){

}

@Override
public void onSensorChanged(SensorEvent event){

//ジャイロセンサーの値取得
if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE){

//TextViewインスタンス取得
TextView dataX = (TextView)findViewById(R.id.dataX);
TextView dataY = (TextView)findViewById(R.id.dataY);
TextView dataZ = (TextView)findViewById(R.id.dataZ);

//取得した値をTextViewへセット
dataX.setText(String.valueOf(event.values[0]));
dataY.setText(String.valueOf(event.values[1]));
dataZ.setText(String.valueOf(event.values[2]));
}
}

なお、ジャイロセンサーから取得できる値は
角速度になるため
これを積分すれば角度を求めることができる

単位は、rad/sec

加速度センサーとジャイロセンサーの使い分けは
加速度センサーは移動速度

ジャイロセンサーは、姿勢などを求めるのに使う
あとは、傾きなどの検知
この2つをあわせることで、モーションセンサーにできる

加速度センサーの値取得

加速度センサーの値取得

加速度センサーの取得は
Sensor.TYPE_ACCELEROMETER
に対応するセンサーを取得し
SensorEventListener
を設定することで変化を検出できる

まずは、SensorManagerのインスタンス取得

Context.getSystemService()

SensorManagerインスタンス取得

@Override
protected void inResume(){

super.onResume();

//加速度センサーリスナー設定
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);

if(sensors.size()>0){

Sensor s = sensors.get(0);
mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI);
}
}

登録したら、あとで解除するので解除設定

これは、SensorManager.unregisterListener()で解除になる

@Override
protected void onPause(){

//加速度センサーリスナー解除
mSensorManager.unregisterListener(this);
super.onPause();
}

あとは、加速度センサーの値取得
これは、
SensoreEventListenerを継承し
onSensorChanged()
へセンサーの値が変更されたときの処理を実装

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy){

}

@Override
public void onSensorChanged(SensorEvent event){

//加速度センサーの値取得
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){

//TextViewのインスタンス取得
TextView dataX = (TextView)findViewById(R.id.dataX);
TextView dataY = (TextView)findViewById(R.id.dataY);
TextView dataZ = (TextView)findViewById(R.id.dataZ);

//TextViewへそれぞれの値をTextViewへ反映させる
dataX.setText(String.valueOf(event.values[0]));
dataY.setText(String.valueOf(event.values[1]));
dataZ.setText(String.valueOf(event.values[2]));
}
}

センサーを扱うときの注意点としては、
センサーリスナーは、一度登録すると
アプリが終了するまでセンサーが稼働し続けるということ

このため、使っていないときには解除しておくほうが節電になる

一般的には、
登録はonResume()
解除はonPause()
で行う

あと、加速度センサーは
物が動くときに働く加速度を測定するので
event.values[]で取得できる

0でx軸
1でy軸
2でz軸
を取得している

緯度経度から住所取得

緯度経度から住所取得

Geocooderクラスを使えば、
緯度経度から地点情報を取得できる

今回は、地図上のタッチした地点の住所取得

まずは、GoogleMapインスタンス取得

地図を操作するためGoogleMapインスタンス生成

SupportMapFragment fragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map));

final GoogleMap gmap = fragment.getMap();

次に、タッチした地点の緯度経度取得

地図上のタッチした地点の緯度経度取得のため
setOnMapClickListener()をセット

gmap.setOnMapClickListener(){

@Override
public void onMapClick(LatLng point){

}
});

となり、ここへ処理を書く

次に、緯度経度を元に、位置情報を取得する

private String getAddressFromPoint(LatLng p){

String addressValue  null;
 
Geocoder geocoder = new Geocoder(this, locale.getDefault());

try{

List<Address> addressList = geocoder.getFromLocation(p.latitude, p.longitude, 1);

if(!addressList.isEmpty()){
Address address = addressList.get(0);

StringBuilder sb = new StringBuilder();

for(int i=0; i<address.getMaxAddressListIndex(); i++){

String addressLine = address.getAddressList(i);
sb.append(addressLine);
}
addressValue= sb.toString();
}
}catch(IOException e){

e.printStackTrace();
}
return addressValue;
}

ソースの解説をつけると

if(!addressList.isEmpty()){

で、データがあるならとなる
!は否定の意味
isEmpty()は、空か判定

また、

i<address.getMaxAddressListIndex()

で要素の分だけになる

forループの中で

address.getAddressList(i);

ね、順番に取得
そして

sb.append(addressLine);

で、append()で末尾へ追加している

今回は、GeoCoderクラスの
getFromLocation()
へ緯度経度を指定することで、
地点情報を取得している

しかし、地点情報は
List


なので、国名や都市名などに細かく分かれている

イメージとしては、WebAPIで天気情報をあつかったとき
細かく分けられているのと同じ

このため、あらかじめ取り出したい情報を決め
目的の配列を取り出す必要がある

raspberry Pi へ twitter クライアントインストール

raspberry Pi へ twitter クライアントインストール

赤外線モジュールは反応せず
I2C デバイス関連は、はんだづけが必要になるため
保留

とりあえず、できることから試すため
今回は twitter クライアントを入れて
ボタンを押すだけで
一定のワードをツイートできるようにする

さらに、ボタンを押してツイートできたらサウンドをならす
これはメールみたいに送信したのがわかるようにするため

使う部品は
タクトスイッチ(黒色) 4つ

カーボン抵抗(炭素皮膜抵抗) 1/4W 10kΩ 4つ

ボタンを4つブレッドボードに配置

そして今回使用するのは
3.3V
GPIO 18
GPIO 23
GPIO 24
GPIO 25
を使う
3.3V とブレッドボードの+と書いてある一番左の列をつなげる

複数の部品をコントロールするなら、ここにつける
そして各部品にジャンパワイヤーのオスオスで接続していく

今回は4つのボタンに、それぞれ左上につなげる
横列さえあっているなら、どの穴でもOK

次にGNDとブレッドボードのーと書いてある列をつなげる

そして
GPIO 18
GPIO 23
GPIO 24
GPIO 25
から各ボタンの左下と同じ横列につなげる

このとき、ボタンとジャンパワイヤーの間に
10kΩの抵抗をいれる
抵抗の左はここにさして、右側は
ボタンの下に列で重ならないようにさす

そして
抵抗の右側とブレッドボードのーの列とを
ジャンパワイヤーのオスオスでつなげる

今回はジャンパワイヤーを大量に使うので
各ワイヤーごとに色分けするとわかりやすい

ブレッドボード・ジャンパーコード(オス-オス)(10cm)20本セット

とか
ブレッドボード・ジャンパーワイヤ(オス-メス) 15cm(黒)

などで補充しておくと後々役立つ

これで配線はできたので
次に twitter クライアントをインストール
今回使うのは ttytter

sudo apt-get install ttytter 

でインストール

次に

ttytter -ssl

を実行すると

-- using SSL for default URLs.
trying to find cURL ... /usr/bin/curl
-- Streaming API disabled (no -dostream) (TTYtter will use REST API only)
-- no version check performed (use /vcheck, or -vcheck to check on startup)

+----------------------------------------------------------------------------+
|| WELCOME TO TTYtter: Authorize TTYtter by signing into Twitter with OAuth ||
+----------------------------------------------------------------------------+
Looks like you're starting TTYtter for the first time, and/or creating a
keyfile. Welcome to the most user-hostile, highly obfuscated, spaghetti code
infested and obscenely obscure Twitter client that's out there. You'll love it.

TTYtter generates a keyfile that contains credentials for you, including your
access tokens. This needs to be done JUST ONCE. You can take this keyfile with
you to other systems. If you revoke TTYtter's access, you must remove the
keyfile and start again with a new token. You need to do this once per account
you use with TTYtter; only one account token can be stored per keyfile. If you
have multiple accounts, use -keyf=... to specify different keyfiles. KEEP THESE
FILES SECRET.

** This wizard will overwrite /home/pi/.ttytterkey
Press RETURN/ENTER to continue or CTRL-C NOW! to abort.

とでるので Enter をおす

すると
1. Visit, in your browser, ALL ON ONE LINE,

の下にアクセスするURLが

https://api.twitter.com/oauth/authorize?oauth_token=アクセストークン

としてでるので、このURLへブラウザでアクセス

すると連携アプリを認証する画面になるので
連携アプリを認証
をクリック

twitter_cl

すると、次の画面でPINコードがでるので
端末画面で

Enter PIN> 

と表示されているので、ここへPINコードを入力する

これであっているのなら

Request from https://api.twitter.com/oauth/access_token ... SUCCEEDED!
Written keyfile /home/pi/.ttytterkey

Now, restart TTYtter to use this keyfile.
(To choose between multiple keyfiles other than the default .ttytterkey,
 tell TTYtter where the key is using -keyf=... .)

となる

これで ttytter でツイートするには

ttytter -ssl -status="ツイートメッセージ"

となる

もし tytter のテストだよ とツイートしたいのなら

ttytter -ssl -status="tytter のテストだよ"

とする

Raspberry Pi を家電の学習リモコンにする

Raspberry Pi を家電の学習リモコンにする

学習リモコンは、リモコンから送信される赤外線の信号を読み取って
本体に記録し
学習リモコンのボタンを押したときに
その赤外線の信号を送信するというもの

これと同じことが Raspberry Pi でもできる

Raspberry Pi を学習リモコンにできれば
エアコンとかテレビの操作も可能になる

Raspberry Pi で学習リモコンを実現するには
赤外線信号をデジタル信号に変換する
赤外線リモコン受信モジュール

そして
電気信号で赤外線を発光する
赤外線LED
を使うことになる

今回
赤外線リモコン受信モジュールには
 PL-IRM2161-XD1

赤外線LEDには
5mm赤外線LED OSI5LA5113A (10個入)

を使用

また抵抗をつかうので
カーボン抵抗(炭素皮膜抵抗) 1/4W 220Ω (100本入)

を使用

そして、途中に ジャンパーワイヤーのオスオス
が必要

オスオスのジャンパワイヤーは
ハック ラズベリーパイ Raspberry Pi 電子工作入門キット。
に付属していたものを使用

なお、抵抗に関しては
カラー抵抗値の写真早読み表!

を参考にして確認

今回使う赤外線リモコン受信モジュールは
3本足で
リモコン受信の丸いものを前にした場合
一番左が Vout で信号の出力になる

真ん中は GND

一番右は Vcc で 3.3V 電源になる

今回は、信号の出力端子である Vout を
GPIO 17 左下6番めに接続し
GPIO 17 から Raspberry Pi に信号を取り込む

真ん中のGNDと RaspberryPi のGNDを接続

一番右が電源なので、
これと Raspbery PI の 3.3 V
一番左下と接続する

次に GPIO 18 左上6番めから
赤外線LEDの+、つまり足の長いほうへ接続するけど
途中に 220 Ωの抵抗をいれる

赤外線LEDのー、つまり足の短いほうと
赤外線受信モジュールのGNDを
ジャンパーケーブルのオスで接続

これで Raspberry PI から赤外線信号を送信できる

通常、赤外線LEDは流れる電流が大きいため
トランジスタなどで電流を増幅する

今回はGPIOへ直接さしている

これで配線はできたので、
次に
Raspbery Piで赤外線を扱えるようにするソフト
LIRC をインストール

 sudo apt-get install lirc

次に LIRC モジュールを起動時に読み込むようにする

sudo vim /etc/modules

これで最終行に追記する

lirc_dev
lirc_rpi gpio_in_pin=17 gpio_out_pin=18

これで再起動すると

ls -l /dev/lirc0 

を実行すると

crw-rw---T 1 root video 247, 0  9月  9 22:31 /dev/lirc0

となる
これがデバイスファイルになる

LIRCをインストールすると
自動的に起動するけど
自動起動されたくないのなら

 sudo update-rc.d lirc remove 

自動起動するようにしたいのなら

sudo update-rc.d lirc defaults 

ここまでで準備できたので
次に赤外線受信テスト

テストのため一度LIRC を停止

sudo /etc/init.d/lirc stop

次に mode2 コマンドを実行して
赤外線受信テスト
テスト終了は Ctrl + c でOK

しかし、実践しても認識しないため
続きは明日以降にすることに

raspberry pi と RTCモジュール

raspberry pi と RTCモジュール

パソコンには RTC と呼ばれる内蔵時計がはいっている
この内蔵時計には専用バッテリーがある
なので、電源を切っても
RTC で時間管理しているので刻合わせしてくれる

でも Raspberry Pi にはない

その代わり、NTPという仕組みを使って
インターネットに接続してソフトで管理している
つまり、ネットにつながっているのなら問題ない

Raspberry Pi は起動すると
前回シャットダウンしたときの時間が設定される

でも、ネットにつながらない環境では
NTPサーバにアクセスできないので
時刻修正ができない

これを解決するには RTC モジュールを取り付ければいい

今回利用したのは
リアルタイムクロック(RTC)モジュール

今回も
秋月電子通商通販

で部品を調達

これで、今回使ったものは
リアルタイムクロック(RTC)モジュール
ブレッドボード
ジャンパーワイヤー4本
Raspberry Pi 本体

インターネットで購入できるので
電車などで向かわなくても購入できるし
ある程度の時間指定もできるので
忙しい人にもおすすめ

なお、配線にあたって回路が全然わからないため
http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/16F1827/RTC/RTC.htm
を参考に配線

文字が書いてあるほうを手前にして
右側に3つのーマークがくるようにして
ブレッドボードにはめる

次に
電源が 3,3V なので VDD になる上の左から1番めと
GPIO 3,3V を配線

次にGND同士を合わせるので
右下1番めと
GPIO GND を配線

次に SDA がモジュールの一番右上になるので
これと
GPIO 3 つまり左下2番めと接続

次に SCL モジュールの右上2番めと
GPIO 5 つまり左下3番めと接続

これで配線は完了

ここまでできたら Raspberry Pi の電源を入れて
実験

まずは
I2Cデバイスということで
i2cdetect コマンドで、デバイスのアドレスを検出

$ sudo i2cdetect -y 1

とすると

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                   

となり検出できているのがわかる

次に

ls /lib/modules/$(uname -r)/kernel/drivers/rtc/

でカーネルモジュールを調べる

結果は

rtc-bq32k.ko   rtc-ds3234.ko    rtc-m41t94.ko   rtc-pcf8583.ko   rtc-rx8581.ko
rtc-ds1305.ko  rtc-em3027.ko    rtc-max6900.ko  rtc-r9701.ko     rtc-s35390a.ko
rtc-ds1307.ko  rtc-fm3130.ko    rtc-max6902.ko  rtc-rs5c348.ko   rtc-x1205.ko
rtc-ds1374.ko  rtc-isl12022.ko  rtc-pcf2123.ko  rtc-rs5c372.ko
rtc-ds1390.ko  rtc-isl1208.ko   rtc-pcf2127.ko  rtc-rv3029c2.ko
rtc-ds1672.ko  rtc-m41t80.ko    rtc-pcf8523.ko  rtc-rx4581.ko
rtc-ds3232.ko  rtc-m41t93.ko    rtc-pcf8563.ko  rtc-rx8025.ko

どれをつかうかわからなかったので
時計モジュールをRaspbian OSで管理する

を参考に


次に、デバイスの宣言をするけど
これは sudo でやってもダメなので
一度 root ユーザで行う


sudo su

で root になって

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device 

で書き込む

これで接続成功なら仮想デバイスが作成されているので

ls -l /dev/rtc*

で確認

結果は

crw------- 1 root root 254, 0  9月  9 00:16 /dev/rtc0

となり
/dev/rtc0 ができているのがわかる

次に、時刻の設定
RTCを接続しただけだと、正確な日時は設定されていない

まずはネットにつなげ、date コマンドで時刻を取得

date

とすると

2014年  9月  9日 火曜日 00:22:53 JST

という結果になる

これで時刻取得できているのがわかったので
次に RTC モジュールへ書き込み

sudo hwclock -w

で書き込み

そして RTC の時刻をみたいときには

sudo hwclock -r

でみることができる

実行結果は

2014年09月09日 00時25分37秒  -0.047100 seconds

これでRTCには設定されたけど
Raspberry Pi には設定されていない
なので
hwclock -s でRTCの時刻をシステムに反映できる

これで設定できるようになったので
あとはネットから切り離しても動作するように
起動時にこの動作をするように
/etc/rc.local
へ書き込む

sudo vim /etc/rc.local


exit 0
とかかれている前に追記する

内容は

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-1/new_device 
sleep 1
hwclock -s

これで起動時に時刻調整することができる

raspberry pi と I2C

raspberry pi と I2C

Raspberry Pi では
GPIO 2 が SDA
GPIO 3 が SCL
となっている

このため I2C デバイスの
SDA
SCL
へそれぞれ接続する

注意点は
Raspberry Pi の GPIO ポートは 3.3V なので
3.3V 対応デバイスであること

もし 5V デバイスを使うのなら
間にレベルコンバータなどをいれて
電圧を変換する必要がある

部品の調達にまだ時間がかかるため
さきにRTCモジュールを実験