poniedziałek, 5 października 2015

Oświetlenie LED w kuchni

Ostatnio postanowiłem zrobić dla ukochanej żony oświetlenie pod szafkowe, aby nie musiała zmywać w ciemnościach ;).
Do zrobienia projektu wykorzystałem następujące części:
* Taśma LED 12V biała ciepła
* Zasilacz wodoodporny IP67 (ja miałem 50W)
* Arduino Pro Mini
* Tip31C
* Czujnik odległości HC-SR04
* Wtyk DC Power Jack męski i damski

Poniżej mini-schemat:


Wszystko zamknąłem w obudowę:


Pomocne przy lutowaniu wtyków do zasilania okazały się poniższe zdjęcia:
Tu warto zwrócić uwagę, że należy oba piny GND podłączyć do masy.
I drugie zdjęcie:



Program został napisany z wykorzystaniem Arduino IDE. Jak załadować projekt na arduino mini opiszę w osobnym poście. Poniżej kod programu. Ma on za zadanie włączać oświetlenie gdy zbliżymy rękę do czujnika na max 20cm. Odczyt sygnału ustawiłem na 1,2sekundy. Kolejne zbliżenie ręki ma wyłączyć taśmę LED.
Wszystkie odwołania do Serial można wyrzucić - były tylko pomocne na etapie projektowania i debugowania.
/*
HC-SR04 Ping distance sensor]
VCC to arduino 5v; GND to arduino GND
Echo to Arduino pin 7; Trig to Arduino pin 8
*/

#define echoPin 7
#define trigPin 8
#define dioda 9
int isEnable = 0;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(dioda, OUTPUT);
}

void loop() {
  // send a pulse on the trigger pin to initiate measurement
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // the length of the pulse on the echo pin is proportional to the distance
  long duration = pulseIn(echoPin, HIGH);
  long distance = (duration/2) / 29.1;

  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
    digitalWrite(dioda, HIGH);
      delay(1200);
      digitalWrite(dioda, LOW);
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
    if(distance < 20) {
      if(isEnable == 0) {
        isEnable = 1;
        digitalWrite(dioda, HIGH);
      }
      else if(isEnable == 1) {
        isEnable = 0;
        digitalWrite(dioda, LOW);
      } 
    }
  }
  delay(1200);
 
}

Całość prezentuje się jak na filmiku poniżej. Zostało podłączenie docelowego zasilacza oraz zamaskowanie kabli.


piątek, 21 sierpnia 2015

Zdalne debugowanie skryptu Python z Eclipse na Raspberry Pi

Ostatnio chciałem zdalnie przedebugować aplikację na OSMC. Na poniższej stronie jest wiele potrzebnych informacji, ale jednak niestety nie wszystkie. 
http://kodi.wiki/view/HOW-TO:Debug_Python_Scripts_with_Eclipse

Jasno i gładko jest do punktu 3.4.4 tj Copy pysrc in XBMC Python install. Nie jest dokładnie opisane co należało zrobić w przypadku Linuxa. Po chwili kombinowania ściągnąłem na OSMC repozytorium SuperRepo a następnie zainstalowałem PyDev. W moim przypadku zainstalował się on w
/home/osmc/.kodi/addons/script.module.pydevd.

Następnie na malince wykonałem polecenie:
python -c "from distutils.sysconfig import *; print(get_python_lib())"

 które zwróciło mi ściezkę, do której musiałem wgrać pliki z pydev.
Wykonałem polecenia:
cd /usr/lib/python2.7/dist-packages
mkdir pysrc
cp -rvp /home/osmc/.kodi/addons/script.module.pydevd/* /usr/lib/python2.7/dist-packages/pysrc/

Po skopiowaniu plików, w folderze pysrc musiałem utworzyć pusty plik __init__.py - bez tego zdalne debugowanie mi nie działało. Na sam koniec do źródeł programu co chciałem przedebugować dodałem
# Make pydev debugger works for auto reload.
    # Note pydevd module need to be copied in XBMC\system\python\Lib\pysrc
    try:
        import pysrc.pydevd as pydevd # with the addon script.module.pydevd, only use `import pydevd`
 # stdoutToServer and stderrToServer redirect stdout and stderr to eclipse console
        pydevd.settrace('ipSkadChcemyDebugow', stdoutToServer=True, stderrToServer=True)
    except ImportError:
        sys.stderr.write("Error: " +
            "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.")
        sys.exit(1)

wgrałem na malinkę, uruchomiłem program i voila!

niedziela, 31 maja 2015

Sprawdzenie predkości zapisu/odczytu na dysku

Na raspberry pi 2 w celu sprawdzenia prędkości odczytu z karty należy zainstalować hdparm i wywołać:
# hdparm -t --direct /dev/sda
W celu sprawdzenia prędkości zapisu:
$ sync;time bash -c "(dd if=/dev/zero of=bf bs=8k count=500000; sync)"

sobota, 18 kwietnia 2015

Raspberry Pi Samba - udostępnianie zasobu, prosty serwer NAS

Ostatnio zapragnąłem mieć dostęp do przenośnego dysku z multimediami z każdego miejsca bez zabierania tegoż dysku. Wiele osób odradza wykorzystywanie Raspberry Pi jako serwer NAS. Polecają po prostu podłączenie dysku przez usb do rutera lub kupno dedykowanego serwera. W sumie stwierdziłem, że czemu by nie podłączyć dysku do rutera skoro posiada złączę usb. Zdecydowałem się na to rozwiązanie mimo, że spotkałem się z opiniami, że takie rozwiązanie nie zawsze działa. No i niestety takie rozwiązanie z niewiadomych mi względów powodowało przejściowe problemy z internetem - po prostu co jakiś czas modem rozłączał dostęp. Nie chciało mi się szukać przyczyny czy to firmware rutera czy jakieś problemy z zasilaniem. Po prostu stwierdziłem, że lepiej i szybciej będzie podpiąć dysk pod malinkę i udostępnić zasoby przez Sambe. Dysk który posiadam ma pojemność 2TB ale jest na usb 2. Predkość zapisu i odczytu nie będzie imponująca, ale spokojnie wystarczy do domowego użytku (w sumie do tej pory też wystarczała). Zwłaszcza, że Raspbery Pi nie posiada złącza SATA lub USB3. Jeśli komuś zależy na serwerze NAS z większą wydajnością polecam zapoznanie się z Banana Pi (posiada interfejs SATA). Zaczynamy od podłączenia dysku przez usb do maliny. Sprawdzamy czy Raspbian go widzi i jaka ma nazwę:
sudo fdisk -l
w moim przypadku widać, ze dysk 2TB jest pod /dev/sda1.

U mnie dysk był od razu zamontowany więc użyłem do jego odmontowania następującego polecenia:
umount /dev/sda1
Ponieważ mój dysk zewnętrzy ma system plików NTFS to zainstalowałem:
sudo apt-get install ntfs-3g
W internecie znalazłem informację, że: ntfs-3g for NTFS drives vfat for FAT32 drives ext4 for ext4 drives kolejny krok to założenie folderu gdzie chce zamontować dysk zewnętrzny:
sudo mkdir /media/USBZEWN
i zamontowanie dysku w ustalonym przeze mnie folderze:
sudo mount -t auto /dev/sda1 /media/USBZEWN
Niestety po restarcie raspberry musielibysmy montować dysk od nowa. Aby robiło się to automatycznie należy wyedytować plik /etc/fstab i dopisać na koncu:
/dev/sda1 /media/USBZEWN auto defaults 0 2

Teraz musimy pobrac repozytorium samby:
sudo apt-get install samba samba-common-bin
Robimy kopie i przechodzimy do edycji pliku konfiguracyjnego samby:
sudo cp /etc/samba/smb.conf /etc/samba/backup_smb.conf
sudo nano /etc/samba/smb.conf
W moim przypadku w Share definitions dodałem dwa udziały:
[MEDIA_public]
   commment = Server NAS Public
   path = /media/USBZEWN
   guest ok = yes
   read only = yes

[MEDIA_2TB]
   comment = Dysk zewnetrzny DLNA 2TB
   path = /media/USBZEWN
   create mask = 0777
   directory mask = 0777
   valid users = @users
   force group = users
   public = yes
   browseable = yes
   read only = no
Pierwszy jest tylko readonly czyli tylko do odczytu, ale nie wymaga za to uwierzytelniania. Do drugiego mogą zapisywać, ale tylko wybrani uzytkownicy. Jak ich dodać? Zacznijmy od założenia użytkownika do Raspbiana:
sudo useradd radek
sudo passwd radek
Jesli w konfiguracji Samby ustawiliśmy force group = users to naszego nowego użytkownika musimy dodać do tej grupy "users". Jeśli tego nie zrobimy to windows nie da nam dostępu do udziału:
sudo gpasswd -a radek users
groups radek
Nastepnie musimy dodac użytkownika do samby:
sudo smbpasswd -a radek
UWAGA: logowanie do udzialu bedzie tym hasłem który ustalimy w powyższym kroku. Nie logujemy się na hasło do użytkownika z Raspbiana. Na koniec resetujemy sambe:
sudo service samba restart
Teraz będąc poza domową siecią moge np na laptopie uruchomić OpenVPNa , nastepnie w windowsie wpisać sciezkę \\IP_LOKALNE_RASPBERRY i bedę miał widoczne udziały z Samby.

poniedziałek, 2 lutego 2015

Sprawdzenie rozmiaru folderów pod linuxem

Wystarczy wywołać komendę:
find /SCIEZKA -maxdepth 1 -type d -exec du -hs {} \; | sort -nr

a jeśli chcemy posortować po rozmiarze w bajtach:
find /mnt/kardio/ -maxdepth 1 -type d -exec du -s {} \; | sort -nr

piątek, 2 stycznia 2015

Wywołanie C z Javy - JNI na przykładzie czujnika temperatury DHT11

W poprzednim wpisie na blogu pokazałem jak przygotować bibliotekę SO i wywołać metody w javie wykorzystując Java Native Interface. Poniżej przedstawiam bardziej rozbudowany przykład gdzie klasa C odwołuje się dodatkowo do biblioteki wiringPi. Dzięki temu będę mógł z poziomu Javy wywołać metodę w C odczytującą temperaturę z czujnika DHT11.

Pierwsze kroki jakie należy wykonać są dokładnie opisane w poprzednim artykule. Różnica jest przy kompilowaniu i tworzeniu pliku SO (shared object - objekt współdzielony, odpowiednik windowsowego pliku DLL).

W celu kompilacji wywołujemy kod:
gcc -fPIC -c DHT11.c -I $JAVA_HOME/include -I /usr/local/include/


Należy upewnić się, że mamy ustawioną zmienną środowiskową JAVA_HOME.
Aby to sprawdzić należy wywołać:
echo $JAVA_HOME

Jeśli zostanie zwrócony pusty wynik to trzeba ustawić tą zmienną przez polecenie:
export JAVA_HOME="scieżkaDoJavy"


Po wywołaniu powyższej komendy kompilacji zostanie utworzony plik DHT11.so. Następnie wywołujemy:
gcc DHT11.o -shared -o libDHT11.so -Wl,-soname,DHT11 -L/usr/local/lib -lwiringPi

gdzie:
-o - nazwa pliku wynikowego, musi być z przedrostkiem "lib", nazwa musi się zgadzać z nazwą w klauzuli System.loadlibrary() w Javie
-L/usr/local/lib - ścieżka gdzie szukać skompilowanego kodu źródłowego biblioteki (plików obiektowych)
-lwiringPi - linkujemy do kompilatora bibliotekę wiringPi - wcześniej należy ją zainstalować zgodnie z instrukcjami ze strony http://wiringpi.com/download-and-install/

Jeśli nie dodamy -L/sciezka -lwiringPi to będziemy mieli do czynienia z błędem:
java: symbol lookup error: ..../libDHT11.so: undefined symbol: pinMode


Zostało sprawdzenie czy wszystko działa:
java -Djava.library.path=. DHT11


I na ekranie konsoli uzyskamy odczyt temperatury z czujnika DHT11