راهنمای کامل برنامه نویسی پایه های GPIO رزبری پای با پایتون

فهرست مطالب

مقدمه

در این آموزش، شما با پایه های ورودی و خروجی برد رزبری پای آشنا می شوید و یاد می گیرید که چگونه آن ها را با زبان python3 و کتابخانه ی Gpiozero و Rpi.GPIO کنترل کنید.

آنچه در این آموزش یاد می گیرید

معرفی پایه های GPIO رزبری پای

GPIO مخفف general-purpose input/output است. برد های رزبری پای دارای 40 پایه هستند که می توانید از آن ها برای ارتباط با دستگاه ها و قطعات دیگر استفاده کنید.
اگر سیستم عامل نصب شده روی رزبری پای شما Raspbian desktop است، با وارد کردن دستور pinout در ترمینال نیز می توانید ترتیب پایه ها را ببینید.

این پایه ها قابلیت های مختلفی دارند:

  • 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 با پایتون

این کتابخانه یک از کامل ترین کتابخانه های موجود برای کنترل پایه های ورودی و خروجی رزبری پای است که به زبان پایتون نوشته شده است. در این کتابخانه بسیاری از قطعات مثل LED، کلید، LED های بارگراف، سنسور شدت نور و… از قبل تعریف شده اند. به همین دلیل، کار با این کتابخانه بسیار آسان است و با استفاده از آن می توانید قطعات مختلف را به سادگی کنترل کنید.
نکته

در این کتابخانه برای قطعات مختلف کلاس تعریف شده است . هر کلاس نیز متد های متنوعی ای دارد. در این آموزش نیاز به آشنایی با مباحث شی گرایی (مثل کلاس، متد و…) ندارید، با این حال برای درک بهتر برنامه نویسی توصیه می شود برنامه نویسی شی گرا (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 کنید: 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):مقدار دهی به پایه ی خروجی
نکته
اگر از یک پایه به صورت همزمان در چند اسکریپت (Script) استفاده کرده باشید، در زمان اجرای کد به شما یک هشدار (Warning) داده می شود. برای غیر فعال کردن این هشدار از دستور زیر استفاده کنید. 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() 

کلید

سیم بندی کلید را به پایه 2 متصل کنید، این پایه بصورت پیشفرض pull-up می باشد.

کد(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) ، وجود حرکت را تشخیص دهید و درصورت وجود حرکت، با بازر یک هشدار بدهید.

رزبری پای 3 بخرید

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (6)

  • امیر عرفان Reply

    سلام
    بسیار بسیار ممنون از شما برای این متن کاممل و عالی خیلی بدردم خورد

    ژوئن 27, 2020 at 7:26 ب.ظ
    • مهران ملکی Reply

      سلام، متشکریم.

      جولای 3, 2021 at 9:46 ق.ظ
  • 5علی Reply

    درود بی کران

    بسیار بسیار کاربردی, کامل و عالی
    خیلی دنبال این مطالب گشتم همه رو یکجا اینجا پیدا کردم.

    جولای 2, 2021 at 11:47 ب.ظ
    • مهران ملکی Reply

      سلام، ممنون از لطف شما.

      جولای 3, 2021 at 9:46 ق.ظ
  • محمد حسنی Reply

    با سلام خدمت شما جناب مهندس اکبری. بسیار ممنون بابت این مقاله کامل و مفیدتون.
    جهت راهنمایی دوستان می تونید برای ایمن سازی رزبری پای راهکار هایی همچون بهبود امنیت SSH، نصب firewall و … را امتحان کنید که بصورت کامل در لینک زیر قابل دسترسی می باشد.
    ضمن تشکر از تمام مدیران زحمتکش کافه ربات امیدوارم برای دوستان این مقاله مفید واقع شود.
    https://sasnam.ir/5-ways-to-secure-raspberry-pi/

    نوامبر 23, 2021 at 3:55 ب.ظ
    • مهران ملکی Reply

      سلام.
      تشکر از شما. خوشحالیم که مفید بوده براتون.

      نوامبر 27, 2021 at 12:25 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.