IZVEDBA POTOVALNEGA RAČUNALNIKA ZA OSEBNO VOZILO S POMOČJO PLATFORME RASPBERRY PI

Similar documents
Diagnostika avtomobila z mikrokrmilnikom Arduino

Prikaz podatkov o delovanju avtomobila na mobilni napravi z uporabo OBDII

Atim - izvlečni mehanizmi

Pošta Slovenije d.o.o. Slomškov trg MARIBOR e pošta: espremnica Navodilo za namestitev aplikacije»espremnica«

Študija varnosti OBD Bluetooth adapterjev

Hydrostatic transmission design Tandem closed-loop circuit applied on a forestry cable carrier

Aljoša Skočir PROGRAMSKI VMESNIK ZA PRIKLOP NAPRAVE ZA ZAJEM PODATKOV NA VODILO USB

Uporabniški program za generator identifikatorjev UFI Priročnik za uporabnike. Julij 2018

VSD2 VARIABILNI VRTINČNI DIFUZOR VARIABLE SWIRL DIFFUSER. Kot lopatic ( ) / Angle of the blades ( ) 90 odpiranje / opening 85

Implementacija programske kode za vodenje tehnoloških operacij frezanja z robotom Acma XR 701

LAHKE TOVORNE PRIKOLICE BREZ NALETNE NAPRAVE DO 750 KG

Mentor: doc. dr. Janez Demšar

Arduino-based OBD-II Interface and Data Logger. CS 497 Independent Study Ryan Miller Advisor: Prof. Douglas Comer April 26, 2011

POROČILO PRAKTIČNEGA IZOBRAŽEVANJA

IZGRADNJA GRAFIČNEGA VMESNIKA ZA KRMILNIK LINEARNEGA MOTORJA

Mobilna aplikacija za inventuro osnovnih sredstev

Energy usage in mast system of electrohydraulic forklift

SAMODEJNI SISTEM ZA KRMILJENJE ZALIVALNO-NAMAKALNIH SISTEMOV

KONTROLNI SISTEM ZA KRMILJENJE MOTORJEV IN KOREKCIJSKIH TULJAV

Preprost prevajalnik besedil za platformo android

NAVODILA ZA UPORABO H500 UVOD UREJANJE NALEPKE TISKANJE NALEPK UPORABA POMNILNIKA ZA DATOTEKE UPORABA PROGRAMSKE OPREME P-TOUCH

NAVODILA ZA UPORABO: Namestitev aplikacije Renault Media Nav Toolbox

Nadzor in avtomatizacija funkcij v sobi

RFID implementacija sledenja v preskrbovalni verigi

Razvoj poslovnih aplikacij po metodi Scrum

NAČRTOVANJE TESTIRANJA PRI RAZVOJU IS V MANJŠIH RAZVOJNIH SKUPINAH

BREZŽIČNO KOMUNIKACIJSKO RAZVOJNO OKOLJE ZA ROBOTA ROBOSAPIEN

Sodoben razvoj prototipov uporabniških vmesnikov z orodjem Microsoft Expression Blend 4

INTEGRACIJA INTRANETOV PODJETJA S POUDARKOM NA UPRABNIŠKI IZKUŠNJI

10,92 cm / 4,3 navigacijski sistem

Raziskave in razvoj iz ljubezni do ljudi

Klima naprava za parkirana vozila. Navodila za uporabo. Cool Top Vario 10 E

PRENOS PODATKOV V SISTEMU ZA POLNJENJE ELEKTRIČNIH VOZIL

Gonilnik za sistem hišne avtomatizacije Adhoco

NAVODILA ZA UPORABO. Različica 0 SLOVENSKO

IZDELAVA DOKUMENTACIJE STROJA ZA GLOBOKO VRTANJE

KRMILJENJE TRAČNE ŽAGE S PROGRAMIRLJIVIM LOGIČNIM KRMILNIKOM

Tomaž Avberšek NADZOROVANJE TELESKOPA S POMOČJO PLATFORME RASPBERRY PI. Diplomsko delo

JACKETS, FLEECE, BASE LAYERS AND T SHIRTS / JAKNE, FLISI, JOPICE, PULIJI, AKTIVNE MAJICE IN KRATKE MAJICE USA / UK / EU XS S M L XL XXL XXXL

Navodila za mrežne nastavitve PT-E550W

UNIVERZA V LJUBLJANI FAKULTETA ZA ELEKTROTEHNIKO MAGISTRSKO DELO KOMUNIKACIJSKI PROTOKOLI V ELEKTRONSKEM ŠTEVCU ELEKTRIČNE ENERGIJE

Termoelektrarna Šoštanj d. o. o.

Jamova cesta Ljubljana, Slovenija Jamova cesta 2 SI 1000 Ljubljana, Slovenia

BOGDAN DUGONIK FERI - MEDIJSKE KOMUNIKACIJE GRADIVO ZA VAJE. Navodilo za programsko orodje. Premiere 1.5 PRO

MARTIN VERSTOVŠEK UPORABA ORODIJ ZA VODENJE PROJEKTOV IT V MAJHNI RAZVOJNI SKUPINI DIPLOMSKO DELO NA VISOKOŠOLSKEM STROKOVNEM ŠTUDIJU

Krmilnik za ročni sistem za prašno lakiranje Encore HD in XT

UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO ANALIZA VZROKOV IN NAČINOV ODPOVEDI PROGRAMSKE REŠITVE E-TRANS

POROČILO PRAKTIČNEGA IZOBRAŽEVANJA

RFID NADZORNI SISTEM

Razvrščanje proizvodnih opravil z orodji za vodenje projektov

INTELEKTUALNA LASTNINA IN PRAVNA ZAŠČITA MOBILNE APLIKACIJE

UNIVERZA V LJUBLJANI EKONOMSKA FAKULTETA DIPLOMSKO DELO MOJCA URŠIČ

FR F. Notice d'installation et d'utilisation Français. Instructions for installation and use English. Montage- und Gebrauchsanleitung Deutsch


EVROPSKO RIBIŠTVO V ŠTEVILKAH

Eratostenovo rešeto. Aleksandar Jurišić in Matjaž Urlep. Doma (v točki ena) nam postane dolgčas in podamo se na sprehod po številski premici.

ZBIRANJE IN PROCESIRANJE PODATKOV PRIDOBLJENIH IZ OTLM NAPRAV, KI SO NAMEŠČENE NA PRENOSNIH VODNIKIH

11/14. test NOKIINIH ZEMLJEVIDOV na Androidu ANDROID 5 nasveti za MAC in LINUX sam svoj MOJSTER. TEST vrhunskih telefonov od Appla do»kitajcev«12

CTC Basic display SLO. Svenska 4 Deutsch 18 Dansk 32 English 46 Suomi 58 Français 70 Nederlands 82 Norsk 96 Slovensko 108

Navodila za namestitev. DEVIreg 550. Inteligentni elektronski termostat.

WTW InoLab ph, Cond 720 Laboratorijski ph, Cond meter

Naprava za pranje ulitkov

FORD FOCUS MALOPRODAJNI CENIK - MODELNO LETO Velja od: za vozila iz zaloge

THE OPTIMIZATION OF A RACE CAR INTAKE SYSTEM OPTIMIZACIJA SESALNEGA SISTEMA DIRKALNIKA

Stiskanje podatkov na grafični procesni enoti

FORD B-MAX. MALOPRODAJNI CENIK - MODELNO LETO Velja za od: do preklica

ProductDiscontinued. Sistem za merjenje z rezervoarjem Posebna varnostna navodila ATEX. Posebna varnostna navodila SL, 1.

NAZIV VZDRŽEVALNE ORGANIZACIJE SKLIC ODOBRITVE VZDRŽEVALNE ORGANIZACIJE DELO DO. DELO POTRJUJE (ime in priimek odgovorne osebe)

Digitalno tedensko časovno stikalo Hama Premium

UNIVERZA V LJUBLJANI FAKULTETA ZA RAČUNALNIŠTVO IN INFORMATIKO STOLPČNO USMERJENI SISTEMI ZA UPRAVLJANJE PODATKOVNIH BAZ DIPLOMSKO DELO

Navodilo za vgradnjo. Thermo Call TC3

POROČILO PRAKTIČNEGA IZOBRAŽEVANJA

Opis in uporaba strežnika Microsoft Team Foundation Server v projektnem delu

OBD2 ECU Simulator. User Manual IMSB5010.

Informacije o sistemu 2 O vašem alarmnem sistemu 6 Kratek opis delovanja sistema 6 Vklop in izklop sistema 7 Vklop z LED tipkovnico 7 Vklop z LCD

Avtomatizirani stroj za izdelavo cigaret

PLANIRANJE KADROV V PODJETJU UNIOR d.d.

09/2008 CENTRIFUGALNI VENTILATORJI ZA ODVOD DIMA IN TOPLOTE - ODT CV CENTRIFUGAL FANS FOR SMOKE AND HEAT EXTRACTION - ODT CV

FORD FOCUS ST-Line MALOPRODAJNI CENIK - MODELNO LETO Velja od: za vozila iz zaloge

Avtomatizacija premikanja masažne kopeli

Ustreznost odprtokodnih sistemov za upravljanje vsebin za načrtovanje in izvedbo kompleksnih spletnih mest: primer TYPO3

KAMINSKA PEČ na pelete s toplovodnim izmenjevalcem

UVAJANJE AGILNE METODE SCRUM V RAZVOJ SPLETNEGA PORTALA ZA ZDRAVO PREHRANO

Obvladovanje časa s pomočjo sodobne informacijske tehnologije

SLOVENŠ INA. Vodi za hiter za etek. Poslovni telefon VoIP. snom 320_v2.indd 1 11/09/14 11:08

CSC CSD Jermenski prenos. DRC DRD DRE Direktni prenos

NAVODILA ZA UPORABO. Navodila za uporabo brezžičnega upravljalnika. Slovenščina. OM-GS (4)-DAIKIN Št. dela: R D MODE TURBO TIMER

AUTOBOSS V30 ELITE hand-held diagnostic tool developed for the European market - the true all-in-one scan tool.

VAŠA NOVA HONDA CIVIC GRAND

Evalvacijski model uvedbe nove storitve za mobilne operaterje

RAZVOJ APLIKACIJE ZA ZAJEM IN SPREMLJANJE PROIZVODNIH PODATKOV

Prototipni razvoj (Prototyping)

MI6 overview - for Mini vehicles

ERWEKA DT 800 za preizkušanje raztapljanja

PLCC-28 OE91C1110. KWP2000 simulator v Features

RAZISKAVA SEVANJA MOBILNIH TELEFONOV

MX2 Ustvarjen za pogon strojev Model: 3G3MX2 200V trifazni vhod 0.1 do 15 kw. 400V trifazni vhod 0.1 do 15 kw UPORABNIŠKA NAVODILA

hp officejet 4200 series all-in-one

EASE CAN! Start scanning with EASE today! EASE Diagnostics. Can any hand held scanner display data like this? Automotive Information Specialists

Bayesove metode razvrščanja nezaželene elektronske pošte

Transcription:

Uroš Krajnc IZVEDBA POTOVALNEGA RAČUNALNIKA ZA OSEBNO VOZILO S POMOČJO PLATFORME RASPBERRY PI Diplomsko delo Ptuj, julij 2013

