Raspberry Pi #2 – GPIO və LED

Ötən məqalədə Raspberry Pi mini-kompüterinə giriş verdik və ilkin konfiqurasiyaları etdik. Bu dəfə isə RPi-ın daha praktiki tərəfləri ilə – məsələn diod lampanı (LED) proqramdan necə yandırıb-söndürə biləcəyimizlə tanış olacağıq. Məqalədə olan bütün addımları praktiki olaraq bu videomuzda da görə bilərsiniz.

Qollarımızı çırmalayıb işə qoyulmazdan əvvəl yaxşı olarki Linux ƏS-i ilə, xüsusilə də terminal pəncərəsi ilə tanış olaq. Sadə dildə desək, Terminal özü də bir proqramdır və istifadəçinin daxil etdiyi əmrləri birbaşa ƏS-nə ötürür. Windows istifadəçiləri üçün bu biraz yad görünə bilər, xüsusən də Windowsda command prompt (cmd.exe) proqramını heç vaxt işlətməmisinizsə.

Terminal əmrləri

RPi-ın ƏS-i Raspbian da Linux əsaslı olduğundan terminal proqramı (LXTerminal adlı) mövcuddur. Proqramı işə saldıqda ilkin olaraq terminalda bu yazılar peyda olur:

pi@raspberrypi ~ $

burada piraspberrypi uyğun olaraq istifadəçi adı və kompüter adını, ~ $ isə proqramın hazırda home/pi qovluğunda aktiv olduğunu göstərir.
pwd (print working directory) əmrini daxil etsək bizə hazırda terminalın aktiv olduğu qovluğu göstərəcək (/home/pi). Hazırda olduğumuz qovluqda hansı fayl, proqramların və ya qovluqların olduğunu görmək üçün isə ls (list) daxil edirik. Naviqasiya üçün isə cd (change directory) əmrindən istifadə olunur.

Terminalın aktiv olduğu qovluqda yeni qovluq (məs. Makerspace-Az adlı)  yaratmaq üçün mkdir Makerspace-Az yazıb Enter daxil edirik. Bu əmr bizə yeni qovluq yaradır və yeni qovluğa daxil olmaq üçün cd Makerspace-Az əmrini yerinə yetiririk. Bir üst qovluğa qayıtmaq üçün isə cd .. əmrini icra yetiririk.

Linuxda bəzi əmrlər sistemdə dəyişiklik etdiyindən sizdən super istifadəçi imtiyazı istəyə bilər (super user permission), bunun üçün əmrin əvvəlinə sudo (super-user-do) əlavə etməyiniz və Enter daxil etdikdən sonra istifadəçi parolunu daxil etməlisiniz. Misal üçün: sudo apt-get update və davamı olan sudo apt-get upgrade əmrləri Raspbian ƏS-ni yeniləyir (update). Terminal əmrləri haqqında ətraflı burdan oxuya bilərsiniz.

Ümumi giriş-çıxış pinləri (GPIO)

İndi isə keçək işin daha maraqlı tərəfinə. Kompüter proqramlaşdırılmasında ilk addım “Salam Dünya” (Hello World) ifadəsini çap etməkdir, aparat proqramlaşdırılmaısnda isə bunun əvəzedicisi LED lampanı yandırıb-söndürməkdir. Lampanın yanıb-sönməsi nə qədər sadə görünsədə, bizə bir çox baza biliklər öyrədir.

RPi-ın ilkin modellərində 26, yeni modellərində isə 40 pin var. İlk 26 pinin düzülüşü köhnə və yeni modəllərdə eyni olaraq qalır. Qida (+3.3 V, +5 V) və torpaqlama (GND) pinlərini çıxmaq şərtilə bütün ümumi giriş-çıxış pinlərini (General Purpose Input/Output – GPIO) proqramlamaq mümkündür.

Raspberry-Pi GPIO

Pinlərin fiziki nömrələnməsini diaqrama uyğun olaraq aşağıda göstərmişəm.

RPI pins

Bu pinlərin məqsədini (giriş/çıxış olması) və vəziyyətini (False/Low – 0 V və ya True/High – 3.3 V) birbaşa terminaldan da dəyişmək mümkündür, amma bu proses yeni başlayanlar üçün çətin olduğundan və effektiv idarəetmə mümkün olmadığından RPi həvəskarları Python proqramlaşdırma dili üçün RPi.GPIO kitabxana paketini yazıblar. Bu GPIO proqramlama işini hədsiz dərəcədə asanlaşdırır.

