ラズパイ WiringPi LED点滅


20160510_raspi_led

ラズパイで WiringPi を使ってLEDを点滅する。
ラズパイの GPIO 制御は RPI.GPIO が定番ですが。
今回は WiringPi を使います。

WiringPi はラズパイ1の BCM2835 のために、C言語で書かれた GPIO のライブラリです。
適切なラッパーにより Python などの言語に対応しています。
Arduino のライブラリに似せて設計されています。
ラズパイ2の BCM2836 にも対応しています。

インストール

(Python 開発ライブラリ)
$ sudo apt-get install python-dev
(WiringPi 本体)
$ sudo apt-get install wiringpi
(Python ラッパー)
$ sudo pip install wiringpi2

確認
バージョンの確認

$ gpio -v

gpio version: 2.32

WiringPi のピン番号には、(1) 物理ピン (2) BCM GPIO ピン (3) wiringPi ピンの3種類があり、ちと面倒です。
デフォルトは wiringPi ピンです。
このへんの対応は、下記のコマンドで表示できます。

$ gpio readall

20160525_wiringpi_readall

gpio コマンドでLED点滅
11番ピン(GPIO 17、wPi 0)と6番ピン(GND)の間に、LEDと1KΩの抵抗を直列に入れます。
20160510_raspi_led_gpio17

$ gpio mode 0 out
(点灯)
$ gpio write 0 1
(消灯)
$ gpio write 0 0

Python でLED点滅 (1)

$ sudo python
>> import wiringpi
>> wiringpi.wiringPiSetup()
>> wiringpi.pinMode(0, wiringpi.OUTPUT)
(点灯)
>> wiringpi.digitalWrite(0, wiringpi.HIGH)
(消灯)
>> wiringpi.digitalWrite(0, wiringpi.LOW)
>>> exit()

Python LED点滅 (2)
1秒間隔で点滅する
wiringpi_led_blink.py

import wiringpi
import time
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(17, wiringpi.OUTPUT)
while True:
	wiringpi.digitalWrite(17, wiringpi.HIGH)                 
	time.sleep(1)
	wiringpi.digitalWrite(17, wiringpi.LOW)            
	time.sleep(1)

参考
Setup – Wiring Pi
・wiringPiSetup (void)
WiringPi 方式のピン番号を使用して、WiringPi を初期化します。
これは、Broadcom の GPIO のピン番号 16 に対して、仮想のピン番号 0 をマッピングする方式です。
この関数は、 root権限で呼び出す必要があります。

・wiringPiSetupGpio (void)
Broadcom の GPIO のピン番号を使用して、WiringPi を初期化します。
この関数は、 root権限で呼び出す必要があります。

Core Functions – Wiring Pi
・void pinMode (int pin, int mode)
pin に対して、mode として、INPUT、 OUTPUT、 PWM_OUTPUT、または GPIO_CLOCK のいずれかを設定します。
PWM_OUTPUT は、WiringPi 1ピン (BCM_GPIO 18) のみサポートされています。
GPIO_CLOCK は、WiringPi 7ピン (BCM_GPIO 4) のみサポートされています。

・void digitalWrite (int pin, int value)
pin は OUTPUT として設定されている必要があります
pin に value として、HIGH (1) または LOW (0) の値を書き込みます。
WiringPi では、0(ゼロ) は LOW となり、0(ゼロ) 以外の数値は HIGH として扱います。


ラズパイで weaved を試す (web)


weaved は、ラズパイなどの小型コンピュータボードを IoT化するためのサービスです。

ラズパイでは下記のインターネット・ポートを利用できます。
– SSH on port 22
– Web (http) on port 80
– VNC on port 5901
– A custom TCP service on your port of choice

ラズパイで weaved を試す (ssh) に続いて、Web (http) on port 80 を試してみます。

技術的には ポートフォワード を使っているものと思われます。

設定
ssh と同じです。
Protocol Selection Menu で 2 を選択します。

$ sudo weavedinstaller

*********** Protocol Selection Menu ***********                                         
*    1) SSH on default port 22                
*    2) Web (HTTP) on default port 80         
*    3) VNC on default port 5901              
*    4) Custom (TCP)                          
*    5) Return to previous menu               
***********************************************
Please select from the above options (1-5): <== 2

