Radina radionica

Programiranje

OC dr Backup

Moja supruga i ja vodimo malu privatnu lekarsku ordinaciju. Napisao sam set softverskih rešenja za vođenje podataka o pacijentima i zakazivanje pregleda. Tako sam došao na ideju da napravim mali uređaj koji sve to objedinjuje u kompaktno rešenje koje se lako podešava i održava.

Cena mora da bude relativno niska da bi male ordinacije mogle da priušte. 

 Celo rešenje je sadržano u minijaturnom računaru veličine kutije cigareta sa dodatnim USB konektorom za eksternu USB memoriju na koju se podaci dupliraju. U slučaju bilo kakvih problema, moguče je jednostavno isključiti USB memoriju i koristiti sve podatke koji su u "doc" formatu (standardni word dokumenti). Potrošnja struje je mala i napajanje je jači punjač za telefon.

Zaštita ličnih podataka je od velikog značaja, pa da bi cena ostala niska i rešenje robusno i jednostavno, pristup preko interneta je onemogućen. Podacima se može pristupiti samo iz lokalne mreže. 

Ako ste zainteresovani za ovo rešenje, moguće je nadograditi dodatne servise kao što je sistem za zakazivanje pregleda, obaveštavanje o pacijentima na čekanju, automatsko generisanje kvartalne statistike dijagnoza i bilo šta drugo što Vam treba.

IOT projekat

Tehnologija poznata pod nazivom "Internet Of Things" je koncept koji, između ostalog, dozvoljava povezivanje i kontrolu kućnih uređaja. U tu svrhu sam napravio skup "opensource"projekata pod zajedničkim nazivom "Ohanacode IOT".

Počelo je kao želja da napravim nekoliko LED lampi koje bih mogao na jedno dugme da isključim. Sada imam, preko lokalne WiFi mreže povezane LED lampe, termostat, termometar, NTP sat koji se sinhronizuje preko interneta, ruter preko kojeg mogu da pristupim svim uređajima iz tog skupa, multimedijalni daljinski za računar i android aplikaciju koja služi za listanje svih uređaja iz Ujagaga IOT projekata. Svaki od uređaja ima svoj web interfejs pomoću kojeg se konfiguriše nakon što se na njega povežete preko web browser-a na lokalnoj mreži. Uređaji koriste čip ESP8266. Gotove module kupujem na AliExpress-u za oko 2 evra po komadu, a za napajanje koristim najjeftinije punjače za mobilni telefon. Napon po potrebi povećam koristeći jeftine DC/DC konvertore.

Svaki od uređaja sa ESP8266 modulom, nekonfigurisan daje sopstveni "WiFi Hotspot", a nakon povezivanja, kroz web interfejs je moguće konfigurisati uređaj da se poveže na lokalnu mrežu.

1. LED lampa dozvoljava regulaciju jačine osvetljenja ("dimmer")

2. Termometar samo prikazuje izmerenu temperaturu.

3. Termostat može da preko RELE-a upravlja nekakvim grejčem (kalorifer, bojler...)

4. Ruter može da se konfiguriše da na e-mail šalje eksternu IP adresu rutera, tako da možete da pristupite Ujagaga IOT Rruteru preko interneta i upravljate Vašim termostatima, lampama,... (Još nije završen)

5. "Lazy control" je aplikacija za daljinsku kontrolu multimedije računara. Ovoj aplikaciji se pristupa preko IP adrese računara na portu 4211.

6. "Ujagaga IOT Browser" je Android aplikacija preko koje možete da izlistate sve uređaje na lokalnoj mreži iz "Ujagaga IOT" projekata. Na taj način ne morate da imate sačuvane IP adrese uređaja niti moraju da budu statičke.

7. NTP sat se sinhronizuje preko interneta, tako da nije potrebno nikakvo podešavanje. Upravlja sa dva step motora koja okreću kazaljke. Krajnji dizajn sata je na korisniku.

 

Lazyfier daljinski upravljač za računar

Tražio sam na Google Play Store-u mutimedijalni daljinski upravljač sa minimalnim brojem komandi za PC sa podrškom za Linux. Sve što sam našao, nije startovalo dovoljno brzo jer sam želeo mogućnost da pauziram film ili muziku za nekoliko sekundi kad neko pozove Skype-om ili telefonom.