LED qoşulması

Proqramı yazmağa başlamazdan əvvəl gəlin LED ilə RPi arasında kabelləşməni necə aparacağımıza baxaq. RPi-ın spesifikasiyasında göstərilir ki, GPIO pinləri hər biri maksimum 16 milli-Amper (mA) cərəyan təmin edə bilər. Bundan artıq cərəyan çəkməyə çalışsaq RPi zədələyə bilərik.  Ona görə də LED-ə ardıcıl cərəyanı limitləməsi üçün müqavimət qoşmalıyıq. Bu müqavimətin qiymətini hesablamaq lazım gələcək, çünki əgər qiymət böyük olsa onda LED işə düşməyəcək, çox kiçik olduqda isə cərəyan limitini keçib RPi zədələyə bilərik.

Bunun üçün bizə Om qanunu kömək edəcək. LED lampaları işə salmaq üçün 1.8-3.5 V arası gərginlik tələb olunur və qırmızı rəngli LED-lər üçün bu göstərici ~2.0 V olur. Tipik 5 mm-lik LED-lər təxminən 10-20 mA arası cərəyan tələb edir. RPi pinlərinin maks. cərəyan limitini nəzərə alıb, 10 mA keçməsək LED-i problemsiz pinlərə bağlaya bilərik. Lakin yadınıza salın, RPi pinləri 3.3 V gərginlik verir, bu isə qırmızı LED üçün lazımından çoxdur. Cərəyan limitləyici müqavimətin əsas işi həm də gərginlik düşküsü yaradıb (3.3 V – 2.0 V = 1.3 V) LED-i qorumaqdan ibarətdir. Deməli seçməli olduğumuz müqavimət 1.3V gərginlik düşküsü yaratmalı və maksimum 10 mA cərəyan buraxmalıdır. Om qanunua görə isə Müqavimət = Gərginlik[volt] / Cərəyan şiddəti[amper] (R = V/I).

Verilənləri bu düstura daxil etsək R = 1.3V / 10 mA = 130 Om. Nəticədən belə aydın olur ki, müqaviməti 130 Omdan böyük bir rezistor seçməliyik. Geniş yayılmış müqavimət qiymətlərindən isə bu intervala yaxın 180 və 220 Omluq rezistorlardır. Əlimdə 180 olmadığı üçün 220 Omluq R işlədəcəyəm. Amma ümumi qayda olaraq, 3.3 V-luq sistemlərdə 180-330 Om arası, 5 V-luq sistemlərdə isə (məs. Arduino) 220 – 470 Om rezistor işlətsək heç bir problem yaranmaz və hər dəfə müqavimət hesablamağa ehtiyac qalmır. Ümumiləşdirmə aparsaq LED olan dövrələrdə müqaviməti asanlıqla hesablamaq üçün aşağıdakı düsturdan istifadə edə bilərik.

  • Vqida – pinlərin və ya qida blokunun gərginliyi (birbaşa qida dövrəsinə qoşulduğu halda)
  • Vled – LED-in rəngindən asılı olan düşüş gərginliyi (forward voltage drop)
  • I – nominal LED cərəyanı – işə düşməsi üçün (forward current)

Xatırladım ki verilənlərin qiyməti Volt və Amper intervalında daxil edilməlidir. Məlumat vərəqlərində LED-in isə cərəyanın göstəricisi  milli-Amper (0.001 * Amper) intervalında göstərilir və mA-i Amperə çevirmək üçün verilən rəqəmi 1000-ə bölməyiniz lazımdır (məs. 20 mA = 0.02 A). Həyatınızı biraz da rahatlaşdırmaq istəsəniz Anroid və Apple smartfonları üçün LED müqavimət hesablama proqramlarından (Anroid: LED Resistor Calculator, ElectroDroid, Apple: LED Resistor Calculator) və ya onlayn kalkulyatorlardan (keçidlər: Digikey, Linear1, LedCalc) istifadə edə bilərsiniz.

led

