Maturski rad “Raspberry Pi”

Napisano: 21.05.2013.
Autor: Ante Primorac
Škola: Srednja Škola Metković
Mentori: Goran Manenica i Josip Jurković


SADRŽAJ

  1. Raspberry Pi
    1. Povijest
    2. Hardware
      1. Specifikacija
    3. Software
      1. Arhitektura
      2. Operativni sustavi
    4. Zajednica
  2. Nabavka
    1. Napajanje
    2. Monitor
    3. Mrežno/Internet spajanje
    4. USB Hub
    5. Ostalo
  3. Početni koraci
    1. Spajanje
    2. Instalacija OS-a
      1. Koristeći Windows 7/XP
      2. Koristeći Mac OSX
      3. Koristeći Linux
      4. BerryBoot
    3. Podešavanje
      1. Wi-Fi
    4. Pokretanje
  4. Programiranje
    1. Wiring Pi
      1. Instalacija
      2. GPIO
      3. Funkcije
  5. Projekt: Pomagalo u komunikaciji
    1. Shema spajanja
    2. Program
    3. Primjena
  6. Literatura

1. Raspberry Pi Sadržaj

Raspberry Pi, u daljnjem tekstu RPi, je single-board(nalazi se na jednoj pločici) računalo, veličine kreditne kartice, razvijeno u Velikoj Britaniji od Raspberry Pi Foundation s namjerom promicanja osnovne računalne znanosti u školama. RPi na sebi ima Broadcom BCM2835 sustav na čipu, koji sadržava: ARM1176JZF-S 700 Mhz procesor (firmware uključuje niz “turbo” modova rada tako da korisnik može overclockati, do 1Ghz, bez utjecaja na jamstvo), VideoCore IV GPU i 256MB(Model A) RAM memorije, odnosno 512MB(Model B). Na uređaj nije ugrađen tvrdi disk niti SSD(Solid-State Drive), nego koristi SD karticu za podizanje sustava i dugotrajnu pohranu podataka. Zaklada pruža Debian i Arch Linux ARM distribucije za preuzimanje. Također ulaže za podršku Python-a kao glavnog programskog jezika, sa podrškom za BBC BASIC(preko RISC OS preslike ili “Brandy Basic” klona za Linux), C i Perl.

01

1.1. Povijest Sadržaj

2006. godine, rani koncepti RPi su temeljeni na Atmel mikrokontroleru ATmega644. Njegova shema i izgled tiskane pločice su dostupni javno. Povjerenik zaklade Eben Upton okupio je skupinu znanstvenika, nastavnika i računalnih entuzijasta da osmisle računalo koje će potaknuti djecu na učenje osnovne računalne znanosti. Računalo je inspirirano Acorn-ovim BBC Micro računalom iz 1981. Prvi ARM prototip računala je postavljen u kutiju jednake veličine kao i USB stick. S jedne strane je imao USB, a s druge HDMI priključak.

U kolovozu 2011., proizvedeno je 50 Alpha ploča. Te ploče su funkcionalno identične planiranom modelu B, ali su fizički veće za smještaj debug zaglavlja. Demonstracija je pokazala pokretanje LXDE desktop-a na Debian-u, Quake 3 na 1080p i Full HD MPEG-4 video preko HDMI. U prosincu 2011., 25 modela B Beta su sastavljeni i testirani. Raspored komponenata i izgled ploče je bio jednak kao i produkcijska ploča. Jedna greška je otkrivena u dizajnu ploče gdje su neki pinovi na CPU nisu bili uzdignuti i to je ispravljeno do prve produkcijske linije. Beta ploče su demonstrirale dizanje Linux-a, prikazivanje 1080p videa i Rightware Samurai OpenGL ES test. Tijekom prvog tjedna 2012., prvih 10 ploča su stavili na aukciju na eBay-u. Jedan korisnik je kupio i anonimno darovao muzeju The Centre for Computing History u Suffolku, Engleska. U unaprijed predviđenom lansiranju na kraju veljače 2012., web serveri zaklade su se nosili s velikim opterećenjem kojeg su uzrokovali korisnici koji su konstantno osvježavali svoj Internet preglednik kako bi što prije došli do svog primjerka RPi-a. Web serveri su pokleknuli pod opterećenjem. Prva serija od 10.000 ploča je proizvedena u Tajvanu i Kini, a poslije u VB zbog problema s carinjenjem pojedinih komponenata. Sve ploče su prodane u roku nekoliko minuta, a u rujnu 2012. prodano je 500.000. Od tada se sve RPi ploče proizvode u VB u Sony proizvodnom pogonu gdje se mjesečno proizvodi 30.000 primjeraka. Slabiji model A je u prodaji od početka 2013.

1.2. Hardware Sadržaj

Modela A dolazi s jednim USB portom i bez Ethernet kontrolera, zbog čega je jeftiniji od modela B koji dolazi s 2 USB porta i s 10/100 Ethernet kontrolerom. Iako model A nema Ethernet kontroler on se može povezati na Internet pomoću WiFi USB adaptera. Tako spojen model A je isti kao i model B s Ethernet kontrolerom, zbog toga jer je Ethernet port na modelu B zapravo tvornički ugrađen USB Ethernet adapter. Kao što je i tipično za moderna računala, USB tipkovnice i miševi su kompatibilni s RPi-em. RPi ne dolazi s real-time satom, zbog toga operativni sustav se mora spajati na poslužitelj točnog vremena ili pitati korisnika za točno vrijeme pri pokretanju. Real-time sat (kao što je DS1307) s vlastitim napajanjem može se spojiti preko I2C sučelja. Od 24. kolovoza 2012. je dostupna hardware-ska akceleracija videa za H.264 kodek. U isto vrijeme zaklada nudi licence za MPEG-2 i Microsoft VC-1 kodeke.

