サーボモータの配線

サーボモータの配線

モータを動かすには大きな電流が必要なので
サーボモータの電源を 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 

で終了となる

raspberry Pi でサーボモータ制御

raspberry Pi でサーボモータ制御

サーボモーターは、回転軸の角度、速度が制御できる特殊なモーターのこと

ホビー用としては
ラジコンとかロボットで使われるRCサーボがある

RCサーボは3本のケーブルを持ち
2本は電源用
1本は制御信号用
となっている

サーボモータに送る制御信号で
モーターの角度を変化させることができるので
ロボットの手足の関節部分に使われる

制御信号の送りかたは
信号のパルス幅でサーボモータの角度が変化する
というもの
これはPWMが使われている

サーボモータの種類により異なるけど
20ms 単位の周期で
1~2ms 程度のパルス幅を与えると
そのパルス幅を与えた角度に移動する

Raspberry Pi のPWM回路は
数百KHz の周期でパルスを発生できるけど
サーボモータで発生する周期は
50Hz 程度のため
Raspberry Pi のPWM回路で生成するのは困難なので
サーボモータの制御に特価した ServiBlaster
もしくは
WiringPi の softServiWrute'( で制御する

ServoBlaster はサーボモータの制御に特化している
これは、仮想デバイスファイルにアクセスすることで
簡単にサーボモータの角度を制御できる
また
デーモンとして起動し
ソフトウェアでPWM信号を出力するため
複数のGPIOポートに接続したサーボモータを制御できる

ServoBlaster を起動すると
初期設定では
GPIO 4
GPIO 17
GPIO 18
GPIO 27
GPIO 22
GPIO 23
GPIO 24
GPIO 25
がサーボモータ用のポートになる

とりあえずまずは実験したほうがわかりやすいので
実際に ServoBlaster をインストール

インストールには git が必要なので

sudo apt-get install git-core 

でインストール

次に
ServoBlaster のソースをダウンロード

 git clone git://github.com/richardghirst/PiBits.git

ダウンロード完了したらコンパイル

cd PiBits/ServoBlaster/user/
make
sudo make install

ServoBlaster をインストールすると
自動起動する

自動起動しないようにするには

sudo update-rc.d servoblaster remove 

とする

ServoBaster を自動起動させたいのなら

sudo update-rc.d servoblaster defaults 

とする

これでソフトのインストールはできたので次回配線

WiringPi の SoftPWM機能

WiringPi の SoftPWM機能

Raspberry PI でPWM機能を使えるのは
GPIO18だけだけど
SoftPWM() を使うことで
ソフトウェアでON/OFF させることで
擬似的に他のGPIOポートでPWMを行える

ただし、あくまで擬似的なので
実際に出力されるパルス幅が安定しないし
CPUに負荷がかかるとパルス幅がずれる

LEDを光らせる程度ならわからないレベルのずれ

正確に制御するならGPIO18で制御することになる

試しに
まず

sudo shutdown -h now

で電源を切って配列を変える

+のほうをGPIO4に接続
そして抵抗を270Ωでつけて
LEDの+になるアノードにつなげる

そして
-になるカノードを
GPIOのGNDに接続

これで制御してみる

今回使う WiringPi のメソッドは
wiringPiSetupGpio()
wiringPi の初期化

softPwmCreate(GPIOポート番号, 初期値, 最大値)
初期値はPWMの初期値
LEDとかなら0にする
最大値はパルス幅の最大値で
定数にしておくとメンテしやすい

softPwmWrite(GPIOポート番号, 値)
値は0から設定した最大値になる
これも最大値を定数にするとメンテが楽

基本的には PWM のときのソースと変わらないので

cp pwm_led.c soft_pwm.c

でコピーして改造する

まず、ポートを変えるので

#define LED_PORT 18

#define LED_PORT 4

次に softPwmCreate() でポートや初期値
最大値を設定するので

        //GPIO 18 を PWM
        pinMode(LED_PORT, PWM_OUTPUT);

        //softPWM設定
        softPwmCreate(LED_PORT,0,RANGE);

さらに定数を宣言しておく

