Portál AbcLinuxu, 20. dubna 2024 06:06

Plně otevřené RFID řešení pomocí Olimex A20 (2/2)

26. 3. 2014 | Max Devaine
Články - Plně otevřené RFID řešení pomocí Olimex A20 (2/2)  

Základní práce s ARM deskou Olimex A20, úprava systému, mapování GPIO portů, práce s relátky a nasazení RFID řešení.

Obsah

OlinuXino A20

link

Olimex A20 je relativně levná a výkonná deska, která existuje i ve verzi s 4GiB NAND pamětí. Je osazena dvoujádrovým Cortex-A7 s dvoujádrovou Mali 400, obsahuje 1GiB DDR3, dva USB porty, LAN port, HDMI, spoustu programovatelných GPIO portů, konektor pro diplej a dvě nezávislá UEXT rozhraní. Olimex disponuje také konektorem na baterii, kterou lze použít jako UPS. K dispozici je např. údaj, kdy 6600mAh baterii lze použít jako záložní zdroj pro staršího bratříčka A13-OLinuXino (příklad s výdrží pro A20 nemám k dispozici), který by v takovém případě při plné zátěži měl vydržet běžet 20 hodin. A20 lze dále napájet pomocí klasického adaptéru (6-16V), nebo pomocí USB-OTG (5V). Pro jednoduchý popis desky vizte Board Layout. Kromě základního vybavení jsou právě stěžejní ony programovatelné GPIO porty, které lze mj. mapovat do UEXT rozhraní.

Mnozí si jistě řeknou, že při takovém to popisu je to pro RFID těžký overkill. Samozřejmě ano, ale poměr cena/výkon/možnosti převyšují nad ušetřenými pár stovkami a uspořenou energií.

UEXT rozhraní

link

UEXT je univerzální konektor (Universal EXTension connector), jenž obsahuje 3 základní komunikační rozhraní:

Vizte kompletní popis v PDF.

Olimex disponuje spousty UEXT moduly, jejichž počet se stále rozšiřuje. Tyto moduly většinou obsahují programovatelné čipy s nějakým výchozím firmware (programem), jehož zdrojový kód je volně k dispozici, takže není problém si upravit vnitřní logiku dle vlastních požadavků (pokud umíme programovat a máme programmer).

V našem případě bude potřeba komunikovat s RFID čtečkou po seriové lince (buď napřímo přes UART, nebo pomocí RS232), takže bude potřeba minimálně na jedno UEXT rozhraní namapovat UART. Taktéž budeme potřebovat relátka, resp. modul MOD-IO2, který ke komunikaci používá I2C.

Bootovací proces

link

O první bootování se A20 samozřejmě snaží z SD karty, pokud neuspěje, jde se na vnitřní NAND paměť. Jako bootloader slouží U-Boot. U-Boot se zapisuje na začátek zařízení:

dd if=u-boot-sunxi-with-spl.bin of=/dev/sda bs=1024 seek=8

První partition musí být vfat a měla by začínat aspoň na 2048 sektoru, aby měl U-Boot se SPL(Second Program Loader) dostatek prostoru před začátkem první partition. Tato vfat partition může být 16MiB velká, slouží jen pro kernel a script.bin. Další partition je již pro systém a ta se formátuje na ext2/3/4. Bootovací sekvence je tedy následující:

script.bin

link

Tento soubor je velmi důležitý, popisuje konfiguraci Olimexu, tedy např. mapuje GPIO porty, nastavuje parametry paměti, rozlišení obrazu atd. Díky tomu lze provádět celkem zajímavé změny, aniž bychom museli překompilovávat jádro stále dokola.

Tento soubor vytvoříme konverzí textového souboru „*.fex“, vizte aktuální verzi a20-olinuxino_micro.fex. Konverzi pak provedeme pomocí programu fex2bin:

./fex2bin a20-olinuxino_micro.fex > script.bin

Pro více vizte např. wiki: Configuration of hardware in the debian image a Fex Guide.

Mapování GPIO portů lze vyčíst z Programmable I/O Pins nebo z pokusů nadšenců o grafické zmapování A20 GPIO map.
Dále je k dispozici celkem přehledný manuál : A20-OLinuXino-Micro.pdf nebo z pro laiky naprosto smrtící dokumentace A20 User Manual 2013-03-22.pdf.

