Tag Archives: Raspberry Pi

První experimenty s GPIO – svítíme LED diodou a detekujeme pohyb

Prvotně publikováno na raspi.cz 29.6.2012.

Takže máme Raspberry Pi… co s ním? Přece ho nebudeme používat jako běžný počítač. Je to hračka pro bastlíře, pojďme k němu něco připojit.

Trocha teorie na úvod

Vedle držáku pro SD kartu je vyveden „expanzní konektor“ – 2x 13 pinů ve standardní rozteči desetiny palce. Konektor je dobře popsán na wiki projektu.

Dsc_20451

Na konektoru jsou vyvedeny sériové sběrnice SPI a I2C, těm se budeme věnovat příště. Dále je zde vyvedeno napájení 5V a 3.3V (obojí ovšem s poměrně malým povoleným odběrem) a pak je tu to nejdůležitější: 8 „general purpose“ portů, které mohou sloužit jako vstupní nebo výstupní.

POZOR! Všechny porty na expanzním konektoru (tj. nejen GPIO, ale i I2C a SPI sběrnice) jsou provozovány na napětí 3.3 V a nejsou tolerantní ke „standardním“ 5 V, které se vyskytují v bastlířské elektronice nejčastěji. Pokud na některý pin přivedete více než 3.3 V, můžete svému RPi udělat bebí, které se mu nezahojí.

Stejné varování se týká i povoleného maximálního odběru z jednotlivých pinů. Taháte přímo za nožičky procesoru – nečekejte, že tím budete přímo řídit velkou LED diodu či relátko. Určitě to krátkodobě něco vydrží, ale více než 1 mA z každého pinu  bych raději dlouhodobě neodebíral.

Všechny GPIO piny jsou dostupné jako speciální soubory v /sys filesystému. Ale pro používání těchto souborů musíte mít superuživatelská (root) práva, a to je špatně. Kdo s linuxem již někdy dělal, ví proč; kdo přichází ze světa Windows – prosím, berte to jako axiom. Lépe je psát aplikace, které nemusí běžet jako root.

Tady je řešení problému – aplikace, která GPIO zpřístupňuje normálním uživatelům. Nainstalujte podle návodu. Pak už je to snadné. Na začátku je potřeba GPIO port otevřít – říct, že ho budeme používat:

gpio-admin export 22

Port je následně dostupný jako soubor – třeba /sys/devices/virtual/gpio/gpio22/value . Tedy zobrazit jeho stav můžeme přímo v shellu:

cat /sys/devices/virtual/gpio/gpio22/value

(vypíše nulu nebo jedničku). Stejně tak do něj můžeme zapisovat. Nejprve mu otočíme směr na výstupní a pak můžeme začít řídit, zda z portu teče logická jednička (3.3 V) nebo nula:

echo out > /sys/devices/virtual/gpio/gpio22/direction
echo 1 > /sys/devices/virtual/gpio/gpio22/value

Jak se k portu fyzicky připojit?

Nejjednodušší mi přijde varianta koupit si kousek plochého kabelu (FBK26H v GM Electronics) a nacvakávací konektor (PFL26 v GM Electronics). Kabel (bez odizolovávání!) vložíme do konektoru na zoubky, které tam na něj čekají, a kleštěmi nebo svěrákem přimáčkneme horní část, dokud nezacvaknou zámky. Tím získáme kabel, který bezpečně (bez možnosti omylu, přepojení na špatné piny atd) nasadíme na Raspberry Pi a na druhém konci máme naše zařízení.

Svítíme si LED diodou

Abych RPi zbytečně nezatěžoval, koupil jsem LED diodu, které stačí proud 2 mA. Přes odpor 680 ohm jsem jí připojil mezi GPIO port 24 a zem. A pak stačilo:

gpio-admin export 24
echo out > /sys/devices/virtual/gpio/gpio24/direction
echo 1 > /sys/devices/virtual/gpio/gpio24/value

