Slijede razlike između dviju inačica stranice
Starije izmjene na obje strane Starija izmjena Novija izmjena | Starija izmjena | ||
2018:karlo_siladi:projektni_zadatak [2018/06/06 23:29] ksiladi [Arduino Uno - Centralna jedinica] |
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. Odabrana je zbog svoje pristupačnosti, cijene, kratkog vremena razvoja, jednostavnosti korištenja te cijene. | + | 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 71: | 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 80: | 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 proizvodu. Napredak: 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> | ||