Debian na MicroSD kartu

link

Základem je rychlá a relativně kvalitní MicroSD karta. V současné době je originální obraz disku Debianu by Olimex celkem kvalitní a pro naše potřeby nepotřebuje žádné větší úpravy. S tímto standardním obrazem je odzkoušená funkčnost i2c na obou UEXT rozhraní, stejně jako UARTy, funkční síť, HDMI, grafické prostředí, OTG, SATA, audio atd. Také konečně obsahuje modul „CDC ACM“ (/dev/ttyACM), který je nutný pro připojení čtečky přes USB. Aktuální verzi obrazu s popisem odzkoušených částí je možné stáhnout z wiki Olimexu: ULTIMATE A20 Debian 4GB SD-card image release-5.

Obraz dostaneme na sd kartu klasicky pomocí dd:

dd if=a20_debian_kernel_3_4_LAN_USBx2_Cards_LCD_HDMI_SATA_TS_X_GPIO_OTG_MIC_release5.img of=/dev/sdX

Kdo si chce hrát nebo něvěří firmě Olimex či Google Drive (tam link ke stažení míří), tak si může zkusit vytvořit vlastní image:

Úprava systému a instalace všech potřebných součástí pro RFID

link

Obraz SD karty má několik menších nedostatků, které by se daly vylepšit, jedním z nich je logování, které není moc vhodné zapisovat na SD kartu, stejně tak jako mít tmp na kartě:

# logování a dočasné soubory v paměti:
nano /etc/fstab
tmpfs     /tmp         tmpfs    nodev,nosuid,size=15M   0   0
tmpfs     /var/log     tmpfs    nodev,nosuid,size=100M   0   0

Další možností je logovat např. na nějaký syslog server.

Nastavíme si časové pásmo:

dpkg-reconfigure tzdata

Dále si nastavíme sync času podle vlastních NTP serverů:

nano /etc/ntp.conf
...
server ntp.firma.local iburst
server ntp.nic.cz iburst
...

Samotný sync času bych řešil skokově pomocí ntpdate (Olimex nemá rtc/baterii, nedrží čas – po každém restartu je resetován) a poté spustil ntpd na drobné odchylky:

nano /etc/rc.local
...
ntpdate ntp.firma.local
/etc/init.d/ntp start

Kdo chce řešit realtime, tak si může vyzkoušet MOD-RTC.

Příprava pro RFID program

link

Program na čtení RFID tagů je napsaný v Pythonu a má grafické rozhraní. Vzhledem k urychlení nasazení a lepší kontrole ze strany kolegů se rozhodlo, že se program nechá tak, jak je. Olimex obraz standardně obsahuje Xfce, což je pro mé „linux laik“ kolegy ideální. Spouštěcí sekvence tedy bude:

Instalace potřebných a vhodných balíčků:

# update seznamu balíčků :
apt-get update

# pro vnc server a RFID program :
apt-get install tightvncserver python python2.7-wxgtk2.8 python-serial python-fpconst python-soappy

# další vhodné balíčky :
apt-get install setserial rsync screen mc htop iptraf iperf unzip minicom

Kdo používá proxy server, tak si jej pro apt nastaví:

nano /etc/apt/apt.conf.d/75proxy
Acquire::http::Proxy "http://IP_proxy:3128";

Dále si vytvoříme uživatele, pod kterým poběží vnc server a RFID program na čtení tagů, a nezapomeneme přidat uživatele do skupiny dialout, která má oprávnění pro přístup k /dev/ttySx:

useradd -d /home/admin -m -s /bin/bash admin -G dialout
passwd admin

Nyní nastavíme heslo pro VNC server:

root@A20:~# su - admin
admin@A20:~$ cd
admin@A20:~$ vncpasswd
Using password file /home/admin/.vnc/passwd
VNC directory /home/admin/.vnc does not exist, creating.
Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

Dále vytvoříme spouštěcí script VNC serveru:

cd .vnc/
nano xstartup
#!/bin/bash
/usr/bin/startxfce4 &

A nastavíme oprávnění:

chmod 755 xstartup

Dále je potřeba zařídit, aby se vnc server spustil po spuštění systému pod uživatelem admin, čehož docílíme vhodným rc skriptem:

