Adatgyűjtő rendszer építése iMX233-OLinuXino kártyával (Arch Linux ARM telepítése)

Egy hőmérséklet- és páratartalommérő készüléket építettem iMX233-OLinuXino-MAXI kártyával. Fő előnyei:
- a mért adatok áttölthetők WiFi-n (esetleg 3G modemen) keresztül
- távolról menedzselhető SSH-val
- kis fogyasztás: kb. 5W
A fejlesztőkártyát a http://monosx.hu biztosította.

Én egy kész Linux disztribúciót telepítettem az OLinuXino kártyára, az Arch Linux ARM-ot. Az kezdjen neki a műveleteknek, aki legalább felhasználói szinten tud használni Linux konzolt, tudja mi a dd, ls, iwconfig, ifconfig parancs.
Az Arch Linux ARM a disztribúcióhoz egy 2GB-os micro SD kártyára lesz szükség! A jelenleg letölthető képfájl csak 2 GB-os kártyákkal működik: partíciós táblát és három partíciót is tartalmaz az image. Ezt a képfájlt a következő parancsokkal tudjuk letölteni és az SD kártyára másolni egy Linux PC-n:

wget http://archlinuxarm.org/os/ArchLinuxARM-olinuxino-latest.img.gz
gunzip ArchLinuxARM-olinuxino-latest.img.gz
dd if=ArchLinuxARM-olinuxino-latest.img of=/dev/sdX
sync

A /dev/sdX helyett a kártyánkhoz tartozó eszközfájlt adjuk meg: miután a kártyaolvasóba helyeztük a kártyát, a dmesg parancs kimenetében megtalálhatjuk az eszköz nevét. Figyeljünk, mert ha rossz eszköznevet írunk be, letörölhetjük a vincseszterünk vagy más adathordozónk tartalmát!
Az alábbi példában a keresett eszköz neve /dev/sdb:
[ 1551.825963] scsi3 : usb-storage 2-7:1.0
[ 1552.833373] scsi 3:0:0:0: Direct-Access     Generic- Multi-Card       1.00 PQ: 0 ANSI: 0 CCS
[ 1553.429647] sd 3:0:0:0: [sdb] 3970048 512-byte logical blocks: (2.03 GB/1.89 GiB)
[ 1553.430730] sd 3:0:0:0: [sdb] Write Protect is off
[ 1553.430746] sd 3:0:0:0: [sdb] Mode Sense: 03 00 00 00
[ 1553.431857] sd 3:0:0:0: [sdb] No Caching mode page present
[ 1553.431875] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[ 1553.438018] sd 3:0:0:0: [sdb] No Caching mode page present
[ 1553.438034] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[ 1553.673672]  sdb: sdb1
[ 1553.678468] sd 3:0:0:0: [sdb] No Caching mode page present
[ 1553.678482] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[ 1553.678494] sd 3:0:0:0: [sdb] Attached SCSI removable disk

Az SD kártyát tegyük az OLinuXino foglalatába, majd kapcsoljuk be a tápfeszültséget. Az U_DEBUG porton keresztül figyelhetjük a boot folyamatát, majd ezután a root felhasználónévvel és root jelszóval léphetünk be a rendszerbe.
Ha csatlakoztattunk egy ethernet kábelt, az ifconfig paranccsal ellenőrizhetjük, hogy a DHCP szervertől kapott-e IP címet:

