書籍や公式ドキュメントなどを見ると、Raspberry Pi は python を (発音が似ているからでしょうか) 標準的な言語としてサポートしているように思われます。python には GPIO を操作するライブラリが標準で導入されています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# 初期設定
GPIO.setmode(GPIO.BCM)
# GPIO 14 をデジタル出力に設定
GPIO.setup(14, GPIO.OUT)
try:
# ON(3.3V)/OFF(GND) トグル (Ctrl-C 待ち)
while True:
print time.strftime("%Y/%m/%d %H:%M:%S GPIO 14 HIGH")
GPIO.output(14, GPIO.HIGH)
time.sleep(2.0)
print time.strftime("%Y/%m/%d %H:%M:%S GPIO 14 LOW")
GPIO.output(14, GPIO.LOW)
time.sleep(2.0)
except:
print "interrupted"
finally:
# 後片付け
GPIO.cleanup()
回路図は CircuitLab で作成しました。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# 初期設定
GPIO.setmode(GPIO.BCM)
# GPIO 14 をデジタル入力に設定
GPIO.setup(14, GPIO.IN)
try:
# Ctrl-C 待ち
while True:
print "%s GPIO 14 is %d" % (time.strftime("%Y/%m/%d %H:%M:%S"), GPIO.input(14))
time.sleep(1.0)
#time.sleep(0.1) # チャタリング防止 (ON/OFF の振動状態にある時間は待つ)
except:
print "interrupted"
finally:
# 後片付け
GPIO.cleanup()
Raspberry Pi はアナログ出力できません。PWM (Pulse Width Modulation) で擬似的にアナログ出力します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# 初期設定
GPIO.setmode(GPIO.BCM)
# GPIO 14 を出力に設定
GPIO.setup(14, GPIO.OUT)
# PWM 設定
freq = 50 # Hz (PWM のパルスを一秒間に 50 個生成)
duty = 0.0 # デューティー比 0.0 で出力開始 (パルス内に占める HIGH 状態の時間が 0.0 %)
pwm = GPIO.PWM(14, freq)
pwm.start(duty)
try:
# デューティー比 (duty cycle) を 0..100 の範囲で変化 (Ctrl-C 待ち)
while True:
duty = (duty + 1) % 101
print "%s GPIO 14 duty cycle %d%%" % (time.strftime("%Y/%m/%d %H:%M:%S"), duty)
pwm.ChangeDutyCycle(duty)
time.sleep(0.1)
except:
print "interrupted"
finally:
# 後片付け
pwm.stop()
GPIO.cleanup()
Wiring Pi で提供される gpio コマンドを利用することで GPIO を簡単に制御できます。2016-4-12 現在の最新 Raspbian (NOOBS インストーラ経由) には gpio コマンドが標準でインストールされています。
pi@raspberrypi:~ $ cat /etc/issue
Raspbian GNU/Linux 8 \n \l
pi@raspberrypi:~ $ uname -r
4.1.19+
pi@raspberrypi:~ $ which gpio
/usr/bin/gpio
ピン番号の割り振り方には何種類かあります。このうち python の例でも利用した BCM 形式のピン割り当てを利用することにします。コマンド実行時に -g
オプションを付与します。また、WiringPi の gpio コマンドで利用する GPIO ピンに関する注意事項があります。
基本的な処理を行うにあたって知っておくとよさそうなことは以下のとおりです。
1
で 3.3V, 0
で 0.0V です。
gpio -g mode 18 out
gpio -g write 18 1
gpio -g write 18 0
gpio -g mode 18 in
gpio -g read 18
0 (0.0V) から 1023 (3.3V) の範囲で調整します。
gpio -g mode 18 pwm
gpio -g pwm 18 0
gpio -g pwm 14 500
gpio -g pwm 14 1023
gpio readall
各プログラミング言語には外部コマンドを実行するための何らかの仕組みが備わっています。これを利用して gpio コマンドを操作すれば、任意のプログラミング言語で Raspberry Pi を制御できます。厳密なリアルタイム性が求められないマイコン制御は C/C++ だけのものではなくなりました。
This program, called gpio, can also be used in scripts to manipulate the GPIO pins – set outputs and read inputs. It’s even possible to write entire programs just using the gpio command in a shell-script, although it’s not terribly efficient doing it that way… Another way to call it is using the system() function in C/C++ or it’s equivalent in other programming languages.
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
system "gpio -g mode 18 out"
while true do
puts "GPIO 18 HIGH"
system "gpio -g write 18 1"
sleep 2.0
puts "GPIO 18 LOW"
system "gpio -g write 18 0"
sleep 2.0
end
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
system "gpio -g mode 18 out";
while(1) {
print "GPIO 18 HIGH\n";
system "gpio -g write 18 1";
sleep 2;
print "GPIO 18 LOW\n";
system "gpio -g write 18 0";
sleep 2;
}
前述の通り RPi.GPIO
を利用することもできます。コマンドを利用する場合は以下のようにできます。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import time
os.system("gpio -g mode 18 out")
while True:
print "GPIO 18 HIGH"
os.system("gpio -g write 18 1")
time.sleep(2.0)
print "GPIO 18 LOW"
os.system("gpio -g write 18 0")
time.sleep(2.0)