Zato sam sam napisao Python server i Android Aplikaciju. Aplikacija sadrži 2 razlicita rasporeda dugmića i nekoliko različitih boja za biranje izgleda. Inicijalno je potrebno pokrenuti server koji napravi konfiguraciju i prijavi korisniku naziv servera (ime mašine). U podešavanju Android aplikacije treba to ime izabrati. Na serveru može da se doda i lozinka kako bi se server zaštitio od neželjenog pristupa.

Server simulira unos sa multimedijalne tastature. Ako želite da testirate, na donjim linkovima možete preuzeti Android applikaciju, Linux ili Windows server. Dostupan je i izvorni kod klijenta i servera.

Android aplikaciju sam testirao na Android verziji 5.1 i 4.2. Trebalo bi da radi na bilo kojoj vecoj od 4.0.2.

Mali saveti: Pritiskom na taster za isključivanje se zatvara aktivni prozor, a dužim pritiskom se isključuje računar. Slično se ponašaju tasteri za premotavanje, kratki pritisak prebacuje na sledeći fajl, a dugi premotava. Prilikom korišćenja funkcije upravljanja kursorom (MOUSE), početna tačka je sredina ekrana kad se telefon postavi u horizontalni položaj. Naginjanjem telefona se pomera kursor.

Server sam testirao na Linux verziji XUbuntu 16, na 64-bitnom Windows7 i Windows 10. 

Linux version  Preuzmite Lazyfier server za Linux

windows version  Preuzmite Lazyfier server za Windows

Android app  Preuzmite Lazyfier klijent APK za Android  ili  instalirajte sa Play Store-a

Podsetnik za račune

Sve svoje račune plaćam preko interneta sa kućnog računara. Povremeno neki račun kasni i bude zaboravljen. Napisao sam aplikaciju u kojoj mogu da pribeležim koje sam račune platio čim ih platim. Posle datuma konfigurisanog za proveru, ako neki od računa nije plaćen, po uključenju računara iskoči obaveštenje. Klikom na dugme za konfiguraciju, otvara se tekstualni fajl koji sadrži spisak računa koji treba ispraviti prema potrebama. Plaćenim računima se u tom fajlu dodaje datum plaćanja. Na početku tekućeg meseca se konfiguracija za prethodni mesec arhivira, a novi fajl se kopira sa očišćenim datumima kako bi se proces ponovio za tekući mesec. Ako ne podešavate datum provere, podrazumevani je 19-ti u mesecu.

Možete preuzeti aplikaciju za Linux ili Windows, kao i izvorni kod u Python-u.

Napisao sam i onlajn servis dostupan svima.

Pravljenje USB uređaja

 

Odricanje od odgovornosti

U daljem tekstu je sažeto moje skromno iskustvo vezano za pravljenje hardvera na Atmel mikro kontrolerima i softverske podrške za USB uređaje na linux i windows operativnim sistemima. Tekst je namenjen da služi kao početnički vodič za pravljenje USB uređaja. Nadam se da će Vam skratiti vreme potrebno za rešavanje problema na tom polju. Ovde nije navedeno sve što treba da znate o USB uređajima. Ni u kom slučaju ne mogu da tvrdim da je moj tekst primenljiv na Vaš konkretan problem, niti da neće doći do materijalne štete praćenjem ovih instrukcija. Koristite na sopstvenu odgovornost.

 

Uvod u USB standard

USB uređaj može da bude klase HID, CDC, Miš, HUB, Vaša specifična klasa… Najviše sam koristio CDC i HID.

CDC uređaj je jednostavan za komunikaciju. Na linux operativnim sistemima se prepozna bez problema kao serijski uređaj tipa „/dev/ttyACM0”, ali na windows-u je potrebno pripremiti i drajver da bi se video kao, recimo „COM4”. U ovom trenutku, pretpostavljam da Vam to zvuči komplikovano, ali srećom postoje programi koji to odrade umesto Vas. CDC uređaj možete koristiti iz gotovih programa kao što su na linux-u GTKTERM ili HTERM, a na windows-u PUTTY, HTERM,...

HID uređaj zahteva pisanje sopstvenog programa za komunikaciju jer niti operativni sistem niti gotovi programi znaju kako ste Vi implementirali komunikacioni protokol. To će zavisiti od toga kako pripremite firmver mikro kontrolera. Meni je najjednostavnije bilo da napišem program u Python programskom jeziku jer je dosta dobro dokumentovan i jednostavan za korištenje.

