記事

Raspberry Piでコマンドをゆっくりマスタしよう (12) gpio

GPIOポートをアクセスするgpio コマンド

 WiringPiは2016-02-03版のRASPBIAN JESSIEから含まれるようになりました。WiringPiには、C言語から呼び出してGPIO関係のI/Oを容易にアクセスできるプログラム開発以外に、シェルで実行できるコマンド(GPIO utility)があります。管理者権限のないユーザpiでも、コマンドを入れるだけでOSが管理しているGPIOにアクセスできます。

バージョンの表示

gpio -v

バージョン表示

 ボード名、製造工場などの情報も表示されています。

GPIOの各ポートの状態を表示

gpio readall

アクセス可能なピンの状態を表示

GPIOの物理的なピン番号とBCMピンの名称

GPIOピンを出力できる状態に設定して、1もしくは0を出力

gpio -g mode 14 out

gpio -g write 14 0

ピンを出力(out)に設定して

0レベルを出力

 BCMピンの14を出力に設定して0(Low)を出力しました。BCMピンで指定するときは、-gオプションをつけます。BCMはRaspberry Piで使われているCPU(SoC)の頭文字です。BCMピン番号は、回路図に書かれているI/Oピンの名称GPIOxxのxx番号です。

gpio mode 14 out

gpio write 14 1

ピンを出力(out)に設定して

1レベル(High=3.3V)を出力

 WiringPiピンの14を出力に設定して1(High)を出力しました。

 -gオプションをつけないときは、WiringPiのピン番号になります。同じピンに3種類の番号が振られているので、とても混乱します。

 上記の二つを実行した状態を次の写真に示します。3桁のLED表示は電圧計です。1を出力すると、ほぼCPUの電源電圧と同じになります。

GPIOピンを入力できる状態に設定してアナログ値を読み取る

 Raspberry Piにはアナログ入力がありません。学習用実験ボードとして販売されているGertboardに搭載されているA-DコンバータMCP3002からA-D変換値をリードできるように接続します。

 A-DコンバータMCP3002はSPIのシリアル・インターフェースです。OSで利用できるように、Raspberry Piの設定画面で有効にし、再起動しておきます。

 GertboardはGPIOが26ピン時代の古い実験用ボードです。現在GPIOは40ピンに増えていますが、26ピン部分はほぼ継承されています。SPIインターフェースの4本のケーブルをジャンパ線で接続します。

Raspberry Pi GPIO

Gertboard

GP11 (SPI CLK)

SCLX

GP10 (SPI MOSI) MOSI
GP9 (SPI MISO) MISO
GP8 (SPI CE0) CSnA

 A-DコンバータICの二つの入力は、ピンヘッダのAD0、AD1につながっています。ピンヘッダAD0は3.3Vに接続し、AD1は、10kΩのボリュームをつなぎ、0~3.3Vの間を変化できるようにします。

Gertboard ボリューム
3.3V 3番
AD1

2番 (中央のピン)

GND 1番
AD0-3.3Vに接続  

アナログ値を読み取る

gpio gbr 0 AD0から読み取る
gpio gbr 1 AD1から読み取る

 読み取った値は、ディジタルですから、アナログ電圧(V)にするには、次のように計算します。

(読みとった値)*3.3 / 1024

サンプル・プログラム

#!/usr/bin/python
#coding:utf-8
import time
from subprocess import check_call,Popen,PIPE
while 1:
      p = Popen(["gpio","gbr","1"],stdout=PIPE)
      c = p.stdout.read(4)
      analogVolt = int(c) * 3.3 / 1024
      print '電圧は ' + str(analogVolt) + 'V'
      time.sleep(3)

 上記のテキスト・ファイルをpiのホーム・ディレクトリにad1.pyというファイル名で保存し、ターミナルで、chmod 755 ad1.py で実行権を付け、 ./ad1.py で実行します。ボリュームを回すと、0Vと3.3Vの間の電圧を表示します。小数点以下の桁数が多いですが、計算上の表示です。10ビットA-Dコンバータにはこれほどの分解能はありません。

PWM出力(アナログ出力)

 下記のサイトを参考にさせていただきました。ありがとうございます。

  http://kutajin.blog101.fc2.com/blog-entry-279.html

  http://raspberrypi.stackexchange.com/questions/4906/control-hardware-pwm-frequency/9725#9725

gpio mode 1 pwm

gpio pwm-ms

gpio pwmc 100

gpio pwmr 200

gpio pwm 1 50

GPIO18(BCM)ピンをPWM出力に設定

mark-spaceモード

クロックの値を100(2 ~4095)

レンジの値を200( ~4096)

ディーティ比 50/200のPWMを出力

 50/200はONしている時間は短いです。

 アナログ・メータでは繰り返しの周波数が高いので、PWM出力はアナログ出力のように針が止まっています。

 デューティ比を 150/200に変更。ONしている時間が増え、アナログ・メータの電圧表示は高い数値になっています。

バックグラウンド

The GPIO utilityhttps://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/

Gertboarボードhttps://www.element14.com/community/docs/DOC-65588/l/an-introduction-to-using-the-gertboard-with-the-raspberry-pi#MoreADC

MCP3002;10ビット2チャネルのA-Dコンバータ。10ビットなので、0から2^10(=1023)のディジタル値をとります。

連載メニュー Raspberry Piでシェル・コマンドをゆっくりマスタしよう

(1) pwd いま、私はどこにいるの?

(2) df あといくつ空いている?

(3) cd ディレクトリ間をうろうろする

(4) cat ファイルの内容を表示

(5) top ps kill プロセスの表示、削除

(6) scrot  画面キャプチャ

(7) CPUの温度

(8) ifconfig ip iw 私のIPアドレス

(9) apt-getで日本語化

(10) ls dir lsusb ディレクトリ情報、USB機器の接続状況

(11) nano テキスト・エディタ

(12) GPIOポートをアクセスするgpio コマンド

(13) ping IPアドレス