Josip Budulica SEMINARSKI RAD - SPVP...

16
Josip Budulica 0036440961 Tekst je namjenjen za sve studente i one koji žele naučiti nešto više o praktičnom radu u razvojnom sustavu Arduino Za razumijevanje teksta potrebno je imati osnovna znanja iz elektrotehnike i programiranja SEMINARSKI RAD - SPVP 8. lipanj 2011

Transcript of Josip Budulica SEMINARSKI RAD - SPVP...

  • Josip Budulica 0036440961

    Tekst je namjenjen za sve studente i

    one koji žele naučiti nešto više o

    praktičnom radu u razvojnom sustavu

    Arduino

    Za razumijevanje teksta potrebno je

    imati osnovna znanja iz elektrotehnike

    i programiranja

    SEMINARSKI RAD - SPVP

    8. lipanj 2011

  • Prijenos zvuka preko UDP-a

    2

    Sažetak

    U ovom tekstu opisano je jedno od rješenja ozvučenja kuće. Glazba

    se šalje preko Ethernet mreže u IP paketima te se reproducira u realnom

    vremenu. Kao glavni element koristi se Arduino Duemilanove

    mikrokontroler te njegov Ethernet Shield pomoću kojeg se spaja na mrežu. Za prijenos zvuka odabran je UDP (User Datagram Protocol)

    protokol iz tog razloga što je prvenstveno zamišljeno da se glazba prenosi

    na manjem tj. lokalnom prostoru i da iz tog razloga neće doći do gubitaka

    paketa, čemu je UDP protokol podložan. Za prijenos i reprodukciju glazbe

    u realnom vremenu potrebna je i velika brzina prijenosa što je još jedan

    razlog zašto je odabran UDP ispred TCP (Transmission Control Protocol)

    protokola koji je pouzdaniji ali zahtjeva potvrdu ispravnog prijenosa

    podataka te je time sporiji.

    Sadržaj

    1. UVOD ............................................................................................................ 3

    2. DIJELOVI SUSTAVA ......................................................................................... 4

    2.1. Izvor zvuka: ............................................................................................ 4

    2.2. Sustav za prijenos zvuka: ......................................................................... 4

    2.2.1. Arduino Duemilanove: ........................................................................ 4

    2.2.2. Ethernet Shield: ................................................................................ 5

    2.2.3. RJ-45: .............................................................................................. 6

    2.3. Primatelj zvuka i reprodukcija zvuka: ......................................................... 6

    3. IMPLEMENTACIJA: .......................................................................................... 7

    3.1. Opis spajanja: ......................................................................................... 7

    3.2. Programski kod:....................................................................................... 8

    3.2.1. Pošiljateljska strana: .......................................................................... 8

    3.2.2. Primaća strana: ............................................................................... 11

    4. UPUTE ZA POKRETANJE: ................................................................................ 12

    5. ZAKLJUČAK .................................................................................................. 14

    6. LITERATURA................................................................................................. 15

    7. POJMOVNIK ................................................................................................. 16

    Ovaj seminarski rad je izraĎen u okviru predmeta „Sustavi za praćenje i voĎenje procesa“ na Zavodu za elektroničke sustave i obradbu informacija, Fakulteta elektrotehnike i računarstva,

    Sveučilišta u Zagrebu.

    Sadržaj ovog rada može se slobodno koristiti, umnožavati i distribuirati djelomično ili u cijelosti,

    uz uvjet da je uvijek naveden izvor dokumenta i autor, te da se time ne ostvaruje materijalna korist, a rezultirajuće djelo daje na korištenje pod istim ili sličnim ovakvim uvjetima.

  • Prijenos zvuka preko UDP-a

    3

    1. Uvod

    U sklopu seminarskog rada „pametna kuća“ opisano je i realizirano

    jedno od rješenja problema ozvučenja u kući. Glazba se šalje preko

    Ethernet mreže UDP/IP protokolom. Sirovi audio signal iz nekog audio

    izvora Arduino Dueminalove prihvaća te pomoću svog Ethernet Shielda

    šalje UDP protokolom na računalo povezano RJ-45 kabelom. Računalo je

    programirano da te podatke prihvaća te da ih šalje na zvučnu karticu tj.

    da reproducira zvuk. Za realizaciju ovog projekta potrebno je imati Arduino Duemilanove mikrokontroler, Ethernet Shield, računalo sa

    instaliranim Ubuntu operativnim sustavom, RJ-45 kabel te komponente

    potrebne za realizaciju predsklopova. Detaljna realizacija projekta biti će

    objašnjena u nastavku ovog dokumenta.

  • Prijenos zvuka preko UDP-a

    4

    2. Dijelovi sustava

    Ovaj sustav sastoji se od izvora zvuka, sustava za prijenos i

    primatelja zvuka (reprodukcija zvuka).

    Slika 1 Principjelna shema sustava

    2.1. Izvor zvuka:

    Kao izvor zvuka koristi se bilo kakav audio ureĎaj te se uzima sirovi signal koji se inače dovodi na njegove zvučnike. U ovom projektu korišten

    je izlazni audio signal iz računala koji se dovodi iz line out priključka ali

    priključivanje drugog izvora zvuka poput CD playera, MP3 playera ili

    nekog trećeg je potpuno identično. Ako bi se koristio mikrofon kao izvor

    zvuka bilo bi potrebno napraviti predpojačalo što u ovome radu neće biti

    objašnjeno.

    2.2. Sustav za prijenos zvuka:

    Sustav za prijenos zvuka sastoji se od Arduino Duemilanove mikrokontrolera, Ethernet Shielda i RJ-45 kabela.

    2.2.1. Arduino Duemilanove:

    Slika 2 Arduino Duemilanove mikrokontroler

    Arduino je „open source“ platforma zasnovana na fleksibilnom i

    jednostavnom za upotrebu hardveru i softveru. Mikrokontrolerska pločica je temenjena na ATMega168 ili ATMega328 procesoru. Ima 14 digitalnih

    pinova koji se softverski mogu odabrati hoće li se koristiti kao ulazni ili

  • Prijenos zvuka preko UDP-a

    5

    kao izlazni pinovi. Od njih 14, 6 ih se može koristiti kao PWM (Pulse Width

    Modulation) izlaze i to na pinovima 3, 5, 6, 9, 10 i 11. Arduino

    Duemilanove ima i šest analognih ulaza koji su smješteni nasuprot

    digitalnim pinovima. Priključak za USB kabel koristi se za programiranje

    mikrokontrolera te za napajanje istoga. Kako ovaj mikrokontroler radi sa

    naponima 0-5V, a audio signal je izmjenični napon, potrebno je učiniti nešto u vezi toga. Taj problem će se riješiti jednostavnim unošenjem

    istosmjerne komponente u audio signal, a na to će se kasnije morati

    obratiti pažnja u programskom kodu. Programski kod mikrokontrolera piše

    se u posebnom Arduino programskom jeziku temeljenom na C/C++

    programskom jeziku.

    2.2.2. Ethernet Shield:

    Slika 3 Arduino Ethernet Shield

    Arduino Ethernet Shield omogućava Arduino mikrokontroleru da se

    spoji na internet. Zasnovan je na Wiznet W5100 ethernet čipu koji

    osigurava mrežni (IP) stog koji omogućuje i TCP i UDP komunikaciju i

    podržava do četiri istovremene veze. Ethernet Shield se spaja povrh

    Arduino pločice koja preko SPI sabirnice komunicira sa Ethernet Shieldom

    na pinovima 11, 12 i 13. Na Ethernet Shieldu postoje indikacijske lampice

    kao što su LINK (indicira prisutnost mreže i „blinka“ kada se šalju ili

    dobivaju podaci), RX („blinka“ kada se primaju podaci sa mreže), TX

    („blinka“ kada se šalju podaci na mrežu) koje daju uvid u osnovne dogaĎaje.

  • Prijenos zvuka preko UDP-a

    6

    2.2.3. RJ-45:

    Slika 4 RJ-45 kabel

    RJ-45 je u računarstvu neformalni naziv za 8-polni modularni utikač

    ili utičnicu kakve se koriste u strukturnom kabliranju (npr. za potrebe

    Ethernet-a ili ISDN-a). U ovome projektu RJ-45 kabelom povezati će se

    Ethernet Shield sa osobnim računalom te će se preko njega slati podaci.

    2.3. Primatelj zvuka i reprodukcija zvuka:

    Kao primatelj zvuka koji će prihvaćati podatke koje sadrže zvučnu

    informaciju koristit će se računalo. Računalo će preko RJ-45 mrežnog

    kabela dobivati podatke od Ethernet Shielda te će ih prenositi na zvučnu

    karticu koja će preko zvučnika reproducirati podatke u vidu audio signala.

    Kao simulaciju drugog računala (zvučnika), na kojeg bi se audio signal

    mogao prespojiti, koristit će se isto računalo (ista IP adresa) ali će

    „slušati“ sa dva porta (no ne i istovremeno).

  • Prijenos zvuka preko UDP-a

    7

    3. Implementacija:

    3.1. Opis spajanja:

    Slika 5 Shema spajanja sustava

    Na slici 5 prikazana je shema spajanja sustav. Preko kondenzatora

    od 10uF dovodi se sirovi audio signal iz line out konektora računala. Kao

    što je već rečeno, Arduino mikrokontroler radi sa naponima od 0-5V pa je

    potrebno izmjenični audio signal podići za odreĎeni iznos. Ovdje je to

    izvedeno naponskim dijelilom kojim se izmjeničnom audio signalu dodaje istosmjerna komponenta od 2.5V podižući tako audio signal na pola

    naponskog opsega. Napon od 5V i ground uzimamo sa Arduino pločice.

    Kondenzatorom od 4.7nF postiže se efekt „glaĎenja“ audio signala nebi li

    se smanjio šum. Tako oblikovani signal dovodi se na analogni ulaz

    mikrokontrolera A0. U sklopu projekta zamišljeno je prezentirati

    mogućnost automatskog stišavanja zvuka prilikom zvona telefona ili zvona

    na ulaznim vratima. Za simulaciju ovog efekta koristit će se sklopka S1

    koja će prebacivanjem u jedan položaj simulirati dolazni poziv na telefonu

    ili zvono na vratima, a prebacivanjem u drugi položaj simulirati će

    poklapanje slušalice nakon razgovora ili zatvaranje ulaznih vrata. Arduino

    mikrokontroler posjeduje dva hardverska prekida (interrupt) koji se nalaze

  • Prijenos zvuka preko UDP-a

    8

    na digitalnim pinovima 2 ( INTERRUPT 0) i 3 (INTERRUPT 1). Signali koji

    će simulirati npr. dolazni poziv i poklapanje slušalice biti će spojeni na te

    pinove, a prekidi će se dešavati na rastući brid promjene signala. Signal

    simulacije dolaznog poziva biti će na pinu 3 (INT1), a signal simulacije

    poklopljene slušalice na pinu 2 (INT0). Sklopka S2 koristit će se za

    prespajanje audio signala na drugo odredište tj. u ovom slučaju na isto odredište (ista IP adresa) ali na drugi port. Ti signali provjeravati će se na

    digitalnim pinovima 8 i 9.

    3.2. Programski kod:

    Potrebno je napisati kod na pošiljateljskoj strani tj. kod koji će slati

    UDP pakete sa informacijom audio signala i kod na primajućoj strani tj.

    kod koji će primati UDP pakete i slati ih na zvučnu karticu računala.

    3.2.1. Pošiljateljska strana:

    U gornjem odsječku programa navode se korišteni library-ji,

    postavlja se mac adresa samog arduina i njegova IP adresa te lokalni port.

    Navode se adrese i odredišni portovi ureĎaja na koje se šalju podaci.

    #include

    extern "C" {

    #include

    #include

    }

    /* ETHERNET CONFIGURATION

    * ARDUINO: set MAC, IP address of Ethernet shield,

    * and local port to listen on for incoming packets */

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC address to use

    byte ip[] = { 192, 168, 0, 2 }; // Arduino's IP address

    int localPort = 8888; //local port to listen on

    /* TARGET: set this to IP/Port of computer that will receive

    * UDP messages from Arduino */

    byte targetIp[] = { 192,168,0,1};

    int targetPort = 8005;

    byte targetIp2[] = { 192, 168, 0, 1};

    int targetPort2 = 8010;

  • Prijenos zvuka preko UDP-a

    9

    U gornjem odsječku programskog koda nevedeni su pinovi koji se

    koriste te hoće li se koristiti kao ulazni ili izlazni. Kod varijable 'prigušenje'

    potrebno je navesti 'volatile' što označava da će se ova varijabla mijenjati

    u prekidnoj funkciji. U funkciji 'setup', osim navoda tipova pinova, navode

    se prekidi i uspostavlja se ethernet komunikacija kao i otvaranje priključka za UDP komunikaciju. Prekidi su postavljeni tako da se prekidna

    funkcija izvrši na svaki rastući brid pojedinog signala.

    int zvuk = 0; //analogni pin za zvuk

    int i=0;

    int jedan = 8; //digitalni ulaz

    int dva = 9; //digitalni ulaz

    volatile int prigusenje = 4;

    int zvoni = 0; //zvono telefona

    int slusalicaSpustena = 1; //spuštena slušalica

    #define PACKET_SIZE 512

    uint8_t podaci[PACKET_SIZE];

    void setup() {

    pinMode(zvoni, INPUT);

    pinMode(slusalicaSpustena, INPUT);

    pinMode(jedan,INPUT);

    pinMode(dva,INPUT);

    Ethernet.begin(mac,ip);

    socket(0,Sn_MR_UDP,8888,0);

    attachInterrupt(zvoni, POZIV, RISING);

    attachInterrupt(slusalicaSpustena, SLUSALICA, RISING);

    }

  • Prijenos zvuka preko UDP-a

    10

    U gornjem odsječku programskog koda definirane su prekidne

    funkcije i glavna petlja. U prekidnim funkcijama postavlja se prigušenje

    audio signala ovisno o kojem prekidu je riječ. U glavnoj petlji provjerava

    se zadano odredište slanja podataka, puni se buffer (podaci) podacima

    analognog signala te se šalje putem UDP-a na odredište.

    void POZIV(){

    prigusenje = 6;

    }

    void SLUSALICA(){

    prigusenje = 4;

    }

    void loop() {

    while(1){

    if(digitalRead(jedan) == HIGH){

    for(i=0;i

  • Prijenos zvuka preko UDP-a

    11

    3.2.2. Primaća strana:

    Prijem i reprodukcija audio signala izvedeni su u operativnom sistemu

    Ubuntu. Korišten je Linuxov napredni zvučni sustav ALSA (Advanced Linux

    Sound System). Može se reći da je to komponenta Linux jezgre zadužena

    za rad i povezivanje s hardverom zaduženim za zvuk u računalu (zvučne

    kartice, mikrofoni, zvučnici itd.). Korišten je Linuxov C++ kompajler gcc.

    Instalacija i upute za korištenje biti će objašnjenje u poglavlju „Upute za

    pokretanje“.

    U gornjem programskom odsječku navodi se library alsa/asoundlib.h

    kako bi bilo omogućeno pristupati zvučnoj kartici, definira se buffer

    veličine 256 byteova, frekvencija uzorkovanja koja se upisuje prilikom

    pokretanja programa, te se otvara komunikacija sa zvučnom karticom.

    #include "alsa/asoundlib.h"

    static char *device = "default";

    /* playback device */

    #define BUFFER_SIZE 256

    unsigned char buffer[BUFFER_SIZE];

    int main(int argc, char *argv[])

    {

    int err;

    unsigned int i;

    snd_pcm_t *handle;

    snd_pcm_sframes_t frames;

    int samplingF = 7200; /*default

    int rv;

    int size=16;

    if(argc>=2)

    samplingF = atoi(argv[1]);

    if((err=snd_pcm_open(&handle,device, SND_PCM_STREAM_PLAYBACK,

    0)) < 0) {

    printf("Playback open error: %s\n",snd_strerror(err));

    exit(EXIT_FAILURE);

    }

    if ((err = snd_pcm_set_params(handle,SND_PCM_FORMAT_U8,

    SND_PCM_ACCESS_RW_INTERLEAVED, 1, samplingF, 1,1000000))

  • Prijenos zvuka preko UDP-a

    12

    U gornjem programskom odsječku izvodi se petlja u kojoj se

    buffer puni pcm podacima koji se tada šalju na zvučnu karticu. Ovaj dio

    biti će detaljnije objašnjen u poglavlju „Upute za pokretanje“.

    4. Upute za pokretanje:

    Kako bi kod namjenjen za Arduino mikrokontroler prebacili na samu

    pločicu potrebno je imati odgovarajući softverski alat. Za potrebe ovoga

    projekta korišten je Arduino 0016 softver te se preporuča da se koristi ova

    verzija programa kako bi se izbjegli neki problemi. U programu odabire se tip korištenog mikrokontrolera (BoardAtm128) te COM port na koji je

    spojen USB kabelom. Pritiskom na tipku program se prebaci na

    mikrokontroler. Prema uputama navedenim u ovom radu spoji se sustav

    koji bi trebao izgledati kao na slici 6. Na računalu na kojeme je instaliran operacijski sustav Ubuntu potrebno je spojiti drugi kraj RJ-45 kabla. U

    radnom okružju Ubuntu potrebno je konfigurirati vezu izmeĎu

    mikrokontrolera i računala. To se radi u postavkama za mrežu gdje je

    potrebno namjestiti IP adresu na koju mikrokontroler šalje podatke

    (targetIP u kodu za Arduino mikrokontroler). Nakon što je to napravljeno

    potrebno je otvoriti Terminal u Ubuntu radnom okruženju. Potrebno je

    izvršiti slijedeće naredbe:

    sleep(1);

    while(1) {

    int rv = fread(buffer,BUFFER_SIZE,1,stdin);

    frames = snd_pcm_writei(handle, buffer, BUFFER_SIZE);

    size--;

    if (frames < 0)

    frames = snd_pcm_recover(handle, frames, 0);

    if (frames < 0) {

    printf("snd_pcm_writei failed: %s\n", snd_strerror(err));

    break;

    }

    if (frames > 0 && frames < (long)rv)

    printf("Short write (expected %li, wrote %li)\n", (long)rv, frames);

    }

    snd_pcm_close(handle);

    return 0;

    }

    sudo apt-get install build-essential

    sudo apt-get install libasound2-dev

  • Prijenos zvuka preko UDP-a

    13

    Za izvršavanje ovih naredaba potrebno je imati internet vezu. Ako je

    instalacija prošla uspješno sve je spremno za kompajliranje koda koji će

    svirati glazbu. Kompajliranje programskog koda obavljamo izvršavanjem

    slijedeće naredbe koju je potrebno upisati u Terminal-u:

    Treba imati na umu da se tada moramo nalaziti u direktoriju u kojem se

    nalazi datoteka (treba je nazvati alsa.c) sa programskim kodom. Tada je

    potrebno izvršiti slijedeću naredbu u Terminal-u:

    To su ustvari dvije naredbe nc i alsa. Netcat (nc) „sluša“ podatke sa mreže

    koje mikrokontroler šalje UDP protokolom i te podatke šalje nastandardni

    izlaz. Naredbom „|“ (neimenovani cjevovod) podaci sa standardnog izlaza

    prosljeĎuju se na standardni ulaz sa kojeg alsa.c čita podatke naredbom

    fread. 8005 je port na kojeme nc „sluša“, a 7200 je frekvencija kojom se

    čitaju podaci sa standardnog ulaza i šalju na zvučnu karticu. Zvuk koji dolazi iz izvora zvuka sada bi se trebao čuti na zvučnicima računala.

    Slika 6 Realizacijska shema sustava

    gcc -Wall -o alsa alsa.c -lasound -lm

    nc -l -u 8005 | ./alsa 7200

  • Prijenos zvuka preko UDP-a

    14

    5. Zaključak

    Kao rezultat ovog projekta ostvarena je UDP komunikacija izmeĎu

    dva ureĎaja, Arduino mikrokontrolera (i njegovog Ethernet Shielda) sa

    osobnim računalom. Kao budućnost ovog projekta može se izvesti

    miješanje audio signala iz više izvora zvuka. TakoĎer mogla bi se ostvariti

    i komunikacija na daljinu tako da se UDP paketi prenose preko interneta.

    Primjer primjene toga bio bi postaviti mikrofon u dječjoj sobi i slušati što

    se tamo dogaĎa dok ste recimo na poslu. Nedostatak ovog projekta je taj što kvaliteta zvuka pri objašnjenom rješenju nije najbolja te će rijetko ko

    koristiti ovo za slušanje glazbe. Kvaliteta se mogla poboljšati upotrebom

    „timer interrupta“ za uzorkovanje audio signala na ulazu mikrokontrolera

    no to je ostavljeno za druge radove te ovdje nije ni realizirano ni

    objašnjeno.

  • Prijenos zvuka preko UDP-a

    15

    6. Literatura

    [1] Arduino Home page: http://www.arduino.cc/

    [2] Laboratory for Experimental Computer Science at the Academy of Media Arts Cologne: http://interface.khm.de/index.php/lab/experiments/arduino-realtime-

    audio-processing/

    [3] Advanced Linux Sound Architecture: http://www.alsa-

    project.org/main/index.php/Main_Page

    http://www.arduino.cc/http://interface.khm.de/index.php/lab/experiments/arduino-realtime-audio-processing/http://interface.khm.de/index.php/lab/experiments/arduino-realtime-audio-processing/http://www.alsa-project.org/main/index.php/Main_Pagehttp://www.alsa-project.org/main/index.php/Main_Page

  • Prijenos zvuka preko UDP-a

    16

    7. Pojmovnik

    Pojam Kratko

    objašnjenje

    Više informacija potražite na

    UDP User Datagram Protocol

    http://en.wikipedia.org/wiki/User_Datagram_Protocol

    PCM Pulse-Code-

    Modulation

    http://en.wikipedia.org/wiki/Pulse-code_modulation

    RJ-45 Mrežni kabel http://en.wikipedia.org/wiki/RJ45

    Arduino Duemilanove

    Mikrokontroler http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove

    Ethernet Shield Dodatak Arduinu http://arduino.cc/en/Guide/ArduinoEthernetShield

    http://en.wikipedia.org/wiki/User_Datagram_Protocolhttp://en.wikipedia.org/wiki/Pulse-code_modulationhttp://en.wikipedia.org/wiki/RJ45http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove