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 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

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 mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10

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.

[root@alarm \~]# wpa_passphrase Pelda Jelszo123

network={

ssid="Pelda"

#psk="Jelszo123"

psk=eb3123a9475d62371230611b8b3010e3c9d41c7cc59487138bffa94a0106539f

}

[root@alarm \~]# wpa_passphrase Pelda Jelszo123>/etc/wpa_supplicant/wpa_supplicant-wlan0.conf

[root@alarm \~]# systemctl enable dhcpcd

ln -s '/usr/lib/systemd/system/dhcpcd.service' '/etc/systemd/system/multi-user.target.wants/dhcpcd.service'

[root@alarm \~]# systemctl start dhcpcd

[root@alarm \~]# systemctl enable wpa_supplicant@wlan0

ln -s '/usr/lib/systemd/system/wpa_supplicant@.service' '/etc/systemd/system/multi-user.target.wants/wpa_supplicant@wlan0.service'

[root@alarm \~]# systemctl start wpa_supplicant@wlan0

-->

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 '"""'

# 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{width="320" height="273"} Napkollektoros
(sörkollektoros) gyümölcsaszaló mérési eredmények
2.{width="320" height="273"}

További információ az Arch Linuxról:

https://wiki.archlinux.org/index.php/WPA_supplicant

https://wiki.archlinux.org/index.php/Wireless_Setup

Oldalak