Josip Budulica SEMINARSKI RAD - SPVP...
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