IZVEDBA POTOVALNEGA RAČUNALNIKA ZA OSEBNO VOZILO S POMOČJO PLATFORME RASPBERRY PI Diplomsko delo Študent: Študijski program: Smer: Mentor: Lektorica: Uroš Krajnc visokošolski študijski program Računalništvo in informacijske tehnologije Računalništvo in informacijske tehnologije doc. dr. CIGALE BORIS, univ.dipl.inž. rač. in inf. Stanka Krajnc Letonja Ptuj, julij 2013

I

ZAHVALA Zahvaljujem se mentorju doc. dr. Borisu Cigaletu za strokovno pomoč, vodenje in koristne nasvete pri opravljanju diplomskega dela. Prav tako se zahvaljujem vsem, ki so mi v času študija na kakršen koli način pomagali. Posebna zahvala gre staršem, ki so mi omogočili študij, bratu Denisu, Stanki in Anji za vso moralno podporo. II

Izvedba potovalnega računalnika za osebno vozilo s pomočjo platforme Raspberry PI Ključne besede: potovalni računalnik, Raspberry PI, OBD, Python UDK: 004.451:004.382(043.2) Povzetek Diplomsko delo obravnava prikaz podatkov na zaslonu, pridobljenih iz avtomobilsko diagnostičnega sistema OBD-II, preko operacijskega sistema Linux. V diplomski nalogi, smo se odločili spoznati sistem OBD-II, razviti programsko opremo ter vse skupaj preko platforme Raspberry PI prikazati na zaslonu. Osredotočili smo se na prikaz le določenih podatkov, kot so hitrost, vrtljaji na minuto, temperatura motorja in trenutna poraba goriva. Celoten sistem smo preizkusili na avtomobilu Opel Corsa 1.8 ter naredili analizo podatkov. Cilj programske opreme je, da omogoča vozniku pogled na trenutno porabo goriva ter drugih podatkov pridobljenih iz avtomobilskih senzorjev. III

Implementation of on-board car computer with Raspbery PI Key words: board computer, Raspberry PI, on-board diagnostics (OBD), Python UDK: 004.451:004.382(043.2) Abstract Thesis deals with data display on the screen, obtained from auto diagnostic system OBD-II through the Linux operating system. In this thesis we decided to get to know OBD-II, to develop the software and display all together on the screen through the platform Raspberry PI. We focused to show only certain data, such as speed, revolutions per minute (RPM), engine temperature and current fuel consumption. The entire system was tested on the Opel Corsa 1.8 car on which we did data analysis. The aim of the software is that it allows the driver to view the current fuel consumption and other data obtained from auto sensors. IV

KAZALO 1. UVOD...1 2. VMESNIK OBD-II...3 2.1. Diagnostični priključek OBD-II...3 2.2. Signalni protokoli OBD-II...5 2.3. Diagnostični podatki OBD-II...6 2.3.1. Uporaba načina $01...7 3. MIKROKONTROLER ELM327...11 3.1. ELM327 kloni...13 4. RASPBERRY PI...14 4.1. Sestava RPi...15 4.2. Uporaba RPi...16 4.2.1. Namestitev OS Arch Linux ARM...16 4.2.2. Spreminjanje nastavitev RPi...18 4.2.3. Namestitev paketov za programsko okolje Python...19 4.2.4. Avtomatsko zaganjanje skripte...20 5. IZRAČUN TRENUTNE PORABE...21 6. PYTHON...23 6.1. Sintaksa programskega jezika Python...23 6.2. Osnovni ukazi...24 6.2.1. Komentarji...24 6.2.2. Izpis na ekran...24 6.2.3. Spremenljivke in polja...25 6.2.4. Pogojni stavki in zanke...27 6.2.5. Niti...29 6.2.6. Uporaba globalnih spremenljivk...30 6.3. PySerial...31 6.3.1. Uporaba PySerial...32 6.4. PyGame...33 6.4.1. Uporaba knjižnice PyGame...33 6.4.2. Osnovno okno...34 6.4.3. Izpis podatkov...35 6.4.4. Izris črt in likov...36 7. APLIKACIJA...38 V

7.1. Opis aplikacije...40 7.1.1. Postopek delovanja...40 7.1.2. Uporabljeni moduli...40 7.1.3. Globalne spremenljivke...41 7.1.4. Funkcije...41 7.1.5. Psevdokod...44 8. OPIS NAPRAV IN PRIKLOP SISTEMA...46 8.1. Raspberry PI...46 8.2. Multimedijski prikazovalnik...47 8.3. Daljinski upravljalnik...47 9. TESTIRANJE APLIKACIJE...48 9.1. Analiza podatkov...48 9.1.1. Prvi testni primer...48 9.1.2. Drugi testni primer...50 9.1.3. Testiranje daljinskega upravljalnika...52 10. ZAKLJUČEK...54 11. VIRI, LITERATURA...55 12. PRILOGE...56 12.1. Podatki o študentu...56 VI

KAZALO SLIK Slika 2.1: OBD-II priključek...4 Slika 3.1: Vmesnik ELM327...11 Slika 4.1: Raspberry PI...14 Slika 4.2: Kompozitni kabel (RCA)...15 Slika 4.3: Program Win32 Disk Imager...17 Slika 4.4: Pomnilniška kartica SD...17 Slika 7.1: Uporabniški vmesnik, način 0...38 Slika 7.2: Uporabniški vmesnik, način 1...39 Slika 7.3: Uporabniški vmesnik, način 2...40 Slika 7.4: Uporabniški vmesnik, način 3...40 Slika 8.1: Potovalni računalnik v vozilu...46 Slika 8.2: Multimedijski prikazovalnik...47 Slika 8.3: Daljinski uporavljalnik...47 KAZALO TABEL Tabela 2.1: Tabela identifikacijskih številk...10 Tabela 9.1: Testni primer za hitrost...48 Tabela 9.2: Testni primer za vrtljaje na minuto...49 Tabela 9.3: Testni primer za temperaturo motorja...49 Tabela 9.4: Testni primer za trenutno porabo na 10 km...49 Tabela 9.5: Testni primer za trenutno porabo na 100 km...49 Tabela 9.6: Testni primer za trenutno porabo na 743 km...50 Tabela 9.7: Testni primer za hitrost...50 Tabela 9.8: Testni primer za vrtljaje na minuto...51 Tabela 9.9: Testni primer za temperaturo motorja...51 Tabela 9.10: Testni primer za trenutno porabo na 10 km...51 Tabela 9.11: Testni primer za trenutno porabo na 100 km...52 Tabela 9.12: Testni primer za trenutno porabo na 593 km...52 Tabela 9.13: Testiranje daljinskega upravljalnika...53 VII

UPORABLJENE KRATICE ECU (ang. engine control unit) krmilna enota motorja OBD-II (ang. on-board diagnostic) sistem za diagnostiko ELM327 naprava za povezavo računalnik vozilo SAE (ang. Society of automotive Engineers) združenje avtomobilskih inženirjev MAF (ang. mass air flow) pretok zraka RPM (ang. revolutions per minute) vrtljaji na minuto KMH (ang. kilometers per hour) kilometri na uro HDMI (ang. high-definition multimedia interface) priključek za avdio in video vsebino USB (ang. universal serial bus) univerzalno serijsko vodilo LAN (ang. local area network) lokalno omrežje RCA (ang Radio Corporation of America) kompozitni kabel za video RAM (ang. random-access memory) bralno pisalni pomnilnik ZIP datotečni format RPi Raspberry PI MPG (ang. miles per galon) milje na galon ABS (ang. anti-lock system) sistem proti blokiranju koles EPS (ang. electric power steering) pomoč pri krmiljenju ARM (ang. advanced RISC machine) procesna arhitektura EOBD (ang. Europe on-board diagnostic) evropski sistem za diagnostiko GM (General Motors) multinacionalno podjetje PID (ang. parameters IDs) identifikacijske številke parametrov VIII

Stran 1 1. UVOD V današnji dobi, kjer nas vsepovsod spremlja elektronika, si več ne moremo predstavljati avtomobila brez krmilne enote, ki poskrbi, da naš avtomobil praktično deluje. Če pogledamo avtomobil kot celoto, se od prvega rojstva avtomobila leta 1886 ni kaj veliko spremenilo. Avtomobil kot celoto še vedno sestavljajo glavne stvari, kot so šasija, kolesa, volan, luči, vrata,... Po drugi strani pa se je zelo veliko spremenilo. Skoraj ni vozila v današnjem času, ki mu ne pomaga elektronika, da je avtomobil funkcionalen. Kot vemo, ima vsak nov avtomobil vgrajeno glavno krmilno enoto, v nadaljevanju ECU (ang. Engine control unit), ki je povezana na več manjših krmilnih enot, ki nam omogočajo nadzor in krmiljenje motorja. Pri krmiljenju avtomobila imamo v mislih zagon motorja, vbrizg goriva, sisteme za pomoč voznikom (brisalci, luči, parkirni senzorji, tempomat, navigacija), varnostne sisteme (pomoč pri zaviranju (ABS), pri speljevanju (ASR), pri krmiljenju (EPS), zračne blazine,...) ter radio in druge multifunkcijske naprave. Zato so pri organizaciji SAE (Society of Automotive Engineers) leta 1988 predlagali standardizacijo priključkov in signalov za diagnostiko napak. Nastal je standard z imenom On-board diagnostics ali krajše OBD. Na začetku, dokler ni prišel nov standard z imenom OBD-II, ki ga uporabljajo vsi današnji avtomobili, se je uporabljal standard OBD in OBD-1.5. Standard OBD-II nam omogoča, da se z vmesnikom (računalnik, namenski tester, telefon,...) in s pomočjo protokolov povežemo z avtomobilsko krmilno enoto (ECU) ter pridobimo informacije o avtomobilu, njegovem delovanju in diagnosticiranju napak. V tej diplomski nalogi bomo na kratko predstavili sistem OBD-II (njegovo zgodovino, namen in uporabo). Nato bomo predstavili vmesnik ELM327, ki nam omogoča komunikacijo med računalnikom in OBD napravo v avtomobilu. Sledila bo predstavitev platforme Raspberry PI, na kateri bo nameščen operacijski sistem Arch Linux ARM. Predstavili bomo tudi programski jezik Python in knjižnice, ki smo jih potrebovali za pravilno delovanje (PyGame in PySerial). Na koncu pa še sledi predstavitev aplikacije, ki

Stran 2 nam prikazuje podatke na zaslon in analiza podatkov, pridobljenih na testiranju z različnimi avtomobili.