Ako izaberete uređaj tipa MIŠ ili Tastatura, operativni sistem će sam instalirati drajvere koje već ima i preuzeti kontrolu nad uređajem. Da bi ste ga koristili iz Vašeg programa, morate da nađete način da operativnom sistemu kažete da otpusti uređaj, kako biste ga Vi preuzeli. To još nisam radio, pa ne mogu da pomognem.

Svaki USB uređaj, ima tzv. deskriptor koji „Host-u“ govori o detaljima uređaja. Ako je deskriptor takav da se uređaj ne identifikuje kao standardni miš, tastatura ili neki drugi osnovni uređaj, windows će Vas pitati za drajvere. Možete da ne implementirate deskriptor u kom slučaju windows neće ništa prijaviti, pa će na Vama biti da instalirate odgovarajući drajver.

Ako koristite Microchip-ov kontroler i neku od njihovih biblioteka, MLA ili Harmony, obično možete da nađete gotov drajver koji je već potpisan. Ako koristite Atmelov mikrokontroler više klase, priča je slična, ali ako upotrebite neki jeftiniji kontroler kao što je AtTiny, on nema  USB interfejs, pa možete USB funkcionalnost postići VUSB bibliotekom za softwersku emulaciju. VUSB biblioteka dolazi sa gotovim primerima koji se dosta jednostavno modifikuju.

 

CDC konfiguracija

Iako je najjednostavnija za komunikaciju jer ne morate da pišete dodatnu aplikaciju nego koristite gotov program za komunikaciju preko serijskog porta, na windows operativnom sistemu može da stvori dosta problema ako ste uređaj implementirali koristeći VUSB biblioteku. Drajver koji može da se nađe na netu ( http://www.recursion.jp/prose/avrcdc ) nije digitalno potpisan. Da bi ste koristili taj drajver na 64-bitnoj verziji windows-a, morate prilikom starta držati F8 i u boot meniju izabrati “Disable driver signing enforcement”. Naravno, možete koristiti i neki dodatni program za to. Na 32-bitnoj verziji windows 7, trebalo bi da prilikom instalacije drajvera možete da samo odaberete “Install anyway” kad prijavi da nije digitalno potpisan.

Na linux-u CDC uređaj jednostavno radi. Ipak imajte na umu, CDC uređaj je u stvari tretiran kao modem, pa može da prođe i do 10 sekundi dok modem manager osveži spisak prisutnih uređaja i Vaš uređaj bude dostupan.

 

HID konfiguracija

Iako nema puno gotovih programa za komunikaciju, relativno je jednostavno napisati aplikaciju za Vaš uređaj. Ima dosta gotovih primera za HID komunikaciju, a Python ima gotove module za to. Ono što je bitno da znate je da postoji dosta različitih biblioteka za rad sa HID uređajima (pisanje drajvera i aplikacije koja koristi taj drajver) a ovde ću navesti samo LibUSB jer pruža najjednostavnije rešenje.

Na linux operativnom sistemu, libusb biblioteka dolazi već instalirana i nema nikakavih problema sa korištenjem drajvera. Dovoljno je da napišete aplikaciju koja komunicira preko libusb sa Vašim uređajem.

Na windows-u, situacija je nešto komplikovanija. Potrebno je instalirati libusb-win32 paket. On dolazi sa InfWizard-om koji će Vam pomoći da napravite digitalno potpisani drajver za windows.

 

Hardverski identifikatori

Svaki USB uređaj ima hardverski identifikator proizvođača (Vid) i proizvoda (Pid). Oni se konfigurišu u samom firmveru mikrokontrolera. Gotovi primeri dolaze sa nekim slobodnim identifikatorima. Vi možete da ih promenite, ali problem nastaje ako se poklope sa nekim drugim uređajem koji koristite. Zbog toga se plaća sertifikacija identifikatora, kako bi se održala jedinstvena tabela uređaja i kako bi operativni sistemi umeli da uključe odgovarajuće drajvere. Za komercijalne urećaje je zato razvoj nesto skuplji, ali za hobi uređaje koje svakako koristite samo Vi, ostavite Vid koji dobijete uz primer, a slobodno promenite Pid. Na taj način ćete biti sigurni da niste potrefili proizvođački identifikator nekog komercijalnog uređaja, a možete da pravite više uređaja za ličnu upotrebu.

 

Pisanje aplikacije

Kao primer izrade USB uređaja može da Vam posluži moj USB puls generator za koji je kompletan projekat sa šemom i firmverom kontrolera dostupan besplatno. Nakon napravljenog uređaja, potrebno je pobrinuti se za drajver. Ako ste se odlučili za uređaj klase CDC, ostaje vam da pokrenete program za serijsku komunikaciju (HTERM, PUTTY, GTKTERM,...), a ako ste se odlučili za uređaj klase HID, neophodno će biti da napišete neku aplikaciju kako bi ste sa njim komunicirali.

Uz gotove primere firmvera, obično dolazi i primer aplikacije u C programskom jeziku. Meni je Python bio jednostavniji jer ima gotove module za to, pa je pisanje aplikacije svedeno na mnogo manje linija koda. Ovde ću navesti najbitnije delove koda kako bih Vam skratio vreme potrebno da ostvarite komunikaciju sa Vašim uređajem.

Koristio sam Python2.7, a nešto osnovnog koda bi izgledalo ovako:

from usb import core, util

VENDOR_ID = 0x16c0
PRODUCT_ID = 0x05dc
dev = None
dev_status_changed = False


def connect_to_dev():
    global dev
    global VENDOR_ID
    global PRODUCT_ID

    dev = core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)

    if dev is not None:
        dev.set_configuration()