動作確認
ssh とほぼ同じです。
(1) 利用可能なサービスの一覧から、サービス名をクリックします。
20160520_weaved_web_service_list

(2) web 画面が表示されれば、OKです。
この例では、OctoPrint を表示しています。
20160520_weaved_web_pi


ラズパイで weaved を試す (ssh)


weaved は、ラズパイなどの小型コンピュータボードを IoT化するためのサービスです。
インターネット上のサーバーから、ローカルネット内のラズパイにアクセスすることができます。
ラズパイの他には、BeagleBone Black や Intel Edison などに対応しています。
有償のサービスですが、無料で利用できるプランも用意されています。

ラズパイでは下記のインターネット・ポートを利用できます。
– SSH on port 22
– Web (http) on port 80
– VNC on port 5901
– A custom TCP service on your port of choice
Installation Instructions for Raspberry Pi

技術的には ポートフォワード を使っているものと思われます。

アカウントの取得
weaved のサイト にて、メールアドレスとパスワードを登録します。

インストール
(1) ラズパイにログインする
(2) weaved をインストールする

$ sudo apt-get update
$ sudo apt-get install weavedconnectd

設定

$ sudo weavedinstaller

Please enter your Weaved Username (email address): <== メールアドレス
Please enter your password: <== パスワード

********************** Main Menu ************************                                                    
*       1) Attach/reinstall Weaved to a Service         
*       2) Remove Weaved attachment from a Service      
*       3) Exit                                         
*********************************************************
Please select from the above options (1-3): <== 1

*********** Protocol Selection Menu ***********                                         
*    1) SSH on default port 22                
*    2) Web (HTTP) on default port 80         
*    3) VNC on default port 5901              
*    4) Custom (TCP)                          
*    5) Return to previous menu               
***********************************************
Please select from the above options (1-5): <== 1

You have selected: 1. 
Would you like to continue with the default port assignment? [y/n]  <== y

Enter a name for this Service Attachment (e.g. SSH-Pi). 
This name will be shown in your Weaved Device List.
<== ssh-pi

(下記のように一覧に表示されます)
Protocol	Port	Service		Weaved Name
=================================
SSH		22	sshd       	ssh-pi

********************** Main Menu ************************                                                    
*       1) Attach/reinstall Weaved to a Service         
*       2) Remove Weaved attachment from a Service      
*       3) Exit                                         
*********************************************************
Please select from the above options (1-3): <== 3

動作確認
(1) weaved のサイトに、ログインします。
(2) 利用可能なサービスの一覧が表示されます。上記で設定した ssh−pi が表示されれば、OKです。
20160520_weaved_service_list

(3) サービス名の ssh−pi をクリックします。
(4) ssh の情報が表示されます。
20160520_weaved_ssh

(5) MACにて、下記のように ssh コマンドを実行します。

$ ssh -l pi *** -p 30493

(6) ターミナルに、ログイン画面が表示されれば、OKです。
20160520_weaved_ssh_login

参考
Installation Instructions for Raspberry Pi – weaved
ACCESS YOUR RASPBERRY PI OVER THE INTERNET – raspberrypi.org
Raspberry Piの設定【Weaved – IoT Kit による外部ネットークからのSSH接続】
ルーターを超えてリモートホストに接続できる Weaved を使って Raspberry Pi、Intel Edison を IoT エッジにする方法


ラズパイ pip


ラズパイで pip コマンドで pip 自身を更新しても、バージョンが変わらない。

現象
更新前

$ pip -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

更新

$ sudo pip install --upgrade pip
Downloading pip-8.1.1-py2.py3-none-any.whl (1.2MB): 1.2MB downloaded

更新後
あれっ! 変わらないぞ。

$ pip -V
pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)

対応
実は pip は2つインストールされてます。

$ which pip
/usr/bin/pip /usr/local/bin/pip

(1) /usr/bin/pip は apt-get でインストールされたもの

$ dpkg -S /usr/bin/pip
python-pip: /usr/bin/pip

$ dpkg -L python-pip
/usr/lib/python2.7/dist-packages/pip
/usr/bin/pip

(2) /usr/local/bin/pip は今回の更新でインストールされたもの

