Arduino TNC + Raspberry Pi + aprx

Alltaf er ég eitthvað að grúska heima fyrir og að þessu sinni er það Arduino TNC með RPI sem IGátt. Hvað þarftu?

  • Eitt stykki RPI
  • 4GB SD kort eða stærra.
  • Ethernet kapal (eða USB wifi fyrir RPI)
  • Eitt stykki Arduino Uno eða annað ámóta með Atmega328P.
  • VHF talstöð stillta á 144.800MHz
  • Tölvu með linux uppsettu, Debian 6 eða Ubuntu 12.04 eða annað sambærilegt hentar vel.
  • Minniskortalesara fyrir SD kort
  • Arduino TNC RX pakkann frá KI4MCW
  • Brauðbretti, veroborð eða ámóta.
  • Lóðbolta & lóðtin (bara ef þú ætlar að smíða þetta á veroborð/prentplötu)

Byrjum á að útbúa Arduino sem TNC.
1. Skref, rafbúnaður.

Fyrir þetta þarftu:

  • Arduino Uno
  • Linux tölvu
  • Brauðbretti eða Veroborð
  • Bertos Arduino TNC tengimyndina
  • VHF talstöð stillta á 144.800MHz
  • Íhluti:
  • 2x 1kOhm viðnám
  • 100nF þétti
  • 3.5 mm Mono jack tengi (eða annað tengi sem passar þinni VHF talstöð!)

Taktu brauðbrettið og víraðu arduinoinn upp eins og sést á tengimyndinni. Þar sem þetta er bara RX ætlum við ekki að nota PTT og Audio out þarftu bara að horfa í efsta hlutann á tengimyndinni. (Ég fer yfir bæði RX og TX með öðrum pistli síðar)

2. skref – Hugbúnaðurinn

Næst er að tengja Arduino í gegnum USB við vinnutölvuna þína. Þá skaltu sækja bertos_kiss_tnc_rx.tar.gz af vefsíðu KI4MCW. Þegar þú ert búinn að ná í það skaltu afþjappa því. t.d. með eftirfarandi skipun í þeirri möppu sem skjalið er í (t.d. /home/user/Downloads/)
# tar -xvf bertos_kiss_tnc_rx.tar.gz
Næst skaltu opna terminal ef þú hefur ekki þegar gert það. :)
(ctrl + alt + t)

# cd ~/Downloads/bertos_kiss_tnc_rx/

Þá skulum við kanna hvar Arduino er, oftast er hann undir /dev/ttyACM0
Getur kannað það með
# ls /dev/ttyACM*
/dev/ttyACM0
Ætti að koma upp, ef ‘no such file or directory’ kemur upp þá er arduino undir einhverju öðru eða ekki tengdur. Þú getur prófa að skrifa eftirfarandi og sjá hvort hann sé einhverstaðar annarstað.
# ls /dev/tty*
Tengdu og aftengdu Arduino og sjáðu hvort eitthvað bætist inní listann eða dettur út.

Ef þetta virkar skulum við næst henda hugbúnaðinum yfir á Arduino. (Þú þarf að hafa avrdude uppsettan)
Setjum upp avrdude á ubuntu/debian
# sudo apt-get install avrdude

í bertos_kiss_tnc_rx/ möppunni ætti að vera bash skrá sem heitir ‘p’ Það ætti að duga að keyra þá skrá.
# sh p
EÐA keyra eftirfarandi skipun í terminal í þessari möppu.
# avrdude -p atmega328p -c arduino -P /dev/ttyACM0 -U images/aprs.bin -v

Voila! Arduino er kominn með Bertos RX ef allt heppnaðist.

3. skref – VHF talstöð tengd við Arduino

Til að geta móttekið pakka þarftu VHF talstöð (helst amatör stöð). Stilltu hana á 144.800MHz.

Þú þarft að fá hljóðmerki út af stöðinni: Flestar talstöðvar koma með 3,5mm mono jack aftan á sér og þú getur búið til einfaldan kapal eða notað snúru með mono eða steríó tengi á öðrum enda. Á hinum endanum viltu bara hafa víra, jörð (yfirleitt skerming) og einn vír sem er endinn á jack tenginu. (e. Tip)

Tengdu þetta við 100nF þéttinn sem þú settir upp samkvæmt Bertos teikningunni.

Stilltu síðan Squelch á stöðinni alveg niður í 0, þá ættir þú að heyra suð í stöðinni, hækkaðu síðan styrkinn uppí c.a. 50%. Tengdu Jack tengið aftan í stöðina (eða sambærilegt tengi fyrir þína stöð)

Mundu að þú þarft að hafa stöðina tengda við loftnet. :)

Voila!

Raspberry Pi

1. Uppsetning Debian