def query_device(msg, value=0):
    global dev
    global dev_status_changed

    REQUEST_TYPE = 0x20
    HID_SET_PROTOCOL = 0x0b

    if dev is None:
        connect_to_dev()
        if dev is None:
            return None
        else:
            dev_status_changed = True

    cfg = dev.get_active_configuration()
    endpoint = cfg[(0, 0)][0]

    result = None

    try:
        dev.ctrl_transfer(REQUEST_TYPE, HID_SET_PROTOCOL, (value << 8) | msg, 0, 0)
        response = dev.read(endpoint.bEndpointAddress, 1)
        result = response[0]
    except core.USBError as e:
        print e

    # release the device
    util.release_interface(dev, endpoint)
    if result is None:
        if dev is not None:
            dev = None

    return result


my_msg = 0xAB
my_value = 0xCD

print query_device(my_msg, my_value)

Workspace switcher

Kod kuce i na poslu koristim linux, Xubuntu sa XFCE desktop okruženjem. Ono ima opcije za korištenje više radnih prostora ("workspace"), ali je teško razlikovati na kojem se trenutno radi.

Napisao sam skript koji prebacuje izmedju različitih radnih površina i u istop vreme menja boju panela radi lakšeg prepoznavanja aktivne radne površine. Samo pozovite skript sa brojem workspace-a koji želite. Na primer:

wswitch 1

da bi ste se prebacili na workspace broj 1. Brojevi idu od nule. bckgnd0.png, bckgnd1.png,... se koriste za postavljanje izgleda panela. Njih možete menjati po želji.

Script se oslanja na paket wmctrl, pa sam napravio debian paket koji može da se instalira i usput instalira i wmctrl. Izvorni kod i instalacioni debian paket za ovaj skript se nalaze na mom Github repozitorijumu. Prethodno spomenute slike za panel se nakon instalacije nalaze u "HOME" direktorijumu u podfolderu ".wswitch".

Quiet At Work

Ima dosta aplikacija na ovu temu, ali sam zeleo da napisem svoju jer na mom novom telefonu druge nisu radile. Lokacija se pokazala kao nepouzdana jer ne radi na svakom telefonu dobro, a i cesto je iskljucujem radi stednje baterije. WiFi ukljucujem na poslu, pa sam napisao aplikaciju koja preko detektovanih WiFi mreza odlucuje kad sam na poslu i utisava ton telefona kako nebih smetao kolegama. Mozete je skinuti sa play store-a. Dostupan je i sors kod na github-u.

program za deljenje sadrzaja ekrana

Povremeno mi ustreba da pratim delim sadrzaj ekrana kolegi na istoj LAN mrezi. Napisao sam python skript koji to radi. Radi na Linux-u ,Windows-u, a trebalo bi i na MacOsX-u. potrebno je samo pokrenuti skript sa:

python3 sharescreen.py

ili ako zelite da precizirate drugi port kao npr. 8900:

python3 sharescreen.py 8900

Skript ce sam instalirati potrebne biblioteke i pokrenuti se na trazenom portu. Nakon toga je samo potrebno pokrenuti web browser i otvoriti link sa IP adrese racunara koji deli ekran kao na primer: 192.168.0.10:9000