02

1.2.1. Specifikacija Sadržaj

Model A Model B
SoC Broadcom BCM2835 (CPU, GPU, DSP, SDRAM, i USB port)
CPU 700 Mhz ARM1176JZF-S jezgra(ARM11)
GPU Broadcom VideoCore IV
OpenGL ES 2.0 (24 GFLOPS)
1080p30 h.264/MPEG-4 AVC visoko profilni dekoder i enkoder, s licencom: MPEG-2 i VC-1
Memorija(SDRAM) 256MB (dijeli s GPU) 512MB (dijeli s GPU)
USB 2.0 portova 1 2
Video izlaz Composite RCA (PAL i NTSC), HDMI, LCD Paneli preko DSI
14 HDMI rezolucija od 640×350 do 1920×1200 plus razni PAL i NTSC standardi
Audio izlaz 3.5mm jack, HDMI, i I2S audio
Pohrana SD / MMC / SDIO utor za kartice (podržava samo 3,3V napajane kartice)
Mreža Nema 10/100 Ethernet (8P8C) USB adapter na trećem portu USB sučelja
Low-level periferija 8 x GPIO, UART, I2C bus, SPI bus s dva izbora čipa, I2S audio, +3,3V, +5V, uzemljenje
Snaga 300mA(1,5W) 700mA(3,5W)
Izvor napajanja 5V preko MicroUSB ili GPIO
Veličina 85,60mm x 53,98mm
Težina 45g
Operativni sustavi Arch Linux ARM, Debian Linux, Fedora, FreeBSD, Plan 9, Raspbian OS, RISC OS, Slackware Linux
Cijena 25$ 35$

1.3. Software Sadržaj

1.3.1. Arhitektura Sadržaj

Raspberry Pi koristi Linux kernel-baziran operativni sustav. Raspbian, Debian-baziran free operativni sustav optimiziran za RPi hardware. To je preporučeni sustav koji je objavljen u srpnju 2012. Pristup GPU se vrši preko firmware slike koju GPU učita prilikom podizanja sustava s SD kartice. Firmware slika je poznata kao binarni blob, dok su pripadajući ARM Linux driver-i u početku bili zatvoreni, ovaj dio driver-a je kasnije objavljen, međutim velik posao trenutnih driver-a obavlja close source GPU kod. Aplikacije pozivaju close source run-time biblioteke (Open Max, Open GL ES ili OpenVG) koji pak poziva open source driver unutar Linux kernela, koji onda poziva close source Videocore IV GPU driver. API ovih kernel driver-a je specifičan za ove zatvorene biblioteke. Video aplikacije koriste OpenMax, 3D aplikacije koriste Open GL ES i 2D aplikacije koriste OpenVG koji pak oboje koriste EGL. OpenMAX i EGL koriste open source kernel driver. 19. veljače 2012. RPi zaklada je objavila prvi koncept preslike SD kartice koja se mogu učitati na SD karticu za preliminarni operativni sustav. Preslika je temeljena na Debian 6.0(Squeeze), sa LXDE desktop-om i Midori Internet preglednikom i s još raznim programerskim alatima. Ova preslika se također može pokrenuti na QEMU što omogućava da se RPi emulira na različitim drugim operativnim sustavima.

1.3.2. Operativni sustavi Sadržaj

03

Linux kernel od verzije 3.7 podržava ARMv7 i ARMv8, no RPi ima ARMv6 stoga se distribucije moraju prilagođavati kako bi se mogle vrtjeti na RPi. No slijedeći modeli RPi-a bi trebali imati novije ARM-ove pa će korisnici biti manje ograničeni u pogledu operativnih sustava i programa.

Trenutno podržani operativni sustavi:

  • AROS
  • Haiku
  • Linux
  • Android
  • Android 2.3 (Gingerbread)
  • Android 4.0 (Ice Cream Sandwich)
  • Arch Linux ARM
  • R_Pi Bodhi Linux
  • Debian ARM
  • Raspbian
  • Firefox OS
  • Gentoo Linux
  • Google Chromium OS
  • PiBang Linux
  • Raspberry Pi Fedora Remix
  • Slackware ARM
  • QtonPi
  • WebOS
  • Open webOS
  • Plan 9 from Bell Labs
  • RISC OS
  • Unix
  • FreeBSD
  • NetBSD

1.4. Zajednica Sadržaj

05Jamie Ayre(FLOSS software tvrtka AdaCore) je opisao Raspberry Pi zajednicu kao najuzbudljiviji dio projekta. Bloger Russell Davis rekao je da snaga zajednice omogućava zakladi da se usredotoči na dokumentaciju i proučavanje. Zajednica razvija časopise za fanove(fanzini), kao što je The MagPi. Zajednica održava Raspberry Jam događaje po cijeloj Velikoj Britaniji i šire, na čelu s Alan O’Donohoe, glavni učitelj na ICT na Our Lady’s High School, Preston.

