10 септембар 2017

Arduino Joystick + OLED 128x64 LCD I2C Display

Ovim jednostavnim primerom prikazano je na koji način je moguće vizuelno prikazati vrednosti očitavanja na analognim ulazima Arduino mikrokontrolera.

Korišćen hardver: 

- Arduino Duemillanove
- Dual Axis Joystick Module
- 0.96" OLED LCD Display Module I2C

Očitavanje analognih vrednosti sa joystick-a je preko pinova A0 (x-osa) i A1 (y-osa). Princip je isti kao i kod običnog potenciometra - ovde ih praktično ima dva, po jedan za svaku osu.
Joystick ima i jedan taster koji je u primeru povezan kao digitalni ulaz 4 na Arduino mikrokontroleru.
0.96" OLED LCD Display Module je jedan od retkih I2C Display modula i povezuje se korišćenjem samo dve žice - SDA (A4) i SCK (A5). Naravno, neophodno je i napajanje, koje za ovaj model displeja iznosi 5V.

Šema povezivanja:





Neophodne biblioteke za OLED display mogu se preuzeti sa sledećih linkova:
SSD1306 library
GFX library

Izvorni kod:


#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const int buttonPin = 4;
Adafruit_SSD1306 display(0);
void setup() {
  pinMode(buttonPin, INPUT_PULLUP); //joystick button
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialization
  display.clearDisplay();
}
void loop() {
  bool button = digitalRead(buttonPin);
  int x = analogRead(A0);
  int y = analogRead(A1);
  f_drawJoystickInfo(button, x, y);
}
void f_drawJoystickInfo(bool button, int x, int y) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Joystick");
  display.println("    test");
  display.println();
  display.print("X: ");
  display.println(x);
  display.print("Y: ");
  display.println(y);

  if(!button) {
    display.setCursor(0, 54);
    display.setTextColor(BLACK, WHITE);
    display.print("Button");
  }
  int x1 = map(x, 0, 1023, display.width() - 60 - 2, display.width() - 2);
  int y1 = map(y, 0, 1023, display.height() - 60 - 2, display.height() - 2);
  display.drawRect(display.width() - 60 - 2, display.height() - 60 - 2, 60, 60, WHITE);  //draw frame
  display.drawLine(x1, y1 - 2, x1, y1 + 2, WHITE);  //draw joystick position inside frame
  display.drawLine(x1 - 2, y1, x1 + 2, y1, WHITE);

  display.display();
}

Demo video:


23 март 2016

Lokalni hosting dva sajta - Debian 8/Apache2 konfiguracija


Za razvoj veb aplikacija uglavnom je dovoljna standardna instalacija veb servera, bez dodatnih intervencija. Ali, ukoliko se ukaže potreba za hostovanjem više od jednog sajta na lokalnom serveru, potrebna je malo drugačija konfiguracija.
Naredni primer pokazuje način konfiguracije Apache 2.4.10 veb servera na Debian 8 (64-bit) sistemu, za dva lokalna veb sajta.

Server na kome je testirana ova konfiguracija nazvan je webserver.test.mreza, korisnik je dogriz, a IP adresa je 192.168.0.102.
Zbog jednostavnosti, sajtovi su nazvani sajt1 i sajt2, a tako su kreirani i potrebni direktorijumi u fajl sistemu:
/home/dogriz/www/sajt1/
/home/dogriz/www/sajt1/index.html
/home/dogriz/www/sajt1/logs/

/home/dogriz/www/sajt2/
/home/dogriz/www/sajt2/index.html
/home/dogriz/www/sajt2/logs/

Sadržaj fajla /home/dogriz/sajt1/index.html:
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Sajt 1</title>
</head>
<body>
  <h1>Sajt 1</h1>
  <p>Trenutno se nalazite na sajtu 1</p>
</body>
</html>

Sadržaj fajla /home/dogriz/sajt2/index.html:
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Sajt 2</title>
</head>
<body>
  <h1>Sajt 2</h1>
  <p>Trenutno se nalazite na sajtu 2</p>
</body>
</html>

U narednom koraku proveriću trenutnu konfiguraciju servera:
$ sudo apachectl -t -D DUMP_VHOSTS
VirtualHost configuration:
*:80      webserver.test.mreza (/etc/apache2/sites-enabled/000-default.conf:1)
Po defaultu, apache je podešen da prikaže početnu stranu koja je sačuvana u /var/www/html/index.html i izgleda kao na slici:


Deaktiviraću ovu konfiguraciju:
$ sudo a2dissite 000-default

U direktorijumu /etc/apache2/sites-available/ kreiraću dva konfiguraciona fajla, za moje buduće sajtove.
$ sudo nano /etc/apache2/sites-available/sajt1.conf
<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName sajt1
        DirectoryIndex index.html
        DocumentRoot /home/dogriz/www/sajt1/

        #LogFiles
        ErrorLog /home/dogriz/www/sajt1/logs/error.log
        CustomLog /home/dogriz/www/sajt1/logs/access.log combined
</VirtualHost>

$ sudo nano /etc/apache2/sites-available/sajt2.conf
<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName sajt2
        DirectoryIndex index.html
        DocumentRoot /home/dogriz/www/sajt2/

        #LogFiles
        ErrorLog /home/dogriz/www/sajt2/logs/error.log
        CustomLog /home/dogriz/www/sajt2/logs/access.log combined
</VirtualHost>

Nakon kreiranja konfiguracionih fajlova, potrebno je aktivirati željene sajtove:
$ sudo a2ensite sajt1
$ sudo a2ensite sajt2
Na ovaj način kreirani su potrebni linkovi u direktorijumu /etc/apache2/sites-enabled/

Poslednja izmena na veb serveru je dodavanje sledećih linija u /etc/apache2/apache2.conf
<Directory /home/dogriz/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

Na kraju preostaje ponovno učitavanje izmenjene konfiguracije veb servera:
$ sudo service apache2 reload

Da bih proverio da li su sajtovi dostupni sa drugog računara u lokalnoj mreži, rekonfigurisaću hosts fajl jer ne koristim DNS server.
Na linuxu to je (dopisao sam odeljak Virtual Hosts):
$ sudo nano /etc/hosts
127.0.0.1       localhost
127.0.1.1       testDesktop

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

#Vitual Hosts
192.168.0.102 sajt1
192.168.0.102 sajt2

Na windowsu, isti fajl se nalazi u C:\Windows\System32\drivers\etc\hosts

Sada u veb pretraživaču mogu da kucam sledeće adrese
http://sajt1 ili http://sajt2


24 јул 2015

Arduino IDE na Linux-u - gde je /dev/ttyUSB0?


Problem:
U Debian/LMDE/Ubuntu/Mint distribucijama (neke druge nisam isprobavao) nije moguće podesiti Port (Tools/Port) u Arduino IDE - ta opcija je nedostupna ("zasivljena").

Rešenje:
1. korisnik mora biti u grupi dialout ($ sudo adduser USER_NAME dialout)
2. treba deinstalirati brltty paket ($ sudo apt-get purge brltty)

Opis:
Podrazumeva se da je korisnik član grupe dialout. Iako je Arduino mikrokontroler (npr. Duemilanove) priključen na računar preko USB porta, u Arduino IDE nije moguće odabrati port za komunikaciju jer ta opcija nije dostupna.
Listajući /dev direktorijum u potrazi za device file-om, ispostavlja se da ga tamo nema!?
$ ls /dev/ttyUSB* -l
ls: cannot access /dev/ttyUSB*: No such file or directory
Analiziranjem problema dalje, vidi se da je sistem uredno prepoznao priključeni mikrokontroler:
$ lsusb
Bus 003 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Gde je taj ttyUSB0, što ga nema tamo gde mu je mesto?
Pa, evo zašto ga nema:
$ dmesg | grep tty
[ 1058.698443] usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB0
[ 1060.279423] usb 3-2: usbfs: interface 0 claimed by ftdi_sio while 'brltty' sets config #1
Kad se čovek dobro zagleda, vidi se da je brltty (Braille device) je u konfliktu sa Arduinom. A trebalo mi je vremena da se zagledam...
I na kraju, rešenje je gore opisano, deinstalacijom ovog konfliktnog paketa, sve je proradilo kako treba:
$ ls /dev/ttyUSB* -l
crw-rw---- 1 root dialout 188, 0 Jul 24 21:50 /dev/ttyUSB0
Naravno, sada se i iz Arduino IDE bez problema može odabrati željeni port.