Korisnički alati

Site alati


2018:karlo_siladi:projektni_zadatak

Razlike

Slijede razlike između dviju inačica stranice

Poveznica na ovu usporedbu

Starije izmjene na obje strane Starija izmjena
Novija izmjena
Starija izmjena
2018:karlo_siladi:projektni_zadatak [2018/06/06 23:24]
ksiladi istrazivanje trzista
2018:karlo_siladi:projektni_zadatak [2023/06/19 18:11] (trenutno)
Redak 14: Redak 14:
   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Očitavati RFID oznake na proizvodima i policama.</​font>​   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Očitavati RFID oznake na proizvodima i policama.</​font>​
   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Sustav vraća glasovne upute koje sadrže lokaciju i informacije o proizvodu.</​font>​   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Sustav vraća glasovne upute koje sadrže lokaciju i informacije o proizvodu.</​font>​
-  * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Povezati sustav s Android aplikacijom ​Bluetoothom V06.</​font>​+  * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Povezati sustav s Android aplikacijom ​Bluetooth modulom HC-06.</​font>​
   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Unos glasovnih naredbi, prikaz cijene i proizvođača.</​font>​   * <font 14px/​Arial,​Helvetica,​sans-serif;;#​333333;;​white>​Unos glasovnih naredbi, prikaz cijene i proizvođača.</​font>​
  