Stran 3 2. VMESNIK OBD-II Z vgradnjo OBD sistemov v avtomobile, so omogočili lažje odkrivanje napak na avtomobilu, saj lahko serviserji in drugi uporabniki z eno napravo odkrijemo napake na skoraj katerem koli novejšem avtomobilu. Sistem OBD nam omogoča spreminjanje nastavitev parametrov, ki jih avto uporablja za delovanje in s tem pridobitev na večji moči motorja, manjši porabi,... Lahko pa ga tudi uporabljamo za shranjevanje podatkov in kasnejšo analizo delovanja avtomobila. Za razvoj OBD sistemov je bila želja po omejitvi izpustov emisij in čistejšem okolju. Vmesnik OBD-II je bil naslednik vmesnika OBD-I, razvit leta 1994, zaradi težav z nestandardnim OBD-I. Pri razvoju druge verzije so upoštevali predvsem predloge organizacije SAE, ki je že leta 1988 predlagala standardizacijo priključkov in diagnostičnih signalov. Evropska različica OBD-II standarda (imenovana EOBD) je obvezna za bencinska vozila od leta 2001 in dizelska od leta 2004 naprej. V Združenih državah Amerike je standard OBD-II obvezen za vsa vozila, ki se prodajajo od leta 1996 naprej. OBD-II standard natančno določa diagnostični priključek, električne signale podprtih protokolov, zgradbo sporočila in kode za nadzor senzorjev. Ena izmed nožic na priključku služi napajanju vmesnika, ki ga pridobi iz avtomobilskega sistema, zato ne potrebuje lastnega vira energije. [1] 2.1. Diagnostični priključek OBD-II Priključek na OBD-II je 16-pinska J1962 ženska vtičnica (dve vrstici po 8 pinov). Za razliko od prejšnje različice OBD vtičnice, ki je bila po navadi najdena pod pokrovom motorja, se mora OBD-II vtičnica nahajati 61cm (2 čevlja) od volanskega obroča, torej nekje v potniškem prostoru. [1] Standard SAE J1962 določa zaporedje nožic na priključku po naslednjem vrstnem redu:

Stran 4 Slika 2.1: OBD-II priključek 1. Neuporabljena ali uporabljena po presoji proizvajalca (GM: J2411 GMLAN/SWC/Single-Wire CAN. VW/Audi: +12, da naprava zazna ali je avto vključen ali izključen) 2. napajanje za SAE-J1850 PWM in SAE-1850 VPW 3. v Argentini Ford DCL + vodilo; Chrysler CCD + vodilo v Braziliji (pred OBD-II), ZDA in Evropi 4. ozemljitev šasije 5. ozemljitev signala 6. CAN high (ISO 15765-4 and SAE-J2284) 7. K linija za ISO 9141-2 in ISO 14230-4 8. neuporabljena ali uporabljena po presoji proizvajalca (za večino BMW-jevih avtomobilov K linija za sisteme, ki nimajo OBD-II) 9. neuporabljena ali uporabljena po presoji proizvajalca 10. negativna linija za SAE-J1850 PWM 11. v Argentini Ford DCL - vodilo; Chrysler CCD - vodilo v Braziliji (pred OBD-II), ZDA in Evropi 12. neuporabljena ali uporabljena po presoji proizvajalca 13. neuporabljena ali uporabljena po presoji 14. CAN low (ISO 15765-4 in SAE-J2284) 15. K linija za ISO 9141-2 in ISO 14230-4 16. napajanje iz akumulatorja

Stran 5 2.2. Signalni protokoli OBD-II Standard OBD-II omogoča uporabo petih protokolov, ki nam povedo, na kakšen način se povežemo z vmesnikom in dostopamo do podatkov. Večina vozil omogoča le en signalni protokol. Vsak posamezni protokol uporablja specifične nožice na OBD-II J1962 priključku, le četrta in šestnajsta nožica sta skupni. Četrta nožica je masa akumulatorja in šestnajsta napajanje iz akumulatorja. Protokoli: [1] SAE J1850 PWM o uporablja Ford Motor Company o hitrost 41,6 kb/sec z pulzno širinsko modulacijo (ang. pulse-width modulation) o nožica 2: vodilo + o nožica 10: vodilo - o napetost +5V o velikost sporočila je 12 zlogov vključno s CRC (ciklično redundančno kontrolo; ang. cyclic redundancy check) SAE J1850 VPW o uporablja General Motors (GM) o hitrost 10,4 kb/sec ali 41,6 kb/sec z variabilno pulzno širinsko modulacijo (ang. variable pulse width modulation) o nožica 2: vodilo + o ko se vodilo ne uporablja, je v stanju mirovanja o napetost +7V o velikost sporočila je 12 zlogov vključno s CRC (ciklično redundančno kontrolo; ang. cyclic redundancy check) ISO 9141-2 o uporabljajo Chrysler, evropska in azijska vozila o hitrost 10.4 kbaud z asinhronim serijskim prenosom podatkov (podoben prenos podatkov kot pri RS-232) o nožica 7: K-linija o nožica 15: L-linija (opcijsko) o UART signal o K-linija ima možnost prehoda v stanje mirovanje

Stran 6 o velikost sporočila je 12 zlogov vključno s CRC (ciklično redundančno kontrolo; ang. cyclic redundancy check) ISO 14230 KWP2000 o hitrost med 1,2 kbaud in 10.4 kbaud o nožica 7: K-linija o nožica 15: L-linija (opcijsko) o fizičen nivo isti kot pri ISO 9141-2 o velikost sporočila do 255 zlogov ISO 15765 CAN o hitrost 250 kbit/s ali 500 kbit/s o razvil Bosch o uporaba za razliko od drugih protokolov tudi izven avtomobilske industrije o vsa vozila od leta 2008 v Združenih državah Amerike morajo podpirati ta protokol o nožica 6: CAN visoki nivo o nožica 14: CAN nizki nivo 2.3. Diagnostični podatki OBD-II OBD-II nam omogoča dostop do podatkov iz kontrole enote (ECU). Podatke pridobimo, da pošljemo ukaz ECU enoti in ta nam vrne odgovor. Ukaz, ki ga pošljemo, je sestavljen iz načina delovanja in identifikacijsko številko parametra, krajše PID (ang. parameter identification numbers). PID kode so šestnajstiška števila, definirana po standardu SAE J9179. ECU nam vrne odgovor v šestnajstiški obliki, nato ga je potrebno pretvoriti z uporabo enačbe, ki je definirana po standardu SAE J9179. Proizvajalci niso primorani, da implementirajo vse PID kode, uporabljajo lahko svoje, ki niso definirane v standardu. Upoštevati morajo le eno izjemo in sicer ukaz 01 00, ki nam vrača rezultat dolg 4 zloge. Z izračunom rezultata pridobimo podatke, katere PID kode so podprte v našem avtomobilu. Glede na to, da proizvajalcem ni potrebno obvezno upoštevati SAE predpisanih kod, vseeno večina uporablja osnovne ukaze, s katerimi lahko preverimo delovanje motorja in preberemo ter pobrišemo napake motorja. Osnovi ukazi, ki jih proizvajalci vključijo po SAE predpisih, so po navadi hitrost, vrtljaji na minuto, temperatura motorja in identifikacijska številka avtomobila ter drugi odvisno od vrste avtomobila.

Stran 7 Standard SAE J1979 omogoča 10 načinov delovanja: [1] način $01 - prikaz trenutnih podatkov in izračun podprtih PID kod način $02 - prikaz zamrznjenih podatkovnih nizov način $03 - prikaz shranjenih diagnostičnih kod napak in napak v povezavi z emisijami; prikaže 4 mestno številko kode, ki nam omogoča določiti napako način $04 - izbris diagnostičnih napak in shranjenih vrednosti način $05 - prikaz podatkov senzorja za kisik (ne deluje na CAN protokolu) način $06 - avtomatska diagnoza sistemov vozila, ki se sproži neprekinjeno ali časovno omejeno; pri časovno omejenem testiranju so potrebni dodatni parametri način $07 - prikaz napak, ki so se pojavile med trenutno in zadnjo vožnjo; tako avtomehaniki ugotovijo, ali so napako pravilno odpravili način $08 - omogoči zunanji testni napravi kontrolo delovanja sistema ali posamezni komponenti vozila način $09 - prikaz standardnih informacij o vozilu (identifikacijska številka, verzija programske opreme na ECU enoti,...) način $0A - hrani seznam stalnih diagnostičnih kod napak v povezavi z emisijami, ki se morajo po navodilih CARB (Kalifornijski komite za ozračje) shraniti v neizbrisljiv pomnilnik 2.3.1. Uporaba načina $01 V primeru, da smo uspešno povezani z vozilom in želimo iz vozila razbrati podatek o trenutni hitrosti, je način povpraševanja sledeč. Pošljemo ukaz, ki je predpisan za trenutno hitrost. Ukaz je po standardu zapisan kot način delovanja 01 in z identifikacijsko številko 0D in nam vrne odgovor 1 zlog. Preverjali smo hitrost, ko je avto miroval, zato smo pričakovali odgovor 0 km/h. Pošljemo ukaz vozilu: > 01 0D Vozilo vrne rezultat: > 41 0D 0 Kot je razvidno nam vrne rezultat 3 zloge, prva dva zloga nam povesta, da gre za odgovor na zahtevo 01 (način) 0D (PID), zadnji zlog pa nam pove trenutno hitrost avtomobila v šestnajstiški obliki, v našem primeru 0 km/h - pretvorjeno v desetiško.

Stran 8 Nato smo se z avtom peljali in podali zahtevo za hitrost (01 0D) in pričakovali trenutno hitrost avtomobila. Pošljemo ukaz vozilu: > 01 0D Vozilo vrne rezultat: > 41 0D 9 Spet smo dobili odgovor v 3 zlogih. Če primerjamo odgovor, ko je bil avtomobil v mirujočem in sedaj, ko se je avto premikal, vidimo, da je trenutna hitrost 9 km/h. Ker bomo v svoji diplomski nalogi uporabil še druge zahteve, jih bomo predstavil kar na konkretnem primeru. V programu bomo uporabili zahteve za hitrost, temperaturo motorja, število vrtljajev na minuto in senzor, ki nam vrača pretok zraka (MAF, ang. mass air flow sensor), da bomo lahko preračunali trenutno porabo goriva na 100km. Za hitrost smo uporabo prikazali malo višje, tako da sedaj bomo avtomobilu poslali zahtevo za temperaturo motorja. Senzor nam vrača podatek v stopinjah Celzija, vendar vrnjen podatek moramo pretvoriti po enačbi, ki jo lahko vidimo v tabeli 2.1. Pošljemo ukaz vozilu: > 01 05 Vozilo vrne rezultat: > 41 05 76 Znova vidimo, da smo dobili odgovor v treh zlogih (povpraševanje za temperaturo motorja vrača odgovor enega zloga), kjer prva dva pomenita, da smo prejeli odgovor na povpraševanje (01 05), vrednost 76 pa nam pove dejanski rezultat povpraševanja. Rezultat 76 je v šestnajstiški obliki, zato ga moramo pretvoriti v desetiško obliko. Nato pa ga je še potrebno po enačbi preračunati, da dobimo temperature v stopinjah Celzija. 76 šestnajstiško pretvorimo v desetiško in dobimo, da je to 114. Enačba za izračun temperature motorja je, pri čem je A odgovor povpraševanja (v našem primeru 76 oz. 114 v desetiški obliki). Avtomobil smo testirali, ko še ni bil ogret na delovno temperaturo, zato tudi tako relativno nizka temperatura.