python-pip を削除します。

$ sudo apt-get remove python-pip
Removing python-pip (1.5.6-5) ...

無事、新しいバージョンが表示されました。

$ pip -V
pip 8.1.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)

ラズパイのシェルは dash


ラズパイの shell (シェル) は bash ではなく dash です。

シェルのバージョンを確認しようと思ったら、エラーになった。

$ sh --version
sh: 0: Illegal option --

あれっ! と思って、bash にしたら、問題なし。

$ bash --version
GNU bash, version 4.3.30(1)-release (arm-unknown-linux-gnueabihf)

どうなっているんだろうと、現状を調べてみると。
sh は dash にリンクされています。

$ which sh
/bin/sh
$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Jan 21  2014 /bin/sh -> dash

dash で何? と、調べてみると。
Debian lenny から使われているシェルのようです。
Ubuntu や Raspbian も変更になっています。

bash と dash は互換性に問題があるようで、ubuntu wiki にてbash に戻す方法も紹介されています。
・shebang を #!/bin/sh から #!/bin/bash に書き換える
・環境変数の SHELL を /bin/sh から /bin/bash に書き換える
・sudo dpkg-reconfigure dash を実行して /bin/sh を bash にかえる

なお、冒頭のシェルのバージョンを確認する方法ですが。
dash にはコマンドオプションがないようです。
ask ubuntu に、下記の方法が紹介されてました。

$ apt-cache policy dash
Installed: 0.5.7-4

参考
Ubuntuの/bin/shはbashではなくdash
Bash – wikipedia
Debian Almquist shell – wikipedia
Dash as /bin/sh – ubuntu
How to find the version of the Dash shell on Ubuntu /bin


ラズパイ PythonでLED点滅


20160510_raspi_led

ラズパイで Python プログラムで LEDを点滅します。
Python の GPIO 制御として、RPI.GPIO を使用します。

P11(GPIO17) と P6(GND) の間に、LEDと1kΩの抵抗を直列に入れます。
20160510_raspi_led_gpio17

rpi_led_blink.py

import RPi.GPIO as GPIO
import time
PIN = 11
INTERVAL = 1
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN, GPIO.OUT)
try:
	while True:
		GPIO.output(PIN, GPIO.LOW)
		time.sleep(INTERVAL)
		GPIO.output(PIN, GPIO.HIGH)
		time.sleep(INTERVAL)	
except KeyboardInterrupt:
	pass
GPIO.cleanup()

GPIO.setwarnings
すでにGPIOを使っている場合に、下記のようなワーニングが出力されます。

RuntimeWarning: This channel is already in use, continuing anyway.

TESTING A CONNECTED LED IN PYTHON にある GPIO.setwarnings(False) は、これを出力しないように抑止する設定です。
なくても、ワーニングが出るだけなので、気にしない。

参考
CONNECTING AN LED WITHOUT A BREADBOARD
TESTING A CONNECTED LED IN PYTHON
RPi.GPIO basics 3 – How to Exit GPIO programs cleanly, avoid warnings and protect your Pi


ラズパイ シェルでLED点灯


P11(GPIO17)とP6(GND)の間に、LEDと1kΩの抵抗を直列に入れます。
20160510_raspi_led

$ sudo su -
# echo "17" > /sys/class/gpio/export
# echo "out" > /sys/class/gpio/gpio17/direction
# echo "1" > /sys/class/gpio/gpio17/value
# echo "0" > /sys/class/gpio/gpio17/value
...
# exit

参考
CONNECTING AN LED WITHOUT A BREADBOARD


ラズパイ sumobot turn


sumobot turn は、Sumobot が左回転と右回転を繰り返すプログラムです。
sumobot_turn.py と sumobot_turn_check.py の2つがあります。
後者は、前者に、ピンの状態をチェックする処理を追加したものです。

インストール
Github から持ってきて、ラズパイの好きな場所 (例えば /home/pi/sumobot/ ) に置きます。

起動

$ sudo python /home/pi/sumobot/sumobot_turn.py

Sumobot が左回転と右回転を繰り返します。

注意
無線LANでログインして起動してください。
有線LANだと、LANケーブルが絡まります。

