Raspberry Pi4 でLチカしてみた (Python編)

ラズパイの入門とも言われる、LEDの制御、通称”Lチカ”。
Pythonを使って、Raspberry Pi 4で行った。

#準備するもの
- Raspberry Pi 4 Model B
- ブレッドボード(1台)
- ジャンパー線　オスーオス(4本)
- ジャンパー線　オスーメス(5本)
- 330Ω の抵抗(4つ)
- LED（4個）

#1.LED1個を光らせる
ラズパイがいわば電池の役割を果すので、プログラムをしなくてもLEDを点灯させられます。
####配線
1.ジャンパー線のオスーメスケーブルを”GPIO”の**<font color=deepskyblue> 1番ピン</font>** (左の上から1番目)につなげる。
2.ブレッドボードに反対側を差し込む。
3.抵抗の片足をジャンパー線と同じ横列に差し込む。
4.LEDの＋側を、抵抗の反対の足と同じ横列に差し込む。
　※ LEDでは、**足が長い方が" ＋ "**、短い方は" - "です。
　　注意してください。
5.別のジャンパー線のオスーメスケーブルをLEDの"-"と同じ横列に差し込む。
6.反対側は”GPIO”の**<font color=Green> 6番ピン </font>**(右の上から3番目）につなげる。

このような感じで配線します。
![IMG_3800.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/b639201d-4acf-500a-008d-e435e93192ba.jpeg)

#2.LED1個でLチカ
####配線
上記1の配線を少し変ええるだけでできます。

”GPIO”の1番ピンにつながっていたジャンパー線を、**<font color=Red>11番ピン</font>** (左の上から6番目）につなぎ直します。もう1本のジャンパー線はそのままにします。

このような感じで配線します。
![IMG_3797.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/eff3d207-bbee-112e-ebad-3495a3af1eda.jpeg)

####プログラム
ラズパイ4では以下のwgetをしないと、LEDを点滅できません。

```
$ wget https://project-downloads.drogon.net/wiringpi-latest.deb　
$ sudo dpkg -i wiringpi-latest.deb　#自動的に出るので" EnterKey "を押す
```

できたら次に…

```
$ gpio readall
```
以下のようなGPIO"の各ピンの情報が出れば準備完了です。
<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/da3cf2da-cce7-1893-ebbd-99a513ee4c42.png">

まずは手動制御でLチカさせてみましょう。

```
$ gpio -g mode 4 out　#1回LEDが消える
$ gpio -g write 4 1　#点灯
$ gpio -g write 4 0　#消灯
```

次に自動で点滅させます。

```

$ sudo nano led1.py　#新しいテキストを作成
```

その中に、以下を記入

```python:led1.py

#LED1個でLチカ

import RPi.GPIO as GPIO
import time

PNO = 17 # 抵抗に繋いだ側の、GPIOポート番号

GPIO.setmode(GPIO.BCM)
GPIO.setup(PNO, GPIO.OUT)

for i in range(15):
    GPIO.output(PNO, GPIO.HIGH) # 点灯
    time.sleep(0.4)
    GPIO.output(PNO, GPIO.LOW) # 消灯
    time.sleep(0.4)

GPIO.cleanup()
```
" control " + " X "を押下、" y "を押してEnterで保存完了です。

" for i in range(　): "の"range"には、点滅させる回数を入力します。
" time.sleep(　) "では、点灯時間、消灯時間を入力できます。
例として、上のテキストでは、15回点滅し、0.4秒点灯、0.4秒消灯します。

また、" HIGH "の時は点灯し、" LOW "の時に消灯します。
※ ピン番号とポート番号は別なのでご注意を。

```
$ python led1.py
```

で実行します。

#####コマンドの豆知識

```
$ sudo nano ファイル名　#新規テキスト作成や編集をする時
$ nano ファイル名　#テキストを見るだけの時
$ cp コピーするファイル名 コピーしたファイル名　#ファイルのコピー
$ rm ファイル名　# ファイルの削除
$ python ファイル名　#ファイルのプログラム等を実行
```

#3.LED2個でLチカ
上記2の配線に、もう1つLEDを追加させて、LEDを交互に点滅させます。
###配線
1.6番ピンに差し込んでいるジャンパー線の反対側をブレッドボードのマイナスレーンに差し込む。
2.抵抗、LEDを上記1と同じようにもう1セット差し込む。
3.ジャンパー線のオスーメスケーブルを”GPIO”の**<font color=Orange> 13番ピン</font>** (左の上から7番目)につなげる。
  反対側をブレッドボードに差し込む。
4.それぞれジャンパー線のオスーオスケーブルをLEDの"-"と同じ横列に差し込む。
　 反対側はマイナスレーンに差し込む。

このような感じで配線します。
![IMG_3796.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/5d39dc36-2157-a53b-8b19-e037f21f8f5e.jpeg)


###プログラム

```

$ sudo nano led2.py
```

```python:led2.py
#LED2個でLチカ

import RPi.GPIO as GPIO
import time, sys

GPIO.setmode(GPIO.BCM)

PORT_L = 17
PORT_R = 27
GPIO.setup(PORT_L, GPIO.OUT) 
GPIO.setup(PORT_R, GPIO.OUT)

while True:
    try:
        GPIO.output(PORT_L, GPIO.HIGH) # 左点灯
        GPIO.output(PORT_R, GPIO.LOW)
        time.sleep(0.4)
        GPIO.output(PORT_L, GPIO.LOW)  # 右消灯
        GPIO.output(PORT_R, GPIO.HIGH)
        time.sleep(0.4)
    except KeyboardInterrupt:
        GPIO.cleanup()
        sys.exit()
```

ファイルを保存して・・・

```
$ python led2.py
```

で実行します。

このテキストでは回数を決めずにLチカをさせているので、" control " + " C "で終了させます。

#4.LED4個でLチカ
順番に光って を繰り返すLチカをします。
###配線
上記3の配線に、抵抗とLED、ジャンパー線を増やします。

1.抵抗、LEDを上記1と同じようにもう2セット差し込む。
2.ジャンパー線のオスーメスケーブルを”GPIO”の**<font color=Purple> 15番ピン</font>** (左の上から8番目)につなげる。
　反対側をブレッドボードに差し込む。(3個目のLEDへ)
3.”GPIO”の**<font color=Brown> 19番ピン</font>** (左の上から10番目)にジャンパー線のオスーメスケーブルをつなげる。
　反対側をブレッドボードに差し込む。(4個目のLEDへ)
4.それぞれジャンパー線のオスーオスケーブルをLEDの" - "と同じ横列に差し込む。
　反対側はマイナスレーンに差し込む。

このような感じで配線します。
![IMG_3794.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/e7d37154-1ce8-2527-d968-e41650aadf69.jpeg)

###プログラム

```

$ sudo nano led4.py
```

```python:led4.py
#LED4個でLチカ

import RPi.GPIO as GPIO
import time, sys

GPIO.setmode(GPIO.BCM)
ports = [17,27,22,10];
for i in ports:
  GPIO.setup(i, GPIO.OUT)
  GPIO.output(i, GPIO.HIGH)

def led_on(no):
    for i, port in enumerate(ports):
        if no == i:
            v = GPIO.HIGH
        else:
            v = GPIO.LOW
        GPIO.output(port, v)

while True:
    try:
        for i in range(0, 4):
            led_on(i)
            time.sleep(0.2)
        for i in range(3, -1, -1):
            led_on(i)
            time.sleep(0.2)
    except KeyboardInterrupt:
        GPIO.cleanup()
        sys.exit()
```


ファイルを保存して・・・

```
$ python led4.py
```

で実行します。
上記3と同じように" control " + " C "で終了させてください。

#応用
下記の記事にて、応用として信号機の動きを再現したプログラムを載せています。
ぜひ、トライしていただければ嬉しいです。
[ラズパイ4で信号機もどきを作ってみた (Python編)](https://qiita.com/umet787X/items/7e9f8f6b39003308122c)

#参考図書
クジラ飛行机 著
[「やさしくはじめるラズベリー・パイ 電子工作でガジェット＆簡易ロボットを作ってみよう」](https://www.amazon.co.jp/gp/product/B0721WG731/ref=dbs_a_def_rwt_hsch_vapi_tkin_p1_i1)
ーマイナビ出版

※ 本記事では上記の図書を参考にRaspberry Pi 4版に改良して使わさせて頂いています。