GPIOのピン番号や状態を取得する
GPIOの状態は$gpio readallで見れる
pi@raspberrypi:~ $ gpio readall
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
それぞれの欄は下記のような意味
- BCM : GPIO番号
- wPi : Wiring Piというライブラリを使う場合の番号
- Name : 一般的な端子名称
- Mode : 入力か出力か
- V : 現在の端子にかかってる電圧
- Physical : 40Pin端子の物理的な端子番号
- BCM : GPIO番号
- wPi : Wiring Piというライブラリを使う場合の番号
- Name : 一般的な端子名称
- Mode : 入力か出力か
- V : 現在の端子にかかってる電圧
- Physical : 40Pin端子の物理的な端子番号
shellスクリプトで書く場合は、wPiの番号になります。
Pythonで使う場合は、BCMとPhysicalのどちらの番号でも指定できます。
Pythonで使う場合は、BCMとPhysicalのどちらの番号でも指定できます。
GPIOのライブラリ
GPIOを操作するライブラリは3種類ある
- pigpio
- RPi.GPIO
- WiringPi
今回使ったのは、RPi.GPIO
スイッチ入力を検出するPythonプログラム
スイッチの状態を検出するには、プログラムでずっと監視するか、スイッチの状態が変わったイベントを取得するか、の2つの方法があります。
以下でそれぞれの方法について説明します。
以下でそれぞれの方法について説明します。
無限ループ使ったスイッチ検出
スイッチの状態を監視して、LEDを点灯させるプログラムは下記になります。
LED_Loop.py
import RPi.GPIO as GPIO #GPIOにアクセスするライブラリをimportします。
import time
GPIO.setmode(GPIO.BCM) #GPIOへアクセスする番号をBCMの番号で指定することを宣言します。
GPIO.setup(15,GPIO.OUT) #BCMの15番ピン、物理的には10番ピンを出力に設定します。
GPIO.setup(2,GPIO.IN) #BCM 2番ピンを入力に設定します。
try:
while True:
if GPIO.input(2) == GPIO.LOW:
GPIO.output(15,GPIO.HIGH)
else:
GPIO.output(15,GPIO.LOW)
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()
参考
http://robocad.blog.jp/archives/678444.html
https://www.raspberrypi.org/forums/viewtopic.php?t=121182
http://robocad.blog.jp/archives/678444.html
https://www.raspberrypi.org/forums/viewtopic.php?t=121182
下記のコマンドで実行します。
pi@raspberrypi:~/pythonSandBox $ python3 ledLoop2.py
python コマンド実行すると、ディフォルトでUTF-8に対応しないので、のコメントアウトがうまく処理されず、下記のようなエラーになります。
pi@raspberrypi:~/pythonSandBox $ python ledLoop2.py
File "ledLoop2.py", line 1
SyntaxError: Non-ASCII character '\xe3' in file ledLoop2.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
イベント駆動型
無限ループかっこ悪いので、
イベント駆動型だと以下のような感じ
押した瞬間だけ光る
イベント駆動型だと以下のような感じ
押した瞬間だけ光る
import RPi.GPIO as GPIO
import time
#callback関数の定義
def switch_callback(gpio_pin):
print(gpio_pin)
GPIO.output(15,GPIO.HIGH)
GPIO.setmode(GPIO.BCM) #GPIOへアクセスする番号をBCMの番号で指定することを宣言します。
GPIO.setup(15,GPIO.OUT) #BCMの15番ピン、物理的には10番ピンを出力に設定します。
GPIO.setup(2,GPIO.IN) #BCM 2番ピンを入力に設定します。
GPIO.add_event_detect(2, GPIO.FALLING,bouncetime=100)
GPIO.add_event_callback(2, switch_callback) #スイッチ入力端子の状態ををcallbackのトリガとして指定します。
try:
while True:
GPIO.output(15,GPIO.LOW)
time.sleep(0.1)
except KeyboardInterrupt:
GPIO.cleanup()
参考
Raspberry PiのGPIO操作(1)Lチカ、OLED表示
せっかく久しぶりにRaspbianをインストールしたので、これまでやっていなかった、Raspbianからのデバイス制御を試してみました。
RaspbianはStretch-Liteをインストールし、raspi-configでシリアルポートを有効化しました。
これでシリアルポートからログインできるようになり、キーボードやディスプレイを接続する必要が無くなります。
Pi Zero Wなら、ネットワークとsshを有効にしておけばネットワーク経由でログインできますので、シリアルケーブルも不要になります。
これでシリアルポートからログインできるようになり、キーボードやディスプレイを接続する必要が無くなります。
Pi Zero Wなら、ネットワークとsshを有効にしておけばネットワーク経由でログインできますので、シリアルケーブルも不要になります。
これでRPi周辺がすっきりしましたので、GPIOでのデバイス接続を試してみました。
まず、Raspberry Pi Zero/Zero WのGPIOですが、BCM2835のマニュアルP102によると、ピンに対して機能が以下の図のように割り当てられています。
このうち、ピンヘッダで信号を取り出せるのはGPIO2~27となっています。
このうち、ピンヘッダで信号を取り出せるのはGPIO2~27となっています。
ざっと見ると、いわゆるGPIOとしての入出力以外に(ピンヘッダから)使える主な機能は
・I2C ×1 (SDA1/SCL1)
・SPI ×2 (SPI0、SPI1)
・UART ×1 (TXD0/RXD0/CTS0/RTS0、またはTXD1/RXD1/CTS1/RTS1)
・PWM ×2 (PWM0、PWM1)
・PCM ×1 (PCM_CLK/PCM_FS/PCM_DIN/PCM_DOUT)
・JTAG ×1 (ARM_TDI/ARM_TDO/ARM_RTCK/ARM_TMS/ARM_TCK)
・SPI ×2 (SPI0、SPI1)
・UART ×1 (TXD0/RXD0/CTS0/RTS0、またはTXD1/RXD1/CTS1/RTS1)
・PWM ×2 (PWM0、PWM1)
・PCM ×1 (PCM_CLK/PCM_FS/PCM_DIN/PCM_DOUT)
・JTAG ×1 (ARM_TDI/ARM_TDO/ARM_RTCK/ARM_TMS/ARM_TCK)
であることが解ります。
このほかにGPIO Clock(オーディオデバイスにクロックを供給するために使われるらしい)、BSC Slave(I2C互換のBroadcom独自インタフェースらしいです)、メモリインタフェース(SDx、SAxがそれぞれデータバス/アドレスバス)があるようです。
このほかにGPIO Clock(オーディオデバイスにクロックを供給するために使われるらしい)、BSC Slave(I2C互換のBroadcom独自インタフェースらしいです)、メモリインタフェース(SDx、SAxがそれぞれデータバス/アドレスバス)があるようです。
他のRaspberry Piも含めた、より詳しい一覧表が以下のページにあります。
一つのピンに複数の機能は割り振れないので、例えばSPI1とRTS0/CTS0/RTS1/CTS1を同時に使用することはできません。
ピン配置は以前も掲載しましたが下図の通りです。
ピン配置は以前も掲載しましたが下図の通りです。
●Lチカ
GPIOを制御するには、Pythonのライブラリが公開されています。
しかしRaspbianはLinuxなので、GPIOのオン・オフくらいファイルシステム経由でできるだろう、と考えて調べてみたら、やはりそういったインタフェースが用意されていました。
しかしRaspbianはLinuxなので、GPIOのオン・オフくらいファイルシステム経由でできるだろう、と考えて調べてみたら、やはりそういったインタフェースが用意されていました。
GPIOをオンオフするには、/sys/class/gpio以下のファイルに設定を書き込みます。
先日試したオンボードのLEDがつながっているGPIO47は、BUSYで制御できませんでしたので、普通にピンヘッダのほうのGPIOを試してみました。
先日試したオンボードのLEDがつながっているGPIO47は、BUSYで制御できませんでしたので、普通にピンヘッダのほうのGPIOを試してみました。
1)echo ピン番号 > /sys/class/gpio/export で該当のGPIOを有効化
2)echo out > /sys/class/gpio/ピン番号/direction で出力ピンに設定
3)echo 0か1 > /sys/class/gpio/ピン番号/value でHまたはLを出力
2)echo out > /sys/class/gpio/ピン番号/direction で出力ピンに設定
3)echo 0か1 > /sys/class/gpio/ピン番号/value でHまたはLを出力
という形で制御できます。
入力の場合は、echo in > /sys/class/gpio/ピン番号/directionで設定し、cat /sys/class/gpio/ピン番号/value で値を取得します。
入力の場合は、echo in > /sys/class/gpio/ピン番号/directionで設定し、cat /sys/class/gpio/ピン番号/value で値を取得します。
以下の例ではGPIO4(ピンヘッダの7番ピン)に出力しています。
LEDのアノードを7番ピン、カソードを9番ピン(GND)に接続すれば、LEDをオン・オフできます。
LEDのアノードを7番ピン、カソードを9番ピン(GND)に接続すれば、LEDをオン・オフできます。
raspbianにはraspi-gpioというパッケージがあり、
sudo apt-get install raspi-gpio
でインストールできます。
このパッケージを使うと、上記と同等のことをより簡単に行うことができます。
例えばGPIOの状態を取得するには、以下のようになります。
このパッケージを使うと、上記と同等のことをより簡単に行うことができます。
例えばGPIOの状態を取得するには、以下のようになります。
●I2C
まず、sudo raspi-configで「5 Interfacing Options」を選択し、I2CとSPIをenabledにしておきます。
これでデバイスドライバが自動で読み込まれるようになります。
I2Cは/dev/i2c-1、SPIは/dev/spidev0.0と/dev/spidev0.1がデバイスファイルとして作成されます。
これでデバイスドライバが自動で読み込まれるようになります。
I2Cは/dev/i2c-1、SPIは/dev/spidev0.0と/dev/spidev0.1がデバイスファイルとして作成されます。
I2Cは標準コマンドのみで操作することは難しいようですが、Linuxではプログラムを書かずに操作するための専用のi2c-toolsというパッケージがあります。
これはデフォルトのraspbianではインストールされていないので、
sudo apt-get install i2c-tools
でインストールします。
すると、以下のコマンドがインストールされます。
すると、以下のコマンドがインストールされます。
/usr/sbin/i2cdetect /usr/sbin/i2cget /usr/sbin/i2c-stub-from-dump /usr/sbin/i2cdump /usr/sbin/i2cset
これらのコマンドで、i2cデバイスを制御することができます。
とはいえ、i2cデバイスごとのドライバが必要にはなりますが。
おなじみのOLED、SSD1306のI2C版を接続してみました。結線は下図の通りです。
とはいえ、i2cデバイスごとのドライバが必要にはなりますが。
おなじみのOLED、SSD1306のI2C版を接続してみました。結線は下図の通りです。
デバイスの検索は
i2cdetect -a 1
で行えます。1はI2Cバス番号です。
Raspberry Piでは、ピンヘッダ(ピン3、ピン5)で利用できるのはI2C1ですので、1を指定しています。
SSD1306 OLEDを接続した状態で実行すると、以下のようにアドレス「3C」にデバイスがあることが表示されます。
このアドレスは、製品によって異なる場合があるようです。
Raspberry Piでは、ピンヘッダ(ピン3、ピン5)で利用できるのはI2C1ですので、1を指定しています。
SSD1306 OLEDを接続した状態で実行すると、以下のようにアドレス「3C」にデバイスがあることが表示されます。
このアドレスは、製品によって異なる場合があるようです。
このOLEDへコマンドを送るには、i2csetを使います。
ちょっと長いですが、こちらのサンプルを借用して、I2Cバス番号とデバイスアドレスだけ書き換えたシェルスクリプトを作ってみました。
ちょっと長いですが、こちらのサンプルを借用して、I2Cバス番号とデバイスアドレスだけ書き換えたシェルスクリプトを作ってみました。
実行すると、こんな感じでOLEDに表示されます。
0 件のコメント:
コメントを投稿