Sadržaj

Svrha projekta

Olakšati slijepim, slabovidnim i osobama s lošijim vidom kupovinu u trgovinama.

Korisnici projekta

Sustav je prvenstveno namijenjen slijepim, slabovidnim i osobama s lošijim vidom.

Pogodan je za korištenje svim ljudima u svrhu lakše identifikacije proizvoda.

Ciljevi projekta

Resursi

Očitavanje RFID oznake na proizvodima vršit će se RFID čitačem ID-12.

Informacije o proizvodu obrađivat će se na Arduinu.

Na Arduino će se priključiti MP3 modul za koji će glasovnim zapisima informirati korisnika o proizvodu.

Korisnik će informaciju primati korištenjem Android aplikacije, a veza između Arduina i Android uređaja ostvarit će se Bluetoothom V06.

Ograničenja

Nedovoljno brzo ažuriranje glasovnih zapisa prilikom promjene cijena i mjesta na kojima se nalazi proizvod.

Nemogućnost instaliranja aplikacije na iOS uređaje.

Glasnoća zvučnih zapisa može oštetiti sluh.

Ciljana skupina

Provedeno je malo istraživanje potencijalnih korisnika našeg sustava.

Prema podacima iz izvješća o osobama s invaliditetom u Hrvatskoj 2016. godine od oštećenja vida pati 17 377 ljudi, odnosno svaki 250. stanovnik Hrvatske od čega je 3326 osoba slijepo na oba oka. Prezbiopija ili starosna dalekovidnost dio je prirodnog procesa starenja oka. Počinje se javljati u ranim četrdesetim godinama. Prema popisu stanovništva iz 2011. godine je u Hrvatskoj bilo 4 284 889 stanovnika od čega čak 2 258 187 stariji od 40 godina što čini 52.7% stanovništva koji podliježu starosnoj dalekovidnosti. Upravo osobe koje imaju problema s vidom prilikom svakodnevne kupovine u dućanima teško ili nikako ne mogu pročitati cijenu proizvoda, informacije s deklaracije ili čak prepoznati o kojem se proizvodu radi. Cilj ovog projekta je projektirati sustav koji će slijepim, slabovidnim te osobama sa slabijim vidom pomoći prilikom kupovine. Ideja je da se na police gdje se sada nalaze papirići s cijenama i barkodovima doda RFID (Radio-frequency identification) oznaka koja sadrži jedinstveni broj proizvoda. Uređajem koji je projektiran moguće je takvu oznaku očitati nakon čega se na slušalice reproducira glasovna poruka koja sadrži osnovne informacije o proizvodu te lokaciju proizvoda. Uređaj se može bluetooth komunikacijom spojiti s pametnim telefonom pa se glasovna poruka reproducira i na njemu te se preko cijelog zaslona velikim fontom ispisuju osnovne informacije o proizvodu i cijena. Iz ranije navedenih podatak vidi se da je broj potencijalnih korisnika velik, a važno je naglasiti da sustav mogu koristi svi.

Projektiranje sustava

Ideja

Svaki proizvod i police imaju jedinstvene RFID pasivne oznake. Prilikom očitavanja RFID oznake na proizvodu uređaj započne reprodukciju glasovne poruke koja sadrži lokaciju proizvoda, ime proizvoda, ime proizvođača te cijenu samog proizvoda. Prilikom očitavanja RFID oznake na polici uređaj započne reprodukciju glasovne poruke koja sadrži lokaciju odnosno redni broj police. Svaki proizvod je jedinstven pa tako ima i jedinstven RFID identifikacijski broj zapisan na RFID oznaci. Uređaj ima mogućnost spajanja sa pametnim telefonom ili tabletom pomoću Android aplikacije. Prilikom očitanja RFID oznake prozivoda na zaslonu mobilnog uređaja se velikim fontom prikaže cijena proizvoda.

Sustav se sastoji od slijedećih podsustava:

Arduino Uno/Duemilanove - Centralna jedinica

Arduino Uno je razvojna platforma zasnovana na 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.

Specifikacije

Arduino Uno specifications

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

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, 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 SoftwareSerial koja se već nalazi u Arduino IDE.

RFID čitač

ID-12

RFID čitač ID-12 proizvođača ID Innovations namjenjen je za očitavanje 125kHz RFID oznaka. Ima ugrađenu antenu koja osigurava domet od oko 12cm. Približavanjem RFID oznake čitač prosljeđuje jedinstveni identifikacijski broj oznake asinkronom serijskom komunikacijom na Arduino Uno razvojnu platformu.

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

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.

kuciste.jpg

Komunikacija s vanjskim sustavima

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:

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/ .

Detaljne upute za instalaciju razvojnog alata Android Studio

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.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

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

<?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>

Baza podataka

@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;
    }
}

Sučelje za slanje upita na bazu

 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);
}

Bluetooth handler i reprodukcija zapisa

        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();

                            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;
                }
            };
        };