#define RANGE 100

次に、繰り返す幅も変えるので

for(pw=0;pw<1024;pw++){

for(pw=0;pw<RANGE;pw++){

にして

for(pw=1023;pw>=0;pw--){

for(pw=RANGE;pw>=0;pw--){

にする

値の変更がsoftPwm を使うので

pwmWrite(LED_PORT,pw);

softPwmWrite(LED_PORT,pw);

に変える

そして待ち時間も変更
現在は 0.3ms なので
3ms にする

 delayMicroseconds(300);

 delay(3);

に書き換える

ここまでできたら

cc -o softpwm soft_pwm.c -lwiringPi

でコンパイルして

sudo ./softpwm 

とすると
GPIO4でも PWMが行えることが確認できる

C言語でLED調光

C言語でLED調光

WiringPi のC言語ライブラリにある
pwmWrite()
を使うことで PWMのデューティー比を指定できる

今回、使用するメソッドとしては
wiringPiSetupGpio()
wiringPi の初期化

pinMode(GPIOポート番号,モード)
指定したGPIOポートのモードを設定
PWMにするのなら
PWM_OUTPUT
でPWM出力になる

pwmWrite(GPIOポート番号, 値)
指定したGPIOポートのPWM値を設定
1~1023 で設定

delayMicroSeconds()
マイクロ秒単位の dekay()

vim pwm_led.c

でファイル作成

ソースは

#include<wiringPi.h>

#define LED_PORT 18

int main(void){
        int pw, i;

        //初期化
        if(wiringPiSetupGpio() == -1) return 1;

        //GPIO 18 を PWM
        pinMode(LED_PORT, PWM_OUTPUT);

        for(i=1;i<10;i++){
                //fade in
                for(pw=0;pw<1024;pw++){
                        //PWM の値変更
                        pwmWrite(LED_PORT,pw);
                        //03ms 待つ
                        delayMicroseconds(300);
                }
                //fade out
                for(pw=1023;pw>=0;pw--){
                        //PWMの値を変更
                        pwmWrite(LED_PORT,pw);
                        delayMicroseconds(300);
                }
        }
        return 0;
}

これで

cc -o pwmled pwm_led.c -lwiringPi

でコンパイル

そして

sudo ./pwmled 

とするとLEDが点滅を10回繰り替えして消灯する

WiringPi でLED調光

WiringPi でLED調光

raspberry Pi のPWMでLEDの明るさ変更

で配線の汲み上げが終わったので続き

WiringPi 付属の gpio ユーティリティを使えば
簡単にPWMの出力ができる

初期設定状態だと
デューティー比を 1024 段階で調整可能

0~1023の値で指定できる

1出力の幅が50%で
0出力の幅が50%なら
中間となるので
指定する値は 511 になる

出力幅が25%なら 255
この半分なら 127 になる

実際に行うにはGPIO18を出力モードで宣言する

gpio -g mode 18 pwm

次に明るさを指定する
構文は

gpio -g pwm 18 値

となる

値を
1023
255
127
で行うのなら

gpio -g pwm 18 1023
gpio -g pwm 18 255
gpio -g pwm 18 127
gpio -g pwm 18 0

とすればいい

最後の0は消灯

値を連続して変化させれば
ゆっくり光らせることもできる

raspberry Pi のPWMでLEDの明るさ変更

raspberry Pi のPWMでLEDの明るさ変更

GPIOの出力は
0 つまり 0V
1 つまり 3.3V
だけなので
これだとLEDをつけるか消すしかできない

しかしPWMを使えば明るさの変更ができるようになる

デジタル信号は


だけだけど
高速で信号をON/OFF させることで
明るさを調整していかのように錯覚させることができる

これはLEDを人間では分からないくらいの早さで
ON/OFF にしていることで錯覚させている

この原理でONの状態が長いと明るく感じて
ONの状態が短いと暗く感じる

このON/OFF のパルスの幅を変える仕組みのことを
PWM
Pulse Width Modulation
といい
パルス幅変調とも言われる

そしてPWMの ON/OFF の長さの比率のことを
デューティー幅という

PWMは様々なところで使われていて
PCのファンの回転数のコントロールにも使われている

Raspberry Pi ではGPIO18だけ
PWM出力可能で
他のGPIOではできない

プログラムを組んで
他のポートでも擬似的にできるけど
CPU処理などで微妙な待ち時間ができるため
不安定な動作になってしまう

とりあえずLEDを使って実験

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

の中から
赤のLED
ジャンパワイヤーのメスオスx2本
ブレッドボード
270Ωの抵抗
を使うことに

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

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

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

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

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

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

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

今回はGPIO18の部分を+にするので
Raspberry Pi の 
Pin1 右上から6番めのところへ+の抵抗とつけたジャンパケーブルをさして

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

これで配線準備は完了

URL中の特定の文字列の抽出

URL中の特定の文字列の抽出

これは、表示中のページからJavascriptコードを使うときに利用する

URL文字列を使っていると
ホスト部分や
クエリパラメーター部分だけ切り出して利用することがある

PHPのマッシュアップではおなじみのもの

これを実現するには
Uriクラスを使う

まずほ、Uriインスタンスの取得

Uriクラスの
parse()を使うことで、Uriインスタンスを取得する

Uri uri = Uri.parse("http://www.example.com/");

次に、取得したインスタンスのメソッドを取得
もし、ホスト部分を取得したいのなら
getHost()
を使う

String scheme = uri.getHost();

ほかのメソッドを使えば
様々な部分の値の取得が可能

例えばURLが
https://user:pass@www.example.com:8080/path/to/index.html?parameter1=value1&parameter2=value2#fragment

だったなら
getScheme()で
http:// とかhttps:// の判別

getSchemeSpecificPart()は
URL全部

getUserInfo()では
user:pass
みたいなユーザ名、パスワード

getAuthority()で
user:pass@www.example.com:8080
みたいに、
ユーザ名:パスワード@ドメイン:ポート番号

getHost()で
www.example.comというようにドメイン
取得

getPort()で8080というように、ポート番号の取得 

getPathSegment()で
ファイルまでのパス取得
今回なら
path/to/index.htmlを
配列で [path, to, index.html]と扱う

getLastPathSegment()で
パスの最後を取得
今回なら index.html

getQuery()で
URLの ? 以降のパラメーターを取得
今回なら
parameter1=value1&parameter2=value2

getFragment()で
fragmentの取得

表示中のページへJavascript発行

表示中のページへJavascript発行

これは、アプリでWebページを書き換えるときに使う

WebページへJavascriptを発行するには
WebViewクラスのloadUrl()を使う

このときに、引数として渡す文字列をhttp://とかのUrlではなく

javascript.
というようにして渡す

また
WebViewクラスの
setJavascriptEnabled(true)
を先に呼び出してJavascriptを使えるようにしておく必要がある

mWebView.loadUrl("javascript.document.getElementById('area').innerText = ('Javascript replace !');");

これで、Javascriptでテキストの置き換えができる

C言語でボタン状態の取得

C言語でボタン状態の取得

WiringPi のC言語ライブラリにある
digitalRead() を使うことで
指定したGPIOポートの値を取得できる

vim button.c

でファイルを作成

ソースは

#include<stdio.h>
#include<wiringPi.h>

#define BTN_PORT 25

int main(void){
        int data, i;

        //初期化
        if(wiringPiSetupGpio() == -1) return 1;

        //GPIO mode in
        pinMode(BTN_PORT,INPUT);

        //読み込み
        for(i=0; i<10;i++){
                //GPIO の値読み込み
                data = digitalRead(BTN_PORT);


                printf("GPIO%d = %d\n",BTN_PORT,data);
                
                //1秒まつ
                sleep(1);
        }
        return 0;
}

最初に
#include
でライブラリなどを読み込む

#define は定数の定義

wiringPiSetupGpio() は
wiringPi の初期化

pinMode(GPIOポート番号 , 入力モード)
でポートのモードを設定
今回なら in モードなので INPUT

pinMode(BTN_PORT,INPUT);

digitalRead(GPIOポート番号)
でポートの値を取得
今回は

data = digitalRead(BTN_PORT);

として結果を変数data に格納している

これで

cc -o button button.c -lwiringPi

でコンパイル

構文は

cc -o 任意の名前 Cソースファイル名 -lwiringPi

これで実行するけど
権利者権限で実行しないとエラーになるので

sudo ./button 

これでボタンをおすと1
ボタンを押していないと0
が10回まで表示される

結果は

GPIO25 = 0
GPIO25 = 0
GPIO25 = 0
GPIO25 = 1
GPIO25 = 1
GPIO25 = 0
GPIO25 = 1
GPIO25 = 0
GPIO25 = 1
GPIO25 = 0

となった

raspbery Pi でボタンからの入力を検知

raspbery Pi でボタンからの入力を検知

GPIOポートが out モードのときなら
値が0なら 0V
値が1なら 3.3V
の電圧が出力される

これに対して
inモード、つまり入力のときには
GPIOポートの電圧に応じた値を読み込める

電圧 0V なら 0
3.3V なら 1
となる

GPIOポートはデジタル入力のため
値が 0 と 1 しかない

例えば
3.3V の半分の1.65V の電圧を加えても 0.5 にはならず
0と1のどっちかという不安定な値になってしまう

このため Raspberry Pi のGPIOポートに入力する電圧は値を正しく検知できるように
3.3V

0V
にする

今回はボタンをおすと 3.3 V の電圧が加わるようにする

使うパーツは
10KΩの抵抗
タクトスイッチ
ジャンパーケーブル3本
ブレッドボード
そして Raspberry Pi 本体

部品に関しては Amazon で購入

電子部品についてはセットであったのでこれを購入

抵抗に関しては少し分かりにくいため
カラー抵抗値の写真早読み表!

を参考に
一番左が茶色のものが 10KΩということで使用

部品に関してはこれでOK

GPIOのヘッダピンになる Pin1
これは一番左上のピン

これは 3.3 V が出力されているので
ボタンが押されたら、この 3.3V が
GPIO25 の Pin22 に加わるようにする
この位置は右上3番めにある

そしてGNDとの間には
10KΩの抵抗を入れる

これがプルダウン抵抗
これがないと
ボタンをおすと GPIO25に 3.3 V が加わるけど
押していないと何もつながっていない状態になる
しかし
電圧は 0V にならずに不安定な状態になっている

これを防ぐために
高い抵抗値をもつ抵抗をいれることで
GND側に電圧を引っ張る

ちなみに
GND側に抵抗をいれることをプルダウンと呼ぶ

注意点として4本足のボタンを使うので
ボタンを押したときににどのピンとつながるのかを調べておく必要がある

これで準備できたので、まずはコマンドでボタンの状態を取得

LEDを光らせるのと同じ手順になるけど
今回は入力になるので
モードが in になる

まずはGPIO25を inモードで使用開始宣言

echo 25 > /sys/class/gpio/export 

で使用するポートを宣言

echo in > /sys/class/gpio/gpio25/direction 

でモードを in に指定

次に cat コマンドで値を読み込む

cat /sys/class/gpio/gpio25/value 

まずはボタンを押していない状態で実行すると

になる

ボタンを押しながら

cat /sys/class/gpio/gpio25/value 

を実行すると

になる

このように、信号の入出力もファイルを読み書きする感覚でGPIOポートを扱うことができる

そして、GPIOポートの使用が終了したら
unexport で終了宣言をする

echo 25 > /sys/class/gpio/unexport 

ちなみに、WiringPi を使えばもっと簡単に操作できる

gpio mode コマンドで in モードに設定して
gpio read コマンドで値を読み出せる

まずはポートの設定
構文は

gpio -g mode 使用するGPIOポート番号 in

今回なら GPIO25 なので

gpio -g mode 25 in

次に gpio read コマンドで値を読み込む

構文は

gpio -g read GPIOポート番号

今回は GPIO25 なので

gpio -g read 25

これでボタンを入れながら実行すると

と表示され、入れずに実行すると

となる