nano /etc/init.d/vncserver

#!/bin/sh
### BEGIN INIT INFO
# Provides:          vncserver
# Required-Start:    x11-common
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# X-Start-Before:
### END INIT INFO


PATH=/bin:/sbin:/usr/bin:/usr/sbin

# The Username:Group that will run VNC
USER="admin"
#${RUNAS}

# The display that VNC will use
DISPLAY="0"

# Color depth (8,15,16 and 24)
DEPTH="16"

# The Desktop geometry to use.
#GEOMETRY="<WIDTH>x<HEIGHT>"
#GEOMETRY="800x600"
GEOMETRY="1024x768"
#GEOMETRY="1280x1024"

# The name that the VNC Desktop will have.
NAME=`hostname`

OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

. /lib/lsb/init-functions

case "$1" in
start)

   log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
   su - ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;

stop)

   log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
   su - ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;

restart)
   $0 stop
   $0 start
;;

esac

exit 

Nastavíme oprávnění a přidáme do příslušného runlevelu:

chmod 755 /etc/init.d/vncserver
update-rc.d vncserver defaults

Můžeme vyzkoušet (jako root), zda funguje:

/etc/init.d/vncserver start

Nyní by se měl spustit vncserver na výchozím portu 5900 a mělo by se na něj dát přihlásit pod heslem, které jsme si nastavili do „~/.vnc/passwd“.

Program s RFID umístíme do domovského adresáře uživatele a nastavíme jeho automatické spouštění v xfce a provedeme lehké úpravy nastavení v Xfce:

# nastavíme rfid po spuštění xfce4:
Applications Menu -> Settings -> Session and Startup -> Application Autostart -> Add -> ...

# nastavíme zástupce na ploše (kdyby bylo potřeba spustit dodatečně):
Pravý tl. na plochu -> Create Launcher -> ...
(ikonka je ze sekce "Device Icons -> gnome-dev-wavelan")

# vypneme pozadí, aby bylo rychlejší vnc:
pravý tl. myši na plochu -> Desktop Settings -> zde vypneme obrázek plochy a nastavime jen barvu bez gradientu

# vypneme screensaver:
Applications Menu -> Settings -> Screensaver -> Mode -> Disable Screen Saver

# vypneme removable devices z plochy:
Pravý tl. na plochu -> Desktop Settings -> Icons -> Odškrtneme "Removable Devices"

A takto to nějak vypadá, když čtečka naběhne:

rfid program up 01 rfid program up 02 rfid program up 03

Veškeré nastavení se ukládá přímo do čtečky a program si jej při spouštění ze čtečky čte.

Sériové porty

link

V tuto chvíli bychom měli mít v systému tři UART rozhraní, viz výpis dmesg :

root@rfid-sdm-in:~# dmesg |grep uart
[    0.624022] [uart]: used uart info.: 0xc1
[    0.628771] [uart]: serial probe 0 irq 33 mapbase 0x01c28000
[    0.655074] sunxi-uart.0: ttyS0 at MMIO 0x1c28000 (irq = 33) is a U6_16550A
[    1.395151] [uart]: serial probe 6 irq 51 mapbase 0x01c29800
[    1.427070] sunxi-uart.6: ttyS1 at MMIO 0x1c29800 (irq = 51) is a U6_16550A
[    1.438859] [uart]: serial probe 7 irq 52 mapbase 0x01c29c00
[    1.470730] sunxi-uart.6: ttyS2 at MMIO 0x1c29c00 (irq = 52) is a U6_16550A

Používat tedy budeme „/dev/ttyS1“ nebo „/dev/ttyS2“.

RFID program a verze Pythonu

link

RFID program je napsán pro dvojkovou řadu Pythonu, kdo si jej tedy chce vyzkoušet třeba na Arch Linuxu, kde je jako výchozí python3, tak by měla stačit jedna malá úprava main.py:

nano main.py
z:
#!/usr/bin/env python
na:
#!/usr/bin/env python2

MOD-IO2 alá používáme relátka

link

Tento modul je moc pěkná a zajímavá věc. Modul obsahuje tři diody, jedna svítí červeně a říká, že je modul napájen. Poté má dvě diody (každé relátko má jednu) a pokud svítí, tak to znamená, že je relátko sepnuté.

