Objavljeno:

Upravljanje zunanjih naprav z RaspberryPi

RaspberryPi ima privzeto že montiran GPIO vmesnik (General-purpose input/output), s katerim je mogoče krmiliti zunanje naprave. V tokratnem prispevku si bomo pogledali, kako na RaspberryPi 3 preko GPIO vmesnika priključimo zunanji rele, s katerim nato preko spleta vklapljamo ali izklapljamo luči in ventilator, kar je odličen učni primer računalniške interakcije za otroke.

Poleg RaspberyPi z nameščenim operacijskim sistemom Raspbian potrebujemo še 5V rele (8-kanalnega za dobre 3 EUR dobimo na AliExpressu) in nekaj povezovalnih kablov. Pri nabavi relejev se splača biti nekoliko previden – kupiti je potrebno 5V in ne 12V (včasih pošiljatelj pošlje napačnega), kitajski releji pa so znani tudi po tem, da so včasih defektni ali pa se med transportom poškodujejo. Vsekakor pa je nakup že pripravljenega releja z vsemi ustreznimi upori, tranzistorjem in zener diodo dobra naložba, saj je v takem primeru verjetnost, da bo prišlo do poškodbe RaspberryPi-ja precej manjša kot če prej omenjene zaščite rele nima. V primeru, da rele brez dodatne elektronike priklopimo neposredno na RaspberryPi, se lahko zgodi, da RaspberryPi skurimo. Je pa res, da vedno obstaja možnost poškodbe Raspberryja, zato se tovrstnih projektov lotimo previdno in na lastno odgovornost.

Povezava RaspberryPi in releja

Za povezavo si najprej poglejmo shemo GPIO priključkov na RaspberryPi. Shema je razvidna iz spodnje slike:

Shematika GPIO priključkov na RaspberryPi3.

Shema GPIO priključkov na RaspberryPi3.

Ter  še sliko releja:

8-kanalni rele.

8-kanalni rele.

Kot je razvidno iz slike, ima rele spodaj na sredini 10 priključkov. Skrajno levi je označen z GND (nanj priključimo negativni pol), skrajno desni pa VCC (nanj priključimo pozitivni pol). Vmes so “krmilni” priključki, označeni z IN1 do IN8.

Za primere prikaza bomo na RaspberryPi priključili dve zunanji napravi – žarnico in ventilator. Naj dodamo, da je na rele mogoče priključiti naprave, ki delujejo na do 250V in potegnejo do 10A toka, torej bi na rele lahko priključili npr. pravo žarnico, TV ali celo pralni stroj. Seveda pa je v tem primeru potrebna skrajna previdnost, saj so tovrstne napetosti in tokovi že smrtno nevarni.

RapberryPi3 torej z relejem povežemo takole:

  • VCC na releju z rdečim kablom povežemo na PIN02 na RaspberryPi (5V, pozitivni pol);
  • GND na releju s črnim kablom povežemo na PIN06 (negativni pol oz. “zemlja”);
  • IN1 na releju z zelenim kablom povežemo na PIN07 (oz. GPIO04) na RaspberryPi.
  • IN2 na releju z modrim kablom na PIN03 (GPIO02) na RaspberryPi.

Končna povezava RaspberryPi z relejem zgleda takole:

Povezava RaspberryPi in releja.

Povezava RaspberryPi in releja.

Program za krmiljenje releja

Program za krmiljenje releja bomo napisali v Pythonu. Pravzaprav je program skrajno enostaven. Za začetek v ukazni vrstici s skrbniškimi pravicami zaženemo Python:

sudo python

Sedaj vpisujemo ukaze (ko ukaz vpišemo, ga zaženemo s pritiskom na Enter):

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, False)

Kratka razlaga. S prvim ukazom naložimo GPIO knjižnico. Z drugim ukazom določimo, da bomo GPIO priključke označevali s standardiziranimi številkami priključkov na matični plošči (v zgornji shemi GPIO priključkov so označeni v stolpcu Pin#). Druga možnost je, da uporabimo oznako priključkov na nivoju Broadcom čipa – v tem primeru bi uporabili ukaz GPIO.setmode(GPIO.BCM), v shemi pa bi upoštevali oznake GPIO_xx_.

S tretjim ukazom določimo, da bo priključek št. 7 deloval kot izhodni priključek. Z zadnjim ukazom pa spremenimo izhodni signal na priključku št. 7. Ko vpišemo zadnji ukaz, bi morali slišati kako rele klikne.

Rele sedaj lahko preklopimo v prejšnje stanje, in sicer z ukazom:

GPIO.output(7, True)

Če vse deluje kot je treba, Python sedaj zapustimo s Ctrl-D.

Zdaj bomo za krmiljenje GPIO priključka št. 7 napisali dva Python programa. Programa bosta praktično identična, razlika bo le v zadnji vrstici.

Prvi program poimenujemo lampon.py (z njim bomo luči prižigali):

sudo nano lampon.py

Vanj skopiramo naslednje ukaze:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, False)