Stran 9 V naslednjih dveh primerih, povpraševanju za obrate na minuto in pretok zraka, moramo paziti, saj dobimo odgovor v dveh zlogih, ki jih je potem potrebno pravilno vstaviti v enačbo. Primer za število vrtljajev na minuto - avtomobil miruje na mestu (prosti tek). Pošljemo ukaz vozilu: > 01 0C Vozilo vrne rezultat: > 41 0C C 8C Kot smo prej opozorili, nam povpraševanje vrne 4 zloge, pri čemer sta prva dva odgovor na povpraševanje (01 0C), druga dva pa dejanski odgovor na povpraševanje. Odgovora C in 8C sta v šestnajstiški obliki, zato jih moramo pretvoriti v desetiško, da jih bomo lahko uporabili v enačbi. Enačba za izračun obratov na minuto pa je, pri čemer je A prvi zlog odgovora (C) in B drugi zlog odgovora (8C). Odgovor dobimo v vrtljajih na minuto (ang. revolutions per minute - RPM). C šestnajstiško pretvorimo v desetiško in dobimo, da je to 12. 8C šestnajstiško pretvorimo v desetiško in dobimo, da je to 140. Sedaj pretvorjene rezultate vpišemo v enačbo in preračunamo. Primer za pridobitev pretoka zraka. Pošljemo ukaz vozilu: > 01 10 Vozilo vrne rezultat: > 41 10 1 18 Spet dobimo odgovor 4 zloge, pri čemer prva dva zloga povesta, da gre za odgovor na povpraševanje (01 10), druga dva zloga pa pomenita dejanski rezultat, ki pa je spet zapisan v šestnajstiški obliki in ga je potrebno pretvoriti po enačbi, če želimo izvedeti, kakšen je pretok zraka. Enačba za pretok zraka je, pri čemer je A

Stran 10 prvi zlog odgovora (1) in B drugi zlog odgovora (18). Ko enačbo preračunamo, dobimo rezultat, kakšen je pretok zraka v gramih na sekundo. 1 šestnajstiško pretvorimo v desetiško in dobimo, da je to 1. 18 šestnajstiško pretvorimo v desetiško in dobimo, da je to 24. To so štirje primeri, ki jih bomo uporabljali skozi celo diplomsko nalogo. Pretok zraka potrebujemo za enačbo povprečne porabe na 100km, ki je opisana v poglavju 5. Tabela identifikacijskih številk (PID), ki jih lahko uporabimo za povpraševanje. Proizvajalcem ni potrebno upoštevati te tabele, zato nekatera izmed povpraševanj na avtomobilu ne delujejo. Tabela 2.1: Tabela identifikacijskih številk [2] Način PID Število vrnjenih zlogov Opis Enota Formula 01 05 1 Temperatura motorja C 01 0C 2 Vrtljaji na minuto RPM 01 0D 1 Hitrost vozila km/h 01 10 2 Pretok zraka g/s 01 11 1 Pozicija stopalke za plin %

Stran 11 3. MIKROKONTROLER ELM327 ELM327 je mikrokontroler podjetja Elm Electronics, ki nam omogoča komunikacijo med napravo (računalnikom, namenskim testerjem, telefonom,...) in novejšimi avtomobili, ki imajo OBD priključek. Komandni protokol ELM327 je eden izmed najbolj popularnih vmesnikov za komunikacijo med računalnikom in vozilom. ELM327 v originalu vsebuje mikročip PIC18F2480, izdelan v podjetju Microchip Technology in je eden izmed produktov za komunikacijo z OBD. Produkti se med seboj razlikujejo po različnih tipih protokolov, ki jih podpirajo. Trenutno najbolje mikrokontroler ELM327 nadomešča mikrokontroler STN1110. Ta omogoča enake ukaze kot ELM327, tako da ista programska oprema deluje tudi na STN1110. V primerjavi z ELM327 je veliko cenejši in ima tako boljšo strojno opremo (procesor, pomnilnik, itn.), hitrejše dostopanje do podatkov, Podpira vse trenutno podprte OBD-II protokole. Slika 3.1: Vmesnik ELM327 Podprti protokoli v ELM327: [11] SAE J1850 PWM (41.6 kbaud) SAE J1850 VPW (10.4 kbaud) ISO 9141-2 (5 baud init, 10.4 kbaud) ISO 14230-4 KWP (5 baud init, 10.4 kbaud) ISO 14230-4 KWP (fast init, 10.4 kbaud) ISO 15765-4 CAN (11 bit ID, 500 kbaud)

Stran 12 ISO 15765-4 CAN (29 bit ID, 500 kbaud) ISO 15765-4 CAN (11 bit ID, 250 kbaud) ISO 15765-4 CAN (29 bit ID, 250 kbaud) Naprava omogoča visoko hitrost prenosa podatkov (do 500 kb/sec), nizko porabo energije, avtomatsko iskanje protokolov in je lahko popolnoma prilagodljiv z AT ukazi. Nekateri izmed AT ukazov: [12] Z - ponastavi napravo ELM327 (ukaz ATZ) H1 - omogoči glavo odgovora, lažje prepoznamo odgovor - začetna dva zloga nam povesta, katero povpraševanje se je izvedlo (ATH1) SP - nastavitev protokola (ATSP1 - protokol 1) SPAH - avtomatsko iskanje protokola (ATSPAH) SThh - nastavitev odzivnega časa; hh - številka * 4mili sekunde (ATST50 - timeout 200ms) V našem avtomobilu smo morali preveriti, kateri protokol je pravilen, zato smo vpisali ukaze ATSP in nato preverili, ali dobimo odgovor. Pošljem ukaz vozilu: > ATSP1 Vozilo vrne rezultat: > ATSP 1 OK Nastavljen protokol SAE J1850. Zdaj smo morali preveriti ali protokol ustreza našemu vozilu, in sicer z standardnim ukazom za pridobitev hitrosti vozila. Pošljemo ukaz vozilu: > 01 0D Vozilo vrne rezultat: > 01 0D NO DATA V tem primeru vidimo, da izbrani protokol ne deluje, zato moramo poskusiti naslednjega. Preizkusili smo vse in ugotovili, da deluje le peti protokol - ISO 14230-4 KWP, od katerega smo dobili pravilen odgovor (vrne 01 0D 0), od vseh ostalih smo dobili odgovor NO DATA - ni podatka.

Stran 13 Pošljemo ukaz vozilu: > ATSP5 Vozilo vrne rezultat: > ATSP 5 OK Pošljemo ukaz vozilu: > 01 0D Vozilo vrne rezultat: > 01 0D 0 3.1. ELM327 kloni Verzija 1.0 mikrokontrolerja ELM327, ni imela implementiranega preprečevanja kopiranja, zato je bila izvorna koda iz mikročipa PIC skopirana. Sedaj to kodo uporabljajo Kitajci, da prodajajo naprave imenovane ELM327, ki pa vsebujejo staro programsko kodo verzije 1.0. Trenutna verzija originalnega mikrokontrolerja ELM327 je verzija 2.0, ki pa je ni možno kopirati. V mnogih primerih, kjer so uporabljeni kloni mikrokontrolerja ELM327, se pojavljajo napake, v nekaterih primerih pride tudi do poškodbe same naprave, ki vsebuje mikrokontroler ELM327 oz. poškodbe na avtomobilskem računalniku. Čeprav Kitajci spremenijo izpis verzije na trenutno verzijo ELM327, še to ne pomeni, da je koda v resnici najnovejša (še vedno je koda verzije 1.0), zato tudi vse funkcije, ki so podprte v novejši verziji (2.0), ne delujejo na tej napravi. Velikokrat pride do napak že pri samem povezovanju med napravo in avtomobilom. Napake se pojavljajo tudi pri izpisu napak, ki jih avto beleži ali kadar želimo diagnostične napake odpraviti. Ker programska oprema dovoljuje spreminjanje nekaterih parametrov v avtomobilu, mikrokontroler ELM327 z staro programsko kodo (verzije 1.0) pa tega ne podpira, pride znova do napake. V redkih primerih delajo vse funkcije, ki so podprte v priloženi programski opremi.

Stran 14 4. RASPBERRY PI Raspberry PI (v nadaljevanju RPi) je računalnik velikosti bančne kartice, ki ga je mogoče priklopiti na monitor ali televizijo ter ga z uporabo tipkovnice in miške uporabljati za namene pisanja, igranja igric ali gledanje multimedijskih vsebin. Razvili so dve vrsti RPi z oznakama model A in model B. Razlikujeta se v tem, da je model A cenejši, ima samo en USB priključek in nima internetnega priključka. Model B je malenkost dražji z dvema USB priključkoma in internetnim priključkom. Cena modela A je $25 + DDV ter modela B je $35 + DDV. V diplomski nalogi in v opisovanju je bil uporabljen model B. [3] V splošnem je bil ustvarjen, da bi ga lahko uporabljali v svetu, kjer računalnik ni nekaj vsakdanjega in bi se lahko tudi otroci ter vsi, ki so prikrajšani za uporabo računalnikov, naučili programirati oz. pisati in igrati igrice. Slika 4.1: Raspberry PI

Stran 15 4.1. Sestava RPi Ta majhen računalnik, velikosti 9 6 cm (brez pomnilniške kartice), je elektronsko vezje z naslednjimi priključki: napajalni priključek (micro USB) priključek za zunanjo pomnilniško kartico (SD) HDMI (High-Definition Multimedia Interface) priključek za prenos videa in zvoka internetni priključek (LAN) 2x USB priključek (universal serial bus) avdio priključek kompozitni video priključek (RCA Video) Slika 4.2: Kompozitni kabel (RCA) RPi poganja procesor ARM1176JZFS, z delovanjem na 700MHz in 512 MB pomnilniškega prostora (RAM). Na samem vezju so tudi led diode, ki nam prikazujejo, če RPi deluje pravilno. Ima tudi GPIO (General Purpose Input/Output) nožice, ki jih lahko uporabljamo za priključitev na zunanje naprave (druga električna vezja). Za napajanje RPi potrebujemo napetost 5V, ki ga priključimo z micro USB priključkom. Za optimalno delovanje potrebujemo vsaj 1A toka.

Stran 16 4.2. Uporaba RPi Za uporabo RPi potrebujemo pomnilniško kartico SD velikosti vsaj 1GB, HDMI kabel ali kompozitni kabel za sliko, avdio kabel, v primeru da ne uporabljamo HDMI, mrežni kabel UTP, tipkovnico, miško ter napajalni kabel. Na pomnilniško kartico moramo namestiti operacijski sistem, da lahko uporabljamo RPi. Poznamo več različnih distribucij operacijskih sistemov, ki se razlikujejo glede na uporabo. Nekatere distribucije operacijskih sistemov za RPi: Raspbian wheezy - trenutno najbolj uporabljena distribucija, ki je optimizirana različica OS Linux Debian poimenovana Raspbian. Vsebuje namizno okolje LXDE, ki je odprtokodno in se uporablja na operacijskih sistemih Linux in BSD. Arch Linux ARM - distribucija, katere osnova je Arch Linux. Uporablja se predvsem za končnega uporabnika, ki ne potrebuje namiznega okolja. Po navadi se uporablja za namenske skripte. V diplomski nalogi bomo uporabili to verzijo, saj ne potrebujemo namiznega okolja, ker bomo ob zagonu zagnali naš program. Pidora - je optimiziran za RPi na osnovi operacijskega sistema Fedora. 4.2.1. Namestitev OS Arch Linux ARM Postopek je napisan za operacijski sistem Windows 7. Iz spletne strani http://nigdzie.org/raspberrypi/images/archlinuxarm/archlinux-hf-2013-06- 06/archlinux-hf-2013-06-06.zip prenesemo skrčeno datoteko ZIP. Skrčeno datoteko ZIP razširimo z katerim koli programom za razširjanje datotek (v našem primeru bomo uporabili program WinZip) in shranimo datoteko Arch_Linux_ARM.iso na namizje. Nato prenesemo program Win32 Disk Imager s spletne strani http://sourceforge.net/settings/mirror_choices?projectname=win32diskimager&filename=a rchive/win32diskimager-v0.8-binary.zip. Po končanem prenosu razširimo datoteke na namizje v mapo Win32DiskImager. Po končanem postopku odpremo program (slika 4.2). Izberemo slikovno datoteko (.iso), ki smo jo prej razširili na namizje (Arch_Linux_ARM.iso), izberemo napravo (Device), v našem primeru pogon I:\. Na koncu kliknemo tipko Write, nas opozori pred izgubo vseh podatkov, kliknemo OK in počakamo, da konča z namestitvijo.

