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 -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 |
上記のテキスト・ファイルを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 utility;https://projects.drogon.net/raspberry-pi/wiringpi/the-gpio-utility/
MCP3002;10ビット2チャネルのA-Dコンバータ。10ビットなので、0から2^10(=1023 1024)のディジタル値をとります。
(2020/05/07)1023は間違いなので、1024に変更した。