Qısaca LED haqqında bunu deyim ki, dövrəyə düzgün qoşmaq üçün uzun ayaqlı terminalı (anod) qida blokunun (+)müsbət potensiallı xəttinə, digər terminalı (katod) isə aşağı potensiallı xəttə (GND) qoşulur. Tərsinə qoşsanız LED işə düşməyəcək, çünki diod yalnız bir istiqamətdə cərəyan buraxır (təbii ki, dağılma gərginliyinə qədər).

İndi isə RPİ və LED-in qoşulma sxeminə baxaq. Sxemdə LED-in pini GPIO18-ə qoşulub, bu o deməkdir ki, prosessorun içinə bu pin GPIO18 olaraq adlandırılıb, amma yuxarıdakı pin diaqramına baxsaq görərik ki, bu fiziki pinlərin 12-cisidir. Proqramlama zamanı biz fiziki pin nömrələmə sxeminə istinad edəəyik, çünki GPIOxx nömrələməsi ardıcıl deyil və çaşdırıcı ola bilir, həmçinin fərqli RPi modellərində pinlər adlandırılması üst-üstə düşmədiyindən, buna görə vahid formanı saxlamaq üçün fiziki pin nömrələnməsi daha məqsədəuyğundur (yuxarıdakı diaqramda dairə içində olan nömrələr).

blink_circuit_schem

RPi LED qoşulma sxemi

Bu tip prototip dövrələr hazırlayarkən Breadboard istifadə etməyi məsləhət görürəm. Bu sadə sxemin breadboard görünüşü isə aşağıdakı kimi olacaq. Əgər breadboardla heç vaxt işləməmisinizsə qısaca deyim  ki, ən yuxarıda və aşağıda gördüyünüz qoşa horizontal sətrlər (qırmızı və göy rəngli) qida paylamaq üçün nəzərdə tutulub. Bu sətrlər boydan-boya bir-biri ilə əlaqəlidir, bunu daha aydın aşağı cərgədə olan 0 V kanalı (Ground) boyunca yaşıl kölgədən də görmək olar.  Eyni tipli kölgə ortadakı sütunlarda da var və hansı deşiklərin bir-biri ilə ortaq kanalda olduğunu göstərir. Breadboardun daxili əlaqəsini daha əyani görmək üçün bu linkə keçib baxa bilərsiniz.

RPi LED və breadbaord qoşulması

RPi LED və breadbaord qoşulması

Pythonda LED yandırıb-söndürmə (Blink LED)

İndi isə terminaldan sadə bir Python proqramı yazıb LED-i idarə edə bilərik. Terminalda proqram yazmaq üçün terminalın daxilində açılan Nano adlı mətn redaktorundan istifadə edəcəm. Belə həm daha sürətli olur,  həm də RPi-i monitorsuz işlədən zaman da uzaqdan başqa kompüterlə SSH protokolu ilə bağlandıqda (bu barədə növbəti yazıda) terminala giriş etdiyimizdən (əksər hallarda) birbaşa terminalda proqram mətnini yazmaq daha məqsədəuyğun olar. Mətn redaktorunu işə salmaq üçün sudo nano gpio.py əmrini daxil edirik. Bu zaman əgər hazırda olduğumuz qovluqda gpio.py adlı fayl yoxdursa nano bunu bizim üçün yaradacaq. Mətn redaktorunda aşağıdakı sadə proqramı daxil edirik. Copy-Paste etməyin, çünki Python ‘ ‘ – boşluq işarəsinə həssas dildi, yəni əmr olan sətrdə əlavə boşluq qoyulsa proqramın icrası dəyişə bilər. Ona görə də çalışın proqramın hər bir sətrini özünüz daxil edəsiniz.  # (diyez) işarəsi ilə başlayan və ya sonra gələn sətrlər şərhdir (komment) və sadəcə izah xarakteri daşıyır, onlari proqrama yazmaya bilərsiniz, çünki proqramın gedişinə heç bir təsiri yoxdur, sadəcə oxunaqlılığı artırmaq üçündür.Proqram mətnini Nanoya daxil etdikdən sonra faylı yaddaşa yazırıq (Ctrl+O) və proqramdan çıxırıq (Ctrl+X). Bu bizi yenidən terminala qaytaracaq. Proqrami işə salmaq üçün sudo python gpio.py əmrini daxil edirik. Ümumiyyətlə istənilən Python proqramını terminaldan işə salmaq üçün python proqram_adı.py daxil etməliyik, indiki halda isə GPIO pinləri RPi pinlərinə daxil olduğu üçün (aşağı səviyyəli periferik qurğulara) sudo başlığı lazımdır.  Proqramı əgər sonlu dövrlə yazmışıqsa o zaman, proqram X dəfə (indiki halda 6 dəfə) təkrar olunduqdan sonra işini bitirib terminala qayıdır. Əgər sonsuz dövrlə yazdıqda isə (while True:) proqramı özümüz klaviaturadan Ctrl+C düymə kombinasiyası ilə saxlamalıyıq.