Stran 17 Slika 4.3: Program Win32 Disk Imager Priprava na delovanje RPi: vstavimo pomnilniško kartico (slika 4.3) z nameščenim operacijskim sistem (v našem primeru Arch Linux ARM) povežemo HDMI kabel z monitorjem in RPi priključimo internetno povezavo (LAN priključek) priključimo avdio kabel priključimo tipkovnico in miško v USB priključek priključimo napajalni kabel v micro USB priključek Slika 4.4: Pomnilniška kartica SD Ko priključimo napajalni kabel v električno omrežje, se RPi zažene. Na ekranu zagledamo logotip RPi (malino) ter vrstice kode, ki pripravljajo RPi za uporabo. Počakamo, da se vse naloži in od nas zahteva, da se vpišemo v sistem. Privzeto je nastavljeno uporabniško ime root in geslo root, tako da se vpišemo s temi podatki.

Stran 18 4.2.2. Spreminjanje nastavitev RPi Pri naši diplomski nalogi bomo morali spremeniti nekatere nastavitve RPi, kot so samodejni zagon v sistem (brez vpraševanja po uporabniškem imenu in geslu), spreminjanje tipkovnice, namestitev paketov za pravilno delovanje programskega jezika Python in avtomatski zagon skripte (python) ob zagonu RPi. 4.2.2.1. Samodejni vpis v sistem Ker se bo naša skripta morala zagnati ob zagonu RPi, moramo poskrbeti, da nas, ko se RPi naloži, ne vpraša po uporabniškem imenu in geslu. To storimo po naslednjem postopku. 1. Ustvarimo novo mapo z imenom getty@tty1.service.d v mapi /etc/systemd/system. To naredimo z ukazom: mkdir /etc/systemd/system/getty@tty1.service.d 2. Nato ustvarimo datoteko z imenom autologin.conf v novo ustvarjeni mapi. To naredimo tako, da vpišemo ukaz: nano /etc/systemd/system/getty@tty1.service.d/autologin.conf 3. Odpre se nam urejevalnik teksta. V to prazno datoteko vpišemo naslednje podatke: [Service] ExecStart= ExecStart=-/usr/bin/agetty --autologin root --noclear %I 38400 linux pri čemer je root uporabniško ime. Shranimo to datoteko z ukazom CTRL + S in nato zapremo urejevalnik z ukazom CTRL + X. 4. Ponovno zaženemo sistem z ukazom: shutdown -r now Ob naslednjem zagonu vidimo, da se nam ni potrebno več vpisati v sistem, ker za to poskrbi skripta, ki smo jo napisali prej.

Stran 19 4.2.2.2. Nastavitev tipkovnice Kot privzeta je nastavljena angleška tipkovnica, ki pa ima drugačno razporeditev znakov kot slovenska, zato je dobro (ni potrebno), če jo spremenimo, da lažje urejamo dokumente. Postopek za spreminjanje tipa tipkovnice je naslednji. 1. Urediti moramo datotek, v kateri je zapisano, kateri tip tipkovnice naj se uporablja. Ukaz da odpremo in uredimo to datoteko: nano /etc/vconsole.conf 2. Odpre se nam urejevalnik teksta. Poiščemo mesto, kjer piše KEYMAP in spremenimo trenutno vrednost v KEYMAP=slovenia 3. Ponovno zaženemo sistem z ukazom: shutdown -r now Po ponovnem zagonu sistema lahko preizkusimo tipkovnico, ko se sistem naloži in sicer s tipkami, kjer so šumniki in posebni znaki (shift + 4 nam izpiše $). 4.2.3. Namestitev paketov za programsko okolje Python Operacijski sistem Arch Linux ARM privzeto nima nameščenih paketov za programiranje v programskem jeziku Python, zato moramo namestiti določene pakete. Ker programski jezik Python sam po sebi ne omogoča programiranja serijskih vrat, moramo namestiti namensko knjižnico za uporabo le-te. Ker vse skupaj želimo uporabiti kot aplikacijo, moramo namestiti tudi knjižnico ki omogoča izris teksta in slik na ekran. Da namestimo programsko okolje Python vpišemo naslednji ukaz: pacman -S python2 Potrebujemo še knjižnico, ki omogoča programiranje serijskih vrat preko programskega okolja Python. To storimo z ukazom: pacman -S python2-pyserial Da bomo vse skupaj predstavili vizualno, pa potrebujemo knjižnico, imenovano PyGame. Namestimo jo z ukazom: pacman -S python2-pygame

Stran 20 Ko imamo nameščene vse tri podatkovne pakete, lahko začnemo s programiranjem v programskem okolju python. V primeru, da pri namestitvi naletimo na težave z namestitvijo (ni mogoče najti paketa - naslov ne obstaja), uporabite naslednje ukaze: pacman -Syy pacman Syu Ta dva ukaza posodobita celoten sistem in knjižnice, ki se uporabljajo z ukazom pacman. 4.2.4. Avtomatsko zaganjanje skripte Ker ob zagonu avtomobila, ne želimo vedno znova in znova zaganjati naše skripte (aplikacije), želimo, da se ob zagonu RPi skripta avtomatsko zažene. To naredimo tako, da ustvarimo novo bash skripto (zagonsko skripto) v direktoriju /etc/profile.d/. Ustvarimo datoteko z imenom StartScript.sh in sicer z ukazom: nano /etc/profile.d/startscript.sh [12] Odpre se nam urejevalnik besedil, v katerega vpišemo naslednje: #!/bin/bash python2 /boot/bc.py Kliknemo CTRL + X, vpraša nas ali želimo shraniti in to potrdimo z tipko Y (yes). Ime naše skripte, ki jo bomo zaganjali, je bc.py in se nahaja v mapi /boot/. Začetna beseda python2 pa nam pove, da bomo uporabili program python, ki bo zagnal našo skripto bc.py, ki je zapisana v programskem jeziku Python. Sedaj ponovno zaženemo RPi (z ukazom shutdown -r now) in počakamo, da se naloži do konca. Ko se vse naloži, vidimo, da se na koncu naloži tudi naša skripta.

Stran 21 5. IZRAČUN TRENUTNE PORABE Skoraj vsi novejši avtomobili imajo prikaz trenutne porabe na 100 kilometrov, zato je tudi en del te diplomske naloge uporabiti enačbo za izračun povprečne porabe. Z enačbo preračunamo, koliko galonov se porabi na miljo in nato vse skupaj pretvorimo v litre na kilometre. Enačba deluje zgolj za bencinsko gorivo. [5] Enačba: Obrazložitev enačbe: [5] MPG - galonov na milje (miles per galon) 14,7-14,7 gramov zraka na 1 gram bencina; idealno razmerje med zrakom in bencinom (zrak/bencin) 6,17 - gostota bencina 4,54 - gramov na kilogram - pretvorba VSS - hitrost vozila v kilometrih na uro 0,621371 - pretvorba iz milj na uro / kilometri na uro 3600 - sekunde v eni uri MAF - pretok zraka; 100 gramov na sekundo 100 - pretvorba iz 100 gramov na sekund na 1 gram na sekundo Na koncu vse skupaj pretvorimo iz galonov na milje v litre na kilometre po sledeči enačbi. Torej, če želimo pridobiti podatek o trenutni porabi, moramo v čim krajšem času pridobiti podatek o hitrosti in pretoku zraka, preračunati trenutno porabo po formuli in prikazati rezultat na zaslonu. V primeru, da avto nima podatka o pretoku zraka (MAF), lahko ta podatek izračunamo preko druge enačbe.

Stran 22 Enačbi: Obrazložitev prve enačbe: RPM - vrtljaji na minuto (ang. revolutions per minute) MAP - pritisk v razdelilniku (ang. manifold absolute pressure) IAT - temperatura vstopnega zraka (ang. intake air temp) Obrazložitev druge enačbe: IMAP - izračunano po prejšnji formuli VE - prostorninska učinkovitost (pri standardnih avtomobilih 65%, avti z višjimi zmogljivostmi pa cca 85%) ED - prostornina motorja (vsak avto različno) MM - molekulska masa zraka (28,97g/mol) R - bencinska konstanta (8.314 J/ K/mole)

Stran 23 6. PYTHON Python je programski jezik, ki ga je razvilo podjetje Python Software Foundation. Podprt je v večini operacijskih sistemov, kot so Windows, Linux, Mac OS X. Je popolnoma brezplačen, saj ima odprto kodno licenco. Trenutno najnovejša različica je 3.3, lahko pa izberemo tudi med starejšo različico 2.7. Verzija 2.7 je končna verzija različice Python2, vendar je še vedno v uporabi, saj nekatere knjižnice v novejši različici 3.x ne delujejo. Razlika med obema verzijama je tudi ta, da so spremenili nekatere osnovne ukaze, tako da moramo biti pozorni, ko programiramo. [6] Tako kot vsi drugi programski jeziki, ima Python na voljo veliko dodatnih različnih knjižnic za izboljšanje uporabniške izkušnje. V diplomski nalogi bomo uporabili verzijo 2.7 na operacijskem sistemu Arch Linux ARM za RPi. Programsko okolje Python pod operacijskim sistemom Linux lahko uporabljamo kot program,s katerim v terminalu napišemo ukaz Python, odpre se nam programsko okolje, v katero vpisujemo ukaze ali pa, da v datoteko vpišemo zaporedje ukazov, shranimo in na koncu zaženemo skripto. 6.1. Sintaksa programskega jezika Python V vsakem dokumentu, ki ga nato shranimo kot skripto Python, moramo na vrhu napisati naslednjo vrstico: #!/bin/bash S tem ukazom interpretiramo, kaj mora operacijski sistem narediti s skripto. V našem primeru mora prevesti skripto z vnaprej nameščenim programskim okoljem Python. Ne pisano pravilo je, da dokumente shranimo s končnico.py (Python), da je lažje prepoznavno.

Stran 24 6.2. Osnovni ukazi 6.2.1. Komentarji Poznamo eno vrstični in več vrstične komentarje. Če želimo v eni vrstici zapisati komentar, uporabimo simbol #, v primeru več vrstičnega komentarja pa uporabimo simbol '''. Primer: #eno vrstični komentar ''' več vrstični komentar''' 6.2.2. Izpis na ekran Velikokrat želimo nekatere podatke izpisati uporabniku na ekran. V primeru, da želimo izpisati naše ime, to storimo z ukazom print. print "Pozdravljen uporabnik" Na ekranu se bo izpisalo Pozdravljen uporabnik. Če želimo izpisati vrednost spremenljivke, to storimo tako: spremenljivka = "To je besedilo iz spremenljivke" print spremenljivka Na ekranu se izpiše: To je besedilo iz spremenljivke. V primeru, da želimo izpisati kombinirano, tekst in vrednost iz spremenljivke, to storimo tako: starost = 18

