アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

ラズパイ LED点灯まとめ

ラズパイでLED点灯、点滅ができたので整理しておく。こんな簡単なことで…と言いながら意外とつまずいたところがあるので。

f:id:game-allergy:20210316161328j:plain

まとめ

◆ラズパイゼロにヘッダーピン取り付け
はんだ付け面倒だった。

◆ラズパイゼロ、ブレッドボードに接続
LED・・・1こ
抵抗(100Ω)・・・1こ


◆回路設計(事前計算)

電源:3.3v
接続:直列(●電源-▼LED-▼抵抗)
GPIO出力電流:10mA(最大)
LED順電圧(Vf):1.9~2.4v…2vと仮定

・電圧計算
接続:直列(●電源(3.3)-▼LED(2)-▼抵抗(1.3))

オームの法則
V(電圧)=R(抵抗)×I(電流)

・必要な抵抗値計算
R=V/I
R=1.3/(10/1000)mA=1.3/0.01=130
R=130Ω

・使用する抵抗・・・100Ωが最適と判断

・抵抗100Ωの電流を算出
V=RI
I=V/R
I=1.3/100=0.013(A)=13mA

・GPIO出力電流10mA≒13mA・・・許容範囲


◆ラズパイゼロ起動
◆cmd起動、SSH接続

◆点滅プログラム作成(python
※今回はnanoで作成

sudo nano led_on.py
(led_on.pyと命名して作成画面へ。led_blinkのほうが良かったね…)

これでファイル作成すると、/home/pi直下に作成されるので、フルパスは/home/pi/led_on.pyになる。
※面倒な人はwindows上で別途作成してから、WinSCPなどで直接好きなフォルダへアップしたらいいと思う

◆実行スクリプト/python

※実行スクリプトはPC環境が読みやすい。スマホは読みずらい。

#============================================================================
#【内容】LEDの点滅
#【備考】1秒間点灯、1秒間消灯、繰り返し
#【備考】停止したい場合は、ctrl+Cで。
#【実行】$python3 /home/pi/led_on.py・・・「$実行スクリプト 実行するファイルのフルパス」
#============================================================================

#「#!」はShebang(シバンまたはシェバン)Unix系システム、ファイルに書かれたプログラム文をどうやって実行するか指定
#! /usr/bin/env python3

#ライブラリのインポート/GPIO
import Rpi.GPIO as GPIO

#ライブラリのインポート/time
import time

#GPIO端子配列指定は、①Broadcomチップ準拠、②ボード上端子番号、の2種類
#今回はBroadcomチップ準拠形式。ボード上端子指定の場合はGPIO.setmode(GPIO.BOARD)
GPIO.setmode(GPIO.BCM)

#GPIOの設定/4番ピンを出力とする
GPIO.setup(4,GPIO.OUT)

#無限ループ
while True:
	
	#4番ピン出力に電気を流す
	GPIO.output(4,HIGH)

	#1秒間待機
	time.sleep(1)

	#4番ピン出力に電気を流さない
	GPIO.output(4,LOW)

	#1秒間待機
	time.sleep(1)

"""
・注意:念のため
・インデントに関しては、タブとスペースが混在しないように。
・while True:の「True」が「true」だとエラー

・Raspberry OS: ModuleNotFoundError: No module named 'RPi'
・Re: Raspberry OS: ModuleNotFoundError: No module named 'RPi'と出たら、モジュールが入ってないので、インストール
・sudo apt-get update && sudo apt-get install python-rpi.gpio python3-rpi.gpio
・理由:OSによって入ってない場合あり
・Raspbian buster lite does not have RPi.GPIO installed for python 3, nor did stretch.
"""



◆ファイルのパーミッション
実行権限の確認
ls -l led_on.py

実行権限(Execute)を付与
sudo chmod +x led_on.py

作成してみたら動かなかったのパターンでこれが多い。
忘れずに。


◆権限について
Linuxの権限について整理

[所有者][所有グループ][そのほか]
r=read・・・モード=4
w=write・・・モード=2
x=execute・・・モード=1

下記の事例
[rwx][rwx][rwx]
→所有者、所有グループ、そのほか、の人が、read,write,executeの権限あり
→モード表現は、r=4,w=2,x=1なので、rwx=4+2+1=7
→chmod 777とかは、上記状態にすることを表している。

下記の事例
[rwx][rw-][r--]
→所有者はrwxすべて可能、所有グループは実行不可、そのほかはr読み込みのみ
→chmod 764になる


◆実行スクリプト/python


#==========================================================
#【内容】LEDライトをデューティ比によって、じわ~~~っと点灯させる
#【備考】デューティ比4ずつ変化で段々明るくなり、1秒待機して、4ずつ変化して段々暗くなる
#【備考】段々との間隔は0.05秒、つまり0.05秒に4ずつ変化
#==========================================================

#ライブラリインポート
import RPi.GPIO as GPIO
import time
import sys

#使用するポート番号
Led_pin = 4

#GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(Led_pin, GPIO.OUT)

#GPIOのPWM設定
#GPIO.PWM(ポート番号, 周波数[Hz])
Led = GPIO.PWM(Led_pin, 50)

#初期化処理
#PWM信号0%出力
Led.start(0)

#変数"bright"に0を代入
bright = 0


#無限ループ
#LEDの明るさをデューティ比で制御
#Led.ChangeDutyCycle(デューティ比)
while True:

	try:
		
		#ループ1(じわ~っと明るくする)
		#変数brightを、値=0~101まで、+4ずつ繰り返し
		for bright in range(0,101,4):

			#PWM信号出力(デューティ比は変数"bright")
			Led.ChangeDutyCycle(bright)

			#0.05秒待機
			time.sleep(0.05)

		#1秒間待機
		time.sleep(1)

		#ループ2(じわ~っと暗くする)
		for bright in range(100,-1,-4):

			#変数brightを、値=100~0まで、-4ずつ繰り返し
			Led.ChangeDutyCycle(bright)

			#0.05秒待機
			time.sleep(0.05)

		#1秒間待機
		time.sleep(1)


	#Ctrl+Cキーが押された
	except KeyboardInterrupt:

		#LED命令停止
		Led.stop()

		#GPIOの初期化
		GPIO.cleanup()

		#sys終了
		sys.exit()

"""
・TRY,EXCEPTの例外処理
・try:例外が発生するかもしれないが、実行したい処理。
・except エラー名:例外発生時に行う処理

・PWM(Pulse Width Modulation:パルス幅変調) 制御
・PWM制御,時間軸で点灯/消灯のサイクルを描いたときの点灯する時間の幅
・すなわち(サイクル一定)パルス幅を変化、全体の中での点灯時間の比率(デューティ比)を調整、照明輝度を制御する仕組
・パルス幅
・ON短い、OFF長い・・・デューティ比↓、実行電圧低い→暗くなる
・ON長い、OFF短い・・・デューティ比↑、実行電圧高い→明るくなる
・デューティ比=0で真っ暗、デューティ比=100で最大輝度
・【通電イメージ】ON,OFFが→~~~~__~~~~__だと、デューティ比が高く明るい、ON,OFFが→~~____~~____だと、デューティ比が低く暗い
"""