06

2. Nabavka Sadržaj

07Raspberry Pi je službeno dostupan kod 2 proizvođača: element14 i RS Components. Element14 za sad ne nudi dostavu u Hrvatsku, a RS Components dostavlja preko svog zastupnika za Hrvatsku, Primotronic d.o.o. Na početnu cijenu od 25$ odnosno 35$ je potrebno još nadodati PDV Velike Britanije, proviziju dobavljača, PDV Hrvatske i dostavu do vaših kućnih vrata(30kn). Te se cijena na kraju poveća do 305kn(cca 52$) odnosno 360kn(cca 62$). U paketu se dobije samo RPi ploča. Za rad vam je još potreban izvor napajanja, sd kartica, monitor, tipkovnica, miš, ethernet kabel/wifi usb adapter, usb hub, čitač sd kartica, drugo računalo, … što dodatno poskupljuje nabavku i rad s ovim računalom. Ali to još uvijek ga ostavlja dovoljno jeftinim za mnoge projekte.

2.1. Napajanje Sadržaj

08RPi koristi micro-USB priključak za vlastito napajanje. Standardni moderni mobiteli se pune preko micro-USB punjača, ali za RPi adapter mora proizvesti barem 700mA i 5V. Prije priključivanja provjerite te podatke jer može doći do oštećenja RPi-a ili on jednostavno neće raditi. Također se može koristiti USB/micro-USB kabel te napajati RPi preko drugog računala ili laptopa. RPi nema standardnu funkciju on/off kao druga računala nego je za gašenje potrebno isključiti napajanje odnosno za paljenje uključiti napajanje. To se može postići uvlačenjem/izvlačenjem micro-USB priključka ili ugradnjom sklopke, ali pri tom treba paziti da se SD kartica ili podaci na njoj ne oštete.

2.2. Monitor Sadržaj

09Za spajanje monitora na RPi postoje dvije mogućnosti: HDMI (visoka razlučivost) i Composite (niska razlučivost). HD televizori i mnogi LCD monitori se mogu priključiti koristeći HDMI kabel ili ako je potrebno jeftini DVI adapter. RPi omogućuje audio i video izlaz preko HDMI, ali ne i ulaz. Većina starijih televizora se može priključiti preko Composite(yellow to yellow kabel). PAL i NTSC TV su podržani. Treba imati na umu da je RCA izlaz kompozitni video, a ne RF, tako da se ne može izravno povezati na antenski ulaz na TV-u, mora se spojiti na (žuti)video ulaz, ili na SCART ulaz pomoću RCA SCART priključka(adapter). Kada koristite kompozitni video, audio je dostupan na 3.5mm izlazu, a može biti poslan na TV ili do pojačala. Za slanje zvuka na TV trebat će vam kabel koji se prilagođava sa 3.5mm na dvostruke(crveni i bijeli) RCA konektore. Ne preporučuje se spajanje 3,5mm priključka izravno na slušalice jer postavljanje niske impedancije opterećenja, kao što su slušalice, na stereo audio izlaz može dovesti do iskrivljenog zvuka. Ukoliko nemate HDMI ili DVI monitor/televizor onda se ne preporučuje spajanje analognog adaptera jer oni neće raditi. Da bi analogni adapter(HDMI->VGA ili DVI->VGA) radio potrebno mu je vlastito napajanje i mogućnost aktivnog konvertiranja signala, a takvi adapteri su većinom skuplji od samih HDMI monitora.

2.3. Mrežno/Internet spajanje Sadržaj