Menší nevýhodou tohoto modulu je to, že nezná, neví, neumí zjistit, v jakém stavu je relé, zda je sepnuté, nebo ne. Z tohoto důvodu dochází vždy při spuštění čtečky k inicializaci relátek, tzn, pošle se jim výchozí stav – vše vypnout. Poté si stav relátek udržuje upravený RFID program.

Relátka se nastavují pomocí „i2set“, syntaxe je následující:

i2cset -y 2 0x21 0x40 0x03

"2" – znamená, na které sběrnici (1 nebo 2) se modul nachází, to lze zjistit pomocí příkazu i2cdetect

root@rfid-sdm-in:# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- 21 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --     
                    
root@rfid-sdm-in:# i2cdetect -y 2
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

MOD-IO2 má u defaultní verze firmware adresu „0x21“, tudíž se náš modul nachází na první sběrnici, což by odpovídalo UEXT1.

„0x21“ – již jsme si vysvětlili, že toto je adresa modulu, která by měla jít zápisem měnit (nezkoušel jsem)

„0x40“ – patří operaci s relátky, tudíž říkám, že chceme operovat s relátky

„0x03“ – toto je již samotný příkaz relátku, celkem můžeme poslat čtyři hodnoty :

Více viz dokumentace v MOD-IO2.pdf. K dispozici je také i pěkná knihovna modio.py

Komunikace RFID programu s Oraclem

link

Ve firmě máme IS, ten má data v Oracle. Kolega trochu přiohnul RFID program, ten po spuštění provede:

Reálné prostředí

link

Vzhledem k menší čtecí vzdálenosti tagů jsme umístili antény do takové pozice, aby byly co nejblíže k řidiči. Většina řidičů nemá problém a nemusí ani stahovat okénko, aby byl tag načten. Jedinou výjimkou může být velmi zřídka vyskytující se americký machr. Konkrétní prostředí pak může vypadat takto:

stanoviste rozebrano stanoviste komplet pohled 01 stanoviste komplet pohled 02

Někoho může zarazit, proč máme dvě zařízení u sebe, proč dvě A20 a né jedno, které by zvládlo obě brány? Je to z toho důvodu, že jen na tomto místě máme dvě brány, všude jinde operujeme s jednou čtečkou, jednou akcí. Ono se nezdá, ale vzhledem k tomu, že relátko nezná své stavy + pár dalších nepříjemností celou logiku značně komplikuje. V rámci zjednodušení se jasně rozhodlo, že lepší dát 1800,- navrch, než si docela nepříjemně komplikovat život.

Do budoucna ještě přidáme teplotní čidla a možná i nějaké menší chlazení. Výkon A20 je úplně akorát, při čtení tagů se lehce zatěžuje CPU, VNC má velmi přijatelné odezvy. Řidiči si postupně zvykají být blíže k anténám a hlavně si začínají zvykat, že to konečně funguje. Po dvou měsících nemáme hlášenou jedinou výtku, že by někdy někdo nebyl přečten, že by se nezvedla závora apod. Uvidíme za pár let. Na čtečkách je uptime 21 dní a využito 68 MiB paměti, zdá se tedy, že VNC server ani RFID program neleakují paměť.

Závěr

link

Zatím jsme s A20 i RFID čtečkami Metra Blansko spokojeni. A20 máme nasazenou jen v tomto případě, RFID čtečky jsme začali nasazovat před delší dobou do našich kiosků s průmyslovými Windows PC. Dát Debian na NAND flash už by také neměl být problém. Nakonec si ukážeme, jak řidič tahače dohazuje 4h bokovky Iťákům, poznáte deset rozdílů při pohledu z téže kamery? :)... (malá nápověda: druhý snímek je o 50s mladší).

RFID RFID

Odkazy a zdroje

A20-OLinuXino
A20-OLinuXino-MICRO
A10 Boot process and an UPDATED Uboot for the A10
A Handy U-Boot Trick
OpenWRT: Olimex A20-OLinuXino-MICRO board

Další články z této rubriky

HW novinky: podzimní přehled #2
HW novinky: podzimní přehled #1
HW novinky: návrat skleněných ploten v HDD
HW novinky: PCI Express 4.0 prý ještě letos
HW novinky: i Skylake-X s 12 jádry používá levnou teplovodivou pastu

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.