[root@alarm ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.5.250  netmask 255.255.255.0  broadcast 192.168.5.255
        inet6 fe80::ac82:21ff:feec:92e  prefixlen 64  scopeid 0x20<link>
        ether ae:82:21:ec:09:2e  txqueuelen 1000  (Ethernet)
        RX packets 17  bytes 2243 (2.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26  bytes 2622 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

A 192.168.5.250-es címet kaptuk. A pacman -Syu paranccsal frissíthetjük rendszerünket a legújabb alkalmazásokra.
Állítsuk be az időzónát (ezt és az ntpd, sshd beállítását csak egyszer kell elvégezni):
timedatectl set-timezone Europe/Budapest

Ha állandó internetkapcsolata lesz az eszköznek, érdemes egy időszerverhez szinkronizálni:
systemctl enable ntpd
systemctl start ntpd

SSH szerver engedélyezése és elindítása (a legutóbbi, 2014.04.12-én letölthető image-nél már engedélyezve van az ssh):
systemctl enable sshd
systemctl start sshd

Ezután egy másik gépről bejelentkezhetünk az OLinuXino-ba:
ivanovp@titan ivanovp> ssh root@192.168.5.250
The authenticity of host '192.168.5.250 (192.168.5.250)' can't be established.
ECDSA key fingerprint is b4:d0:99:aa:3a:ab:81:12:f1:27:4b:21:e4:fe:09:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.5.250' (ECDSA) to the list of known hosts.
root@192.168.5.250's password:
X11 forwarding request failed on channel 0
Last login: Thu Jan  1 01:27:00 1970
[root@alarm ~]#

WLAN kapcsolat felépítéséhez a wireless_tools és wpa_supplicant csomagokra lesz szükség (a legutóbbi, 2014.04.12-én letölthető image-nél már ezek fel vannak telepítve):
pacman -S wireless_tools wpa_supplicant dialog

Egy USB-s WiFi adapter csatlakoztatása után valami hasonlót kell látnunk az iwconfig parancs kiadása után:
[root@alarm ~]# iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11bg  ESSID:off/any 
          Mode:Managed  Access Point: Not-Associated   Tx-Power=0 dBm  
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
         
eth0      no wireless extensions.

A netctl nevű program segít az ethernet/WiFi kapcsolatok felépítésében. A wlan0 interfészhez a /etc/netctl/wlan0 fájlt kell kitöltenünk. A wifi-menu -o paranncsal egyszerűen elkészíthetjük a fájlt. Nálam kb. így néz ki:

Description='A simple WPA encrypted wireless connection'
Interface=wlan0
Connection=wireless
Security=wpa

IP=dhcp

ESSID='Valami'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='Jelszo'
# Uncomment this if your ssid is hidden
#Hidden=yes

ExecUpPost='iwconfig wlan0 power off || /usr/bin/ntpd -gq || true'

Amennyiben a kapcsolat bizonytalan, gyakran megszakad, a power management-et érdemes kikapcsolni:
iwconfig wlan0 power off

Ez utóbbi parancs az ExecUpPost sorban szerepel. Ha jól állítottuk be a jelszót és megfelelő a jelerősség, ilyesmit kell látnunk (Mode:Managed a lényeg, az Encryption key:off pedig a WEP-re vonatkozik):
[root@alarm wpa_supplicant]# iwconfig wlan0
wlan0     IEEE 802.11bg  ESSID:"Szil" 
          Mode:Managed  Frequency:2.442 GHz  Access Point: 00:18:39:C0:53:5C  
          Bit Rate=9 Mb/s   Tx-Power=20 dBm  
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=44/70  Signal level=-66 dBm 
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:11   Missed beacon:0

A példa adatgyűjtő rendszerben egy USB-s eszköz méri a hőmérsékletet és a páratartalmat és egy virtuális soros porton keresztül lehet lekérdezni az adatokat. Python script nyelven írtam meg az adatgyűjtő programot. Ezért kell telepítenünk a python2 és python2-pyserial csomagokat:
pacman -S python2-pyserial

Hozzáadok egy hagyományos felhasználót:

[root@alarm ~]# cd /home/
[root@alarm home]# useradd ivanovp
[root@alarm home]# ls -l
total 0
[root@alarm home]# mkdir ivanovp
[root@alarm home]# chown ivanovp:ivanovp /home/ivanovp
[root@alarm home]# ls -l
total 4
drwxr-xr-x 2 ivanovp ivanovp 4096 Aug 27 18:23 ivanovp
[root@alarm home]# passwd ivanovp
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Majd egy másik gépről átmásolom a sensors.py programot és kipróbálom (ez nyilvánvalóan csak nálam fog működni, mert ebből a hőmérőből csak egy létezik, de kiindulási alapnak használható):
ivanovp@titan test> scp sensors.py ivanovp@192.168.5.250:
ivanovp@192.168.5.250's password:
sensors.py
ivanovp@titan ivanovp> ssh 192.168.5.250
ivanovp@192.168.5.250's password:
X11 forwarding request failed on channel 0
[ivanovp@alarm ~]$ ls
sensors.py
[ivanovp@alarm ~]$ ls -l
total 4
-rwxr-xr-x 1 ivanovp ivanovp 3737 Aug 27 18:25 sensors.py
[ivanovp@alarm ~]$ chmod +x sensors.py
[ivanovp@alarm ~]$ ./sensors.py
could not open port /dev/ttyACM0: [Errno 2] No such file or directory: '/dev/ttyACM0'

A /dev/ttyACM0 lenne a virtuális soros port eszközfájlja. Az eszköz megnyitásához az ivanovp felhasználónak az uucp csoport tagjának kell lennie. Az USB-s hőmérő csatlakoztatása után meg tudja nyitni a device-t és a beolvasott sorokat a sensors.log-ba írja:
[ivanovp@alarm ~]$ ./sensors.py
[ivanovp@alarm ~]$ ls
sensors.log  sensors.py
[ivanovp@alarm ~]$ cat sensors.log
2013-08-27 18:54:30 TMP122: 25.0000 C  DHT11: 23.0 C 57%

Azért, hogy a script percenként lefusson a crontabba a crontab -e paranncsal a következőket írom:
# m h  dom mon dow   command
*/1 *   *   *   *    /home/ivanovp/sensors.py

A cron szolgáltatás engedélyezéséhez systemctl enable cronie parancs futtatása szükséges.

A begyűjtött adatokból ilyen grafikonokat rajzoltam:
Napkollektoros (sörkollektoros) gyümölcsaszaló mérési eredmények Napkollektoros (sörkollektoros) gyümölcsaszaló mérési eredmények 2.

További információ az Arch Linuxról:
https://wiki.archlinux.org/index.php/WPA_supplicant
https://wiki.archlinux.org/index.php/Wireless_Setup