a LED se rozsvítila.

Detekce pohybu pomocí PIR čidla

Pro některé své projekty (např. krmítko pro ptáky s fotopastí) potřebuji detekovat, zda se v cílovém prostoru někdo pohybuje. To jde samozřejmě dělat přes webkameru a detekci změn v obraze, ale to je jednak náročné na výkon, a druhak to vůbec není elegantní. Navíc to nefunguje v noci.

Ale tenhle problém vyřešili výrobci zabezpečovací techniky už před lety. Řešení se jmenuje pohybové pasivní infračervené (PIR) čidlo. Takže jsem ze svého oblíbeného čínského e-shopu koupil hotový modul PIR čidla, akceptující 5V napájení a kompatibilní s 3.3V signalizací. Za méně než 6 dolarů, dodávka do evropy je zdarma. Cesta z číny mu trvala necelých deset dní – spousta českých e-shopů této rychlosti nedosahuje.

Zapojení je triviální – napájení na 5V port konektoru, zem na zem, a výstup na GPIO 21.

Pak jsem si sednul a napsal krátký program v shellu (jo, to se mi na linuxu líbí):

– otevři port 21 pro vstup a 24 pro výstup

– čekej na 0 na portu 21 (na začátku počkáme na stav „klid“)

– donekonečna opakuj:

    • čekej na 1 na portu 21 (PIR čidlo někoho vidí)
    • vypiš informaci na terminál
    • rozsviť LED diodu (1 na port 24)
    • čekej na 0 na portu 21 (už je zase klid)
    • vypiš informaci na terminál
    • zhasni LED diodu (0 na port 24)

Spustil jsem to … a fungovalo to.


Příště: kterak zařídit, aby RPi vědělo i bez internetu, kolik je hodin

Reklamy

Napsat komentář

Filed under Počítače, vývoj HW a SW

Začínáme s RPi – pár poznámek pro začátečníky

Prvotně publikováno na raspi.cz 23.6.2012.

Článek je dnes již mírně zastaralý – aktuální distribuce Raspbian např. automaticky zvětšuje partition na celé volné místo na SD kartě.

 

 

Hurá, domů dorazila krabička s Raspberry Pi. Co s ní a jak začít? Zde je hromádka námětů pro rychlejší start.

SD karta

Kupte si SD kartu, která je podporovaná – seznam je na wiki. Paradoxně podporované jsou povětšinou ty pomalejší karty, class 4 a class 6. Nepodporované karty se chovají různě – např. z foťáku jsem vyndal Apacer „150x“ 4GB  kartu a ta sice většinou funguje, ale při bootu se zasekne a začne chrlit spoustu chybových hlášení typu „nemohu načíst SD status register“ atd. Po cca půlminutě až minutě (výjimečně až tři minuty) se to najednou rozjede a vše funguje správně.  Lexar 4G class 6 funguje lépe.

V revizi firmware a kernelu z 31.5. je už tohle vylepšené, ale první boot pojedete se starým firmwarem…

Kartu kupte minimálně 4 GB. Image vyžaduje 2 GB – a ukázalo se, že ne všechny karty mají stejně velké 2 GB, na některé se nevejde.

USB hub

RPi má jen dva porty. Klávesnice, myš … a už se nic dalšího nevejde, chtělo by to víc portů. RPi musíte nějak napájet přes microUSB. Nejjednodušší řešení obou těchto požadavků je napájený USB hub. RPi se k němu připojí dvěma kabely – jedním do USB portu (vůči USB hubu jako „nadřazený počítač“) a jedním do microUSB napájení  (vůči USB hubu jako jedno ze zařízení). A nemusíte řešit samostatné napájení RPi, hub ho zvládne nakrmit.

Použil jsem sedmiportový hub od czc.cz a jsem zcela spokojen. Mimo jiné bonusy umožňuje jednotlivé USB porty samostatně vypínat a zapínat, takže nemusíte pro vypnutí RPi vytahovat napájecí zdroj ze zásuvky.

USB hub a RPi

Připojení k televizi/monitoru

Pro připojení k televizi s HDMI vstupem použijte běžný HDMI kabel. Není na tom nic k vymýšlení.

Ale co když máte monitor jen s DVI vstupem? Není problém – HDMI obsahuje mimo jiné i stejné signály jako DVI. Takže stačí levný kabel, který z HDMI vyvede správné dráty na správný konektor – např. tento.

Operační systém

Použijte Debian „squeeze“. Aktuální verze 19-04-2012 je poměrně slušně funkční, obsahuje vše co potřebujete a hlavně má standardní balíčkovací systém debianu – apt-get. Pomocí něj snadno nainstalujete vše, co potřebujete. Fedora je z více důvodů špatná.

Jak dostat image na kartu? Pokud používáte na svém hlavním počítači linux, je to jednoduché a určitě to znáte:

dd if=/cesta/k/image.img of=/cesta/ke/karte bs=4K

kde cesta ke kartě bývá (pokud je v systému jen jeden harddisk) /dev/sdb .

Co ale dělat, pokud používáte Windows? Osobně mám s tooly pro nahrávání image na SD kartu ve Windows nedobré zkušenosti, moc mi to nefungovalo. A četl jsem i hororové příběhy o smazaných discích. Jako lepší variantu vidím

  • stáhnout VmWare Player (zdarma)
  • buď si stáhnout některý hotový virtuální stroj s Ubuntu pro VmWare (třeba tady), nebo si stáhnout instalační image aktuálního Ubuntu desktop a VmWaru říct „vytvoř nový stroj, a jako bootovací CD použij tento soubor s ISO image“

a další akce dělat v Ubuntu. K počítači připojíte čtečku karet (zrovna jsem žádnou neměl, tak jsem použil foťák Nikon D80 přepnutý do USB režimu „mass storage“) a řeknete VmWare playeru, ať jí připojí do virtuálního počítače. Pak můžete ve virtuálním linuxu kopírovat na kartu pomocí „dd“ dle popisu výše a není žádná cesta, jak byste mohli něco zničit – maximálně rozbijete ten virtuální počítač, tak si uděláte nový. K fyzickému disku se virtuální stroj nedostane.

Po prvním bootu

Začněte tím, že si přepnete klávesnici na anglickou podle návodu zde. Bez toho to fakt nejde, na defaultní britské nenajdete spoustu důležitých znaků.

A pak hned nainstalujte tool pro update kernelu a firmware rpi-update a obratem ho spusťte. Doporučený split paměti je 192 MB – tj.

sudo rpi-update 192

Novější verze firmware a kernelu řeší problémy s SD kartami a například přidává podporu webkamer – ty v původní verzi nejsou. No a pak si můžete hrát. Grafické prostředí se (pokud jste si zvolili boot do konzole) spouští standardním příkazem startx .

Image systému obsadila na SD kartě jen 2 GB, zbytek je prázdný

To je škoda, ne? Nejjednodušší způsob, jak změnit velikosti a rozložení jednotlivých partitions na SD kartě je vyndat kartu z RPi a zase jí dát do čtečky připojené k linuxovému počítači. Na něm si nainstalujte Gparted (sudo apt-get install gparted) a v něm můžete partitions snadno přetáhnout myší podle potřeby.


Příště: ovládání GPIO portů; připojení PIR čidla pro detekci pohybu; modul hodin reálného času; webkamera

Napsat komentář

Filed under Počítače, vývoj HW a SW

Raspberry Pi (3) – I2C interface + cheap batery backed real time clock (RTC) module – step-by-step how-to

Raspberry Pi has no RTC (real time clock) module. If you start it without internet connection, time is incorrect.

(This is not exact – there is a smart hack in Debian squeeze image. If you boot without internet connection, time is set to the time of last shutdown. So time is always bigger than any time reported before – not rolling backward to 1970/1/1.)