Proqramı fayl formasında burdan yükləyə bilərsiniz.

# kitabxana elavesi
import RPi.GPIO as GPIO     # GPIO qisaltmasindan istifade et
import time                 # sleep(saniye) funksiyasi ucun

ledPin = 12		    # pin nomresi
tekrar = 6

# pin teyinati
GPIO.setwarnings(False)      # xeberdarliqlari sondur
GPIO.setmode(GPIO.BOARD)     # fiziki pin nomrelenme sxemi
GPIO.setup(ledPin, GPIO.OUT) # pin 12 cixish olaraq teyin edilir

# sonsuz/sonlu dovre
for deyishen in range(0,tekrar):
    GPIO.output(ledPin, GPIO.HIGH) # pin 12 qosh
    time.sleep(1)                  # 1 san gozle
    GPIO.output(ledPin, GPIO.LOW)  # pin 12 sondur
    time.sleep(1)

GPIO.cleanup()     # pinlerin veziyyetini sifirla
print "Ok"

# Proqrami yarida saxlamaq ucun Ctrl+C

Bu proqramın icrasını qısa şəkildə komment olaraq proqramın sətrləri arasında və daha geniş şəkildə isə aşağıdakı videoda qeyd etmişəm.  Sadəcə bir faktı qeyd edim ki, dayanıqlılıq baxımdan bu proqram məqsədə uyğun deyil, sadəcə minimal kod yazmaqla GPIO pinlərini necə idarə edəcəyinizi göstərir. Əgər proqramın icrası zamanı nəsə düz getməsə, proqram yarıda saxlanılsa, bu zaman pinlərin vəziyyəti proqram dayandırılan zaman necə idisə, elə də qalacaq (GPIO.cleanup() funksiyası icra olunmayacaq). Bu isə müəyyən fəsadlara gətirib çıxara bilər, məsələn robot idarə edirsinizsə, hansısa pin qoşulu qalar və ya LED yanılı qalacaq. Bunu aradan qaldırmaq üçün Pythonda istisnalardan (Exceptions) istifadə etməliyik. Exception proqram yarıda saxlanıldıqda və ya icrası  səhvə uğradıqda proqramdan təmiz çıxmağımızı təmin edir. Try blokunda proqramın əsas icraçı dövrü mətni yazılır, digər Except və Finally bloklarında isə istisnaların növünə uyğun əmrlər icra edilib, proqram bağlanılır. Blink proqramın təkmilləşdirilmiş versiyasını aşağıda yazmışam və fayl formatında isə burdan yükləyə bilərsiniz.

# GPIO 2 proqrami, daha yaxshi ishleyen

# kitabxana elavesi
import RPi.GPIO as GPIO    # GPIO qisaltmasindan istifade et
import time 		   # sleep(saniye) funksiyasi ucun

# pin nomresi
ledPin = 12
tekrar = 6

# Funksiya teyinati
def blink(pin):
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(1)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(1)
    return

# pin teyinati
saygac = 0
GPIO.setwarnings(False)        # xeberdarliqlari sondur
GPIO.setmode(GPIO.BOARD)       # fiziki pin nomrelenme sxemi
GPIO.setup(ledPin, GPIO.OUT)   # pin 12 cixish olaraq teyin edilir

# sonsuz/sonlu dovre - try, except bloku ile
try:
    while True:
        blink(ledPin)
        saygac = saygac + 1
        print saygac

except KeyboardInterrupt:
    print "Proqram saxlanildi!" 

finally:
    GPIO.cleanup()              # pinlerin veziyyetini sifirla
    print "Pinler sifirlandi"

# Proqrami yarida saxlamaq ucun Ctrl+C

Növbəti RPi yazısında görüşənədək, sağolun.

PaylaşShare on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Email this to someonePin on PinterestShare on RedditShare on TumblrDigg this

Comments

comments

You may also like...

Rəy bildir