Nato ustvarimo še drugi program, ki ga poimenujemo lampoff.py (z njim bomo luči ugašali):

sudo nano lampoff.py

Vanj skopiramo naslednje ukaze:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)

Programa lahko sedaj preskusimo. Ko vpišemo:

sudo nano lampon.py

… se rele vklopi. Slišimo klik, na releju se prižge lučka.

Ko pa vpišemo:

sudo nano lampoff.py

… se rele izklopi. Slišimo klik, na releju pa se lučka ugasne.

Priklop zunanje naprave na rele

Na tej točki lahko preskusimo, kako deluje upravljanje zunanje naprave.

Kot je razvidno iz zgornje slike releja, ima posamezen rele na drugi strani (zgoraj) tri izhode. Nanje lahko s pomočjo vijakov pritrdimo kable. Izhod prvega releja, ki je označen s K1 (na sliki zgoraj se nahaja skrajno levo), krmilimo preko priključka IN1 (kot smo rekli, je le-ta na RaspberryPi z zelenim kablom povezan na PIN07).

Na sredino izhoda K1 povežemo negativni pol porabnika (minus), levo ali desno pa pozitivni pol porabnika (v našem primeru bo to majhna žarnica skupaj s 3V baterijo). Če bo žarnica povezana na levi priključek, ob zagonu RaspberryPi ne bo svetila, vklopil pa jo bo ukaz GPIO.output(7, False). Če jo povežemo na desni priključek, bo njeno obnašanje ravno nasprotno.

Shema povezave releja z zunanjimi napravami je torej naslednja:

Povezava releja z zunanjo napravo.

Povezava releja z zunanjo napravo.

Na podoben način lahko sedaj na drugi kanal releja priključimo še drugo napravo (v našem primeru bo to 12V ventilator). V tem primeru moramo IN2 vhod na releju z modrim kablom povezati na PIN03 (GPIO02) na RaspberryPi, nato pa napisati dve novi Python aplikaciji, s katerima bomo namesto GPIO priključka 7 krmilili priključek 3. Na podoben način lahko povežemo še ostale kanale.

Postavitev spletne aplikacije

Za konec bomo izdelali preprosto spletno aplikacijo, s pomočjo katere bo preko spletnega brskalnika ali mobilnega telefona mogoče prižigati in ugašati lučko ter ventilator.

Na računalniku RaspberryPi najprej postavimo spletni strežnik s PHP podporo. V našem primeru smo izbrali spletni strežnik Nginx, RaspberryPi je povezan v VPN omrežje, požarni zid pa je nastavljen tako, da je spletna stran dosegljiva samo znotraj VPN omrežja. Sama postavitev spletnega strežnika, VPN povezave in ustrezno zavarovanje celotne infrastrukture sicer ni tema tega prispevka, zato o tem ne bomo podrobneje pisali, vsekakor pa je pri postavljanju spletnih aplikacij potrebno poskrbeti za varnost. Še posebej, če bomo omenjene naprave kdaj uporabili za prižiganje in ugašanje luči v stanovanju – v tem primeru nam gotovo ne bo všeč, da nam bodo luči lahko prižigali neznanci iz spleta…

Ko smo namestili spletni strežnik Nginx, se pomaknemo v podimenik /var/www/. Ta imenik vsebuje datoteke, ki so vidne preko spletnega strežnika. Za delo v njem (ustvarjanje in urejanje datotek ter imenikov) potrebujemo skrbniški dostop. Najprej ustvarimo podimenik lights:

cd /var/www
sudo mkdir lights
sudo chown www-data.www-data lights

V ta imenik najprej skopiramo zgoraj omenjeni Python datoteki. Nato v njem ustvarimo dve PHP datoteki, in sicer lampon.php in lampoff.php. Njuna vsebina je naslednja:

sudo nano lampon.php

Vanjo skopiramo:

<?php
system("echo raspberry | sudo -S python /var/www/lights/lampon.py") ;
header('Location: index.php') ;
?>

Ter še:

sudo nano lampoff.php

Vanjo pa skopiramo:

<?php
system("echo raspberry | sudo -S python /var/www/lights/lampoff.py") ;
header('Location: index.php') ;
?>

Sedaj lahko iz ukazne vrstice zaženemo vsako izmed datotek:

php lampon.php
php lampoff.php

Če vse deluje kot mora, lahko slišimo klikanje relejev oziroma vidimo prižiganje in ugašanje luči.

Omenjeni dve datoteki pokličeta vsaka ustrezno Python skripto, nato pa brskalniku naročita, naj naloži index.php datoteko. Manjka nam torej še datoteka index.php.