No RTC means that RPi is not usable as autonomous „data logger“ where data will be transferred offline (or connectivity will be available only time-to-time).

How to solve it? Get some RTC module, of course.

 

Hardware

I’ve found extra cheap batery backed RTC module in chinese e-shop – for less than 6 USD, with free shipping to Europe.

RTC module is based on PCF8563 chip (datasheet) with crystal and backup battery. Interface is I2C and chip is 3.3V-compatible – so no voltage level conversion is need for connecting to RPi!

So you have to connect it simple – VCC to 3.3V pin on RPi, and GND, SDA and SCL to their equivalents on RPi. That’s all.

Dsc_2050

Software

Standard RPi debian squeeze kernel has no support for I2C (at 2012/06/06 – may change in future).

But this man did some work for us.

I did the following steps:

1) I ran rpi-update to get the newest firmware and kernel (3.2.18), with memory split 192 MB.

2) Downloaded patched kernel (linux-image-3.2.18-rpi1+_5_armel.deb) from link there. (Always check home page for versions equal to your kernel/firmware version!)

3) Ran

dpkg -i linux-image-3.2.18-rpi1+_5_armel.deb 

which created /boot/vmlinuz-3.2.18-rpi1+

4) Copied /boot/vmlinuz-3.2.18-rpi1+ to /boot/kernel.img and restarted.

Nothing bad happens after RPi restart – the system is running as good as before.

So it’s a time for I2C experiments.

5) I think that almost all commands needs root privileges. So:

sudo bash

and all the following commands will be ran in privileged mode.

6) We need to load I2C drivers first:

modprobe i2c-dev

And then    /dev/i2c-0  and /dev/i2c-1 appears magically. I2C bus 0 is connected to GPIO connector, bus 1 is in camera connector (so unusable for me atd this time).

7) I2C is present. We need some tools for manipulating it.

apt-get install i2c-tools

8) Let’s try it:

i2cdetect 0

WARNING! This program can confuse your I2C bus, cause data loss and worse!

I will probe file /dev/i2c-0.

I will probe address range 0x03-0x77.

Continue? [Y/n] 

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          — — — — — — — — — — — — —

10: — — — — — — — — — — — — — — — —

20: — — — — — — — — — — — — — — — —

30: — — — — — — — — — — — — — — — —

40: — — — — — — — — — — — — — — — —

50: — 51 — — — — — — — — — — — — — —

60: — — — — — — — — — — — — — — — —

70: — — — — — — — —

pi@raspberrypi:~$

Yes! There is device shown on the I2C bus! I’m so happy!

OK. I’ve got RTC module connected to working I2C bus, and I’ve got datasheet for chip. So it’s time to start coding some application for reading/writing the time from/to RTC module, right?

Oh … wait … somebody did it before, didn’t it? Let’s use the f* Google… wow! It is there! And it is much better than I think.

9) We have to tell the linux kernel, that the device on address 0x51 on I2C bus 0 is RTC chip PCF8563:

echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

10) And then … magic happens:

hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

It works! With no coding at all!

 

Real world test

So I tried the whole trick with freshly booted RPi with no internet conectivity. Current (real) time was 18:07.

 

pi@raspberrypi:~$ sudo bash

root@raspberrypi:/home/pi# date

Wed Jun  6 17:52:28 BST 2012

There we see that the system clock is incorrect – it is the time of the last shutdown. Smart trick from debian squeeze (much better than Fedora, which always starts at 1970/1/1), but we need better time!

root@raspberrypi:/home/pi# modprobe i2c-dev

root@raspberrypi:/home/pi# echo pcf8563 0x51 > /sys/class/i2c-adapter/i2c-0/new_device

root@raspberrypi:/home/pi# hwclock -r

Wed 06 Jun 2012 18:08:46 BST  -0.057931 seconds

