python を用いた例
書籍や公式ドキュメントなどを見ると、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()
擬似的なアナログ出力 (PWM)
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 ピンに関する注意事項があります。
基本的な処理を行うにあたって知っておくとよさそうなことは以下のとおりです。
- デジタル入出力の用途であればとりあえず GPIO 17,18,21,22,23,24,25 の中から選んでおけば間違いない
- PWM 出力の用途で使用できるのは GPIO 18 のみ
デジタル出力
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
PWM 出力 (疑似アナログ出力)
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.
Ruby
#!/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
Perl
#!/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;
}
Python
前述の通り 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)
C/C++
C/C++ の場合は wiringPi ライブラリを include して利用することもできますが、以下のように system
関数を利用するのも簡単でよいですね。
#include <iostream>
#include <cstdlib>
#include <unistd.h>
using namespace std;
const int SLEEP_TIME = 2 * 1000 * 1000;
int main() {
system("gpio -g mode 18 out");
while(1) {
cout << "GPIO 18 HIGH" << endl;
system("gpio -g write 18 1");
usleep(SLEEP_TIME);
cout << "GPIO 18 LOW" << endl;
system("gpio -g write 18 0");
usleep(SLEEP_TIME);
}
return 0;
}
Java
class Main {
public static void main(String args[]) {
Runtime r = Runtime.getRuntime();
try {
r.exec("gpio -g mode 18 out");
while(true) {
System.out.println("GPIO 18 HIGH");
r.exec("gpio -g write 18 1");
Thread.sleep(2000);
System.out.println("GPIO 18 LOW");
r.exec("gpio -g write 18 0");
Thread.sleep(2000);
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
Scala
import scala.sys.process._
import scala.language.postfixOps
object Main {
def main(args: Array[String]): Unit = {
"gpio -g mode 18 out" !
while(true) {
println("GPIO 18 HIGH")
"gpio -g write 18 1" !
Thread.sleep(2000)
println("GPIO 18 LOW")
"gpio -g write 18 0" !
Thread.sleep(2000)
}
}
}
シェルスクリプト
#!/bin/sh
gpio -g mode 18 out
while :
do
echo "GPIO 18 HIGH"
gpio -g write 18 1
sleep 2
echo "GPIO 18 LOW"
gpio -g write 18 0
sleep 2
done
仮想ファイルシステムについて
python の GPIO ライブラリでも gpio コマンドでも、内部的には OS が提供する仮想ファイルシステムが利用されています。
GPIO Sysfs Interface for Userspace
実用性はありませんが、例えば以下のシェルスクリプトで直接仮想ファイルシステムを操作してもデジタル出力が実現できます。
#!/bin/sh
# GPIO 14 を利用する宣言
echo 14 > /sys/class/gpio/export
sleep 1
# 出力に設定
echo 'out' > /sys/class/gpio/gpio14/direction
# HIGH/LOW トグル
cnt=1
while [ $cnt -lt 5 ]; do
date +'%Y/%m/%d %H:%M:%S LOW'
echo 0 > /sys/class/gpio/gpio14/value
sleep 2
date +'%Y/%m/%d %H:%M:%S HIGH'
echo 1 > /sys/class/gpio/gpio14/value
sleep 2
cnt=`expr $cnt + 1`
done
# 後片付け
echo 14 > /sys/class/gpio/unexport
関連記事
- Android Things による LED 点灯 (Raspberry Pi 3)電子工作や製品のプロトタイピング (例『地球規模で遠隔操作できるブルドーザー』) で利用される Raspberry Pi 3 について、 Android Things アプリケーションを開発できます。 本ページでは、簡単な例として LED を点灯させるアプリケーションを扱います。より実用的なアプリケーションを開発する際には [GitHub (Android Thin
- Raspberry Pi 無線接続時の IP 固定wlan0 の IP 固定方法 Raspberry Pi の SSID とパスワード設定は終わっている前提で以下のファイルを編集します。 $ sudo vi /etc/network/interfaces 以下の 4 行を一番最後に追加します。適宜自分の環境用に IP を変えてください。 iface wlan0 inet static address 192.168.179.1
- Raspberry Pi アナログ入力 (I2C A/D コンバータ)ADS1015 について Raspberry Pi には A/D コンバータが内蔵されていません。デジタル入出力、アナログ出力に加えてアナログ入力を行うためには外部 IC を利用する必要があります。ここでは I2C デバイスの ADS1015 を利用します。事前に I2C 設定を行っておいてください。 ![](
- Raspberry Pi ピン配置などを公式ドキュメントで調べる公式ドキュメント Raspberry Pi 公式ドキュメントにはインストール方法や初期設定などが記載されています。 Raspberry Pi Documentation ピン配置 / GPIO [GPIO: Models A+, B+, Raspberry Pi 2 B and Raspberry Pi
- 地球規模で遠隔操作できるブルドーザー(インターネット経由でスマホによるラジコン操作)スマートフォンから操作できるブルドーザーロボットです。前進、後退、回転が可能です。Qoosky WebSocket API を利用しています。制作費は Raspberry Pi が既に手元にあれば追加でおおよそ 1 万円です。センサー機能が搭載されていないため正確な操作はできませんが、学校や職場から自宅のロボットを動かすこともできます。