V tej datoteki, ki jo ustvarimo v imeniku /var/www/lights/, bodo ustrezni HTML ukazi, ki bodo omogočali klicanje prve in druge PHP skripte.

Nastavitev pravic spletnega strežnika, da lahko poganja skripte s skrbniškim dostopom

Ker želimo PHP skripte klicati preko spletnega strežnika, je potrebno nastaviti, da ima spletni strežnik Nginx, ki je član skupine www-data, pravico poganjati Python skripte s skrbniškimi pravicami. Najprej zaženemo urejevalnik pravic visudo:

sudo visudo

Na konec datoteke dodamo:

%www-data ALL=(ALL) NOPASSWD: /usr/bin/python /var/www/lights/lampon.py
%www-data ALL=(ALL) NOPASSWD: /usr/bin/python /var/www/lights/lampoff.py

S tem smo uporabniku, ki je član skupine www-data (to je spletni strežnik Nginx), dali pravico poganjati skripti lampon.py in lampoff.py (ki se nahajata na /var/www/lights/) s skrbniškimi privilegiji, ne da bi mu bilo potrebno vnesti geslo.

Priprava končne spletne strani

Zaključni korak je še izdelava glavne spletne aplikacije za krmiljenje luči. Primer preproste HTML kode, s katero v index.php pokličemo PHP skripto, ki zažene Python aplikacijo s katero preko releja prižgemo in ugasnemo luč je naslednji. Najprej ustvarimo datoteko index.php:

sudo nano index.php

V datoteko nato skopiramo spodnjo HTML kodo:

<html>
<head>
<meta charset="utf-8">
<meta name="description" content="description">
<title>Prižiganje luči z RaspberryPi</title>
</head>
<body>

<a href="lampon.php">PRIŽGI LUČ</a>
<br><a href="lampoff.php">UGASNI LUČ</a>

</body>
</html>

Mimogrede, namesto index.php bi lahko uporabili kar index.html, prav tako bi v PHP skriptah za kontrolo luči lahko nastavili drugačno pot do Python skript… z nekaj razmisleka lahko sistem precej prilagodimo svojim potrebam.

Sedaj PHP skriptam nastavimo ustrezne pravice:

sudo chown www-data.www-data *.php

In ker spletni strežnik že teče, v brskalniku zaženemo spletno stran. V našem primeru je RaspberryPi vključen v VPN omrežje, kjer ima statično določen (zasebni) IP naslov 10.10.5.100. V brskalnik vpišemo:

http://10.10.5.100/lights/index.php

In naloži se preprosta spletna stran, ki ima dve povezavi: “PRIŽGI LUČ” in “UGASNI LUČ“. S klikom nanju lahko krmilimo rele in prižigamo ter ugašamo na ta rele povezano luč.

Pa še malo šminke…

Če bomo projekt pokazali majhnim otrokom, ki ne znajo brati, je smiselno, da namesto povezav z napisi uporabimo sličice. To je še posebej uporabno če bomo spletno aplikacijo krmilili s pomočjo zaslona na dotik ali mobilnega telefona.

Apletna aplikacija za interakcijo z lučmi in ventilatorjem.

Apletna aplikacija za interakcijo z lučmi in ventilatorjem.

V našem primeru spletna aplikacija omogoča prižiganje luči in ventilatorja. Otrok to lahko stori preko mobilnega telefona ali računalnika ter tako izkusi kako zgleda računalniška interakcija z objekti fizičnega sveta. Ker krmiljenje deluje preko omrežja, je na ta način mogoče luči prižigati in ugašati iz praktično katerekoli naprave, ki je povezana v splet oz. naše VPN omrežje.

Celotna shema naprave.

Celotna shema naprave.

Nekoliko starejši otroci pa se lahko lotijo priklapljanja novih naprav ter programiranja Python in PHP skript. Ker so skripte kratke in preproste za razumeti, za to ni potrebno praktično nikakršno znanje programiranja.

Prototip končnega izdelka. Kabli so obupno neurejeni, vendar to lahko rešimo s pomočjo spajkalnika.

Prototip končnega izdelka. Kabli so obupno neurejeni, vendar to lahko rešimo s pomočjo spajkalnika.

RaspberryPi je tako lahko odličen pripomoček za spodbujanje otroške kreativnosti in inovativnosti. Hkrati pa se otroci tudi naučijo nekaj temeljnih osnov delovanja računalnika – kar je za generacijo, ki pozna samo socialna omrežja in računalniške igrice še kako pomembno. In če damo njihovi domišljiji prosto pot, nas njihove ideje in izdelki znajo še kako presenetiti…

Kategorije: Informacijska tehnologija, Odprta koda
Ključne besede: Raspberry Pi