Time in RTC is correct. Battery backup is working.

root@raspberrypi:/home/pi# date

Wed Jun  6 17:53:33 BST 2012

But system time is still bad…

root@raspberrypi:/home/pi# hwclock -s

… so let set it from the RTC

root@raspberrypi:/home/pi# date

Wed Jun  6 18:09:24 BST 2012

System time is right!

Dsc_2051

 

 

 

 

1 komentář

Filed under Počítače, vývoj HW a SW

Raspberry Pi (2) – Experiments with GPIO

RPi is working, so what to do now? Some hardware hacking! I want my RPi to detect when somebody came into room and to do something (for example fire an flame-thrower on the intruder). So let’s try it.

Dsc_2045

Some theory

Raspberry Pi is equipped with expansion connector – 2×13 pins with standard 1/10″ spacing. Connector is described on RPi wiki.

There is one I2C and one SPI bus on connector – it will be tested later. 5V, 3.3V and GND connection. And an 8 GPIO ports.

It is lower nuber of GPIO than on any Arduino, I know. There is no analog input/output, also. But I don’t like writing code in low-level languages like on Arduino, and I want to use user-friendly and powerfull platform. RPi is much better for me.

GPIO ports on RPi are 3.3 volts and are not 5 volt compatible. If you connect them to 5V signal, your RPi will be dead instantly. So be carefull.

All GPIO ports are available as files under /sys filesystem. But you have to be root for using them – and this is bad. I don’t want running my code under root account, it is a bad behaviour.

There is a solution. People from quick2wire.com released some software solving this trouble. You can „open“ GPIO pin by using

gpio-admin export 22

then you can read from port

cat /sys/devices/virtual/gpio/gpio22/value

or even write to the port

echo out > /sys/devices/virtual/gpio/gpio22/direction
echo 1 > /sys/devices/virtual/gpio/gpio22/value

directly from the shell.

 

Driving a LED from RPi

It’s easy. I’ve bought a LED with 2 mA driving current – so low so I can connect it directly to RPi. Connected it with a 680 ohm resistor (i fact two serial connected 330 ohm resistor) between GPIO port 24 and a GND. Then I tried:

gpio-admin export 24
echo out > /sys/devices/virtual/gpio/gpio24/direction
echo 1 > /sys/devices/virtual/gpio/gpio24/value

and LED starts shining.

 

Using a PIR detector with RPi

PIR stands for „passive infrared“. It’s a basic security/surveillance device – it can detect movement in indoor area by detecting changes in infrared radiation

For a less than 6 USD you can buy a cheap PIR detector from china e-shop with free shipping to EU. Delivery time was about 10 days – better than some czech e-shops…

It is powered by 5 V (available on RPi expansion connector). Output signal is 0 V when nothing happens, and 3.3 V when movement is detected – so it is compatible with RPi GPIO pin with no conversion need.

So I connected it to 5 V, GND and GPIO 21. And wrote some shell script, which:

  • waits for a „0“ signal on GPIO 21 – at start, we will wait for „iddle“ status, no movement detected
  • executes an infinite loop:
    • waits for a „1“ signal on GPIO 21
    • display time and a message on console – „VETRELEC“ (means „intruder“ in czech lng)
    • sends „1“ to GPIO 24 – so LED is switched ON and shining
    • waits for end of a alarm – a „0“ signal on GPIO 21
    • display time and a message on console – „Konec poplachu“ (means „end of alarm“)
    • sends „0“ to GPIO 24 – so LED is switched off

Started the script and … wait for it … it works. When somebody entered the room, message is printed and LED is switched ON. No movement in room -> LED is black. I’m so happy!

 

Dsc_2046

 

Next time to try: Connect to the Lego Mindstorms NXT (robotics set from Lego) with Raspberry Pi.

 

Links:

Napsat komentář

Filed under Počítače, vývoj HW a SW

Raspberry Pi – first steps and experiences

