VOIP
Telefoon naar VoIP-adapter op Linux Snel recept: voeg PIC, SLIC, Asterisk, Linux en FXS toe. Geen telefoonrekening!
Angelos Varvitsiotis (GR)
Dit open hardware & software project is een USB-interface die een Voice-over-IP (VoIP) systeem koppelt aan een analoog telefoon toestel of gelijkwaardige apparatuur zoals een analoge centrale. Het werkt onder Linux met de vernieuwde Asterisk IP PBX software. In één klap kunt u uw oude telefoontoestel verbinden met de VoIP-wereld.
Zin in wat afkor tingen? Ingenieurs gebruiken ze doorlopend en de telefoon/ telecom industrie heeft er genoeg! Zoals: een FXS-interface (Foreign eXchange Subscriber; het telefoonstopcontact op de muur) geeft toegang tot POTS (plain old telephone service/system) via de lokale CO (Central Office; telefooncentrale) en moet aangesloten worden op abonnee-apparatuur zoals telefoontoestellen, modems en faxen.
Elektor producten & diensten • print EPS 100761-1 • componentenopstelling 100761-1.pdf
38
Met andere woorden, een FXS interface wijst naar de abonnee. Een FXS-interface voorziet de abonnee van de volgende primaire diensten: kiestoon, voedingsstroom en belspanning. Merk op dat de waarden en parameters van alle drie de diensten per land kunnen verschillende. Soms wordt het acroniem FXS ook vertaald als Foreign eXchange System. Een FXO-interface (Foreign eXchange
• PIC18F2550-I/SO, geprogrammeerd: # 100761-41 • Source code: # 100761-11.zip
Office; de steker aan de telefoon) krijgt toegang tot POTS, meestal van een CO van het PSTN (Public Switched Telephone Network). Met andere woorden, een FXOinterface wijst naar het Telco kantoor. Een FXO-interface heeft slechts één taak: op de haak/van de haak detecteren (sluiten van de lus). Zoals in figuur 1 te zien is, moet voor een werkende verbinding een
• Hyperlinks in het artikel • Onderdelen verkrijgbaar via www.elektor.nl/100761
02-2011
elektor
VOIP
telecommunicatiekabel van een FXOpoort verbonden worden met een FXSpoort en andersom. Als de FXO-poort van uw analoge telefoon verbonden is met de FXS-poort op de muur, wordt er een FXSservice verkregen van het telefoonbedrijf. Aannemende dat de rekening betaald is, hoor je een kiestoon als de telefoon wordt opgenomen. Let op de pijlen in figuur 1, die illustreren het naar elkaar wijzen. Als je twee FXS-apparaten met elkaar verbindt, werkt de verbinding niet. En ook met twee FXO-apparaten werkt dit niet. Het is dus bijvoorbeeld niet mogelijk om een standaard analoge telefoon (FXO) rechtstreeks aan te sluiten op een andere standaard analoge telefoon en van telefoon naar telefoon te spreken. Met de komst van VoIP (Voice over Internet Protocol) hebben we geen telefoniebedrijf meer nodig en dat roept de vraag op: kan ik een analoge telefoon aansluiten op VoIP? Het antwoord is: JA (voortreffelijk zelfs), met Linux en een speciale converter ontworpen voor gebruik op USB.
De schakeling Het schema van de adapter is weergegeven in figuur 2 – dit is een waar feest voor alle fans van microcontrollers, embedded toepassingen, open source platforms en Linux. Het analoge telefoontoestel wordt verbonden met J1 en de USB-poort van de pc aan... USB! Gemakkelijker kunnen we het niet maken. De Linux-omgeving op de pc en de firmware in de PIC doet al het werk en u kunt beginnen met gratis telefoneren met uw eigen oude vertrouwde analoge telefoon. Het hart van de schakeling is een Silicon Labs Si43210 microcontroller [1] in zijn standaard schakeling. Deze chip, ook wel aangeduid als SLIC (Subscriber Line Integrated Circuit), bestuurt de telefoniefuncties van het board, namelijk: • een DC/DC-converter die de benodigde spanning opwekt voor de abonneeverbinding; • de eigenlijke abonneeverbinding; • de analoog-naar-digitaal en de digitaalnaar-analoog omzetting (PCM-codec). De SLIC wordt aangevuld met een analoge elektor
02-2011
FXOinterface
Aansluit-
FXSdoos interface
POTS-circuit
Gebruiker Telefooncentrale
100761 - 11
Figuur 1. Met de komst van VoIP is dit allemaal geschiedenis, maar het is misschien wel leuk om weer herinnerd te worden aan hoe het ook weer zat met basistelefonie en de afkortingen uit die tijd.
line driver (type Si3201), ook van SiLabs. De schakeling bevat ook de analoge schakeling van de DC/DC-converter. Deze bestaat hoofdzakelijk uit D1, L1, Q7 en Q8 en nog wat onderdelen daaromheen. De converter wordt aangestuurd met een PWM-signaal van de DCDRV-uitgang van de 3210. Naast de analoge telefooninterface gebruikt de chip twee digitale bussen om te communiceren met de (digitale) wereld: een PCM-bus en een SPI-bus. Beiden worden bestuurd door een PIC18F2550-
microcontroller waarop wat slimme firmware loopt. De met een ‘*’ gemarkeerde onderdelen hebben waarden die geoptimaliseerd zijn voor een telefoonkabel met een lengte tot 700 m en een belspanning van 45 Vrms. De PIC (die op 20 MHz loopt) vervult met zijn firmware een groot aantal taken: inpakken van PCM 1-ms audio samples in USB-pakketjes (en vice versa), aansturen van de PCM -busklok van de 3210, tegelijkertijd versturen en ontvangen van
Hoe krijg ik het aan de praat Er zijn zat redenen waarom een board niet meteen zou werken. De eerste stap om leven in een board te krijgen, is om de bootloader op te starten, zoals uitgelegd in de blog op [5b]. Dit wordt gedaan door schakelaar S1b (dat is de DIP-schakelaar die het dichtst bij de USB-connector zit) aan te zetten om de bootloader op te roepen en een USBbootloaderprogramma zoals PICDEM of fsusb (de laatste op Linux) te gebruiken om de firmware te laden. Dit gaat echter alleen op voor een voorgeprogrammeerde PIC. In het geval van een nieuwe, lege PIC, moet je eerst de bootloaderfirmware met een PIC-programmer die ICSP aankan (In-Circuit-Serial-Programming) flashen van hier: http://openusbfxs.googlecode.com/svn/trunk/PIC18FSource/Bootloader-FXSMOD/ bootloader.hex. Als de bootloader eenmaal geflashed is, moet S1b weer omgezet worden en kan het board op USB aangesloten worden om de bootloader te starten. De laatste stap is dan nog om PICDEM-FS of fsusb te gebruiken om de actuele adapterfirmware van [8] te laden. Als alleen de FXS-firmware wordt geflasht zonder de bootloader, dan werkt het board niet. Dat komt omdat de bootloaderfirmware voor een sprong naar de juiste plaatsen in de FXSfirmware zorgt gedurende de reset en interruptvoortgang. Het is duidelijk dat dit niet gaat werken als de bootloader niet geïnstalleerd is. Los van dit alles kan het zeker geen kwaad om de blog van de auteur te raadplegen voor meer tips en advies in het zeldzame geval dat uw adapter het niet meteen doet.
39
VOIP
+5V
+5V
L2 BLM18AG601SN1
+5V
100n
TIP
ITIPN IRINGN
IC2
22n 100V
4 5
RJ45
C106
C6
STIPE
6 680p 100V
22n 100V
BLM18AG601SN1 L4
ITIPP IRINGP
4u7 6V 4u7 6V 15
29
13
25
16
28
14
26 R2 196k
11
SI3201 3
RING
SRINGE
VBATH
10
5
4
1%
*
C26
IGMN SRINGE
IREF
SI3210-FT(LP) 18
QGND
21
SRINGAC SRINGDC SDCL 9
R20 1%
TEST GNDA
16
200k 1%
CAPM
SVBAT
Q9
R21 15R 5%
100n 100V
STIPE
MMBT2222A
*
R28 37k4 1% R29
450k
+5V
IGMP
CAPP
R9 1% 470R R3 1%
220n 100V
SDI
1%
1% R5 200k
C4
INT
IRINGN
5
5
4
6
3
7
2
36
21
38
22
1
24
2
13
37
18 R32
24 R15
IRINGP
19
196k
R6
R7
VBAT
ITIPN ITIPP
17
R4 1%
CS
IC1
GNDD
D1
22
10%
1%
+5V
11 12
8
34
14 C1
RB4/AN11/KBI0 RB5/KBI1/PGM
IC3
RA0/AN0
RB6/KBI2/PGC
RB0/AN12/INT0/FLT0/SDI/SDA
RB7/KBI3/PGD
RB1/AN10/INT1/SCK
RB2/AN8/INT2/VMO
RB3/AN9/CCP2/VPO
VUSB
RC2/CCP1
PIC18F2550-I/SO
RC4/D-/VM
RC7/RX/DT/SDO
RC5/D+/VP
RA5/AN4/SS/HLVIN//C2OUT
RC6/TX/CK
12
K1
25 26
1
2
27
3
4
28
5
6
+5V USB
23 14
1
15
2
16
3
17
4
CUSB
VBUS D– D+ GND
RL1
VSS
OSC1
8
9
OSC2 10
220n
VSS 19
X1
4
3
ON
S1
1%
LD1
CO2
20MHz
CO1
1
2 1
22p
2
22p 100761 - 12
32 23 31
+5V
C10
F1
750mA
C9
FZT953
*
C2
13 10u 6V 10u 6V
1% R16 100n 50V 200R 5%
*
100uH 1A
RA2/AN2/VREF-/CVREF RA1/AN1
RPGM
11
33
R18A 0R82
L1
RC0/T1OSO/T13CKI RC1/T1OSI/CCP2/UOE
R14
ES1D
10u 100V
7
MCLR/VPP/RE3 RA4/T0CKI/C1OUT/RCV RA3/AN3/VREF+
SDCH DCDRV DCFF
R19
1%
6
4
330R
680p 100V
SDO
C19
JLVP 1
10k
3
DTX FSYNC
SCLK
GND
2
STIPAC
VDD
5%
3
243R
1
DRX
Q7
R18B 5% 0R82
*
5%
Q8
MMBT2222A
R17
450R
VDD C5
PCLK
18k
C105
STIPDC
RESET
4k02
1
30 VDDD
7
4k02
J1
27
VDDA1 VDDA2
20
RDTX
10k
100n
RUSR
RCLR
4k7
100n
18k
8 L3 BLM18AG601SN1
C18
100n
100n 25V
C17
20
470R 1%
220n 100V
C24
100u 10V
C16
15
R8 1%
100n
40k2
R1 200k
CDC2
C15
10
C3
CDC1
10k
10u 6V
C30
10k
C31
5%
C14 100n 25V
C25 Tant 10u 25V
Figuur 2. Het hart van de schakeling is een SLIC (Subscriber Line Integrated Circuit) van SiLabs. Het grootste deel van de intelligentie zit in de PIC18F2550 microcontroller.
data over USB, PCM-bustiming synchroon houden met de USB-bus en ten slotte alle andere algemene functies die nodig zijn voor USB communicatie. Hoewel de SiLabs IC’s in een min of meer standaardopstelling volgens de datasheet en referentieschakeling van de fabrikant zijn opgezet, ligt de originaliteit van de schakeling natuurlijk in de firmware in de PIC die alle bovenbeschreven functies in real time uitvoert, waardoor er dus geen noodzaak is voor een dure FPGA en waardoor tevens de totale kosten zeer laag uitvallen. Header K1 is de ICSP (in-circuit programming) connector van de PIC.
De opbouw – ja, u kunt het ook Alle Linuxfans zouden dit moeten willen bouwen, dus is er een mooi klein printje (60 x 30 mm) ontworpen voor de adapter, 40
dat kant-en-klaar bij Elektor verkrijgbaar is (EPS 100761-1). Hetzelfde geldt voor de geprogrammeerde PIC (EPS 10076141). In figuur 3 is de onderdelenopstelling voor de boven- en onderkant te zien. Het printje zit tjokvol met SMD-onderdelen aan beide zijden inclusief de drie geïntegreerde schakelingen, waardoor de montage niet al te gemakkelijk is als u nog nooit eerder met deze kleine onderdelen hebt gewerkt. De Si3210 vraagt extra aandacht vanwege de extreem korte afstand tussen de pootjes waardoor u misschien tegen de grens aanloopt van nauwkeurigheid en gezichtsvermogen. Het prototype werd met succes door labassistent Jan Visser gewoon met de soldeerbout opgebouwd, waarbij de ‘truc met soldeerlitze’ werd gebruikt om de pennen van de Si3210 weer elektrisch van elkaar te scheiden na ze eerst allemaal tegelijk gesoldeerd te hebben. N.B.: Jan
is brildragend en aan de veilige kant van 50, maar toch. Het resultaat is te zien in figuur 4. Spoel L1 valt erg op met de twee grote soldeereilanden. Het is misschien handig om te weten dat SiLabs een sample-service heeft voor hun IC’s. Onze IC’s kwamen echter via Mouser met wat hulp van onze collega's CJ en Valerie van ons zustertijdschrift Circuit Cellar in Vernon, USA.
Firmware De PIC-firmware kan gratis gedownload worden van de Elektor website [2] en kan via USB geüpgraded worden, met een tool van Microchip genaamd PICDEM [3]. Deze functie wordt bereikt met DIP-schakelaar S1(b) die bepaalt of de print in bootloader mode opstart of in de normale mode. Een upgrade van de firmware kan ook met een 02-2011
elektor
VOIP
ONDERDELENLIJST
Halfgeleiders D1 = ES1D (SMB) IC1 = Si3210-FT/GT (TSSOP38-LP), SiLabs,
1
ON
X1
IC2
Open USB FXS
R9
R2 CDC1 R3(C)2010 A.Varvitsiotis
C24
R28
IC3
LD1
R6
R21 R29
C31
C105
C106
R19
RUSR RPGM
L3
2
R4 R5 C2 C1 R1
F1
L4
R15 R14
C6
J1
R7 S1
RL1
R18B R18A
JLVP
RDTX
R20
CO2 CO1
C18
K1
C3
RCLR
IC1
C4
6 1
R8
* voor een telefoonkabel tot 700 m en V(bel) = 45 VRMS.
C5 C30
C14 C10 C17 C16 C15
L1
U1
version: 2.1d
Q8 R17
Q7
C19
C9
Spoelen L1 = 100μH 1A, SMD L2,L3,L4 = 150μH 1A, SMD, type BLM18AG601SN1, afm. 0603
L2
R16 D1 C25
Diversen F1 = zekering, 0,75A, afm. 1210 J1 = RJ-11/12 socket, printmontage JLVP = jumper of tijdelijk draadje K1 = 6-pin (2x3) penheader blok, steek 2,54 mm S1 = 2-voudige DIP-schakelaar, SMD U1 = USB-A-H bus X1 = 20MHz kwartskristal print, EPS 100761-1, zie [2]
C26
Condensatoren (SMD 1206) C1,C2,C31 = 10μ/6V
Mouser # 634-SI3210-GT IC2 = Si3201-FS/GS (ESOIC-16T), SiLabs, Mouser # 634-SI3201-GS IC3 = PIC18F2550-I/SO, geprogrammeerd, EPS 100761-41, zie [2] LD1 = LED, groen (1206 CHIPLED) Q7 = FZT953 (SOT230P700X160-4N) Q8,Q9 = MMBT2222A (SOT95P280X13-3N)
Q9
C3,C4= 220n/100V, afm. 1812 C5,C6= 22n/100V, afm. 1812 C9 = 10μ/100V radiaal C10,C14,C26 = 100n/100V, afm. 1210 C15,C16,C17,C24,C30= 100n, afm. 0603 C18,C19 = 4μ7/6V C25 = 10μ/25V tantaal C105,106 = 680p/100V CDC1 = 100μ/10V radiaal CDC2 = 100n/25V CO1,CO2 = 22p CUSB = 220n
CDC2
Weerstanden (SMD 0805) R1,R3,R5 = 200k R2,R4 = 196k R6,R7 = 4k02 R8,R9 = 470Ω R14 = 40k2 R15 = 243Ω R16 = 200Ω R17 = 453Ω* R18A,R18B = 0,82Ω*, afm. 1206 R19,R20 = 18k R21 = 15Ω, afm. 1206 R28 = 37k4 R29 = 453k* R32,RCLR, RPGM, RUSR = 10k RL1 = 330Ω, afm. 1206
CUSB R32
Figuur 3. Onderdelenopstelling van het VoIP-adapterboard. De print is verkrijgbaar bij Elektor.
hulpprogramma. De andere DIP-schakelaar, S1(a), reset de PIC en moet in de OFF positie blijven.
Linux driver en Asterisk Het board is toegankelijk via een Linux device driver. De auteur heeft er voor gekozen om het board te integreren met de Dahdi [4] device driver familie, zodat het board gebruikt kan worden onder het open-
source Asterisk IP PBX-systeem. Uitgebreide instructies over het samenstellen van de driver en het integreren van het board in een Linux-systeem staan in de blog van de auteur [5]. Als de ‘oufxs’ device driver-module gecompileerd en in de Linux kernel geladen is, herkent het systeem de USB-FXS zodra hij is ingeplugd. De hoeveelheid en het aantal details van de debugboodschappen
kan aangepast worden: standaard wat beknopt, met de parameter ‘debuglevel’ op 4, laat de driver in detail alle stappen zien als het board wordt geïnitialiseerd (figuur 5). Nu hebt u een nieuw Dahdi device, dat zichtbaar is en met programma’s als dahdi_ scan beheerd kan worden. De volgende stap is het configureren van de signalering van het device, dat wil zeggen de elektrische wijze waarop het
Figuur 4. Met de neus bovenop beide zijden van de print. Probeer dit soldeerwerk maar eens te evenaren! elektor
02-2011
41
VOIP
systeem de abonnee vertelt dat de om uw eerste gratis internationale lijn beschikbaar is gekomen of dat VoIP oproep te doen met IAX (the de andere kant heeft opgehangen. Inter-Asterisk-eXchange protocol)? Voor een telefoontoestel maakt dat Leg de hoorn op de haak, neem niet zo veel uit. Maar voor analoge hem weer op en draai 500. Dit centrales ligt dat anders, dus resulteert in een VoIP-oproep Dahdi ondersteunt verschillende naar de demo IAX-server van signaleringsmethodes. De auteur Digium in de Verenigde Staten gebruikt ‘fxols’-signalering, wat (figuur 6). Digium is de maker ‘Loop-Start’ betekent. Hiervoor van Asterisk. U hoort een beltoon moet de file /etc/system/dahdi. en dan beantwoordt Digium’s conf’ gemaakt of aangepast worden eigen Asterisksysteem de oproep en er moet een regel met de tekst (pas op: dit is een echte VoIP ‘fxols=1’ worden toegevoegd aan centrale (PX). Als u nog een paar het eind. Wilt u ook de standaard cijfers erachteraan draait, krijgt u bel- en kiestoon veranderen, dan kan waarschijnlijk een werknemer van dat hier door een andere ‘tonezone’ Digium aan de lijn). te kiezen dan de standaard ‘us’. Figuur 5. De Linux ‘oufxs’ driver ziet dat er een board is Een open project Er kan bijvoorbeeld ook een echo ingeplugd en onderneemt actie. Alle onderdelen van het ontwerp, canceller worden toegevoegd door inclusief het schema en de printde volgende regel toe te voegen ontwerpfiles in Cadsoft Eagle-formaat [6], ‘echocanceller=oslec,1’. Ten slotte moet de Naar je eigen stem luisteren mag dan een de firmware [7] en de Linux-driversoftware utility ‘dahdi_cfg’ gedraaid worden. prachtige tool zijn voor het debuggen, maar zijn open-source en dat betekent dat het U bent nu klaar om met Asterisk aan de erg zinvol is het niet, toch? Dus, wat let u werk gelicenseerd is onder de gang te gaan. Volg de aanwijzingen GNU Public Licence (code) en van de auteur op voor het opzetten Creative Commons licenties (print, en configureren van Asterisk [9]. documentatie, enz.). Start vervolgens Asterisk op in debug console mode (‘bijv. asterisk De source code kan ook gevonden –vvvvvvc’). Neem de telefoon op; worden op [8]. Alle Elektorlezers Asterisk moet nu een off-hook event worden uitgenodigd om de herkennen en er moet een kiestoon sof t ware naar har tenlust te te horen zijn. Draai vervolgens ‘600’ verbeteren en uit te breiden en (en wacht even op een inter-digit daarvan gewag te maken bij de timeout); Asterisk zal een console auteur en leden van de community message loggen en een ‘echo’ via het Elektorforum. toepassing starten. U kunt nu in de (100761) telefoon praten en terugluisteren Figuur 6. Display van het dialplan en log van een oproep naar uw eigen stem met een tiental van de console van Asterisk’s. milliseconden vertraging.
Weblinks [1] www.silabs.com/Support%20Documents/TechnicalDocs/si3210. pdf
[5] (a) http://openusbfxs.wordpress.com/ en (b) http://openusbfxs. wordpress.com/dyi-setup-and-debugging-guide/
[2] www.elektor.nl/100761
[6] http://code.google.com/p/openusbfxs/source/browse/#svn/ trunk/Eagle-OPENUSBFXS-Dongle
[3] Microchip PICDEM FS: www.microchip.com/Microchip.WWW. SecureSoftwareList/secsoftwaredownload.aspx?device=en021 940&lang=en&ReturnURL=http://www.microchip.com/stellent/ idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=e n021940&part=DM163025# [4] http://downloads.asterisk.org/pub/telephony/dahdi-linux/
42
releases/dahdi-linux-2.3.0.1.tar.gz
[7] http://code.google.com/p/openusbfxs/source/browse/#svn/ trunk/PIC18FSource/OPENUSBFXS-FMWR [8] http://code.google.com/p/openusbfxs/source/browse/#svn/ trunk/LinuxDahdiDriver [9] http://openusbfxs.wordpress.com/getting-started-with-asterisk/
02-2011
elektor