مقدمه
در این آموزش، شما با پایه های ورودی و خروجی برد رزبری پای آشنا می شوید و یاد می گیرید که چگونه آن ها را با زبان python3 و کتابخانه ی Gpiozero و Rpi.GPIO کنترل کنید.
آنچه در این آموزش یاد می گیرید
- آشنایی با پایه های GPIO
- نصب کتابخانه های GPIZero و GPIO
- کنترل LED، کلید، بارگراف، RGB LED و LDR
معرفی پایه های GPIO رزبری پای
این پایه ها قابلیت های مختلفی دارند:
- PWM (pulse-width modulation)
- Software PWM available on all pins
- Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19
- SPI
- SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)
- SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)
- I2C
- Data: (GPIO2); Clock (GPIO3)
- EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)
- Serial
- TX (GPIO14); RX (GPIO15)
کتابخانه ی Gpiozero با پایتون
نکته
در این کتابخانه برای قطعات مختلف کلاس تعریف شده است . هر کلاس نیز متد های متنوعی ای دارد. در این آموزش نیاز به آشنایی با مباحث شی گرایی (مثل کلاس، متد و…) ندارید، با این حال برای درک بهتر برنامه نویسی توصیه می شود برنامه نویسی شی گرا (Object oriented programming) را یاد بگیرید.
استفاده از کتابخانه Gpiozero
این کتابخانه به صورت پیش فرض روی سیستم عامل رزبین (Raspbian) موجود است و نیازی به نصب آن ندارید.
اگر سیستم عامل شما رزبین نیست، با دستورات زیر می توانید این کتابخانه را نصب کنید:
پایتون 3: sudo pip3 install gpiozero
پایتون 2: sudo pip install gpiozero
برای استفاده از این کتابخانه کافیست آن را به محیط برنامه نویسی پایتون import کنید.
روش اول(پیشنهادی): from gpiozero import [name of class]
روش دوم: import gpiozero
دستورات پایه
بعد از import کردن کتابخانه، می توانید از دستورات تعریف شده در آن استفاده کنید.
دستورات مرتبط با LED:
- تعریف پایه ای که LED به آن متصل شده است:
led = LED(# of pin)
- روشن کردن:
on()
- خاموش کردن:
off()
- تغییر وضعیت*:
toggle()
- چشمک زدن:
blink()
*عوض کردن وضعیت: اگر روشن باشد خاموش و اگر خاموش باشد، روشن می شود.
دستورات مرتبط با کلید:
button = Button(# of a pin)
:تعریف پایه ای که کلید به آن متصل شده است:wait_for_press ()
: صبر می کند تا کلید فشرده شود و سپس دستورات بعدی را انجام میدهدwait_for_release ()
: صبر می کند تا کلید رها شود و سپس دستورات بعدی را انجام می دهدis_pressed
: اگر کلید فشرده شده باشد مقدار True و در غیر این صورت False را برمی گرداندwhen_pressed
: وقتی کلید فشرده شود، عملی که برای آن تعریف شده را انجام می دهد.
when_released
:وقتی کلید رها شود، عملی که برای آن تعریف شده را انجام می دهد.
دستورات مرتبط با بارگراف:
graph = LEDBarGraph(# of pins)
:تعریف پایه هایی که بارگراف به آن ها متصل شده است.
graph.value = value
: روشن کردن تعدادی از LED ها
دستورات مرتبط با بازر
buzzer = Buzzer (# of a pin)
: تعریف پایه ای که بازر به آن متصل شده است:- روشن کردن:
on()
- خاموش کردن:
off()
- تغییر وضعیت:
toggle()
دستورات مرتبط با RGB LED:
led = RGBLED(red=#, green=#, blue=#)
: تعریف پایه هایی که RGB به آن ها متصل شده است:led.red = value
: روشن کردن رنگ قرمز:led.green = value
: روشن کردن رنگ سبزled.blue = valu
: روشن کردن رنگ آبیon()
: روشن کردن تمام رنگ هاoff()
: خاموش کردن تمام رنگ هاtoggle()
: تغییر وضعیت
دستورات مرتبط با LDR:
sensor = LightSensor(# of a pin)
: تعریف پایه ای که سنسور شدت نور به آن متصل شده استwait_for_dark ()
: صبر می کند تا محیط تاریک شود و سپس دستورات بعدی را انجام می دهدwait_for_light ()
: صبر می کند تا محیط روشن شود و سپس دستورات بعدی را انجام می دهدlight_detected
: وقتی محیط تاریک باشد، عملی که برای آن تعریف شده را انجام می دهدwhen_dark
: وقتی محیط تاریک باشد، عملی که برای آن تعریف شده را انجام می دهدwhen_light
: وقتی محیط روشن باشد ، عملی که برای آن تعریف شده را انجام می دهد
برای اطلاعات بیشتر راجع به این کتابخانه، به این آدرس مراجعه کنید.
کتابخانه ی RPi.GPIO با پایتون
یکی دیگر از کتابخانه های مشهور در راه اندازی پایه های ورودی و خروجی، کتابخانه ی RPi.GPIO است. از این کتابخانه نیز می توانید در برنامه نویسی به زبان پایتون استفاده کنید.
نحوه ی استفاده از RPi.GPIO
import RPi.GPIO
دستورات پایه
GPIO.setmode(GPIO.BCM)
: استفاده از شماره ی BCM پایه هاGPIO.setup(# of pin, GPIO.IN)
: تعریف پایه به عنوان ورودیGPIO.setup(# of pin, GPIO.OUT)
: تعریف پایه به عنوان خروجیGPIO.setup(# of pin, GPIO.OUT, initial=GPIO.HIGH
: مقدار دهی اولیه به خروجی
GPIO.input(# of pin)
:خواندن مقدار پایه ی ورودیGPIO.output(# of pin, state)
:مقدار دهی به پایه ی خروجی
نکته
GPIO.setmode(GPIO.BCM)
مثال ها
LED
سیم بندی برای اتصال LED به GPIO17 از مقاومت استفاده کنید.کد(Gpiozero)
from gpiozero import LED
from time import sleep
red = LED(17)
while True:
red.on() #turn led on
sleep(1) #delay for 1 second
red.off() #turn led off
sleep(1):
- Turning LED on and off with RPi.GPIO
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, True)
sleep(2)
GPIO.output(17, False)
- Blinking LED w/ Gpiozero
from gpiozero import LED
from signal import pause
red = LED(17)
red.blink(2,1,5) #2second on, 1second off, 5 times blink
- Blinking LED w/ RPi.GPIO
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
while True:
GPIO.output(17, True)
sleep(1)
GPIO.output(17, False)
sleep(1)
- LED with variable brightness w/ Gpiozero
from gpiozero import PWMLED
from time import sleep
led = PWMLED(17)
while True:
led.value = 0 # off
sleep(1)
led.value = 0.2 # 20% brightness
sleep(1)
led.value = 0.4 # 40% brightness
sleep(1)
led.value = 0.6 # 60% brightness
sleep(1)
led.value = 1 # full brightness
sleep(1)
- Gpiozero (Method 2)
from gpiozero import PWMLED
from signal import pause
led = PWMLED(17)
led.pulse(1,1,3) #fade_in in 1s, fade_out in 1s, do it for 3 times
pause()
- LED with variable brightness w/ RPi.GPIO
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
p = GPIO.PWM(17, 100) # 100 is frequency
dc = 0
p.start(dc) # where dc is the duty cycle (0.0 <= dc <= 100.0)
for x in range(3):
for i in range(0, 10):
dc += 10
p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0
sleep(0.2)
for i in range(0, 10):
dc -= 10
p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0
sleep(0.2)
p.stop()
GPIO.cleanup()
کلید
کد(Gpiozero)
from gpiozero import Button
from time import sleep
button = Button(2)
while True:
if button.is_pressed:
print("Button is pressed")
sleep(0.25)
- Check if a Button is pressed w/ RPi.GPIO
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN)
while True:
if GPIO.input(2) == 0:
print("Button is pressed")
sleep(0.25)
- Run a function every time the button is pressed and released (w/ Gpiozero)
from gpiozero import Button
from signal import pause
def say_hello():
print("Hello!")
def say_goodbye():
print("Goodbye!")
button = Button(2)
button.when_pressed = say_hello
button.when_released = say_goodbye
pause()
- Shutdown Button w/ Gpiozero
By pressing and holding the button for 2 seconds, your PC will shut down.
from gpiozero import Button
from subprocess import check_call
from signal import pause
def shutdown():
print("system shutdown")
check_call(['sudo', 'poweroff'])
shutdown_btn = Button(2, hold_time=2)
shutdown_btn.when_held = shutdown
pause()
کلید + LED
سیم بندی کنترل یک LED با یک کلید.from gpiozero import LED, Button
from signal import pause
led = LED(17)
button = Button(2)
button.when_pressed = led.on
button.when_released = led.off
pause()
بارگراف
سیم بندی برخی از بارگراف ها ممکن است به مقاومت نیاز داشته باشند.کد(Gpiozero)
from gpiozero import LEDBarGraph
from time import sleep
graph = LEDBarGraph(17, 27, 22, 10, 9, 0, 11, 5, 6, 13)
graph.value = 1 # (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
sleep(1)
graph.value = 1/2 # (1, 1, 1, 1, 1, 0, 0, 0, 0, 0)
sleep(1)
graph.value = -1/2 # (0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
sleep(1)
graph.value = 2/10 # (1, 1, 0, 0, 0, 0, 0, 0, 0, 0)
sleep(1)
graph.value = -2/10 # (0, 0, 0, 0, 0, 0, 0, 0, 1, 1)
sleep(1)
graph.value = -1 # (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
sleep(1)
روشن و خاموش کردن بازر با GPIO رزبری پای
سیم بندی
کد(Gpiozero)
from gpiozero import Buzzer
from time import sleep
bz = Buzzer(17)
while True:
bz.on()
sleep(1)
bz.off()
sleep(1)
کنترل RGB LED با GPIO رزبری پای
سیم بندی
کد(Gpiozero)
from gpiozero import RGBLED
from time import sleep
led = RGBLED(red=17, green=27, blue=22)
led.red = 1 # full red
sleep(1)
led.red = 0.5 # half red
sleep(1)
led.color = (0, 1, 0) # full green
sleep(1)
led.color = (1, 0, 1) # magenta
sleep(1)
led.color = (1, 1, 0) # yellow
sleep(1)
led.color = (0, 1, 1) # cyan
sleep(1)
led.color = (1, 1, 1) # white
sleep(1)
led.color = (0, 0, 0) # off
sleep(1)
# slowly increase intensity of blue
for n in range(100):
led.blue = n/100
sleep(0.1)
کنترل LDR با GPIO رزبری پای
زمانی که محیط تاریک باشد، LED روشن و زمانی که محیط روشن باشد، LED خاموش می شود.
سیم بندی
کد(Gpiozero)
from gpiozero import LightSensor, LED
from signal import pause
sensor = LightSensor(17)
led = LED(21)
sensor.when_dark = led.on
sensor.when_light = led.off
pause()
یک گام جلوتر
- با دو کلید تعداد LED های روشن در یک بارگراف را کم و زیاد کنید. هر بار که کلید اول فشرده شد، به تعداد LED های روشن یکی اضافه شود و اگر کلید دوم فشرده شد، از تعداد LED های روشن یکی کم شود.
- با استفاده از یک سنسور حرکت (PIR) ، وجود حرکت را تشخیص دهید و درصورت وجود حرکت، با بازر یک هشدار بدهید.
Comments (6)
سلام
بسیار بسیار ممنون از شما برای این متن کاممل و عالی خیلی بدردم خورد
سلام، متشکریم.
درود بی کران
بسیار بسیار کاربردی, کامل و عالی
خیلی دنبال این مطالب گشتم همه رو یکجا اینجا پیدا کردم.
سلام، ممنون از لطف شما.
با سلام خدمت شما جناب مهندس اکبری. بسیار ممنون بابت این مقاله کامل و مفیدتون.
جهت راهنمایی دوستان می تونید برای ایمن سازی رزبری پای راهکار هایی همچون بهبود امنیت SSH، نصب firewall و … را امتحان کنید که بصورت کامل در لینک زیر قابل دسترسی می باشد.
ضمن تشکر از تمام مدیران زحمتکش کافه ربات امیدوارم برای دوستان این مقاله مفید واقع شود.
https://sasnam.ir/5-ways-to-secure-raspberry-pi/
سلام.
تشکر از شما. خوشحالیم که مفید بوده براتون.