Some experiences I’ve gained during my first Raspberry Pi‚s tests:

 

1) Fedora sucks.

Really. Fedora Remix, the one distro recommeded by Pi team, is not the best option – at least for me. Just to be sure – I’m talking about version 14 of that.

There is no URL of image on wiki page (nor anywhere I looked at). You have to download installer which will do everything for you… if it can found your card reader. It didn’t on my Windows XP laptop. And there is no way to override automatic detection.

I downloaded VmWare image with Fedora linux and tried the installation from this environment. It worked like a charm, of course.

After first Pi’s boot I’ve found that author of the Fedora Remix distro set password expiration on default accounts. This is a bullshit. Raspberry Pi has no real time clock chip onboard, so if you boot it up with no internet connection, date is set to 1970/1/1. If you connect it, date is set by NTP. So you boot for the first time, with no internet connetion. Password is expired, you have to change it. Then you boot with internet. Password is expired, you have to change it.  You want to try connection with your plasma TV – so you move to another room, connect it to TV (and not to internet) … and shit, password is expired, you have to change it. And so on.

And at last, but not least, I was unable to start X Windows on Fedora Remix. Some error messages on console was all I’ve got.

One positive point for Fedora – it resize partition on SD card to use all the space available. Automatically, during the first boot. 

 

2) Debian is much better – but some tunning is required

Second time I’ve tried Debian „squeeze“ (version 2012-04-19). I copied image to the SD card in virtual Ubuntu box in VmWare with standard „dd“ command … and Pi started up without problem.

This distro’s author didn’t forgot about missing RTC chip in Pi. I logged on with no password expiration message. Default configuration is smart – it detect that date is 1970/1/1 and displays a message like „Time/date seems invalid, you can set it via ‚date …‘ command“. Thumbs up – this is what I call „user friendly“.

X Windows works like a charm. LXDE is simple, but everything I need is there.

British keyboard and british time zone is set by default. I’ve found this article describing how to configure it to something more usefull. There are handful of other tips and tricks here – you should read it.

Next step I did was firmware update. I’ve installed firmware updater from Heexeh. Just did the things mentioned in readme and all proceed OK.

I set memory split to 224 MB for linux / 32 MB for video. 

There are little problems with SD card during the boot after the firmware update. It is mentioned on forum somewhere – and I meet it also. Boot process works for about two seconds, then plenty of error messages are displayed – error during reading SD status register and other similar. Maybe my SD card is too fast for Pi. But after some time (from 30 seconds to three minutes) the boot process resumes and everything is working good.

Debian image is about 2 GB in size. If you have bigger SD card, the rest of SD card is left unused – maybe it is better to resize partition to eat the whole card size. There is no automatic partition resize like in Fedora – I miss this feature. So I had to boot Ubuntu image in  VmWare, insert SD card to reader and use the GParted tool. Partition resize is easy-as-a-breathing in GParted.

Some other tips for debian configuration are here.

 

3) XBMC is working good, too

I’ve tried XBMC within OpenELEC distro. I used the precooked image described in this forum post.

It works!  

  • FullHD 1080/24p video played on my 50″ TV with no problems
  • Subtitles in Czech language with both local encoding (Windows-1250) and UTF-8 – no problem. 
  • Streaming from network – no problem. 
  • AVI, MPEG and MKV containers works.

Good work, XBMC team.

I’ve found some videos which can’t be played – and XBMC seems to be somewhat confused after trying to play them, so I have to reset Pi for playing another video. Strange.

XBMC is not really fast on Pi. Video playback is good, because it is done on GPU, but XBMC environment – menu, configuration and so on – is really slow. I will not use Pi asi a media player device for my TV – but it is still impressive that such a small computer can play Full HD video.

Next step on the XBMC field: I will try to use DLNA server on my Nokia 701 phone for videostreaming.

 

Links:

 

Napsat komentář

Filed under Počítače, vývoj HW a SW