Næst skulum við hefja uppsetningu á RPI. Ef þú ert þegar búinn að setja upp Raspbian á RPI og ert með það keyrandi getur þú sleppt fyrsta kaflanum og farið beint niður í kafla 2.

Náðu í nýjasta Rasbian stýrikerfið á vefsíðu RPI.
Settu SD kortið í kortalesarann og tengdu hann við tölvuna.
Við skulum afþjappa skránni
# unzip dagsetning-wheezy-rasbian.zip

‘df -h’ birtir upplýsingar um öll geymsludrif sem tengd eru tölvunni. (Það er mælst til þess að taka usb lykla, flakkara og annað ámóta úr sambandi rétt á meðan þetta er gert. Það er mjög auðvelt að hreinsa allt útaf viðkomandi drifi ef image skráin er sett á vitlaust drif!!!  Ég get tæplega ítrekað þetta nógu mikið!
Skrifið ‘df -h’ í terminal

Þá ætti að birtast eitthvað svipað þessu:

ulfr@ulfr-laptop:~/Downloads$ df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda1            456G  423G   11G  98% /
udev                 1.5G  4.0K  1.5G   1% /dev
tmpfs                605M  892K  604M   1% /run
none                 5.0M     0  5.0M   0% /run/lock
none                 1.5G  200K  1.5G   1% /run/shm
/home/ulfr/.Private  456G  423G   11G  98% /home/ulfr
/dev/sdc1            7.4G  1.8G  5.7G  25% /media/EOS_DIGITAL

Ég tók eitt af myndavélakortunum mínum í þetta. Því heitir það EOS_DIGITAL þarna. Þarna sést að kortið er undir /dev/sdc1 og er mountað undir /media/EOS_DIGITAL

Því næst gerum við:

# sudo dd if=~/Downloads/2013-02-09-wheezy-raspbian.img of=/dev/sdc bs=1M

Það kemur enginn progress listi, heldur verður bara að hinkra í rólegheitum. Þetta ætti þó ekki að taka lengur en nokkrar mínútur. (Tip: ctrl + t gefur status upplýsingar). Ef þetta virkar ætti eitthvað svona að koma upp:

1850+0 records in
1850+0 records out
1939865600 bytes (1.9 GB) copied, 229.252 s, 8.5 MB/s

Þegar þetta er klárt, þá er næsta skref að fjarlægja kortið úr lesaranum, færa það yfir í Raspberry Pi og prófa að ræsa apparatið.

2. Tengjast RPI og setja upp
Raspbian er með SSH þjónustu virka og því er nóg að skella Raspbanum í samband við Ethernet og prófa að tengjast. Raspbinn gerir ráð fyrir að DHCP sé virkt á staðarnetinu.

hostname á Raspbanum er raspberrypi.lan og ætti að duga að gera

# ssh -l pi raspberrypi.lan

til að tengjast. Lykilorðið er raspbery Virki það ekki, t.d. ef hostname virkar ekki af einhverjum orsökum, er hægt að nota eftirfarandi aðferð til að finna út ip tölu RPI.

Til að finna ip töluna, má nota nmap sem er öflugt tól til að skanna ip tölur og fleira. (man nmap)

# nmap 192.168.1.1/24 | less

Athugið að sumir routerar nota annað IP tölu range og því gæti þurft að gera

# ifconfig eth0 eða ifconfig wlan0

og sjá hvaða ip tölur eru í gangi á DHCP á Ethernet portinu. Stundum er sin hvor IP range fyrir ethernet og svo WLAN.

nmap listar væntanlega upp nokkrar mismunandi ip tölur, en við erum að leita að ip tölu sem hefur bara port 22 opið og ekkert annað.

Ef nmap er ekki uppsett á vélinni má sækja það með að nota skipunina

# sudo apt-get install nmap

Eftir að hafa tengst getur þú búið til annan notanda, skipt um lykilorð á pi notandanum eða bara haft þetta eins og þetta er.

Mér finnst betra að nota mitt eigið notendanafn. Það getur þú gert með

# sudo adduser notendafn

og fylgir síðan leiðbeiningum sem birtast á skjáinn, en betra er að bæta síðan nýja notandanum inní sudoers list.

# sudo visudo

Bættu þar inn línunni: ‘notendanafn ALL=(ALL) ALL’

Voila!

3. Eftirfarandi er fyrir þá sem nota stærri kort en 2-4GB. (Raspberry Pi styður allt að 32GB)

Nauðsynlegt er að lagfæra partition töfluna til að nýta allt SD kortið.

Eftir að þú hefur tengst RPI og verandi rótarnotandi skaltu gera eftirfarandi í terminal:

# fdisk /dev/mmcblk0

Veldu síðan ‘p’ Þá ætti þetta að birtast:

Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes
4 heads, 16 sectors/track, 242560 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00014d34

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     3788799     1832960   83  Linux

Afritaðu þetta í textaskjal á tölvunni þinni.

Þetta eru partition töflurnar sem eru virkar. Hér þurfum við að eyða seinni töflunni og búa til aðra í hennar stað sem verður stærri.

Skrifaðu fyrri talnarununa hjá þér (í mínu tilfelli 122880)

Ýttu svo á ‘d’ til að eyða töflu og ýttu á enter.

Veldu síðan ‘2’ og ýttu á enter.

Síðan skaltu búa til nýja töflu með að styðja á ‘n’ og síðan ‘p’ (merkir primary) og síðan tölustafinn ‘2’ sem merkir partition nr. 2.

Nú þarftu að stimpla inn það númer sem þú skrifaðir hjá þér.

Veldu síðan ‘w’ til að skrifa aðgerðina og ‘q’ til að hætta.

Nú er best að endurræsa Raspbanum með

# shutdown -r now

Næsta skref er að logga sig inná raspbanna aftur og keyra:

# resize2fs /dev/mmcblk0p2

Þetta tekur smá stund en að því loknu getur þú notað allt minniskortið.

Athugaðu hvort allt hafi gengið eftir með því að keyra skipunina

# df -h

Filesystem      Size  Used Avail Use% Mounted on
rootfs          7.3G  1.4G  5.6G  21% /
/dev/root       7.3G  1.4G  5.6G  21% /
devtmpfs        212M     0  212M   0% /dev
tmpfs            44M  216K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  34% /boot
Útkoman ætti að líta svona út.

Þá skulum við uppfæra Raspbann:

# sudo apt-get update && apt-get upgrade

4. Undirbúa RPI

Núna getum við farið að huga að því að tengja saman Arduino og RPI. Við þurfum í raun bara aprx, en ég set einnig upp apache2 og php5 og vim (ef þú fílar ekki vim sem ritil, slepptu honum úr bara)

# sudo apt-get install apache2 php5 vim

5. APRX

Við byrjum á að setja upp AX.25 stuðning, fyrst, gerumst rót.

# sudo su

# apt-get install libax25 libax25-dev ax25-apps ax25-tools

# cd /usr/src

Kíktu á vefsíðuna hjá aprx (http://ham.zmailer.org/oh2mqk/aprx/) og kannaðu hver nýjasti source pakkinn er, í mínu tilfelli er það 2.06.svn514

# wget ham.zmailer.org/oh2mqk/aprx/aprx-2.06.svn514.tar.gz

# tar -xvf aprx-2.06.svn514.tar.gz

# cd aprx-2.06.svn514/

# ./configure && make && make install

Voila! aprx komið inn!

6. Stillingar á aprx

Við skulum stilla aprx config skránna. Ég nota vim sem ritil, ef þú kýst frekar nano skaltu skipta út vim skipuninni fyrir nano. (apt-get install vim til að setja upp vim) Ég geri ráð fyrir að við séum enn rót.

# vim /etc/aprx.conf

Hún er frekar stór skráin, ég fer yfir það helsta til að koma þessu upp.
mycall    TF2SUT-2
server euro.aprs2.net
<interface>
serial-device    /dev/ttyACM0     57600    8n1     KISS
callsign            $mycall
txt-ok              false
</interface>
beaconmode aprsis # við viljum bara senda út beacon á internetinu, ekki RF.
cycle-size     20m #Við sendum út á 20mínútna fresti
beacon symbol “R&” lat “6406.95N” lon “02153.09W” comment “IGate Kopavogur http://birki.ulfr.net” # Þarna setjum við inn R& fyrir RX eingöngu, lat og lon eru hnit gáttarinnar og comment eru skilaboð sem fylgja með, má í raun vera hvað sem er, en er ágætt að nefna hvað þetta er, c.a. staðsetningu og einhverjar fleiri upplýsingar t.d. vefsíðu igáttarinnar.

Voila! config skráin tilbúin!

7. En það er meira.

Næst skulum við búa til stað fyrir loggana okkar.

# mkdir /var/log/aprx

og einnig skulum við búa til startup skriftu fyrir aprx: Þetta er skrifta sem fylgir venjulega með aprx, en þegar þetta er þýtt úr source fylgir hún ekki með.

# vim /etc/init.d/aprx

Afritaðu svo þetta fyrir neðan og settu í það skjal. (Eða ‘cd /etc/init.d && wget http://aprs.ulfr.net/aprx’ )

#! /bin/sh
### BEGIN INIT INFO
# Provides:          aprx
# Required-Start:    $syslog $local_fs
# Required-Stop:     $syslog $local_fs
# Should-Start:      ax25ifs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start and stop aprx
# Description:       Monitor and gateway radio amateur APRS radio network datagrams
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="aprx igate"
NAME=aprx
DAEMON=/sbin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

Þá ættir þú að geta ræst og stöðvað aprx með skipuninni:
# sudo /etc/init.d/aprx stop (getur sleppt sudo ef þú ert enn rótarnotandi)

8. Log skrár

aprx býr til logskrár, við skulum bæta þeim inní logrotate.

# vim /etc/logrotate.conf

Neðst í skránna setjum við:

/var/log/aprx/aprx.log {
daily
rotate 8
}

/var/log/aprx/aprx-rf.log {
daily
rotate 8
}

Svona komum við í veg fyrir að Raspbinn fyllist af loggum, við snúum þeim daglega og hendum eftir 8 skipti.

Hvað svo?

9. Tengjum dótið og prófum!

Tengdu Arduino við RPI og sjáðu hvort raspbinn sjái Arduino.

Næst skaltu prófa að ræsa aprx með skipuninni

# aprx -dddv

Þú ættir að sjá að raspbinn nær sambandi við /dev/ttyACM0 og síðan ætti að koma upp að hann nái að tengjast euro.aprs2.net. Ef það gengur allt saman skaltu fara inná aprs.fi og skoða hvort kallmerkið þitt birtist! (t.d. TF2SUt-2 í mínu tilfelli. Það ætti að koma nokkurnveginn strax, en hinkrum samt í eina mínútu áður en við förum útí bilanagreiningu. Ef þetta virkar ekki, farðu vandlega yfir öll skrefin hér á undan. Ef þetta virkar samt ekki, prófaðu að kommenta hér fyrir neðan eða senda mér email. :)

Ef þetta virkar allt saman, skaltu slökkva á aprx með því að ýta á ctrl + c

Þá ætti aprx að stöðvast, því næst skaltu keyra skipunina:

# /etc/init.d/aprx start

til að keyra daemonin í bakgrunn, hann ræsir sig síðan sjálfur næst þegar þú endurræsir RPI.

10. Að lokum

Þetta ætti allt að virka nokkuð smurt, ef ekki, skoðaðu vel skrefin á undan. Hafðu endilega samband hér að neðan ef þú finnur ekki útúr þessu. Minni á aprstf póstgrúbbuna á yahoo. Hvað svo? Farðu að velta fyrir þér hvernig þú færð Raspbann og Arduino til að vera meira en RX IGátt, t.d. stafvarpi, eða eitthvað allt annað!

11. Bónus 

Afhverju setti ég upp apache og php5? Jú, til að sjá aðeins hvað er að gerast. Mér finnst gott að geta monitorað hvað það er sem igáttin er að móttaka. Vertu hefðbundinn notandi við eftirfarandi skipanir, t.d. pi

# mkdir /home/pi/www/

byrjum á því að búa til crontab fyrir aprx-rf.log

# crontab -e

# */5 * * * * cp /var/log/aprx/aprx-rf.log /home/pi/www/

Síðan skulum við búa til skriftu sem gerir eitthvað við rf.log

# vim /home/pi/www/index.php

Settu þar inn eftirfarandi:

<?php
/*
Lítil php skrifta sem parsar rf.log og hendir henni upp í lesanlegt form

*/

$ro = preg_replace(‘/\s+/’, ‘ ‘, $row[‘message’]);
echo $ro;

$row = 1;

if (($handle = fopen(“rf.log”, “r”)) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, “^”)) !== FALSE) {
        $num = count($data);
        echo “<p> $num RAW APRS Packet $row: \n”;
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . “<br /></p>\n”;
        }
    }
    fclose($handle);
}
?>
Síðan skaltu búa til eftirfarandi í /etc/apache2/apache

Ég er ekkert voðalega flinkur í php, en ef þú hefur betri hugmynd til að parsa þetta máttu láta mig vita. :)

Ef þú tengist http://raspberrypi.lan/ á localnetinu þá færðu upp hvaða pakkar hafa verið að koma inná aprx í gegnum rf. Sniðugt? Síðan er hægt að leika sér með þetta endalaust.

Þú þarft auðvitað að setja upp /etc/apache2/sites-enabled/ rétt (apache wiki hjálpar)

Allar betrumbætur vel þegnar!

Heimildir:

http://www.ke0md.com/2012/09/03/aprs-i-gatedigi-with-my-new-raspberry-pi/

http://ham.zmailer.org/oh2mqk/aprx

http://aprs2.net/

http://aprs.fi/

http://raspberrypi.org/

https://sites.google.com/site/ki4mcw/Home/arduino-tnc

http://www.bertos.org/use/examples-projects/arduino-aprs

Copyright notice: Það má nota þetta tutorial í hvaða tilgangi sem er, með eða án þess að geta heimilda.

Að lokum, myndir af RPI sem IGátt í mjög frumstæðari víringu… (Já, sd kortahaldan brotnaði í dag)

IMG_2892 IMG_2893

This entry was posted in Radio and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *