
Raspberry Pi
Stworzono dwie wersje: A
i B
. Różnica między nimi to tylko: ilość portów USB (A – 1xUSB, B – 2xUSB), oraz brak RJ45 w przypadku modelu A. W chwili obecnej można zamówić tylko model B. Z racji swojej oryginalnej nazwy urządzenie funkcjonuje często pod potoczną nazwą „Malina”
Specyfikacja
Urządzenie oparte jest na układzie Broadcom BCM2835 SoC, w skład którego wchodzi procesor, procesor graficzny oraz pamięć RAM:
- ARM1176JZF-S 700 MHz
- VideoCore IV GPU (1080p, h.264/MPEG-4)
- 256MB RAM
Poza tym mamy do dyspozycji szereg portów i złącz:
- 2 x USB 2.0
- HDMI, RJ45
- czytnik SD / MMC / SDIO
- Composite RCA
- wyjście audio – 3,5mm jack
Złącza:
- GPIO
- UART
- szyna I²C
- szyna SPI
Do zasilania tego urządzenia należy zaopatrzyć się w zasilacz 5V (końcówka MicroUSB), minimum 700mA. Pobór prądu jak można się łatwo domyśleć jest bardzo niski – około 2W.
Koszt i zamówienie
Fundacja Raspberry Pi rekomenduje dwa sklepy, które prowadzą sprzedaż międzynarodową, są to: Premier Farnell/Element 14 oraz RS Components.
W moim przypadku, koszt zamówienia wraz z przesyłką wyniósł około 160zł brutto za sztukę (przy zamówieniu czterech sztuk).
Niektórych to zmartwi, ale w przesyłce będzie tylko samo Raspberry Pi, nie ma karty SD, a nawet zasilacza. Każde rozszerzenie należy kupić we własnym zakresie, a może być tego sporo: karta pamięci, zasilacz, myszka, klawiatura, kabel HDMI, kabel sieciowy, hub USB z zewnętrznym zasilaniem, karta WiFi na USB, dysk USB lub pendrive itd.
Szybki start
Malina jest dość popularnym rozwiązaniem w swoim segmencie, nie jest oczywiście jedynym. W związku z dużą popularnością w sieci znajdziemy multum informacji, porad, przykładów zastosowań, programów. Punktem startowym jest pobranie systemu operacyjnego, są specjalnie przygotowane przez samą fundację dostępne na stronie http://www.raspberrypi.org/downloads. Jako, że moim głównym systemem jest Fedora, postanowiłem pobawić się Debianem, w związku z tym pobrałem obraz Raspbian “wheezy”
. Prędkość pobierania torrenta oraz ilość udostępniających osób tylko potwierdza dużą popularność.
Przygotowanie karty
Po pobraniu obrazu należy go przenieść na kartę pamięci. W pierwszej kolejności, przed podłączeniem karty sprawdzamy listę urządzeń, np za pomocą df -h
.
vokiel@def ~$ df -h System plików rozm. użyte dost. %uż. zamont. na rootfs 108G 15G 93G 14% / devtmpfs 3,9G 0 3,9G 0% /dev tmpfs 3,9G 1,4M 3,9G 1% /dev/shm tmpfs 3,9G 820K 3,9G 1% /run /dev/sda2 108G 15G 93G 14% / tmpfs 3,9G 0 3,9G 0% /sys/fs/cgroup tmpfs 3,9G 0 3,9G 0% /media /dev/sda3 206G 69G 128G 35% /home /dev/mapper/truecrypt1 374G 251G 104G 71% /media/truecrypt1 |
Następnie podłączamy kartę i ponownie wywołujemy polecenie df, nowy wpis na liście wskazuje na naszą kartę pamięci, w moim przypadku było to /dev/sdc1
, które pojawiło się na końcu poprzedniej listy.
Karta pamięci może posiadać kilka partycji, wtedy każda z nich pokaże się osobno. Gdy już znamy lokalizację karty odmontowujemy ją korzystając z polecnia umount
.
vokiel@def ~$ umount /dev/sdc1 |
W tym momencie przystępujemy do faktycznego przeniesienia obrazu systemu na kartę SD, użyjemy programu dd – służącym do niskopoziomowego kopiowania i konwersji surowych danych. Należy zwrócić szczególną uwagę na właściwe podanie parametrów, w przypadku pomyłki możemy nadpisać, a przez to stracić ważne dane. Składnia w moim przypadku wyglądała następująco:
vokiel@def ~$ sudo dd bs=1M if=/home/vokiel/Downloads/rpi/2012-07-15-wheezy-raspbian.img of=/dev/sdc1 |
Parametr bs
to rozmiar bloku w pojedynczej operacji odczytu, parametr if
to źródło (input file), natomiast of
to cel (output file). Wykonanie tego polecenia zajmie chwilę – 1,8GB danych do przeniesienia na kartę, dużo zależy od jej prędkości zapisu.
Niestety program dd domyślnie nie wyświetla żadnego postępu, przez co oczekiwanie bez widocznych postępów jest irytujące. Aby podejrzeć jak sobie radzi skorzystamy z drugiej konsoli, w której wyszukamy proces dd, a następnie za pomocą polecenia kill spowodujemy, że dd zacznie odpowiadać:
vokiel@def ~$ pgrep -l '^dd$' #sprawdzamy id procesu vokiel@def ~$ sudo watch -n 5 kill -USR1 20326 |
W konsoli, w której uruchomiliśmy program dd powinniśmy zacząć otrzymywać informacje o postępach.
Po zakończeniu kopiowania dobrze jest zrobić synchronizację dysku z pamięcią, dzięki temu będziemy mieli pewność, że dane zostały fizycznie zapisane na karcie. Do tego celu służy program sync:
vokiel@def ~$ sync |
Dostępne są też instrukcje dla systemu Windows jak i Mac OS X: RPi Easy SD Card Setup
Pierwsze uruchomienie
Przygotowaną kartę pamięci wkładamy do czytnika RPi, myszka, klawiatura, monitor, na koniec podłączamy zasilanie (u mnie świetnie się sprawdza ładowarka od Nokii – 5V, 1200mA). Malina nie ma włącznika, zatem włączenie/wyłączenie odbywa się odpowiednio poprzez podłączenie/odłączenie zasilania. Po podłączeniu na ekranie pojawia się coś zbliżonego do tego:
Następnie pojawia się możliwość zalogowania do systemu. Domyślny login i hasło dostępne są na stronie pobierania, dla Debiana „Wheezy” to pi z hasłem: raspberry. Konto root nie ma hasła, zatem po zalogowaniu do systemu należy zmienić te dla pi (lub dodać nowe konto) oraz ustawić hasło superużytkownika.
Przy pierwszym uruchomieniu pojawia się możliwość dokonania wstępnej konfiguracji systemu:
Standardowo mamy zainstalowane i skonfigurowane środowisko graficzne, uruchamiamy je poleceniem startx
W taki oto sposób mamy działający komputer ze środowiskiem graficznym. Niestety szybkość działania i responsywność nie jest na najwyższym poziomie. Jednak jak na taką cenę oraz koszty użytkowania (bardzo niski pobór prądu) i przy takiej miniaturyzacji otrzymujemy na prawdę wiele. Z pewnością nie zastąpi nam desktopa/notebooka, ale jako dodatkowe narzędzie może zdziałać wiele.
Początkowa konfiguracja
Jako, że jest to blog webdeveloperski, to RPi w pierwszej konfiguracji zostało przetestowane pod kątem serwera www. Aby ułatwić sobie pracę skonfigurujmy system.
pi@raspberrypi ~$ uname -a Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux |
W pierwszej kolejności ustawiamy hasło konta root, a następnie dodajemy swojego użytkownika i usuwamy domyślnego pi (lub przynajmniej zmieniamy mu hasło).
pi@raspberrypi ~$ sudo passwd root |
pi@raspberrypi ~$ sudo adduser vokiel Dodawanie użytkownika "vokiel"... Dodawanie nowej grupy "vokiel" (1002)... Dodawanie nowego użytkownika "vokiel" (1001) w grupie "vokiel"... Tworzenie katalogu domowego "/home/vokiel"... Kopiowanie plików z "/etc/skel" ... Proszę podać nowe hasło UNIX: Proszę ponownie podać hasło UNIX: passwd: hasło zostało zmienione Zmieniam informację o użytkowniku test Wpisz nową wartość lub wciśnij ENTER by przyjąć wartość domyślną Imię i nazwisko []: Vokiel Numer pokoju []: Telefon do pracy []: Telefon domowy []: Inne []: Czy informacja jest poprawna? [T/n] T |
Możemy też użyć komendy useradd
Dodajemy użytkownika do sudoersów:
pi@raspberrypi ~$ su Hasło: root@raspberrypi: /home/pi# echo "vokiel ALL=(ALL:ALL) ALL" >> etc/sudoers |
Przelogowujemy się na nowe konto, następnie usuwamy użytkownika pi
vokiel@raspberrypi ~$ sudo userdel pi |
Następnie konfigurujemy adres IP. Najwygodniejszy jest stały, który możemy ustawić np poprzez router – rezerwacja IP lub ustawiając w systemie RPi. Wybrałem drugą opcję, dzięki czemu połączenie sieciowe startuje szybciej – nie musi czekać na przydzielenie adresu z DHCP. Przy okazji zmieniłem też nazwę hosta na rpi
. Po ustawieniu statycznego adresu mój pli konfiguracyjny wygląda następująco:
vokiel@rpi ~ $ cat /etc/network/interfaces auto lo iface lo inet loopback #iface eth0 inet dhcp #zakomentowana domyślna konfiguracja iface eth0 inet static address 192.168.1.254 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.100 |
Dzięki temu, możemy wyłączyć RPi, odpiąć monitor, klawiaturę, myszkę i podpiąć gdzieś koło routera, a resztę prac wykonywać zdalnie przy pomocy ssh (demon domyślnie uruchomiony).
Aby logowanie na zdalną maszynę z naszego komputera przebiegało sprawniej dodajemy IP Maliny do listy /etc/hosts
. Dzięki temu będziemy mogli logować się za pomocą komendy ssh vokiel@rpi
root@def /# echo "192.168.1.254 rpi" >> /etc/hosts |
Aby nie było trzeba wpisywać hasła przy każdym logowaniu, możemy posłużyć się kluczami. Kopiujemy swój za pomocą ssh-copy-id
:
vokiel@def ~ $ ssh-copy-id vokiel@rpi |
Pierwsze logowanie przy użyciu kluczy – nie trzeba podawać hasła:
vokiel@def ~$ ssh vokiel@rpi The authenticity of host 'rpi (192.168.1.254)' can't be established. RSA key fingerprint is aa:1a:25:1e:d7:fd:d9:03:73:65:5c:74:ef:9f:1d:62. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'rpi,192.168.1.254' (RSA) to the list of known hosts. Linux rpi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Type 'startx' to launch a graphical session Last login: Sat Aug 11 19:20:20 2012 from def vokiel@rpi ~ $ |
Jeśli lokalnie jesteśmy zalogowani na koncie o tej samej nazwie co konto zdalne, to wystarczy przy logowaniu podać nazwę hosta:
vokiel@def ~$ ssh rpi |
Przydział pamięci
Jako, że nie planuję korzystać z graficznego interfejsu, zmniejszyłem przydział pamięci dla grafiki:
vokiel@rpi ~ $ sudo cp /boot/arm224_start.elf /boot/start.elf |
Po restarcie widzimy, że dostępnej pamięci jest trochę więcej (a i użytej nie tak dużo):
Serwer www
Debian na pokładzie, zatem instalację serwera www możemy przeprowadzić korzystając ze standardowego apt-get install
. Oczywiście, możemy też pokusić się o kompilację, co w przypadku ograniczonych możliwości RPi ma duży sens. Niestety kompilacja nodejs w moim przypadku trwała ponad 2 godziny, aby na koniec rzucić błędem. Ponieważ chciałem jak najszybciej uruchomić pierwszy skrypt, skorzystałem z pakietów.
Sprawdzamy źródła w /etc/apt/sources.list
, następnie aktualizujemy bazy.
vokiel@rpi ~ $ cat /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi vokiel@rpi ~ $ sudo apt-get update vokiel@rpi ~ $ sudo apt-get install nodejs npm vokiel@rpi ~ $ sudo npm install nodeinfo |
Tworzymy prosty skrypt pokazujący info o serwerze:
#!/usr/bin/node var http = require('http'); var os = require('os'); var url = require('url'); var serverIp = '192.168.1.254'; var serverPort = '8080'; function addStyle(res){ var style = ""; style += '<style type="text/css">'; style += "\n body { font-size: 10px; font-family: Verdana, Arial, Tahoma; background: #fff;}"; style += "\n table {collapse: collapse;} "; style += "\n table thead tr th { font-weight: bold;} "; style += "\n table tr td { border-bottom: 1px solid silver; vertical-align: top; padding: 5px 20px;}"; style += "\n</style>"; res.write(style); } function getRemoteAddr(req){ return req.headers['x-forwarded-for'] || req.connection.remoteAddress; } function log(msg){ var now = new Date(); var log = now.toUTCString(); log += "\t" + msg; console.log(log); } http.createServer(function (req, res) { log(getRemoteAddr(req) + "\t" + req.headers['user-agent']); res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'}); res.write('<html><title>Raspberrypi nodejs server</title><meta charset=utf-8">'); addStyle(res); res.write('<body>'); res.write('<h2>Client</h2>'); res.write('<table><thead><tr><th>var</th><th>value</th></tr></thead><tbody>'); res.write('<tr><td>User-agent: </td><td>' + req.headers['user-agent'] + '</td></tr>'); res.write('<tr><td>IP: </td><td>' + getRemoteAddr(req) + '</td></tr>'); res.write('</tbody></table>'); res.write('<h2>Server</h2><table><thead><tr><th>var</th><th>value</th></tr></thead><tbody>'); Object.keys(os).map(function(method) { if ( method != 'getNetworkInterfaces' ){ res.write('<tr><td>' + method + "</td><td><pre>"+JSON.stringify(os[method]())+'< /pre></td></tr>'); } }) res.write('</tbody></table>'); res.write('</body></html>'); res.end(); }).listen(serverPort, serverIp); log('Server running: ' + serverIp +':'+serverPort); |
Uruchamiamy i sprawdzamy wynik w przeglądarce
vokiel@rpi ~ $ node server.js Sat, 11 Aug 2012 18:30:10 GMT Server running: 192.168.1.254:8080 Sat, 11 Aug 2012 18:30:14 GMT 192.168.1.103 Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.10.289 Version/12.00 |
Voila! Działający serwer www, pobierający mniej niż 2W prądu. Wystarczy przekierować port na r0outerze i mamy własnego, taniego vps’a 😉 jeśli mamy stały IP, to już całkiem bajka.
Przy ciągłej pracy, pod dużym obciążeniem RPi zaczyna się wyczuwalnie grzać, ale wystarczy mały radiator, aby temperatura spadła do akceptowalnego poziomu.
Podsumowanie
RPi to bardzo ciekawe rozwiązanie, z dnia na dzień powstają nowe pomysły na jego wykorzystanie. Skupia przy osbie dużą społeczność, która jest bardzo aktywna. Do dyspozycji mamy blogi, fora, a nawet dedykowany miesięcznik „The MagPi issue”. Na głównej stronie raspberrypi.org pojawia się szereg infromacji o projekcie, nowości, przykłady zastosowań etc. Na dzień dzisiejszy RPi jest wykorzystywany na wiele sposobów, ciągle pojawiają się nowe. Jedne idą bardziej w kierunku automatyki, inne oprogramowania, multimediów. Popularność projektu powoduje, że powstają dedykowane RPi porty różnych aplikacji, dzięki temu można wycisnąć z Maliny jeszcze więcej.
[…] przez nodejsDodano w: Raspberry Pi | przez Vokiel | 0 Komentarzy »http://raspberrypi.orgW poprzednim wpisie dotyczącym Raspberry Pi pokazałem co należy zrobić aby uruchomić na nim system oraz […]
[…] ps: przy tworzeniu wpisu pomógł też artykuł na blogu: blog.vokiel.com. […]
This is very interesting, You’re a very skilled blogger. I have joined your feed and look forward to seeking more of your great post. Also, I’ve shared your website in my social
networks!
w linijce brakuje backslesha: root@raspberrypi: /home/pi# echo „vokiel ALL=(ALL:ALL) ALL” >> etc/sudoers