RaspberryPiのPIN制御の基礎中の基礎

RaspberryPiのPIN制御の基本中の基本

$ pinout

これで下のような絵?が出てきます。RaspberryPi zero Wの場合のPIN番号配置です。

Description        : Raspberry Pi Zero W rev 1.1
Revision           : 9000c1
SoC                : BCM2835
RAM                : 512MB
Storage            : MicroSD
USB ports          : 1 (of which 0 USB3)
Ethernet ports     : 0 (0Mbps max. speed)
Wi-fi              : True
Bluetooth          : True
Camera ports (CSI) : 1
Display ports (DSI): 0

,--oooooooooooooooooooo---.
|  1ooooooooooooooooooo J8|
---+ PiZero W    RUN o1   c|
 sd| V1.1 +---+   TV 1o   s|
---+      |SoC|           i|
| hdmi    +---+   usb pwr |
`-|  |------------| |-| |-'

J8:
   3V3  (1) (2)  5V
 GPIO2  (3) (4)  5V
 GPIO3  (5) (6)  GND
 GPIO4  (7) (8)  GPIO14
   GND  (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
   3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
 GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
   GND (25) (26) GPIO7
 GPIO0 (27) (28) GPIO1
 GPIO5 (29) (30) GND
 GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
   GND (39) (40) GPIO21

RUN:
RUN (1)
GND (2)

TV:
COMPOSITE (1)
      GND (2)

For further information, please refer to https://pinout.xyz/

こんな感じです。SDカードのある方からのPIN配置です。


ターミナルにコマンドを1行打ち込むだけで、GPIOピンをLOW(0V)にできます。

お使いのRaspberry Pi OSのバージョンによって、使うコマンドが異なります。以下のいずれかを試してください。

1. 最新のOS(Bookworm)の場合

現在の標準コマンドです。これだけでLOW(0V)に変わります。

pinctrl set 17 dl

GPIO17 PINをLOW(0V)にするコマンド

  • ※「dl」は Drive Low(LOWにする)という意味です。
  • ※逆にHIGH(3.3V)にしたいときは pinctrl set 17 dh と打ちます。

2. 少し古いOS(Bullseyeなど)の場合

一世代前のOSでは、以下のコマンドを使います。

raspi-gpio set 17 op dl

ここで、注目!「op」で出力モードに設定し・・・Bookwormでは、その設定しなくていいの?
ということで、

$ gpio17 Low
-bash: gpio17: command not found

こう出てきます。「出力(output)」ではなく「入力(input)」モードになっているため、HIGHに固定できないというエラーです。ピンに電気を流す(HIGH / LOW を切り替える)ためには、まずピンの役割を「出力」に切り替える必要があります。

pinctrl set 17 op

17番ピンを「出力(op=Open)」モードに変更する。

pinctrl set 17 dh

そのあと、HIGH(dh=DownHigh)にする。これでOK!
この逆は

pinctrl set 17 dl

これでLOW(dl=DownLow)にします。LEDのマイナス側をGND PINに差してプラス側をGPIO17(11)に差して、上記コマンドを打つとON/OFFできます。

$ pinctrl set 17 op
$ pinctrl set 17 dh
$ pinctrl set 17 dl
$ pinctrl get 17
17: op -- -- | lo // GPIO17 = output

これ見ると、最初に「pinctrl set 17 op」で【出力モード】にして、その後に「pinctrl set 17 dh」でHighにして電気流すと、LED点灯。次に「pinctrl set 17 dl」でLowにして電気流すの止めてLED消灯です。
で最後に「pinctrl get 17」ってありますが。これはその下に「17: op — — | lo // GPIO17 = output」と出てきます。表示された結果は、「17番ピンは、いま『出力モード』になっていて、電気は『OFF(0V)』だよ」 という意味です!

それぞれの文字を、限界までわかりやすく分解して説明しますね。


17:「GPIO 17番ピンのことだよ」 という意味です。

op「出力(output)モード」 になっています。自分で電気を流したり止めたりできる状態(LEDを光らせるための状態)という意味です。

— —:特殊な設定(プルアップ・プルダウンなど)は「何も使っていないよ」という意味です。いまは気にしなくて大丈夫です。

| lo:これが一番大事な、今の状態です。「LOW(0V)」 になっています。つまり、電気は流れておらず、LEDは消えている状態です。

// GPIO17 = output「今の設定は、GPIO17番ピン=出力モードだよ」 と親切に要約してくれています。


5mm LEDの色別・基本特性目安

発光色 順方向電圧 (\(V_{F}\)) の目安定格電流 (\(I_{F}\))特徴・用途
赤・オレンジ・黄約 1.8 ~ 2.2 V20 mA比較的低い電圧で点灯。
黄緑・純緑約 2.0 ~ 2.2 V20 mA緑系は色によって電圧に幅あり。
青・青緑・白約 3.0 ~ 3.5 V20 mA電圧降下が高いため注意が必要。


じゃあ、LEDの配線プラスを5Vに差して、GPIO17(11)にマイナス差したらどのようなコマンドを打てばよいのか?

その接続方法は「吸い込み駆動(ローアクティブ)」と呼びます。
LEDを「点灯」させたいとき

pinctrl set 17 dl

LOWにすると、ピンがGNDの代わりになって電気が吸い込まれ、光ります)

LEDを「消灯」させたいとき

pinctrl set 17 dh

コードは注意してご使用ください。(HIGHにすると、電気の通り道がブロックされて消えます)


17番ピンを「入力(ip)」モードに変更する。

「入力(ip)」モードってなに?

出力(op=OutPut)が「ラズパイから電気を出す」モードだったのに対して、入力(ip=input)は「外からの電気を見張る(読み取る)」モードです。

主に、以下のようなパーツを繋ぐときに使います。

  • スイッチ・ボタン(押されたかどうかを検知する)
  • 各種センサー(人感センサー、ドアの開閉センサーなど)

となると、現在「pinctrl set 17 dl」の状態で「pinctrl set 17 op」から「pinctrl set 17 ip」に変えると?
LEDは消灯するかチョイ点灯してる状態になるかと思います。
この逆パターン。LED(+)をGPIO17に差して、LED(-)をGNDに差して

$ pinctrl set 17 ip
$ pinctrl set 17 dh
Can't set pin value, not an output
$ pinctrl set 17 dl
Can't set pin value, not an output

こうなります。両方ともに「Can’t set pin value, not an output」(ピン値を設定できません。出力ではありません。)入力モードにしているので、こうなります。

最後に、コマンド一々「pinctrl set 17 ip」とか「pinctrl set 17 op」とか打って「pinctrl set 17 dh」とか「pinctrl set 17 dl」打つの面倒・・・そんな時は

$ pinctrl set 17 op dh
$ pinctrl set 17 op dl 

と、一度に全部指示できます。最後はこれです。

NEXTは

Pythonという動物・・・
いや言語を使って、LEDを制御する。

です。

zero

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です