RPi, kao što je već spomenuto, omogućuje spajanje na Internet putem Ethernet kabela(Model B) ili putem USB Wi-Fi adapterom. S Ethernet kabelom sve funkcionira isto kao i s ostalim računalima tj spojite RPi i router/modem s Ethernet kabelom. Dok s USB Wi-Fi adapterom ćete morati ipak malo pripaziti, naime svi adapteri nisu kompatibilni s RPi-om. Na ovoj stranici (http://elinux.org/RPi_VerifiedPeripherals#Working_USB_Wi-Fi_Adapters) možete pronaći USB Wi-Fi adaptere koji provjereno rade s RPi-om.

2.4. USB hub Sadržaj

Kako je napajanje RPi-a relativno malo zbog toga on ne može isporučiti dovoljno snage USB periferiji. Na taj problem upada USB hub koji će vam pružiti više USB portova i mogućnost priključivanje USB periferije veće snage. No kod kupnje USB hub-a morate pripaziti da taj USB hub ima vlastito napajanje, a ne da se napaja putem RPi-a jer onda time niste dobili ništa. Također odaberite USB hub s liste onih koji provjereno rade, a lista se nalazi na ovoj stranici – http://elinux.org/RPi_VerifiedPeripherals#Working_USB_Hubs

2.5. Ostalo Sadržaj

Od ostalih stvari još će vam trebati SD kartica(preporučuje se Class 10, a lista onih koji provjereno rade je ovdje http://elinux.org/RPi_SD_cards) i čitač SD kartica kako bi ste mogli prebaciti presliku operativnog sustava na SD karticu. Za početno podešavanje će vam trebati tipkovnica(lista onih koje provjereno rade je ovdje http://elinux.org/RPi_VerifiedPeripherals#Working_USB_Keyboards). Ukoliko želite koristiti grafičko sučelje onda će vam biti potreban i računalni miš(lista onih koje provjereno rade je ovdje http://elinux.org/RPi_VerifiedPeripherals#Working_USB_Mouse_Devices).

3. Početni koraci Sadržaj

Kad smo uspješno nabavili RPi, micro-USB punjač, DVI monitor, HDMI->DVI adapter, HDMI male to male kabel, USB tipkovnicu, USB miš, čitač SD kartice i SD karticu sad možemo početi s spajanjem i instalacijom operativnog sustava.

3.1. Spajanje Sadržaj

Za početak je potrebno spojiti RPi i monitor. To ćemo uraditi tako što ćemo DVI stranu HDMI->DVI adaptera utaknuti u DVI utor u monitoru, a drugu tj. HDMI stranu ćemo utaknuti HDMI kabel, a drugi kraj HDMI kabela u HDMI utor na RPi-u. Zatim ćemo spojiti USB tipkovnicu i miš u USB utore na RPi-u. A nakon instalacije operativnog sustava na SD karticu potrebno je istu utaknuti u pripadajući utor s donje strane Rpi-a.

3.2. Instalacija OS-a Sadržaj

Prva dva koraka su jednaka za sve operativne sustave koje koristite.
1. Skinite distribuciju na vaše računalo, preporučene distribucije možete pronaći ovdje – http://raspberrypi.org/downloads. Ukoliko distribucija dolazi kao .iso slika onda je potrebno taj file samo preimenovati u .img file.
2. Potrebno je utaknuti SD karticu u čitač SD kartica i taj čitač spojiti s računalom koje će te koristiti za izradu “bootable” SD kartice.

3.2.1. Koristeći Windows 7/XP Sadržaj

3. Za izradu “bootable” SD kartice bit će vam potreban program Win32DiskImager, možete ga pronaći ovdje – http://sourceforge.net/projects/win32diskimager/ . Ako ste na Windows 7 onda će te ga trebati pokrenuti kao Administrator (Run as Administrator).
4. Pod opcijom “Image File” odaberite .img file distribucije koju ste preuzeli, a pod opcijom “Device” odaberite vašu SD karticu na koju želite zapisati tu distribuciju.
5. Zatim kliknite na “Write” i pričekajte da se radnja završi.
6. Isključite program i izvucite čitač SD kartice i SD karticu.

10

3.2.2. Koristeći Mac OSX Sadržaj

3. Pokrenite terminal
4. Pomoću komande diskutil list identificirajte disk(ne particiju) SD kartice, npr. disk4(ne disk4s1).
5. Demontirajte SD karticu s komandom: diskutil unmountDisk /dev/disk4, disk4 zamjenite s identificiranim diskom(ne particijom) SD kartice iz prethodnog koraka.
6. Pokrenite komandu sudo dd bs=1m if=image file.img of=/dev/disk4, image file.img zamijenite s vašim .img file-om, a disk4 zamijenite s identificiranim diskom(ne particijom) SD kartice iz 4. koraka. Ovo će potrajati koju minutu.
7. Pokrenite Disk Utility i izbacite(eject) SD karticu
8. Izvucite čitač SD kartice i SD karticu
9. Utaknite SD karticu u RPi

3.2.3. Koristeći Linux Sadržaj

3. Pokrenite terminal
4. Pomoću komande df -h identificirajte naziv uređaja SD kartice, npr. /dev/sdb(ne /dev/sdb1) ili /dev/mmcblk0(ne /dev/mmcblk0p1). “1” i “p1” na kraju naziva označava particiju, a mi želimo OS preko cijele SD kartice a ne samo na jednoj particiji.
5. Demontirajte SD karticu s komandom: umount /dev/sdb1, sdb1 zamjenite s identificiranim nazivom uređaja SD kartice iz prethodnog koraka uključujući particiju. Ako SD kartica ima više particija onda trebate svaku posebno demontirati.
6. Pokrenite komandu sudo dd bs=4M if=image file.img of=/dev/sdb, image file.img zamijenite s vašim .img file-om, a sdb zamijenite s identificiranim nazivom uređaja SD kartice iz 4. koraka. Ukoliko ovo ne funkcionira oprobajte zamijeniti “4M” s “1M” no to će dodatno usporiti ovu operaciju. Ovo će potrajati koju minutu.
7. Pokrenite komandu sudo sync
8. Izvucite čitač SD kartice i SD karticu
9. Utaknite SD karticu u RPi

3.2.4. BerryBoot Sadržaj

BerryBoot vam omogućava preuzimanje i instalaciju linux distribucija na RPi. Napomena: potrebna je Internet veza s RPi. Za instalaciju BerryBoota je potrebno samo otpakirati .zip file na praznu SD karticu ili preko neke od prošlih metoda. BerryBoot .zip file ili .iso/.img file možete pronaći na ovoj web stranici – http://berryterminal.com/doku.php/berryboot

11

3.3. Podešavanje Sadržaj

Pri prvom pokretanju Raspbian distribucije pokrenuti će se Raspi-config.

12

Preporučuje se da uradite:
1. expand_rootfs – ovo će proširiti root particiju preko cijele SD kartice, tako da će te moći koristiti punu veličinu
2. configure_keyboard – ovdje ćete dobiti čarobnjak za podešavanje vaše tipkovnice, po default-u je postavljen US layout, pa je potrebno promjeniti na HR layout kako bi imali hrvatske znakove
3. change_pass – promijenite lozinku korisnika “pi” koja je po default-u “raspberry”
4. change_locale i change_timezone – za podešavanje datuma i vremena
5. ssh – uključite ssh

3.3.1. Wi-Fi Sadržaj

Prvo je potrebno osvježiti sustav na najnoviju verziju. To ćemo uraditi preko dvije komande:

sudo apt-get update
sudo apt-get upgrade

Zatim ponovo pokrenite RPi preko komande sudo reboot. Sad je potrebno instalirati Wi-Fi USB modul. Ovo je različiti postupak ovisno kakav Wi-Fi USB adapter posjedujete.

Pokrenite komandu lsusb te pronađite naziv vašeg Wi-Fi USB adaptera. Zatim pokrenite slijedeću komandu sudo apt-cache search RTL818. Rezultat ove komande je:

firmware-realtek – Binary firmware for Realtek wired and wireless network adapters

Što znači da trebate preuzeti i instalirati firmware-realtek. To ćete uraditi slijedećom komandom sudo apt-get install firmware-realtek. Za podešavanje na koju ćete se Wi-Fi mrežu spojiti možete koristiti WPA supplicant program ili pokrenite slijedeću komandu:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

te uredite file ovako:

network={
ssid="SSID mreže"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
psk="WIFI lozinka"
}

Na kraju je opet potrebno ponovo pokrenuti RPi – sudo reboot.

3.4. Pokretanje Sadržaj

Nakon što se RPi ponovo pokrenuo potrebno je upisati podatke za prijavu. Po default-u to je:

korisničko ime: pi
lozinka: raspberry

Nakon prijave još uvijek smo ostali u komandnoj liniji, za pokretanje grafičkog okruženja potrebno je pokrenuti komandu startx.

4. Programiranje Sadržaj

Programirati na RPi-u nije nikakav problem. On ima grafičko sučelje, programe za pisanje programskog koda, kompajlere,… sve što vam je potrebno za programiranje. No svi mi programeri smo naviknuti na neke svoje navike. Tipa program koji koristimo za pisanje programskog koda. Da bi smo programirali s vlastitog računala na RPi potrebno je se spojiti preko FTP protokola i SSH protokola. FTP nam omogućava pregledavanje, uređivanje, dodavanje i brisanje datoteka na RPi-u. Dok nam SSH omogućava izvršavanje naredbi na RPi-u. Preporučuje se spajanje RPi-a i računala na kojem ćete programirati u lokalnu mrežu – LAN. Potrebno je saznati samo LAN adresu RPi-a, a to možete vidjeti u administratorskom panelu vašeg routera/modema ili očitate IP adresu koju RPi ispiše nakon podizanja sustava. Znači bit će vam potreban FTP i SSH klijent na vašem računalu.

4.1. Wiring Pi Sadržaj

Wiring Pi je biblioteka za pristup GPIO napisana u C programskom jeziku za BCM2835 koji se koristi na RPi. Biblioteka je objavljena pod GNU LGPLv3 licencom i može se koristiti u C i C++ programskom jeziku kao i u mnogim drugim programskim jezicima uz odgovarajući wrapper. Wiring Pi također uključuje gpio program koji se koristi preko komandne linije. On omogućuje programiranje i postavljanje GPIO pinova.

4.1.1. Instalacija Sadržaj

Kao i prije svake instalacije novih paketa i sad je potrebno osvježiti sustav na najnoviju verziju:

sudo apt-get update
sudo apt-get upgrade

Za preuzimanje Wiring Pi biblioteke koristiti ćemo GIT, njega instaliramo pomoću slijedeće komande sudo apt-get install git-core. Za preuzimanje Wiring Pi koristeći GIT potrebno je pokrenuti komandu git clone git://git.dragon.net/wiringPi. Za osvježavanje biblioteke na najnoviju verziju je potrebno ući u njezin direktorij cd wiringPi te pokrenuti slijedeću komandu git pull origin. Nakon što ste preuzeli ili osvježili na najnoviju verziju potrebno je ući u direktorij biblioteke cd ~/wiringPi te zatim pokrenuti build file ./build. Ta komanda će kompajlirati i instalirati wiring Pi umjesto vas.

4.1.2. GPIO Sadržaj

Wiring Pi nudi svoju shemu numeriranja pinova koja je različita od BCM GPIO sheme numeriranja pinova. To omogućuje neovisnost programa o hardware-skim izmjenama kod novih verzija RPi-a.

13
14

4.1.3. Funkcije Sadržaj

Ove funkcije rade direktno na RPi i na vanjskim GPIO modulima, međutim svi moduli ne podržavaju sve funkcije, a i RPi nema na sebi analogni hardware.

wiringPiSetup(void);
Ova funckija se koristi za incijalizaciju Wiring Pi biblioteke. Potrebno ju je pokretati s root privilegijama.

wiringPiSetupGpio(void);
Ova funkcija je identična wiringPiSetup funkciji, samo što dopušta korištenje Broadcom GPIO pin numeriranje direktno. Kao i za funkciju prije i za ovu funkciju su potrebne root privilegije. Treba napomenuti da su neki pinovi rezličiti od revizije 1 do revizije 2.

wiringPiSetupPhys(void);
Identična kao i funkcija prije, samo što dopušta programu da koristi fizičke brojeve pinova, ali samo na P1 konektoru. Kao i za funkciju prije i za ovu funkciju su potrebne root privilegije.

wiringPiSetupSys(void);
Ova funkcija se koristi za incijalizaciju wiringPi biblioteke ali koristi /sys/class/gpio interfejs a ne direktni pristup hardware-u. Zbog toga ova funkcija može biti pozvana bez root privilegija. Numeriranje pinova je po nativnom Broadcom GPIO numeriranju, isto kao i kod wiringPiSetupGpio funkcije. Prije pokretanja programa potrebno je podesiti pinove preko gpio programa ili koristiti system funkciju u programu kako bi pozvali gpio program.

PRIJE KORIŠTENJA BILO KOJE OD FUNKCIJA POTREBNO JE INCIJALIZIRATI wiringPi BIBLIOTEKU S NEKOM OD OVE 4 FUNKCIJE.

void pinMode(int pin, int mode);
Ova funkcija postavlja INPUT, OUTPUT, PWM_OUTPUT ili GPIO_CLOCK mod rada na pin. Samo pin 1(BCM_GPIO 18) podržava PWM output i samo pin 7(BCM_GPIO 4) podržava CLOCK output mod. Funkcija nema efekta u Sys modu. Kod tog moda rada je potrebno promjeniti mod pina preko gpio programa prije nego pokrenete vaš program.

void pullUpDnControl(int pin, int pud);
Ova funkcija postavlja pull-up ili pull-down mod otpornika na zadanom pinu, koji treba biti postavljen kao ulaz(input). Parametar pud može biti: PUD_OFF(ni pull-up niti pull-down mod), PUD_DOWN(pull k uzemljenju) ili PULL_UP(pull na 3.3V). Unutarnji pull up/down otpornici imaju vrijednost od otprilike 50kΩ. Funkcija nema efekta u Sys modu. Kod tog moda rada je potrebno aktivirati pull-up/pull-down mod pina preko gpio programa prije nego pokrenete vaš program.

void digitalWrite(int pin, int value);
Postavlja HIGH(1) ili LOW(0) na zadani pin koji prethodno mora biti postavljen kao izlaz(output). Svaki broj osim nule će biti shvaćen kao HIGH, a samo 0 predstavlja LOW.

void pwmWrite(int pin, int value);
Zapisuje vrijednost u PWM registar na zadanom pinu. Pin može samo biti postavljen na pin 1 jer je on jedini PWM pin na RPi. Vrijednost paramtera value može biti od 0 do 1024. Ova funkcija također nema efekta u Sys modu.

int digitalRead(int pin);
Ova funkcija vraća vrijednost zadanog pina. Ona može biti HIGH(1) ili LOW(0).

analogRead(int pin);
Ova funkcija vraća očitanu vrijednost s zadanog analog pina. Potrebno je prije korištenja ove funkcije registrirati dodatni analogni modul.

analogWrite(int pin, int value);
Ova funkcija zapisuje danu vrijednost na zadani analog pin. Potrebno je prije korištenja ove funkcije registrirati dodatni analogni modul.

unsigned int millis(void);
Funkcija vraća broj koji predstavlja broj milisekunda od kad je vaš program pozvao jednu od wiringPiSetup funkcija. Taj broj je unsigned 32 bitni broj koji istječe nakon 49 dana.

unsigned int micros(void);
Funkcija vraća broj koji predstavlja broj mikrosekunda od kad je vaš program pozvao jednu od wiringPiSetup funkcija. Taj broj je unsignned 32 bitni broj koji istječe nakon otprilike 71 minutu.

void delay(unsigned int howLong);
Ovo prouzrokuje pauziranje programa na howLong milisekundi. Ovisno o multi-tasking prirodi ponašanja na Linuxu to može trajati i duže. Maksimalna vrijednost je unsigned 32 bitni integer ili otprilike 49 dana.

void delayMicroseconds(unsigned int howLong);
Jednako kao i funkcija prije samo nisi milisekunde nego mikrosekunde i maksimalna vrijednost je otprilike 71 minutu. Ovu funkciju je potrebno pažljivo koristiti jer može usporiti performance sustava. Za vrijednosti ispod 100 mikrosekundi koristi se hard-coded petlja koja konstantno osvježava vrijeme sustava, a za vrijednosti veće od 100 mikrosekundi se koristi nanosleep funkcija.

int lcdInit(int rows, int cols, int bits, int rs, int strb, int d0, int d1, int d2, int d3, int d4, int d5, int d6, int d7);
Ovo je glavna funkcija za incijalizaciju LCD display-a i mora biti pozvana prije korištenja bilo koje druge LCD funkcije. Rows i cols su redci i stupci display-a (npr 2, 16 ili 4, 20). Bits je broj širine bitova na display-u. Rs i strb predstavljaju brojeve pinova koji su priključeni na RS pin i Strobe(E) pin display-a. Paramteri d0 do d7 su brojevi pinova od 8 dana pinova koji su spojeni od RPi na display. Koriste se samo prva 4 kod 4-bitnog moda. Vraćena vrijednost se koristi kao “handle” u drugim funkcijama. Ako je vraćena vrijednost -1 to znači da je došlo do pogreške, većinom netočni paramteri.

lcdHome(int handle);
Postavlja kursor na početak display-a.

lcdClear(int handle);
Briše sadržaj na display-u i postavlja kursor na početak.
lcdPosition(int handle, int x, int y);
Postavlja kursor na željenu poziciju na display-u. Parametar x predstavlja stupac(0 predstavlja prvi s lijeva). Parametar y predstavlja redak(0 predstavlja prvi gornji).

lcdPutchar(int handle, unsigned char data);
Ispisuje jedan ASCII karakter na display.

lcdPuts(int handle, const char *string);
Ispisuje čitav string na display.

lcdPrintf(int handle, const char *message, …);
Ispisuje jedan ASCII karakter, string ili formiran string koristeći printf naredbe oblikovanja.

5. Projekt: Pomagalo u komunikaciji Sadržaj

5.1. Shema spajanja Sadržaj

15

5.2. Program Sadržaj

Program je napisan u C programskom jeziku. Potrebno ga je prebaciti u RPi putem FTP-a, USB-a, … Zatim ga je potrebno iskompajlirati pomoću slijedeće komande:

gcc /home/pi/apmr.c -o /home/pi/apmr -l wiringPi

te ga pokrenuti slijedećom komandom:

sudo /home/pi/apmr

/*
 * Project: Raspberry Pi
 * Author: Ante Primorac
 * Author URI: http://anteprimorac.from.hr
 * Version: 1.0
 */

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <wiringPi.h>

char lcd_c_text[200]; // Trenutni tekst na LCD displayu
static volatile int lcd_offset = 0; // Offset na LCD displayu
static volatile int lcd_dis; // Ovo nam je potrebno kako bi mogli pozvati LCD funkcije iz bilo kojeg dijela programa
static volatile int last_left_state = 1; // Zadnji polozaj lijeve tipke, potrebno je postaviti na "1" jer ce event reagirati samo kod prve promjene na "0"
static volatile int last_right_state = 1; // Zadnji polozaj desne tipke, potrebno je postaviti na "1" jer ce event reagirati samo kod prve promjene na "0"
static volatile int morse_short_delay = 250; // Broj milisekundi za promjenu stanja LED diode kod kratkog impulsa
static volatile int morse_long_delay = 500; // Broj milisekundi za promjenu stanja LED diode kod dugog impulsa
// Morseov kod, preuzeto s wikipedije
static const struct {
	char letter, *morse;
} Code[] = {
	{ 'A', ".-" },
	{ 'B', "-..." },
	{ 'C', "-.-." },
	{ 'D', "-.." },
	{ 'E', "." },
	{ 'F', "..-." },
	{ 'G', "--." },
	{ 'H', "...." },
	{ 'I', ".." },
	{ 'J', ".---" },
	{ 'K', ".-.-" },
	{ 'L', ".-.." },
	{ 'M', "--" },
	{ 'N', "-." },
	{ 'O', "---" },
	{ 'P', ".--." },
	{ 'Q', "--.-" },
	{ 'R', ".-." },
	{ 'S', "..." },
	{ 'T', "-" },
	{ 'U', "..-" },
	{ 'V', "...-" },
	{ 'W', ".--" },
	{ 'X', "-..-" },
	{ 'Y', "-.--" },
	{ 'Z', "--.." },
	{ '1', ".----" },
	{ '2', "..---" },
	{ '3', "...--" },
	{ '4', "....-" },
	{ '5', "....." },
	{ '6', "-...." },
	{ '7', "--..." },
	{ '8', "---.." },
	{ '9', "----." },
	{ '0', "-----" },
	{ ' ', "r" },
};

void do_kratko() {
	digitalWrite(7, 1);
	delay(morse_short_delay);
	digitalWrite(7, 0);
	delay(morse_short_delay);
}

void do_dugo() {
	digitalWrite(7, 1);
	delay(morse_long_delay);
	digitalWrite(7, 0);
	delay(morse_short_delay);
}

void do_razmak() {
	delay(morse_long_delay);
}

void do_morse(char *s) {
	size_t i, j, m;
	for ( i = 0; s[i]; ++i ) {
		for ( j = 0; j < sizeof Code / sizeof *Code; ++j ) {
			if ( toupper(s[i]) == Code[j].letter ) {
				char *morse_code = Code[j].morse;
				for ( m = 0; morse_code[m]; ++m ) {
					char kod = morse_code[m];
					switch(kod) {
						case 46 :
							do_kratko();
						break;
						case 45 :
							do_dugo();
						break;
						case 114 :
							do_razmak();
						break;
					}
				}
				break;
			}
		}
	}
}

int compare(char *a, char *b, int o) {
	int i;
	int r = 0;
	
	if(o < 0) {
		printf("OFFSET ERROR!\n");
		return 0;
	}
	
	for ( i = 0; b[i]; i++ ) {
		if ((i == 0 || r == 1) && a[i+o] == b[i]) {
			r = 1;
		}
		else {
			r = 0;
		}
	}
	
	return r;
}

void lcd_text(char *a, int lcdd, int o) {
	int o_l = 0;
	if(o < 0) {
		o_l = 0 - o;
		o = 0;
	}
	if(lcdd == -1) {
		printf("LCD ERROR!\n");
	}
	else {
		size_t i, j;
		int b = 0, c = 0, d = 0, e = 0;
		lcdClear(lcdd);
		delay(10);
		for(i=0; (i + o_l)<16 && a[i+o]; i++) {
			b = i + o_l;
			if((i + o_l) > 7) {
				b = (i + o_l) - 8;
				c = 1;
			}
			lcdPosition(lcdd, b, c);
			lcdPutchar(lcdd, a[i+o]);
		}
	}
}

void lcd_left_down() {
	int state = digitalRead(6);
	if(state == last_left_state) return;
	last_left_state = state;
	if(state == 1) return;
	lcd_offset = lcd_offset + 1;
	lcd_text(lcd_c_text, lcd_dis, lcd_offset);
}

void lcd_right_down() {
	int state = digitalRead(5);
	if(state == last_right_state) return;
	last_right_state = state;
	if(state == 1) return;
	lcd_offset = lcd_offset - 1;
	lcd_text(lcd_c_text, lcd_dis, lcd_offset);
}

int main(void) {
	int lcd1;
	int loop = 1;
	int led_morse = 1;
	int lcd_morse = 1;
	char command[30];
	char command_close[] = "exit";
	char command_input[] = "input";
	char command_led[] = "led=";
	char command_lcd[] = "lcd=";
	
	char exit_msg[] = " POZDRAV ;)";
	
	char on[] = "ON";
	char off[] = "OFF";
	
	if(wiringPiSetup() < 0) {
		fprintf(stderr, "Unable to setup wiringPi: %s\n", strerror(errno));
		return 1;
	}
	
	lcd1 = lcdInit(2,8,4,11,10,0,1,2,3,0,0,0,0);
	
	if(lcd1 == -1) {
		lcd_morse = 0;
		printf("LCD OFF!\n");
	}
	
	sleep(1);
	
	lcd_dis = lcd1;
	
	pinMode(5, INPUT); // DESNO
	pinMode(6, INPUT); // LIJEVO
	pinMode(4, OUTPUT);
	pinMode(7, OUTPUT);
	
	digitalWrite(4, 1); // ZELENI SIGNAL ON
	
	if(wiringPiISR(6, INT_EDGE_BOTH, &lcd_left_down) < 0) {
		fprintf(stderr, "Unable to setup ISR: %s\n", strerror(errno));
		return 1;
	}
	
	if(wiringPiISR(5, INT_EDGE_BOTH, &lcd_right_down) < 0) {
		fprintf(stderr, "Unable to setup ISR: %s\n", strerror(errno));
		return 1;
	}
	
	while(loop) {
		printf("Komanda: ");
		scanf(" %[^\n]", &command);
	
		if(compare(command, command_close, 0)) {
			loop = 0;
		}
		else if(compare(command, command_led, 0)) {
			if(compare(command, on, 4)) {
				led_morse = 1;
				printf("LED ON!\n");
			}
			else if(compare(command, off, 4)) {
				led_morse = 0;
				printf("LED OFF!\n");
			}
		}
		else if(compare(command, command_lcd, 0)) {
			if(lcd1 == -1) {
				lcd_morse = 0;
				printf("LCD OFF!\n");
			}
			else {
				if(compare(command, on, 4)) {
					lcd_morse = 1;
					printf("LCD ON!\n");
				}
				else if(compare(command, off, 4)) {
					lcd_morse = 0;
					printf("LCD OFF!\n");
				}
			}
		}
		else if(compare(command, command_input, 0)) {
			printf("Upisi tekst: ");
			scanf(" %[^\n]", &lcd_c_text);
	
			if(lcd_c_text[0]) {
				if(lcd_morse) {
					lcd_text(lcd_c_text, lcd1, 0);
				}
				if(led_morse == 1)
					do_morse(lcd_c_text);
			}
		}
		else {
			printf("NEPOZNATA KOMANDA!\n\nPopis komandi:\nexit - Izlaz iz programa\ninput - Upis teksta\nled - Ukljucivanje/iskljucivanje prikaza morseovog koda na led diodi(Parametri: ON/OFF), default: led=ON\nlcd - Ukljucivanje/iskljucivanje prikaza	teksta na lcd displayu(Parametri: ON/OFF), default: lcd=ON\n");	
		}	
	}	
	
	digitalWrite(4, 0); // ZELENI SIGNAL OFF
	
	if(lcd1 != -1) {
		int k;
		for(k=0; exit_msg[k]; k++) {
			lcd_text(exit_msg, lcd1, k);
			delay(400);
		}
		lcdClear(lcd1);
	}
	
	return 0;
}

5.3. Primjena Sadržaj

Ovaj projekt se može primijeniti u svim slučajevima gdje s jedne strane imamo osobu koja razumije morseov kod, a s druge strane osobu koja nije u mogućnosti komunicirati na drugi način(možda zbog nedostataka prve osobe ili radi specifičnosti okoline), također se može primjeni za učenje ili vježbanje morseova koda. Primjena se može lako proširiti ugradnjom mikrofona i integracijom s Google Voice ili nekim drugim servisom za prepoznavanje govora.

6. Literatura Sadržaj

wikipedia.org
raspberrypi.org
elinux.org
wiringpi.com

Leave a Reply

Your email address will not be published. Required fields are marked *