自動起動
電源を投入したときに、自動的に起動するようにします。
しかし、常に Sumobot が動き出すと、扱いにくいのです。
sumobot_turn_check.py を使用します。
これは、特定のピン (P13) の状態をチェックして、Sumobot を動かさずに、プログラムを終了する処理を追加したものです。

自動起動するには、/etc/rc.local を変更します。
exit 0 の前に、1行追加します。

$ sudo nano /etc/rc.local
...
# add
python /home/pi/sumobot/sumobot_turn_check.py
exit 0 

ハードの設定
P13(GPIO27) と P17(3.3V) の間に10KΩの抵抗を入れます。
プログラムが自動起動して、Sumobot は動き続けます。
P17(3.3V) に代わりに P14(GND) につなぐと、プログラムは終了して、Sumobot Jr は停止したままです。
20160505_raspi_circuit_p13


ラズパイ Sumobot Jr


20160505_raspi_completion

Arduino に続いて、ラズパイで Sumobot Jr を制御します。

部品
Raspberry Pi 2 B
モバイルバッテリ
・連続回転サーボ SM-S4303R x 2個
16mm ボール
・ネジとナット M2.6x10mm x 12本、M2.6x15mm x 2本
・結索バンド 20cm x 2本
・ゴムバンド #25 3mm幅 x 2本
・線材 少々

加工品
レーザー加工機
・車体 (設計データ) Arduino版と同じです
20160501_sumobot_laser_body

3Dプリンタ
・ボールキャスタ (設計データ) Arduino版と同じです
20160501_sumobot_3d_printer_ball_caster

サーボの動作確認
サーボが所望の動作をするか確認します。
特に、停止を指定したときに、ちゃんと停止しているか。

参考
ラズパイ WiringPi 連続回転サーボ
ラズパイ 連続回転サーボ

車体の組み立て
車体の作り方は、Arduino版 と同じです。
違うのは、上板に Arduino ではなくラズパイを固定すること。
20160505_raspi_upper

配線
20160505_raspi_curuit

(1) オスとメスのジャンパー線を半田付けして、オス2口とメス1口のジャンパー線にします。
20160505_raspi_wiring

(2) モバイルバッテリーを車体に入れます。
モバイルバッテリーの上下に厚紙を入れると、ほどよい感じで固定されます。
20160505_raspi_battery_back

(3) ラズパイと2個のサーボを結線します。ラズパイとモバイルバッテリーを結線します。
20160505_raspi_battery_wire

プログラム
ラズパイにプログラム sumobot_turn を設定します。
電源を入れます。
Sumobot Jr が左回転と右回転を繰り返せば、OKです。

課題
スペーサが3mm厚では足りなかった。
10mmくらい必要です。

(1) 上板にラズパイを固定すると、コネクタの足があたり、基板がしなります。
どうやら、木材のスペーサだと、締め付けると、潰れるようです。
20160505_raspi_problem_1

(2) ラズパイに電源ケーブルを挿す時に、横板が邪魔になり、ケーブルが挿さりません。
応急処置として、横板を切断しました。
20160505_raspi_problem_2_2

YouTube Preview Image

ラズパイ 連続回転サーボ (speed)


20160505_raspi_servo

ラズパイ 連続回転サーボ (duty) に続いて、ラズパイで連続回転サーボを制御します。

ServoSpeed クラス
RPi.GPIO の PWM モードでは、PWMのパルス幅を、デューティ比 で指定します。
デューティ比の範囲は、5.0 から 10.0 です。

これでは使い難いので、速度で指定するクラスを作成しました。
速度の範囲は、−100 から 100 です。
duty のときの確認でわかったように、停止の指定が、計算値よりも少しずれています。
そこで、オフセットを設定して、速度 0 を指定した時に、停止するようにしました。

ソースは、github で公開しています。
rpi_servo_speed.py

確認
試してみたことろ、オフセット=0、速度=0 のときは、微速で回転して、停止しませんでした。
速度 -10 から -26 で、停止しました

オフセットを−18に設定して、速度を -100、-10、0、10、100 と変化させます。
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認しました。

課題
停止を指定しても、クリッと音がして、サーボが微動することがあります。
これは、パルスがジッタを持ってるためと思われます。
今回の用途では、割り切って、このままで使用します。