Stran 25 print "Uporabnik je star " + starost + " let" Na ekranu se izpiše: Uporabnik je star 18 let. 6.2.3. Spremenljivke in polja Spremenljivke ni potrebno v naprej definirati s tipom, tako da lahko shranimo poljuben tip v katerokoli spremenljivko. V primeru, da je v spremenljivko vpisan tekst, lahko do posameznih črk dostopamo po indeksih. Če želimo izvedeti velikost polja ali spremenljivke, uporabimo rezervirano besedo len. Primer, kjer izpišemo izbrane posamezne črke iz spremenljivke, v kateri je zapisan tekst. tekst = "Uporabnik" print "Posamezne črke so: " + tekst[0] + " ; " + tekst[3] + " ; " + tekst[8] Na ekranu se izpiše: Posamezne črke so: U ; r ; k Kot vidimo se indeksiranje začne z 0, tako da v primeru, če želimo prvi podatek v tekstu, moramo začeti z indeksom 0. Primer izpisa velikost teksta, uporabimo ukaz len. tekst = "Uporabnik" print "Dolžina teksta je: " + len(tekst) Na ekranu se izpiše: Dolžina teksta je: 9 V naslednjem primeru bo prikazano, kako shraniti več vrednosti v polje, dodati nove vrednosti, izbrisati vrednost, izpisati posamezno vrednost in izpisati vse skupaj. polje = ["Uporabnik", "racunalnik", 1234, 666]

Stran 26 print polje#izpišemo celotno polje print "Dolžina: " + len(polje) #izpišemo dolžino polja polje.append(333)#dodamo vrednost 333 na konec polja print polje#izpišemo celotno polje print "Dolžina: " + len(polje)#izpišemo dolžino polja polje.insert(2, "monitor")#dodamo vrednost monitor na 2 mesto v polju print polje#izpišemo celotno polje print "Dolžina: " + len(polje)#izpišemo dolžino polja polje.remove(666)#izbrišemo prvo vrednost 666 ki se pojavi v polju print polje#izpišemo celotno polje print "Dolžina: " + len(polje)#izpišemo dolžino polja polje.sort()#sortiramo celotno polje print polje#izpišemo celotno polje V našem primeru vidimo, da smo na začetku deklarirali polje s 4 elementi in nato vse skupaj izpisali. Izpisali smo tudi dolžino polja. Nato dodamo vrednost 333 na konec polja in ponovno vse skupaj izpišemo, tudi dolžino polja. V naslednjem koraku vstavimo vrednost monitor na 2 mesto v polju in celotno polje z dolžino izpišemo. Izbrišemo vrednost 666, ki se prva pojavi v polju, ter izpišemo vse podatke iz polja in njeno velikost. Na koncu sortiramo celotno polje in sortirano izpišemo. Na ekranu se nam prikaže: ['Uporabnik', 'racunalnik', 1234, 666] Dolžina: 4 ['Uporabnik', 'racunalnik', 1234, 666, 333] Dolžina: 5 ['Uporabnik', 'racunalnik', 'monitor', 1234, 666, 333] Dolžina: 6

Stran 27 ['Uporabnik', 'racunalnik', 'monitor', 1234, 333] Dolžina: 5 [333, 1234, 'Uporabnik', 'monitor', 'racunalnik'] 6.2.4. Pogojni stavki in zanke Delovanje je enako kot v drugih programskih jezikih, le sintaksa je drugačna. Pogojni stavki se izvajajo le ob izpolnjenem pogoju, zanke pa se izvajajo tako dolgo, dokler nek pogoj ni izpolnjen. 6.2.4.1. IF stavek V primeru bomo pokazali kako uporabiti pogojni stavek. starost = 23 if starost < 18: print "Mladoletnik" elif starost > 18 and starost < 27: print "Študent" else: print "Delavec" Izpis na ekran: Študent. V primeru vidimo, da smo uporabili tri pogojne stavke in sicer, če je starost manjša od 18, potem izpišemo Mladoletnik, če je starost med 18 in 27 potem izpišemo Študent, v primeru, da je karkoli drugega, pa izpišemo Delavec. 6.2.4.2. Zanke Predstavili bomo for in while zanki. V programskem jeziku Python lahko uporabimo tudi ugnezdene zanke - zanka v zanki. Zanka se izvaja tako dolgo, dokler neki pogoj ni izpolnjen ali pa zanko programsko prekinemo. Primer for zanke:

Stran 28 sadje = ['banana', 'jabolko', 'mango'] for indeks in range(len(sadje)): print 'Trenutno sadje : ', sadje[indeks] V primeru vidimo, da najprej ustvarimo polje s tremi elementi. Nato izvedemo for zanko, ki se bo izvajala tako dolgo, dokler se ne bo range funkcija zaključila (range funkcija deluje tako, da gre od začetka in do vrednosti, ki jo podamo kot parameter). V našem primeru vpišemo v range funkcijo kot parameter vrednost, ki nam ga vrne funkcija len - dolžina polja, v našem primeru 3. V zanki izpisujemo vrednosti iz polja, glede na trenutni indeks, ki ga obdelujemo. Izpis primera: Trenutno sadje : banana Trenutno sadje : jabolko Trenutno sadje : mango Primer While zanke stevec = 0 while (stevec < 3): print "Vrednost števca je: " + stevec stevec = stevec + 1 Ta primer prikazuje izpis števca v while zanki, ki se izvaja tako dolgo, dokler bo vrednost števca manjša od števila 3. Vrednost izpišemo in nato števcu prištejemo vrednost 1. Zanka se zaključi, ko ima števec vrednost 3. Izpis primera: Vrednost števca je: 0 Vrednost števca je: 1 Vrednost števca je: 2

Stran 29 6.2.5. Niti Niti se uporabljajo, ko želimo, da se nekatere stvari dogajajo ločeno od drugih. Na primer, da se izpis časa izvaja v drugi niti, kot izpis starosti uporabnika. Niti omogočajo hitrejše izvajanje programa, saj se niti med seboj ne čakajo. Če želimo v programskem okolju Python uporabiti niti, moramo vključiti knjižnico thread. V primeru spodaj je prikazano, kako vključiti knjižnico in uporabo niti. #!/usr/bin/python import thread, time# vključimo knjižnico za delo z nitmi in knjižnjico za čas (time) starost = 18 def prikazicas(): while(1): print time.strftime("%h:%m:%s") time.sleep(1)# počakamo 1 sekundo preden nadaljujemo while zanko def prikazistarost(): while(1): print "Starost je: " + starost time.sleep(0.5) thread.start_new_thread(prikazicas, ()) thread.start_new_thread(prikazistarost, ()) while(1): pass Če zaženemo to skripto, se nam najprej pokaže trenutni čas, nato se nam dva krat izpiše starost in vse skupaj se ponavlja (zaradi neskončnih zank), dokler skripte ne prekinemo. Čisto na začetku vidimo splošni zapis, da gre za skripto Python, v naslednji vrstici vključimo knjižnici thread (delo z niti) in time (delo z časom). Deklariramo spremenljivko z vrednostjo 18, nato pa deklariramo dve funkciji.

Stran 30 Prva funkcija prikazicas ima neskončno zanko, v kateri se izpisuje trenuten čas (pridobimo ga iz funkcije strftime, kot parametre moramo podati %H za uro, %M za minute in %S za sekunde), nato počaka 1 sekundo, preden ponovno izpiše trenutni čas. V drugi funkciji prikazistarost pa isto v neskončni zanki izpisujemo spremenljivko starost, ki smo jo deklarirali na začetku, nato počakamo 0.5 sekunde in spet izpišemo starost. Spodaj vidimo, da zaženemo nit z ukazom thread.start_new_thread, kot parameter pa podamo funkcijo, ki jo želimo izvajati. Če želimo videti izpise na zaslonu, moramo na koncu dodati neskončno zanko, ki izvaja našo skripto, dokler uporabnik tega ne prekine. Kot vidimo, imata funkciji časovni zamik, prikazicas ima 1 sekundo, prikazistarost pa 0.5 sekunde, zato tudi pridemo do odgovora, zakaj se izpiše čas en krat, nato pa starost dva krat in tako naprej. 6.2.6. Uporaba globalnih spremenljivk Če želimo uporabiti globalno spremenljivko v funkciji, moramo to tudi zapisati. To naredimo z rezervirano besedo global na naslednji način. #!/usr/bin/python globalnaspremenljivka = "vrednost" def funkcija():#definiramo funkcijo global globalnaspremenljivka globalnaspremenljivka = "nova vrednost" print globalnaspremenljivka funkcija() print globalnaspremenljivka Če zaženemo to skripto, se nam na ekranu izpiše: vrednost nova vrednost Če pogledamo kodo, vidimo, da na začetku deklariramo spremenljivko in ji priredimo tekst vrednost. Nato deklariramo funkcijo, v kateri nastavimo spremenljivki novo vrednost. V

Stran 31 nadaljevanju programa izpišemo spremenljivko, nato ji spremenimo vrednost s klicem funkcije ter spet izpišemo spremenljivko. V primeru, da ne napišemo besede global, se vrednost, čeprav se funkcija izvrši, spremenljivka ne spremeni, torej dobimo naslednji rezultat. vrednost vrednost 6.3. PySerial Ker se bomo povezovali iz avtomobilskega OBD-II priključka na računalnik preko USB priključka, potrebujemo program, s katerim bo mogoče komunicirati med obema napravama. Predstavljate si lahko tako, da računalnik pošlje povpraševanje avtomobilu in nato mu avtomobil vrne odgovor. Ker uporabljamo programski jezik Python, smo morali poiskati ustrezno knjižnico za uporabo. Uporabili smo knjižnico PySerial, ki jo je mogoče uporabiti od verzije 2.3 naprej in v verziji 3.x. Knjižnica deluje, tako kot Python, na skoraj vseh operacijskih sistemih, kot so Windows, Linux, Mac OS X,... Namestitev knjižnice smo predstavili v poglavju 4.2.3. Za uporabo knjižnice, jo je potrebno vključiti v skripto in sicer z imenom serial. [7] Povezovali se bomo preko računalniškega USB priključka, zato moramo vedeti, kako je naši napravi ime, da jo bomo lahko uporabili. Ker priključena naprava nima pravic za izvajanje, ji moramo pravice nastaviti. Da pogledamo, kako se naprava imenuje, odpremo terminal in vpišemo naslednji ukaz: ls /dev/tty* Izpišejo se nam vse naprave, ki se začnejo na tty. Kot lahko vidimo na SLIKI SPODAJ, je naša naprava čisto na koncu, poimenovana ttyusb0. Spremeniti moramo pravice, da bomo lahko preko naprave izvajali svoj program. To storimo z ukazom chmod, ki ga lahko nastavljamo samo, če smo superuser (root). sudo chmod +x /dev/ttyusb0

