Tuner FM pro Raspberry Pi – i2c
Tuner FM pro Raspberry Pi. Jedná se o modul s profesionálním tunerem osazeným TEA6810V a TEA6825T, audio procesorem TDA7313 a koncovým zesilovačem TDA7375 (2x 35W).
Modul je určen pro ovládání pomocí sběrnice I2C. Pro Raspberry Pi je zde možnost využít dalších dvou audio vstupů, jež lze využít například pro internetové rádio.
Prozatím přikládáme popis systému a schéma zapojení, posléze bude doplněno i o komunikační protokol pro Raspberry Pi.
Tuner FM pro Raspberry Pi
„Malina“ pro kterou nebude problém generovat řídicí signály pro I2C. Na internetu najdeme velké množství příkladů jak ovládat I2C.
Popis zapojení:
Základem je „profesionální“ tuner, který byl osazován do továrních autorádií. Použijeme hotový tuner bez jakýkoliv úprav, pouze připojíme anténu, napájení a řídicí signály. Připojení tuneru je obdobné jako v autorádiu CDR 2005, kterým byly vybavovány automobily značky Opel. Když se podíváme pod kryty tuneru, zjistíme, že je osazen obvody Philips TEA6810V a TEA6825T. Tato skutečnost je pro nás dostačující, abychom mohli tento tuner řídit po sběrnici I2C. Pro další zpracování využijeme vyvedené nízkofrekvenční signály OUT R a OUT L. Pro možnost SW rozšíření máme vyvedeny na ovládací konektor i signály MPX/RDS a LEVEL.
Parametry tuneru:
Uvedené údaje jsou převzaty z parametrů výše citovaného autorádia a měly by být stejné.
Nf signály OUT R a OUT L jsou přes odpory R121 a R124 a kondenzátory C1 a C2 přivedeny na 1. stereo vstup digitálního audio procesoru TDA7313 od firmy ST microelectronics. Jedná se o obvod, který přepíná až 3 stereo vstupy, řídí hlasitost a umožňuje nastavovat hloubky a výšky v obou kanálech. Veškeré řízení tohoto obvodu je po sběrnici I2C. Zapojení je katalogové a je převzato s minimálními změnami z originálního datasheetu tohoto obvodu.
Jelikož se jedná o obvod určený pro autorádia, má vyvedeny 4 výstupní signály OUT RR, OUT LR, OUT RF a OUT LF. V našem modulu jsou sloučeny signály pravého a levého kanálu do jednoho, a jsou přivedeny na vstup L a R koncového zesilovače osazeného obvodem TDA7375.
Jedná se o koncový zesilovač 2x 35W při impedanci reproduktorů 4 Ω. Zapojení je také katalogové.
Tento obvod je kompletní výkonový zesilovač a je umístěn v pouzdru MULTIWATT15V. Vzhledem k výkonové ztrátě tohoto obvodu je nutné, aby byl umístěn na dostatečném chladiči. Je vybaven i funkcí ST-BY. Ovládání (MUTE) je vyvedeno na ovládací konektor, který je určen pro řízení modulu z nadřazené jednotky.
Zapojení ovládacího konektoru X6 – připojení RASPI:
Při prvních pokusech zapojujeme pouze zvýrazněné signály.
Napájení modulu zabezpečuje střídavé napětí 12V přivedené na konektor X5 – POWER. Je možno použít napájení z transformátoru, kde napětí by nemělo přesáhnout 12V a výkon by měl být alespoň 70 W. Vhodné jsou toroidní transformátory určeném k napájení halogenových světel, které mají sekundární vinutí 11,5V a bývají vybaveny tepelnou pojistkou.
Lze použít i stejnosměrný napájecí zdroj, který by neměl mít vyšší napětí než 14V a dodat by měl proud alespoň 4A. V tomto případě je možno vynechat usměrňovací můstek a nahradit ho propojkami, ale není to nutné.
Multifunkční napěťový regulátor L5956 od firmy ST nám stabilizuje napětí +8.5V a 5V pro tuner a v a 3.3V pro případné další ovládací obvody mimo desku. Je umístěn v pouzdru Power SO20 a umožňuje přiložit chladič v případě, že by se přehříval.
Odkazy na datasheety použitých obvodů:
http://pdf.datasheetcatalog.com/datasheet/philips/TEA6810V_TEA6811V_2.pdf
http://www.nxp.com/documents/data_sheet/TEA6823T_6825T.pdf
http://www.promelec.ru/pdf/tda7313.pdf
http://www.audiosound.info/katlisty/TDA7375.pdf
http://pdf1.alldatasheet.com/datasheet-pdf/view/234416/STMICROELECTRONICS/L5956.html
http://www.raspi.cz/2012/11/1-wire-snimace-na-i2c-presnejsi-mereni-teploty/
Rozpiska materiálu modulu TUNER_RASPI:
To je vše, co se týká HW. Vše ostatní je již SW záležitost a je jedno, jestli se modul tuneru bude ovládat například vlastní aplikací s mikrokontrolerem PIC či ATMEL nebo se bude ovládat pomocí převodníku USB / I2C, kterých najdeme na internetu více. Primárně byl ale tento modul vyvinut pro aplikace s Raspberry Pi. Jenom poznámka : pull up rezistory pro I2C sběrnici osadíme R1 a R2, protože jsou připojeny na 3.3V napájení jako má „Malina“, rezistory R112 a R113 neosazujeme.
Než začneme s aplikací Raspberry Pi, bude vhodné si něco málo nastudovat jednak o „Malině“, například na českém portále: www.raspi.cz nebo na originálním anglickém: www.raspberry.org. Dále bude dobré něco vědět i o sběrnici I2C. Informací je dostupných mnoho, základní charakteristika je na Wikipedii, následné informace byly převzaty z HW serveru.
Stručný popis sběrnice I2C a její praktické využití
I²C bus je zkratka která vznikla z IIC bus, tedy Internal-Integrated-Circuit Bus. Jak již název napovídá, jedná se o interní datovou sběrnici sloužící pro komunikaci a přenos dat mezi jednotlivými integrovanými obvody většinou v rámci jednoho zařízení. Vyvinula ji firma Philips přibližně před 20 lety a od té doby prošla několika vylepšeními, ale o tom až později. V dnešní době tento způsob “komunikace” podporuje řada integrovaných obvodů nejen firmy Philips. Jedná se především o mikrokontroléry, sériové paměti, inteligentní LCD, audio a video obvody, a/d a d/a převodníky a některé další digitálně řízené obvody. Hlavní výhodou je, že obousměrný přenos probíhá pouze po dvou vodičích – “data SDA (serial data)” a “hodiny SCL (serial clock)”. To především u mikrokontrolérů výrazně optimalizuje nároky na počet vstupně-výstupních pinů a celkově zjednodušuje výsledné zapojení. Na jednu sběrnici může být připojeno více integrovaných obvodů. V základní verzi jsou obvody adresovány 7bitově a v rozšířené verzi 10bitově. To umožňuje připojení 128 respektive 1024 čipů s různou adresou na jednu společnou sběrnici. V praxi jsou tato čísla však podstatně nižší, protože adresa čipu většinou nelze určit plnými 7 (10) bity ale třeba jen třemi. Někdy nelze určit vůbec a je dána na pevno pro daný typ čipu – takových čipů tedy na jedné sběrnici nemůže být více než jeden. Přenosová rychlost sběrnice je pro většinu aplikací dostatečná i v základní verzi, kde je frekvence hodin 100kHz. Ve vylepšených verzích to může být 400kHz nebo 1MHz, ale ne všechny intergované obvody tuto verzi podporují. Rychlost přenosu pak musí být přizpůsobena pochopitelně “nejpomalejšímu” čipu na sběrnici. Oba vodiče musí být implicitně v logické jedničce a to je zajištěno pull-up rezistory. Jejich odpory mají hodnotu v řádech jednotek kiloohmů. Čím je vyšší komunikační frekvence, tím musí být nižší hodnoty těchto odporů. Pro 100kHz postačuje 4k7.
Pro řízení tuneru budeme používat 7 bitové adresování a maximální přenosovou rychlost 100 kHz. Pro začátek budeme komunikovat pouze jedním směrem a to od RASPI (master) k jednotlivým obvodům připojeným na sběrnici (slave).
Když si popíšeme jakým způsobem bude master komunikovat, tak to bude vypadat podle následujícího obrázku:
Vysílání začíná vysláním START bitu (A) a následuje 7 bitová adresa obvodu (B). Osmý bit nám určuje, zda budeme data posílat nebo je naopak číst – R/W (C). Logická 0 znamená, že data posílá master, jednička znamená, že master očekává data od obvodu. Po tomto bitu následuje 1 bit ACK (D) – ten vysílá oslovený slave a potvrzuje tím, že je připraven přijímat data. Po té nasleduje 1. byte dat (E), která opět slave potvrdí signálem ACK a následuje 2.byte dat s potvrzením ACK od slave. Ukončení přenosu master zakončí STOP bitem (F). Datových byte může být více nebo naopak jen jeden, ale posloupnost zůstává zachována.
1 |
V případě čtení (R/W=1) data posílá slave a master potvrzuje přijetí signálem ACK. |
Při praktické realizaci propojíme modul tuneru tří vodičovým spojením : SDA, SCL a GND. Napájení jednotlivých zařízení je samostatné. Dáme pozor, abychom pull-up odpory na modulu osadili správně, to je podle napájecího napětí mastra. Raspi má napájení 3.3V, tak ho dodržíme a nebudeme raději zkoušet, zda brána I2C vydrží 5V.
Pro úspěšné programování budeme potřebovat základní údaje od jednotlivých obvodů. To lze
dohledat v datasheetech obvodů, ale pro lepší přehlednost si je ukážeme v následujících tabulkách.
http://www.hw.cz/navrh-obvodu/strucny-popis-sbernice-i2c-a-jeji-prakticke-vyuziti-k-pripojeni-externi-eeprom-24lc256
TDA7313 – signálový procesor:
Obvod TDA7313 umožňuje řídit hlasitost, nastavoval úroveň výstupu pro reproduktory, přepínat vstupy a řídit hloubky a výšky. Například pro nastavení maximální hlasitosti odešleme:
1. adresu obvodu – 10001000 (0x88)
2. data 1 byte – 00000000 (0x00)
Zde se nastavují základní parametry tuneru. V prvním byte bit 1. se nastavuje STEREO – MONO, bity 1 až 3 určují krok ladění (50 kHz), bitem 4 nastavujeme zatlumení při ladění, 5.bit nastavuje SDR, 6.bit umlčí celé rádio a 7. bit povoluje posílat povely na TEA6810. Sběrnici pro vstupní obvod je vhodné vypínat po naladění, protože signály na sběrnici I2C by mohly rušit vstupní obvody tuneru. Proto se sběrnice povoluje pouze v případě ladění (změny frekvence).
1 |
Červeně zvýrazněné hodnoty nastavíme při prvním programování, později je můžeme nastavovat dle požadavků.Příkazy pro vstupní obvod TEA6810 se posílají v následující sekvenci: |
Příkazy pro vstupní obvod TEA6810 se posílají v následující sekvenci:
1. Adresa obvodu
2. Nižší a vyšší byte dělicího poměru pro ladění – 0x0E 0x0D (95.0 MHz) *
3. Byte pro spínání (FM/AM, dělička AM, DX, a další)
4. Testovací byte (0x00)
* Požadovaná frekvence se nastavuje v byte 1 a 2 následovně:
Frekvenci v kHz vynásobíme 2 a připočteme konstantu 1442, což je hodnota mezifrekvence při ladění po 50 kHz.
Příklad: chceme nastavit rádio Blaník na 95.0 MHz (950*2 + 1442 = 3342 => převedeme na hexadecimální tvar => 0x0D0E. První byte tedy bude 0x0E, druhý byte 0x0D.
Příklad pro ovládání I2C na Raspberry PI, který je převzatý:
http://www.raspi.cz/2012/11/i2c-potreti-rozsvecime-led-diodu-sloziteji-draze/ a slouží k ovládání LED.
Po rebootu se RPi zeptáme, zda je tam něco nového na I2C sběrnici.
Na adrese 0x20 vidíme nové zařízení. 0x48 a 0x4d jsou teplotní čidla z minulého dílu. Nastavíme registr IODIRA (0), který určuje, zda jsou piny vstupní nebo výstupní. 1 = vstup, 0 = výstup. Pro komunikaci použijeme i2cset, kterému předáme parametry:
• -y = neptej se na nic
• 1 = sběrnice 1
• 0x20 = adresa čipu na sběrnici
• 0 = adresa registru v čipu
• 0xfe = hodnota, co nastavujeme (1111 1110)
• b = zapisujeme 1 byte
pi@raspberrypi ~ $ i2cset -y 1 0x20 0 0xfe b
LED se rozvítila! Defaultní hodnota výstupního pinu je totiž „0“.
No a teď můžeme blikat LEDkou. Piny se ovládají v registru OLATA (0x0a).
pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b
(1 = zhasnuto)
pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x00 b
(0 = svítí)
pi@raspberrypi ~ $ i2cset -y 0 0x20 0x0a 0x01 b
Ovládání tuneru se provádí obdobně, to znamená k příkazu s parametry $ i2cset -y 0 přidáme adresu obvodu a následuje 1 byte dat.
Mnoho zdaru v experimentování.
1 2 |
<span style="text-decoration: underline;">Zkušenosti s Raspberry 2B</span> *) Oproti minulým verzím má RP instalovanou sběrnici I2C defaultně 1! Druhá důležitá poznámka je, že RPI2 má osazené pullup odpory již na desce, takže neosazujeme na naší desce žádný z odporů R1,R2,R112 a R113! A třetí: u TDA7313 je třeba připojit pin 3 na GND (propojka vypadla v návrhu ) ! |
Příkaz i2cdetect -y 1 vypíše známá zařízení na sběrnici.
Vypisuje čísla aktivních čipů na sběrnici. Příkaz to dělá tak, že osloví všechny adresy postupně a která mu odpoví signálem ACK, tak ji bere jako aktivní zařízení. Ale stačí také to, že z nějakého důvodu máme signál SDA na nule a příkaz vypíše, že aktivní čipy jsou na všech adresách. Když je sběrnice v pořádku vypisuje jen aktivní čipy.
Jako první při oživování bychom měli mít adresu 0x61. Nenechte se zmýlit, že v datasheetu má TEA6825 adresu 0xC2 (B’11000010′). Je to stejné, jen RP má adresování do 0x77 (7 bit adresování) a dochází tady k posunu hodnot jednotlivých bitů doprava. Vypadnul nám nultý bit a ostatní se posunuly jako bychom provedli instrukci rotace right, což je vlastně dělení 2. Takže když se vrátíme k původní adrese z datasheetu 0xC2 a podělíme ji 2, dostaneme skutečně adresu 0x61.
Obdobně je to i u ostatních obvodů:
TEA6810 (0xC4) by se měl hlásit jako 0x62 (pozor, I2C pro něho musíme nejprve povolit příkazem na TEA6825)
TDA7313 (0x88) by se měl hlásit jako 0x44 a těmito adresami je také budeme ovládat.
Takže zpět k příkazu pro TEA6825:
vypíšeme příkaz i2cset -y 1 0x61 0xFA 0x01 i a odešleme ENTER.
Následující obrázek znázorňuje, co bylo odesláno na sběrnici I2C:
Signál SCL jsou hodiny a SDA jsou data. Relace začíná S – Start bit, následuje adresa čipu a že se jedná o zápis (C2W), následuje ACK (odpověď čipu) FA je první odeslaný byte a 01 je druhý odeslaný byte. Po každém byte je potvrzovací signál ACK od čipu a relace je ukončena (P).
Ještě k parametrům příkazu:
– i2cset příkaz
– -y parametr „na nic se neptej“
– 1 číslo sběrnice I2C v Raspi
– 0x61 adresa čipu TEA6825
– 0xFA 1.byte
– 0x01 2.byte
– i parametr I2C block data
Po tomto příkazu by TEA6825 měl povolit I2C pro TEA6810, takže po příkazu: i2cdetect -y 1 by měl počítač vypsat následující tabulku aktivních zařízení připojených na I2C:
pi@raspberrypi ~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — 44 — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — 61 62 — — — — — — — — — — — — —
70: — — — — — — — —
Vše je v pořádku, můžeme pokračovat. Lze ovládat celkem vše, tak jen pro ilustraci některé funkce.
TDA7313 (0x44)
Inicializace:
spočívá v nastavení atenuátoru reproduktorů v pořadí LF,RF,LR a RR. i2cset -y 1 0x44 0x80 0xA0 0xC0 0x E0 i je příkaz složený ze 4 byte, kde každý byte nastavuje jeden kanál. Povolený rozsah je 1F, kde 0 je maximální úroveň a 1F je maximální zatlumení (38,75 dB) s krokem 1,25 dB. Parametr i znamená I2C blok data, c je byte data
Nastavení hlasitosti :
i2cset -y 1 0x44 0x1A c je příkaz pro nastavení hlasitosti TDA7313 na úroveň -17,5 dB 0x1A je byte pro ovládání hlasitosti a může být v rozsahu 0x00 až 0x3F, kde 0 je maximální hlasitost a 3F maximální zatlumení (-78,75 dB) Krok je 1,25 dB.
Přepnutí vstupů:
i2cset -y 1 0x44 0x58 c je příkaz pro přepnutí vstupu 1 s nulovým zesílením.
Lze nastavit maximálně vstup 1, 2 a 3 vždy nejnižšími dvěma bity. Čtvrtý vstup lze nastavit, ale jen vnitřně, protože není vyveden na piny, takže jako by nebyl.
TEA6825 (0x61)
Inicializace:
spočívá v nastavení požadovaných parametrů. Posílají se 2 byte. i2cset -y 1 0x61 0xFA 0x01 i
Nejvyšším bitem prvního byte se povoluje I2C pro přední IO tuneru (TEA6810). Je to z toho důvodu, aby povely procházející po sběrnici nerušily analogovou část vstupu tuneru (rušení). Nejnižší bit je přepínač mono – stereo. Ostatní bity jsou určeny pro nastavení frekvence syntetizéru, povely mute pro rádio a pro ladění. Pro začátek není dobré hodnotu 0xFA měnit. Druhý byte je dobré nechat nulový, kromě nejnižšího bitu, kde se nastavuje mód FM.
TEA6810 (0x62)
Inicializace:se provádí celkem ve 4 byte:
1.byte je „Low byte“, další je „Hight byte požadované frekvence
3.byte jsou nastavení obdobná předcházejícímu čipu. Důležitý je nejnižší bit – přepínač AM-FM.
4.byte je testovací – nastavuje se na nulu.
i2cset -y 1 0x62 0x0E 0x0D 0x37 0x00 i – 0x0D0E je frekvence 95.00 MHz.
Ladění:
i2cset -y 1 0x62 0x0E 0x0D i – povolený rozsah pro frekvenci FM rádia ( 87,5 – 108 MHz) je v rozmezí 3192 až 3602 (0x0C78 – 0x0E12) pro ladění po 50kHz, které máme nastaveno. Takže pro náš příklad rádia Blaník na 95.0 MHz je (950*2 + 1442 = 3342 => 0x0D0E.
Při ladění se dají posílat pouze dva byte požadované frekvence, nesmíme však zapomínat, že si musíme povolit sběrnici I2C na TEA6825 (adresa 0x61) a že posíláme nejdříve nižší a po té vyšší byte.
PYTHON KNIHOVNA
Díky Elektro-potkan máme možnost využívat knihovnu py pro RPI.
Vše na github:
https://github.com/elektro-potkan/AllcompTunerBoards-python-RPi
Díky!!!