ラズパイでLED点灯、点滅ができたので整理しておく。こんな簡単なことで…と言いながら意外とつまずいたところがあるので。
まとめ
◆ラズパイゼロにヘッダーピン取り付け
はんだ付け面倒だった。
◆ラズパイゼロ、ブレッドボードに接続
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などで直接好きなフォルダへアップしたらいいと思う
※実行スクリプトは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になる
#========================================================== #【内容】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が→~~____~~____だと、デューティ比が低く暗い """