Redak 54: Redak 54:
   * Bluetooth modul [[https://​www.olimex.com/​Products/​Components/​RF/​BLUETOOTH-SERIAL-HC-06/​resources/​hc06.pdf|HC-06]]   * Bluetooth modul [[https://​www.olimex.com/​Products/​Components/​RF/​BLUETOOTH-SERIAL-HC-06/​resources/​hc06.pdf|HC-06]]
  
-===== Arduino Uno - Centralna jedinica =====+===== Arduino Uno/​Duemilanove ​- Centralna jedinica =====
  
 Arduino Uno je razvojna platforma zasnovana na [[http://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf|ATmega328p]] mikrokontroleru. Ima 14 ulazno-izlaznih pinova (izvoda) od kojih 6 može biti iskorišteno za pulsno-širinsku modulaciju (engl. //​pulse-width modulation, PWM//), 6 analognih ulaza, kvarcni oscilator frekvencije 16MHz, USB konektor za spajanje s računalom, konektor za napajanje, ICSP ( In Circuit Serial Programming ) konektor te tipkalo za reset mikrokontrolera. Arduino Uno je razvojna platforma zasnovana na [[http://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf|ATmega328p]] mikrokontroleru. Ima 14 ulazno-izlaznih pinova (izvoda) od kojih 6 može biti iskorišteno za pulsno-širinsku modulaciju (engl. //​pulse-width modulation, PWM//), 6 analognih ulaza, kvarcni oscilator frekvencije 16MHz, USB konektor za spajanje s računalom, konektor za napajanje, ICSP ( In Circuit Serial Programming ) konektor te tipkalo za reset mikrokontrolera.
Redak 62: Redak 62:
 {{:​2018:​karlo_siladi:​uno_specifications.png?​nolink&​436x500|Arduino Uno specifications}} {{:​2018:​karlo_siladi:​uno_specifications.png?​nolink&​436x500|Arduino Uno specifications}}
  
-U našem sustavu Arduino Uno je centralna jedinica koja je zadužena za komunikaciju s ostalim podsustavima.+U našem sustavu Arduino Uno/​Duemilanove ​je centralna jedinica koja je zadužena za komunikaciju s ostalim podsustavima. Odabrana je zbog svoje pristupačnosti,​ cijene, kratkog vremena razvoja, jednostavnosti korištenja te cijene.
  
 ====== mp3 modul DFPlayer YX5200 ====== ====== mp3 modul DFPlayer YX5200 ======
Redak 70: Redak 70:
 ==== Komunikacija ==== ==== Komunikacija ====
  
-Komunikacija s modulom se ostvaruje asinkronom serijskom UART komunikacijom. Potrebne su dva digitalna izvoda: Tx i Rx na Arduinu koji se spajaju na Rx i Tx izvode (UOČI: Rx→Tx; Tx→Rx) na mp3 modulu. Za rad mp3 modula potrebno je dovesti i napajanje (GND i +5V) s Arduino Uno razvojne platforme. Na Arduino Uno razvojnoj platformi odnosno na ATmega328p mikrokontroleru postoji sklopovlje za asinkronu serijsku komunikaciju koje je spojeno na USB kako bi se mogla ostvariti komunikacija s računalom. Zbog uhodavanja i nadogradnje sustava asinkrona serijska komunikacija sa mp3 modulom ostvarit će se programski. Pritom će se koristiti ugrađena biblioteka [[https://​www.arduino.cc/​en/​Reference/​SoftwareSerial|SoftwareSerial]] koja se već nalazi u Arduino IDE.+Komunikacija s modulom se ostvaruje asinkronom serijskom UART komunikacijom. Potrebne su dva digitalna izvoda: Tx i Rx na Arduinu koji se spajaju na Rx i Tx izvode (UOČI: Rx→Tx; Tx→Rx) na mp3 modulu. Za rad mp3 modula potrebno je dovesti i napajanje (GND i +5V, može i 3v3) s Arduino Uno razvojne platforme. Na Arduino Uno razvojnoj platformi odnosno na ATmega328p mikrokontroleru postoji sklopovlje za asinkronu serijsku komunikaciju koje je spojeno na USB kako bi se mogla ostvariti komunikacija s računalom. Zbog uhodavanja i nadogradnje sustava asinkrona serijska komunikacija sa mp3 modulom ostvarit će se programski. Pritom će se koristiti ugrađena biblioteka [[https://​www.arduino.cc/​en/​Reference/​SoftwareSerial|SoftwareSerial]] koja se već nalazi u Arduino IDE.
  
 ===== RFID čitač ===== ===== RFID čitač =====
Redak 79: Redak 79:
  
 ==== MFRC522 ==== ==== MFRC522 ====
 +
 +MFRC522 modul je RFID čitač/​pisač proizvođača NXP Semiconductors koji je namijenjen za očitavanje pasivnih RFID oznaka propisanih ISO/IEC 14443 protokolom. Komunikacija između modula i RFID oznaka se odvija na 13.56 MHz. Komunikacija je ostvarena SPI komunikacijom linijama: MISO, MOSI, SS, CLK. Nedostatak: mali domet. Napredak: Zapis info o proizvodima na RFID oznaku (engl. //tag//). Napajanje 5V ili 3v3. S 5V ostvaren nešto veći domet.
 +
 +===== Bluetooth modul =====
 +
 +Bluetooth modul HC-06. Odabran zbog jednostavnog rukovanja. Serijska komunikacija izvedena softverski. Jednostavno spajanje na Android mobilnoj aplikaciji.
 +
 +===== Shema spajanja sustava =====
 +
 +{{:​2018:​karlo_siladi:​shema_sustava2.png?​nolink&​400x285}}{{ ​ :​2018:​karlo_siladi:​sustav_ozicenje.png?​nolink&​400x284}}
 +
 +
 +====== Prototipno kućište ======
 +
 +Uređaj je prenosiv pa je napajanje izvedeno baterijom nazivnog napona 9V. Napredak: punjive baterije, prekidač
 +
 +Za lakše rukovanje sustav je smješten u plastično kućište. Zbog malog dometa RFID čitača isti je postavljen izvan kućišta. Također izvan se nalaze i slušalice.
 +
 +{{:​2018:​karlo_siladi:​kuciste.jpg?​nolink&​300x400|kuciste.jpg}}
  
 ====== Komunikacija s vanjskim sustavima ====== ====== Komunikacija s vanjskim sustavima ======
  
-Ako dođe do greške prilikom povezivanja preko bluetooth veze, sustav može komunicirati izravno nakon očitavanja jedinstvenog koda proizvoda preko .mp3 modula.+Uređaj se povezuje s mobilnom aplikacijom pomoću Bluetooth komunikacije. Napredak: koristiti BLE zbog manje potrođnje 
 + 
 +Ako dođe do greške prilikom povezivanja preko bluetooth veze, sustav može komunicirati izravno nakon očitavanja jedinstvenog koda proizvoda preko .mp3 modula ​odnosno reproducirati glasovni zapis s informacijama o proizvoduNapredak: baza glasovnih zapisa na vanjskom poslužitelju. Snimanje zapisa na samom uređaju. 
 + 
 +====== Android aplikacija ====== 
 + 
 +Kod je dostupan na sljedećoj poveznici: http://​pametne-kuce.zesoi.fer.hr/​lib/​exe/​fetch.php?​media=2018:​karlo_siladi:​spvp_apk.zip 
 + 
 +Struktura aplikacije je prikazana na slici: 
 + 
 +{{:​2018:​karlo_siladi:​struktura_apk.png?​direct&​500x384}} 
 + 
 + 
 +===== Android Studio ===== 
 + 
 +Za izradu Android aplikacije potrebno je instalirati razvojni alat Android Studio. Najnovija verzija trenutno je 3.1.3. a dostupna je za preuzimanje na sljedećoj poveznici:​[[https://​developer.android.com/​studio/​|https://​developer.android.com/​studio/​]] . 
 + 
 +Detaljne upute za instalaciju razvojnog alata Android Studio 
 + 
 +[[https://​developer.android.com/​studio/​install|https://​developer.android.com/​studio/​install]] 
 + 
 + 
 +==== Kreiranje projekta ==== 
 + 
 +Nakon uspješne instalacije razvojnog alata potrebno je kreirati novi Android projekt. Kod stvaranja projekta potrebno je unijeti proizvoljno ime projekta. Korišteno ime je SPVP_projekt . Stvara se novi direktorij istog imena u kojeg se spremaju programski kodovi, biblioteke te resursi potrebni za aplikaciju. Nakon toga potrebno je unijeti verziju platforme za koju se projekt izrađuje. Odabrana je verzija API: 19 Android 4.4 (KitKat) što je relativno stara verzija Android operacijskog sustava, ali je time omogućeno da se aplikacija može pokretati na većini mobilnih uređaja jer je pokretanje moguće i na svim novijim verzijama Androida. 
 + 
 +Pri kreiranju novog projekta, stvoren je novi Activity koji prikazuje grafičko sučelje koje vidi korisnik pri pokretanju aplikacije. Potrebno je odabrati Empty Activity i dodijeliti mu naziv MainActivity. 
 + 
 +=== AndroidManifest.xml === 
 + 
 +Kako bi aplikacija ispravno radila potrebno je u datoteku AndroidManifest.xml dodati potrebne dozvole za korištenjem Bluetooth sučelja. 
 + 
 +<​code>​ 
 +<​uses-permission android:​name="​android.permission.BLUETOOTH"​ /> 
 +<​uses-permission android:​name="​android.permission.BLUETOOTH_ADMIN"​ /> 
 +</​code>​ 
 + 
 +Potrebno je i navesti sve Activity java razrede koji se koriste u aplikaciji. Korišteni su MainActivity , ProductInfoActivity i ProjectAboutActivity. 
 + 
 +Oznakom intent-filter daje se do znanja Androd OS-u koju Activity treba pokrenuti prilikom pokretanja aplikacije. U manifestu se još navode i korištene ikone. 
 + 
 +=== Struktura proizvoda === 
 + 
 +<​code>​ 
 +<?xml version="​1.0"​ encoding="​utf-8"?>​ 
 +<​manifest xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​ 
 +    package="​com.example.karlosiladi.bazapodataka">​ 
 + 
 +    <​uses-permission android:​name="​android.permission.BLUETOOTH_ADMIN"​ /> 
 +    <​uses-permission android:​name="​android.permission.BLUETOOTH"​ /> 
 + 
 +    <​application 
 +        android:​allowBackup="​true"​ 
 +        android:​icon="​@mipmap/​ic_launcher_spvp"​ 
 +        android:​label="​@string/​app_name"​ 
 +        android:​roundIcon="​@mipmap/​ic_launcher_spvp_round"​ 
 +        android:​supportsRtl="​true"​ 
 +        android:​theme="​@style/​AppTheme">​ 
 +        <​activity android:​name="​.ProductInfoActivity"​ /> 
 +        <​activity 
 +            android:​name="​.MainActivity"​ 
 +            android:​label="​@string/​title_activity_main"​ 
 +            android:​screenOrientation="​landscape"​ 
 +            android:​theme="​@style/​AppTheme.NoActionBar">​ 
 +            <​intent-filter>​ 
 +                <action android:​name="​android.intent.action.MAIN"​ /> 
 +                <​category android:​name="​android.intent.category.LAUNCHER"​ /> 
 +            </​intent-filter>​ 
 +        </​activity>​ 
 +        <​activity android:​name="​.ProjectAboutActivity"​ /> 
 +    </​application>​ 
 + 
 +</​manifest>​ 
 +</​code>​ 
 + 
 +=== Baza podataka === 
 + 
 +<​code>​ 
 +@Database(entities = {Products.class},​ version = 1, exportSchema = false) 
 +public abstract class ProductDatabase extends RoomDatabase { 
 + 
 +    private static final String DATABASE_NAME = "​products_db";​ 
 +    private static ProductDatabase INSTANCE; 
 +    public abstract DaoAccess daoAccess() ; 
 + 
 +    public static ProductDatabase getProductDatabase(Context context) { 
 +        if (INSTANCE == null) { 
 +            INSTANCE = 
 +                    Room.databaseBuilder(context.getApplicationContext(),​ ProductDatabase.class,​ DATABASE_NAME) 
 +                            .allowMainThreadQueries() 
 +                            .build(); 
 +        } 
 +        return INSTANCE; 
 +    } 
 + 
 +    public static void destroyInstance() { 
 +        INSTANCE = null; 
 +    } 
 +
 +</​code>​ 
 + 
 +=== Sučelje za slanje upita na bazu === 
 + 
 +<​code>​ 
 + ​public interface DaoAccess { 
 +    @Insert 
 +    void insertSingleProduct (Products product); 
 +    @Insert 
 +    void insertMultipleProducts (List<​Products>​ productsList);​ 
 +    @Query("​SELECT * FROM Products WHERE productId = :​productId"​) 
 +    Products fetchProductByProductId (String productId);​ 
 +    @Query("​SELECT * FROM Products"​) 
 +    List<​Products>​ getProducts();​ 
 +    @Update 
 +    void updateProduct (Products product); 
 +    @Delete 
 +    void deleteProduct (Products product); 
 +
 +</​code>​ 
 + 
 +=== Bluetooth handler i reprodukcija zapisa ===
  
-======   ​======+<​code>​ 
 +        h new Handler() { 
 +            public void handleMessage(android.os.Message msg) { 
 +                switch (msg.what) { 
 +                    case RECIEVE_MESSAGE:​ 
 +                        byte[] readBuf ​(byte[]) msg.obj; 
 +                        String strIncom ​new String(readBuf,​ 0, msg.arg1);​ 
 +                        sb.append(strIncom);​ 
 +                        int endOfLineIndex ​sb.indexOf("​\r\n"​);​ 
 +                        if (endOfLineIndex>​ 0) { 
 +                            String sbprint ​sb.substring(0,​ endOfLineIndex);​ 
 +                            sb.delete(0,​ sb.length());​ 
 +                            //​Toast.makeText(MainActivity.this,​ "From Arduino: " + sbprint, Toast.LENGTH_SHORT).show();​
  
-====== ​Plan projekta ======+                            if(mPlayer !null) { 
 +                                mPlayer.stop();​ 
 +                            } 
 +                            Products product ​db.daoAccess().fetchProductByProductId(sbprint);​ 
 +                            if(product ​== null){ 
 +                                Toast.makeText(MainActivity.this,​ "Ne postoji proizvod s ID: "+ sbprint +" u bazi proizvoda!",​ Toast.LENGTH_SHORT).show();​ 
 +                               // mPlayer ​MediaPlayer.create(MainActivity.this,​ R.raw.error_sound);​ 
 +                               // mPlayer.start();​ 
 +                                mPlayer ​MediaPlayer.create(MainActivity.this,​ R.raw.nemaubazi);​ 
 +                                mPlayer.start();​ 
 +                                productNameTextView.setText("​Skeniraj sljedeći proizvod..."​);​ 
 +                                productPriceTextView.setText(""​);​ 
 +                            } else { 
 +                                productNameTextView.setText(product.getProductName());​ 
 +                                productPriceTextView.setText(product.getProductPrice());​ 
 +                                String id product.getProductId();​ 
 +                                int res MainActivity.this.getResources().getIdentifier("​t"​+id,​ "​raw",​ MainActivity.this.getPackageName());​ 
 +                                if(res !0) { 
 +                                    mPlayer ​MediaPlayer.create(MainActivity.this,​ res); 
 +                                    mPlayer.start();​ 
 +                                } 
 +                            } 
 +                        } 
 +                        break; 
 +                } 
 +            }; 
 +        }; 
 +</​code>​
  
  
2018/karlo_siladi/projektni_zadatak.1528320286.txt.gz · Zadnja izmjena: 2023/06/19 18:10 (vanjsko uređivanje)