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モジュールを実験

I2Cデバイスと raspberry Pi

I2Cデバイスと raspberry Pi

I2C
Inter Integrated Circuit
はシリアルパスで
SDA と SCLという2本の信号線だけでデバイスを制御できる

Raspberry Pi のGPIOポートは
I2Cデバイス対応なのでさまざまなデバイスを扱うことができる

ちなみに
GPIO 2 が SDA
GPIO 3 が SCL
となる

I2C も 1-wire みたいに個々のデバイスにIDが振られているので複数のデバイスを並列に接続し
同時に使うことができる

I2C対応デバイスとしては
温度センサー
湿度センサー
気圧センサー
不揮発メモリ
RTCモジュール
LCD液晶ディスプレイ
I/Oポートエキスパンダ
D/Aコンバータ
A/Dコンバータ

などがある

ちなみに、今回インストールしている OS
Raspbian では
初期状態では I2C が無効化されている

このため

sudo vim /etc/modprobe.d/raspi-blacklist.conf 

で設定ファイルを編集

blacklist i2c-bcm2708

の先頭に#をつけて

#blacklist i2c-bcm2708

とする

次に

 sudo vim /etc/modules 

でファイルを編集

最終行に

i2c-dev

を追記

ここまでできたら
端末からI2C 制御のためのユーティリティ
i2c-tools をインストールする

sudo apt-get install i2c-tools libi2c-dev 

これで設定ができたので再起動すれば使えるようになる

次回、配線と実行

Raspberry Pi と 1-wireデバイス

Raspberry Pi と 1-wireデバイス

1-wire は非同期シリアルインターフェースで
1本の信号線を使ってデータの送受信ができるインターフェース

信号線が1本でも
複数デバイスを接続することができ
電源を信号機からとることもできる

通信速度は 15.4kbps
125kbps となっていて
I2C SPIに比べると低速

個々の 1-wire デバイスには
ROM ID
という重複しない固有IDが振られているので
同じ種類のデバイスを
同じ 1-wire 上のパス上に複数接続できる

これはIPで振り分けている複数のパソコンが
インターネットに接続できる
ように
複数の接続が可能

例えば20個の温度の監視をするときにも
使用する Raspberry Pi のGPIOポートは
1つで済む

まずは実践したほうがわかりやすいので実験

使うものは
1-wire デバイスの温度センサーDS18B20

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

ジャンパーワイヤー 3本

そしてブレッドボードと raspberry Pi 本体

Amazon で調べたけどみあたらないので
今回も秋月電子でネットで購入

複数の抵抗をかったためわかりにくいので

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

をみて
一番右の金色以外すべて赤が 2,2 kΩなので
これを使う

そして配線
3.3V 左下11番め
GPIO 4 左下4番め
GND 左上3番め
から
ブレッドボードにさす
さすときに、これらを縦に同じ列にする

そして
3.3V と GPIO 4 のピンの部分へまたぐように
2.2KΩの抵抗をさす

そして、
GPIO 4
3.3V
GND
のそれぞれの横の列と同じようになるように
温度センサーDS18B20
をさす

センサーには向きがあるので注意
今回、反応しなかったので
検索したところ

[コラム] 第9回『1-wire温度センサーで部屋の温度を測定しよう』


接続例がでていたので、それを参考にさせてもらいました
どうやら文字がかかれていて
1番左がGND
真ん中が GPIO 4
一番右が 3.3V
なるようです

GND側に抵抗を入れるのがプルダウン

+のほうに抵抗を入れるのがプルアップ

今回はプルアップを行う

配線ができても、そのままだと Raspberry Pi は
1-wire が有効になっていないので使えない

sudo vim /etc/modules 

でファイルを開いて編集する

最終行に

w1-gpio
w1-therm

を追記する

編集が終わったら再起動することで
設定が有効になり
1-wire デバイスを使えるようになる

一時的に使うのなら

sudo modprobe w1-gpio 
sudo modprobe w1-therm

を実行することで使えるようになる

ただしこれだけだと再起動すると使えない状態に戻る

設定ができたら、次に 1-wire デバイスのIDを調べる
1-wire デバイスには ROM ID というIDが振られているので
1-wireデバイスを配線したら

ls /sys/bus/w1/devices/

で調べると

28-000006479c5b

みたいに
28-0000 ではじまるシンボリックリンクがみつかる

これが接続しているデバイスのIDになる
ちなみに、何も接続していないと

w1_bus_master1

として表示される

これで認識しているのがわかったので
次に温度センサーの値を取得

cat /sys/bus/w1/devices/28-000006479c5b/w1_slave 

で値を得ることができる

実行結果は