Stran 32 6.3.1. Uporaba PySerial Kot smo že omenili, za vključitev knjižnice PySerial v skripti je potrebno uporabiti besedo serial. import serial Da se povežemo na napravo, moramo vedeti ime naprave (ime serijskih vrat, port), s kakšno hitrostjo bomo delali (baudrate) in kako dolgo bo naprava čakala na odgovor (timeout). Enostaven primer uporabe za povpraševanje o hitrosti vozila v programskem jeziku Python. [8] #!/usr/bin/python import serial ser = serial.serial('/dev/ttyusb0', 38400, timeout=0.5) ser.write("01 OD") printf "Hitrost: " + ser.readline().split(' ') + " kmh" Če smo se uspešno povezali z vozilom, se nam na ekranu izpiše rezultat. Hitrost: 41 0D 16 kmh Ker nam avtomobil vrne šestnajstiško vrednost (v našem primeru 16), moramo pretvoriti to vrednost v desetiško, zato bomo ustvarili funkcijo, ki nam bo pretvorila vrednosti. Vidimo lahko tudi, da nam je vrnil tri podatke, ker pa vemo, da hitrost vrača odgovor v enem zlogu, lahko uporabimo za pretvorbo samo tretji zlog odgovora. Prvi zlog nam pove, da gre za odgovor, drugi pa PID povpraševanja. #!/usr/bin/python import serial def hextodec(hexvalue): tempvalue = float(int('0x' + hexvalue, 0)) return tempvalue ser = serial.serial('/dev/ttyusb0', 38400, timeout=0.5)

Stran 33 ser.write("01 OD") hexkmh = ser.readline().split(' ') KMH = hextodec(hexkmh[2]) printf "Šestnajstiška vrednost: " + hexkmh[2] printf "Hitrost: " KMH + " kmh" Med vožnjo zaženemo skripto in na zaslon dobimo rezultat: Šestnajstiška vrednost: 16 Hitrost: 22 kmh Kot vidimo, je pravilno pretvorilo iz šestnajstiškega števila (16) v desetiško (22) in izpisalo pravilen rezultat. 6.4. PyGame Knjižnica PyGame je namenjena ustvarjanju iger v programskem jeziku Python. Je zelo popularna knjižnica, saj lahko isto skripto poganjamo na različnih operacijskih sistemih kot so Windows, Linux, Mac OS X ter drugimi. Je brezplačna knjižnica in je bila predstavljena pod GPL licenco - omogoča ustvarjanje prosto dostopne kode ali pa igre, ki so licenčne. [9] V naši diplomski nalogi smo se odločili uporabiti knjižnico PyGame zato, ker moramo vizualno prikazovati podatke (hitrost, temperatura motorja, trenutna poraba goriva,...). Z knjižnico PyGame si bomo ustvarili novo okno, na katerem bomo prikazovali vse podatke. 6.4.1. Uporaba knjižnice PyGame Kot vsako knjižnico do sedaj, jo moramo vključiti v našo skripto. To naredimo tako, da uporabimo besedo pygame. Če želimo vso funkcionalnost knjižnice PyGame, moramo tudi inicializirati knjižnico. import pygame pygame.init() #inicializiramo knjižnico pygame

Stran 34 Če želimo ustvariti novo okno, moramo najprej definirati velikost okna (višino in širino) in izberemo želeno barvo ozadja. Da preprečimo zaprtje okna, naredimo neskončno zanko, v kateri pa se po navadi ujemajo dogodki, če pritisnemo tipko na miški ali tipkovnici. V zanki tudi osvežujemo trenutno prikazano okno. 6.4.2. Osnovno okno Primer osnovnega okna: [10] #!/usr/bin/python import pygame pygame.init() size = width, height = 512,384# width and height value backgroundcolor = (28,13,3)# RGB color screen = pygame.display.set_mode(size) screen.fill(backgroundcolor) pygame.display.set_caption("naslov okna") while(1): for event in pygame.event.get(): if event.type == pygame.quit: sys.exit() pygame.display.update() V tem primeru vidimo, da smo si na začetku shranili spremenljivko z imenom size, ki ima shranjen podatek o velikosti okna (širina in višina). Nastavili smo tudi barvo ozadja z RGB lestvico. Da priredimo oknu želeno velikost, uporabimo ukaz pygame.display_set_mode in kot argument podamo velikost okna. Z ukazom screen.fill napolnimo ozadje okna z barvo, ki jo podamo kot argument. Nastavimo še naslov okna z ukazom pygame.display.set_caption. V neskončni zanki pa ujemamo dogodke. V našem primeru, če se zgodi dogodek iz pygame.event.get, preverimo, ali smo kliknili na tipko zapri v

Stran 35 desnem zgornjem kotu. V primeru da smo, zapremo aplikacijo. Če nismo kliknili nobene tipke, aplikacija normalno deluje naprej. 6.4.3. Izpis podatkov Ker bomo v naši diplomski nalogi izpisovali podatke na zaslon, moramo ugotoviti, kako najlažje izpisati podatke na prej ustvarjeno okno. Med pregledovanjem dokumentacije, smo ugotovili, da si moramo nastaviti pisavo, ki jo bomo uporabili (vrsto in velikost pisave), nato pa z ukazom render izrisali našo pisavo na ekran. #!/usr/bin/python import pygame pygame.init() size = width, height = 512,384# width and height value backgroundcolor = (28,13,3)# RGB color fontcolor = (255,255,255) screen = pygame.display.set_mode(size) screen.fill(backgroundcolor) font = pygame.font.sysfont("arial", 40) text = font.render("pozdravljeni", True, fontcolor) screen.blit(text, (100,100)) while(1): for event in pygame.event.get(): if event.type == pygame.quit: sys.exit() pygame.display.update() Primer je podoben prejšnjemu, toda če pogledamo bolj podrobno, vidimo, da smo ustvarili novo spremenljivko fontcolor, ki bo služila za barvo pisave. V našem primeru smo nastavili belo barvo (po RGB lestvici je to 255,255,255). Ponovno nastavimo velikost okna

Stran 36 in barvo ozadja. Nato pa deklariramo novo spremenljivko font, v kateri imamo shranjene podatke o pisavi (vrsta pisave - v našem primeru Arial in velikost pisave - v našem primeru 40). V spremenljivko text shranimo podatke o izrisu pisave in sicer z ukazom font.render(), ki kot parametre sprejme tekst ki ga želimo izpisati (v našem primeru Pozdravljeni), z naslednjim parametrom nastavimo, ali želimo imeti ostre robe na črkah (v našem primer da), na koncu še nastavimo barvo pisave, ki pa smo jo shranili na začetku. Pisavo, ki jo želimo izrisati na ekran, prikažemo z ukazom screen.blit, ki sprejme kot argument spremenljivko, ki je tipa font.render (nastavili smo jo prej) in pa kje na ekranu (x in y os) se naj izris teksta pojavi (v našem primeru 100, 100). 6.4.4. Izris črt in likov Na ekranu ne želimo imeti samo besedila, zato bomo pokazali, kako je mogoče narisati črte in like (štirikotnik in krog). V naši diplomski nalogi smo uporabili črte, da smo prišli do lepšega uporabniškega vmesnika. #!/usr/bin/python import pygame pygame.init() size = width, height = 512,384# width and height value backgroundcolor = (28,13,3)# RGB color linecolor = 255,255,255) screen = pygame.display.set_mode(size) screen.fill(backgroundcolor) pygame.display.set_caption("naslov okna") pygame.draw.line(screen, linecolor, (200,100), (200,150), 2) pygame.draw.rect(screen, linecolor, (50, 100, 100, 150), 0) pygame.draw.circle(screen, linecolor, (300,300), 30, 2) while(1): for event in pygame.event.get(): if event.type == pygame.quit: sys.exit()

Stran 37 pygame.display.update() V tem primeru lahko vidimo, da smo dodali tri vrstice, ki se vse začnejo z pygame.draw. Razlikujejo se samo po nadaljevanju - v prvem primeru narišemo črto, tako da uporabimo pygame.draw.line, kot parameter pa sprejme, kam želimo narisati (na katero okno), barvo črte, začetno pozicijo črte (x, y os), končno pozicijo črte (x, y os) in debelino črte (v našem primeru 2). Eno vrstico nižje smo narisali štirikotnik, ki sprejme podobne parametre, torej, kam želimo narisati (na katero okno), barvo štirikotnika, štiri točke, ki predstavljajo štirikotnik (x1, x2 in y1, y2) ter kakšno debelino želimo imeti. V primeru, da pustimo 0, je štirikotnik zapolnjen z barvo, drugače pa je v notranjosti "prazen". V zadnjem primeru pa narišemo krog, ki sprejme kot parametre, kam ga želimo narisati (na katero okno), barvo kroga, pozicijo kroga (x, y os), premer kroga in debelino črte, ki označuje krog.

Stran 38 7. APLIKACIJA Naša aplikacija, ki je napisana v programskem jeziku Python, omogoča povezovanje in komuniciranje preko RPi na vozilo z OBD-II priključkom. V našem primeru je to Opel Corsa C 1.8, letnik 2002. Podatke bomo prikazovali na 4.3 paličnem zaslonu. Aplikacija je napisana po več sklopih - uporabljamo niti. Ob zagonu avtomobila, se RPi vključi in avtomatsko naloži v naprej naloženo aplikacijo. Aplikacija se imenuje bc (board computer - potovalni računalnik) in se uporablja v maksimiranem načinu (nima robov). Slika 7.1: Uporabniški vmesnik, način 0 Aplikacija se na začetku naloži v privzetem načinu (način 0, slika 7.1), ki prikazuje trenutni čas in datum. Načini so opisani spodaj. V ozadju se povezuje s serijskim vodilom (OBD-II) in v primeru, da se poveže, se nam nariše novi način (način 1). Z daljinskim upravljalnikom se lahko premikamo med načini (med 1 in 3). V primeru, da kliknemo tipko desno, se prestavimo na način 2 (če smo trenutno v načinu 1). Če ponovno stisnemo desno (smo v načinu 2), se prestavimo na način 3. In v zadnjem primeru, če kliknemo desno (trenutni način 3), se vrnemo v način 1. Enak, vendar v obratnem vrstnem redu, je postopek za tipko levo.

Stran 39 Slika 7.2: Uporabniški vmesnik, način 1 Različni načini nam omogočajo različno prikazovanje podatkov. Med načini se premikamo levo in desno s pomočjo daljinskega upravljalnika. Zaporedje načinov je v primeru klika desno 0 -> 1 -> 2 -> 3 -> 1 -> 2 -> 3 ->... V primeru levega klika pa je 0 -> 1 -> 3 -> 2 -> 1 ->3->... način 0: o zagonski način, ki prikazuje trenutno uro in datum; v tem načinu smo tako dolgo, dokler se naprava ne poveže z avtomobilom način 1 prikazuje (slika 7.2): o trenutno porabo goriva o porabo goriva na 100 kilometrov o povprečno hitrost (prevoženo od prejšnjega ponastavljanja podatkov) o trenutno hitrost vozila o temperaturo motorja o trenutni čas način 2 prikazuje (slika 7.3): o trenutno hitrost vozila o trenutno porabo goriva o temperaturo motorja o trenutni čas način 3 prikazuje (slika 7.4): o trenutne vrtljaje vozila o trenutno porabo goriva o temperaturo motorja o trenutni čas

Stran 40 Slika 7.3: Uporabniški vmesnik, način 2 Slika 7.4: Uporabniški vmesnik, način 3 7.1. Opis aplikacije 7.1.1. Postopek delovanja Zapisali bomo postopek, kako naj bi naša aplikacija delovala. začetek aplikacije nalaganje vseh modulov za pravilno delovanje (PyGame, PySerial, time, thread,...) definiranje globalnih spremenljivk, za uporabo le-teh v različnih funkcijah definiranje funkcij (pridobi podatke, izpis podatkov, povezovanje,...) definiranje niti glavna neskončna zanka 7.1.2. Uporabljeni moduli Za pravilno delovanje smo morali uporabiti naslednje module: sys - sistemske zahteve, kot je zapiranje aplikacije, pygame - modul, ki nam omogoča vizualno programiranje,

Stran 41 time - modul, ki pridobi trenutni čas procesorja in manipuliranje z njim, serial - modul za povezovanje s serijskimi napravami (v našem primeru OBD-II), thread - programiranje z nitmi, cpickle - manipuliranje s podatki (shranjevanje, nalaganje,...) os - delo z datotečnim sistemom preko programskega jezika Python (preverjanje ali neka pot obstaja) 7.1.3. Globalne spremenljivke Globalne spremenljivke uporabljene v programu: connectionstate - stanje povezanosti, stanje 1 - povezano, stanje 2 - ni povezave globalkmh - shranjena vrednost o trenutni hitrosti vozila globalmaf - shranjena vrednost o trenutnem pretoku zraka globalavgspeed - shranjena vrednost o povprečni hitrosti globalallspeed - shranjene vse vrednosti hitrosti od zagona aplikacije globalavgconsumption - shranjena vrednost o povprečni porabi goriva na 100 kilometrov globalallconsumption = shranjene vse vrednosti o trenutni porabi goriva ser - spremenljivka, ki ima shranjen objekt tipa serial - omogoča povezovanje in povpraševanje preko serijskega vodila screenposition - shranjen podatek, v katerem načinu smo 7.1.4. Funkcije Funkcije uporabljene v aplikaciji Opis vseh funkcij, ki smo jih uporabili v aplikaciji, njihovo delovanje in psevdokod. showwelcometime - funkcija prikaže tekst dobrodošlice, trenutno uro in datum o definiramo tekst, ki ga želimo izpisati (dobrodošlica) in njegovo pozicijo o ustvarimo zanko, ki se izvaja tako dolgo, dokler se naprava ne poveže z vozilom izbrišemo prejšnji čas in datum, da lahko na novo izpišemo nove podatke prikažemo trenutni čas prikažemo trenutni datum počakamo 0.5 sekunde

Stran 42 postopek ponavljamo, dokler se naprava ne poveže o v primeru, da se naprava uspešno poveže z vozilom, zaključimo trenutno nit connect - funkcija, ki se povezuje s serijskim vmesnikom (OBD-II) o definiramo serijski vmesnik z vsemi parametri (ime naprave, hitrost, odzivnost) o ustvarimo neskončno zanko, ki se izvaja tako dolgo, dokler nismo povezani vozilu pošljemo podatek in počakamo na odgovor v primeru, da ne dobimo pravilnega odgovora (NO_DATA), postopek ponovimo in nastavimo spremenljivko povezljivosti na 2 v primeru, da dobimo pravilni odgovor nastavimo globalno spremenljivko povezljivosti na 1 aktiviramo nove funkcije v novih nitih zaključimo trenutno nit showtime - prikazuje trenuten čas o ustvarimo neskončno zanko izbrišemo prejšnji čas, da lahko izpišemo novi trenutni čas izpišemo trenutni čas na določeni poziciji počakamo 0.1 sekunde getdata - pridobimo podatke iz vozila, to moramo narediti za vsak podatek posebej (hitrost, pretok zraka, vrtljaji na minuto, temperatura motorja) o ustvarimo neskončno zanko pošljemo povpraševanje počakamo na odgovor pretvorimo iz šestnajstiškega v dvojiško preko funkcije hextodec po potrebi izračunamo po enačbi shranimo v spremenljivko showdata - prikaži podatke na zaslonu, glede na izbrani način o ustvarimo neskončno zanko o preverimo v katerem načinu smo način 1

Stran 43 prikaži podatke o hitrosti preveri, ali obstaja podatek o pretoku zraka izračunaj povprečno porabo z uporabo hitrosti in pretoka zraka prikaži podatek o povprečni porabi prikaži podatek o temperaturi motorja izračunaj povprečno hitrost prikaži podatek o povprečni hitrosti izračunaj povprečno porabo na 100 kilometrov prikaži podatek o povprečni porabi na 100 kilometrov način 2 prikaži podatke o hitrosti preveri, ali obstaja podatek o pretoku zraka izračunaj povprečno porabo z uporabo hitrosti in pretoka zraka prikaži podatek o povprečni porabi prikaži podatek o temperaturi motorja izračunaj povprečno hitrost izračunaj povprečno porabo na 100 kilometrov način 3 prikaži podatke o vrtljajih na minuto preveri, ali obstaja podatek o pretoku zraka in trenutni hitrosti izračunaj povprečno porabo z uporabo hitrosti in pretoka zraka prikaži podatek o povprečni porabi prikaži podatek o temperaturi motorja izračunaj povprečno hitrost izračunaj povprečno porabo na 100 kilometrov saveaverage - shranimo podatke o povprečni hitrosti in povprečni porabi o ustvarimo neskončno zanko na pomnilniško kartico shranimo podatke o vseh hitrostih na pomnilniško kartico shranimo podatke o vseh trenutnih porabah

Stran 44 resetdata - izbrišemo čisto vse podatke, ki so bili shranjeni o počistimo polje, kjer so bili shranjeni vsi podatki o hitrostih o počistimo polje, kjer so bili shranjeni vsi podatki o trenutnih porabah o shranimo prazne podatke na pomnilniško kartico neskončna zanka v glavnem programu - čaka na aktivnosti, ki pridejo iz daljinskega upravljalnika o preverimo, ali je bila pritisnjena tipka desno o če je tipka bila pritisnjena preverimo v katerem načinu smo trenutno spremenimo način s povečanjem spremenljivke za 1 (v primeru, da smo v načinu 1 ali 2) ali jo nastavimo na 1 (v primeru, da smo v načinu 3) o tipka ni bila pritisnjena in nadaljujemo s preverjanjem o preverimo, ali je bila pritisnjena tipka levo o če je tipka bila pritisnjena preverimo, v katerem načinu smo trenutno spremenimo način s pomanjšanjem spremenljivke za 1(v primeru, da smo v načinu 2 ali 3) ali jo nastavimo na 3 (v primeru, da smo v načinu 1) o tipka ni bila pritisnjena in nadaljujemo s preverjanjem o preverimo, ali je bila pritisnjena tipka TAB o če je tipka bila pritisnjena aktiviramo funkcijo, ki izbriše vse podatke (funkcija resetdata) o tipka ni bila pritisnjena in nadaljujemo s preverjanjem 7.1.5. Psevdokod ustvarimo dve niti prva nit prikaže in izriše način 0 druga nit se začne povezovati na serijski vmesnik v primeru, da se ni mogoče povezati, ostanemo na načinu 0 - aplikacija se ne zapre

Stran 45 v primeru, da se uspešno povežemo s serijskim vmesnikom (OBD-II), preklopimo na način 1, aktiviramo štiri nove niti in zaključimo trenutne niti nove niti, ki so aktivirane: o prikaži trenutni čas - prikazuje in izrisuje trenutni čas v svoji niti o pridobi podatke - pridobivanje podatkov iz serijskega vmesnika pošlji povpraševanje avtomobilu počakaj na odgovor shrani odgovor v določeno spremenljivko postopek se ponavlja v neskončni zanki vsako povpraševanje se izvede posebej (hitrost, pretok zraka,...) o izpisuj podatke - izpisuje podatke iz spremenljivke pridobi podatke in jih prikaži na zaslonu ko pridobimo podatek o pretoku zraka in trenutni hitrosti, preračunamo povprečno porabo povprečno porabo in trenutno hitrost shranimo v polje iz polja, kjer so shranjeni podatki o vseh hitrostih in vseh povprečnih porabah, preračunamo povprečno hitrost in povprečno porabo na 100 kilometrov o shrani podatke - shranjevanje vseh hitrosti in povprečne porabe, ki so prikazane na zaslonu v datoteke, tako da jih lahko ob naslednjem zagonu uporabimo, da izračunamo povprečne hitrosti in povprečno porabo goriva v glavni niti se pa med tem časom izvede: o nalaganje prejšnjih podatkov o hitrosti in povprečni porabi, če obstajajo in preračunamo povprečno hitrost in povprečno porabo na 100 kilometrov o neskončna zanka, ki čaka na zunanje ukaze, ki jih pošljemo z daljinskim upravljalnikom (premikanje med meniji)

Stran 46 8. OPIS NAPRAV IN PRIKLOP SISTEMA V diplomski nalogi smo uporabili mini računalnik Raspberry PI, na katerem poganjamo aplikacijo, ki smo jo napisali. Vse skupaj se prikazuje na 4,3 paličnem zaslonu (slika 8.2). Za premikanje med različnimi načini prikazovanja podatkov uporabljamo daljinski upravljalnik (slika 8.3). Za napajanje je poskrbljeno v avtomobilu, tako da sistem začne delovati, ko prižgemo avtomobil. Slika 8.1: Potovalni računalnik v vozilu 8.1. Raspberry PI Ta mini računalnik smo opisali že prej v poglavju 4. Napravo smo morali povezati na 5V napetosti. To smo storili tako, da smo v avtomobilski vtikač z 12V napetosti vstavili adapter, ki

Stran 47 pretvori napetost iz 12V na 5V. Vtikač je oblikovan tako, da ima vhod navadni USB priključek. Napravo RPi in vtikač povežemo z micro USB kablom. 8.2. Multimedijski prikazovalnik Zaslon, ki smo ga uporabili je v diagonalo velikosti približno 11 cm (4,3 palcev). Zaslon potrebuje za svoje delovanje 12V napetosti, ki smo jo pridobili iz avtomobilskega vtikača, v katerega smo vstavili adapter za napajanje RPi. Ker ima RPi privzeto nastavljeno resolucijo 1920 * 1080, smo morali v konfiguraciji spremeniti na manjšo resolucijo, saj imamo manjši zaslon, ki ne podpira tako velike resolucije. Na zaslonu je možnost nastavljanja jezika, barve, kontrasta,... Za priključitev zaslona z RPi napravo smo uporabili kompozitni kabel. Konfiguracija RPi za delovanje na pravilni resoluciji. Slika 8.2: Multimedijski prikazovalnik 8.3. Daljinski upravljalnik Ker se moramo premikati med različnimi načini prikazovanja podatkov, smo uporabili daljinski upravljalnik. Tega povežemo na RPi z USB priključkom, ki ima infra rdečo povezavo med sprejemnikom (priključen na PRi) in oddajnikom (daljinski upravljalnik). Daljinski upravljalnik za svoje delovanje uporablja eno baterijo napetosti 3V. Slika 8.3: Daljinski upravljalnik