18 aprilie 2022

Arduino RDS PI decoder

Dupa construirea receptorului FM, urmatoarea etapa a fost integrarea unui decodor RDS. In prima faza intentia mea a fost intelegerea principiului de transmitere RDS si decodarea acestuia. Ulterior, dupa ce am citit mai multe documente pe internet, am trecut la experimente. Folosind semnalele de ceas si date, furnizate de un receptor Sony ST-SE370, am incercat si am reusit sa decodez. Am folosit un Arduino Nano, care s-a potrivit perfect nivelelor semnalelor din receptor. Ultima parte a proiectului a reprezentat simplificarea codului sursa, micsorarea timpului de decodare si extragerea doar a datelor care ma interesau, respectiv identificatorul PI.

Transmisiunea RDS se face in paralel cu semnalul audio stereo in cadrul unui semnal multiplex. Transmisia este seriala, cu o viteza de 1187.5 biti / secunda. Datele sint impartite pe grupuri. Acestea la rindul lor sint impartite in blocuri: A, B, C, D. Fiecare bloc are 26 biti, fiecare grup are 26 x 4 = 104 biti. Intr-o secunda sint transmise cca 11 grupuri. Blocul A contine identificatorul PI. El se regaseste in primul bloc din fiecare grup transmis, din 104 in 104 biti. In concluzie, blocul A este transmis de cca 11x / secunda, respectiv odata la 87.5 milisecunde.

Daca blocul A este transmis de cca 11x / secunda, cred ca este deajuns, in cadrul unor reflexii MS, de scurta durata, daca semnalul este destul de puternic, sa pot identifica PI-ul postului transmis. Pentru aceasta imi este necesar o receptie a grupului, respectiv 87.5 milisecunde, pentru a decoda si memora temporar PI-ul postului receptionat. Urmat dupa aceea de inca o receptie a grupului, alte 87.5 milisecunde, pentru a decoda dinou ID-ul si apoi sa il compar cu primul PI temporar. In caz de egalitate, totul este ok, am identificat postul, altfel, reiau procesul de la inceput.

Aceasta ultima afirmatie este pura teorie. Nu am testat-o inca. Teoretic ar putea sa functioneze, practic voi afla in vara aceasta, cu ocazia Perseidelor. In anii precedenti am receptionat des semnale de scurta durata via MS intr-un receptor auto. Anul acesta am posiblitatea sa si testez.

Schema de principiu este simpla. Pini de date si masa au fost conectati direct la microcontroler. Nu a fost necesara nicio interfatare, nivelele semnalelor sint perfect compatibile, 0 - 5V. Pinii D2 si D3 sint folositi ca intrari si sint conectati pull-up intern din setarile software. Rezultatul decodarii se trimite prin intermediul portului serial in USB la calculator si evidentiat intr-un monitor. Alimentarea se face din portul USB al calculatorului.

Software-ul seteaza pinii ca intrari si activeaza o intrerupere interna pe pinul de ceas. Dupa receptionarea a 26 de biti de date se incearca identificarea blocului prin calcularea CRC. Daca CRC nu este bun operatia se repeta. Cind CRC este ok, se identifica blocul. Daca blocul este altul decit A, se calculeaza dupa citi biti urmeaza blocul A si se reia asteptarea blocului A. Cind blocul A este identificat, se decodeaza si memoreaza PI. Se asteapta timp de 104 biti, se receptioneaza urmatorul bloc A, fara sa se mai verifice CRC, se extrage PI si se compara cu primul decodat. Daca este in regula se trimite prin intermediul portului serial catre calculator pentru a fi afisat pe monitor.

Aceasta este pe scurt descrierea algoritmului decodorului meu si intentiile mele pentru a-l folosii. Mai multe detalii dupa experimentele ce urmeaza sa le intreprind.

Sa vina vara, eu sint pregatit!

Constantin Bădican - YO7FWS

Descarca: codul sursa

Pentru realizarea proiectului m-am inspirat din:

---  73's   YO7FWS  ---

Niciun comentariu:

Trimiteți un comentariu