c6 01 4b 46 7f ff 0a 10 17 : crc=17 YES
c6 01 4b 46 7f ff 0a 10 17 t=28375

この2行めの
t=28375
が温度になる
これは1000倍された値のため
実際の温度は 28.375 度となる

このままだと読みにくいけど
perl とかシェルスクリプトなどを使えば
温度だけを表示できるので見やすくできる

サーボモータの配線

サーボモータの配線

モータを動かすには大きな電流が必要なので
サーボモータの電源を Raspberry Pi からとることはできない

このためサーボモータ専用の電池ボックスなどをつかって電源をとることになる

今回は使用するパーツを
秋月電子通商通販

で購入

使用した部品は

GWSサーボ MICRO/STD/F(フタバ)

電池ボックス 単3×4本用

そして
ハック ラズベリーパイ Raspberry Pi 電子工作入門キット。

使用する単3電池は100均で購入

配線するときの注意点として
Raspberry Pi の 3.3V と
サーボモータ用の+を接続しないこと

これは、Raspberry PI のほうが電圧が低いため
Raspberry Pi に電圧がかかり
Raspbery Pi が物理的に壊れるため

なお、今回購入したサーボモータは
端子がソケットになっていて
ブレッドボードにさせないので
電子工作入門キットに両方ともオスの
ジャンパケーブルがあるので、
これをつかってブレッドボードに接続する

配線は
Raspberry Pi のGND
サーボモータの -
電池ボックスの ー
が同じ横の列

そして
サーボモータの+
電池ボックスの+
が同じ横の列

Raspberry Pi のGND、つまり右から3つめと
GPIO18 つまり右から6つめ
と同じ縦の列にさす

これで配線は完了

次に、電池ボックスの電源をいれてから
ServoBlaster を起動する

起動は

sudo servod

実行結果は

Board revision:                  2
Using hardware:                PWM
Using DMA channel:              14
Idle timeout:             Disabled
Number of servos:                8
Servo cycle time:            20000us
Pulse increment step size:      10us
Minimum width value:            50 (500us)
Maximum width value:           250 (2500us)
Output levels:              Normal

Using P1 pins:               7,11,12,13,15,16,18,22
Using P5 pins:               

Servo mapping:
     0 on P1-7           GPIO-4
     1 on P1-11          GPIO-17
     2 on P1-12          GPIO-18
     3 on P1-13          GPIO-27
     4 on P1-15          GPIO-22
     5 on P1-16          GPIO-23
     6 on P1-18          GPIO-24
     7 on P1-22          GPIO-25

となる

これで次にサーボモータを制御する

サーボモータの制御は
仮想デバイスファイルの
/dev/servoblaster
にパルス幅を書き込む

パルス幅の単位はミリ秒を100倍した値になる

もし 1,2ms のパルス幅を出力するなら
値は120になる

指定できる値は、初期値では
50~250 だけど
-min オプションで下限
-max オプションで上限を変えることができる

サーボモータの制御の構文は

echo サーボ番号=パルス幅  >/dev/servoblaster

となる

サーボ番号は

sudo servod

を実行したときに

Servo mapping:
     0 on P1-7           GPIO-4
     1 on P1-11          GPIO-17
     2 on P1-12          GPIO-18
     3 on P1-13          GPIO-27
     4 on P1-15          GPIO-22
     5 on P1-16          GPIO-23
     6 on P1-18          GPIO-24
     7 on P1-22          GPIO-25

の部分でみることができる

今回なら GPIO 18 は2番になっている

これをつかってパルス幅を 1.2ms にするなら

echo 2=120 > /dev/servoblaster

となる

2回実行してもすでにその角度に動いている後なので
変化しない

簡単な操作なら、スクリプトにすることもできる

Raspberry PiのPWM出力を使ってサーボモーターを動かす!

を参考に角度を動かすなら

vim servo..sh

でファイルを作成して

#!/bin/bash
echo 2=150 >/dev/servoblaster
sleep 0.5

echo 2=60 >/dev/servoblaster
sleep 0.5

echo 2=240 >/dev/servoblaster

で保存

chmod 755 servo.sh 

で権限を与えて

./servo.sh

で実行すると回転を始める

あと ServoBlaster デーモン起動中は
GPIO 4
GPIO 17
GPIO 18
GPIO 27
GPIO 22
GPIO 23
GPIO 24
GPIO 25
は ServoBlaster 専用になる

もし、特定のポートだけServoBlaster にするなら
–p1pins=基盤のピン番号
とする
GPIOポート番号ではないので注意

sudo servod --p1pins=12

とすれば

Servo mapping:
     0 on P1-12          GPIO-18

となり18ポートだけ ServoBlaster 対応になる

ServoBlaster 終了は

sudo killall servod 

で終了となる