FM радиоприемник с ИС TEA5767 под управление на Arduino
/kn34pc.com/конструкции/...

Поредната моя конструкция възникна в резултат няколкo-вечерните ми приятни занимания с едно от последните ми нискобюджетни китайски попълнения от съвременните електронни компоненти, а именно ИС TEA5767 - FM стерео радиоприемник на нисковолтово захранване.

С цената си на международните пазари малко над цената на едно хубаво кафе (и то не само на интегралната схема, а на блокче с цялата периферия, вкл. нискочестотен кварцов резонатор на 32,768 kHz), заради което е добре човек да си вземе не една бройка, дори без да има идея за конкретна бъдеща разработка.

Интегралната схема е с ниска консумация (13 mA при захранване от 2,5V до 5V) и съдържа в себе си почти всички възли на приемника от вход "антена" до изход "ляв и десен канал". Външни остават управлението (по шина i2c), индикацията и нискочестотния усилвател (ако ще се ползва към високоговорители).

Блокчето с прилежащите елементи е с размери само 11 х 11 mm.

Освен ниския профил, при първоначален поглед прави впечатление нестандартния растер на изводите - разстоянието между тях е 2 мм, а по ширина - 11 мм. Не съм си представял директно запояване на изводи или проводници, но в конструкции [1] в интернет видях няколко "трагични" резултата, които завършват с отлепени шини. Заради микро-размерите на платчето и фината изработка след събитието се "гарантира" последващата му плачевна съдба.

За моите си експерименти установих, че платка-присадка за монтиране в цокъл за голяма интегрална схема е добро решение за монтаж, но не ми се чертаеше такава.

Един-единствен разрез с бързооборотното диамантено дискче беше достатъчен да "разполовя" един готов фабричен "SO-16/TSSOP-16 към DIP-16" преходник. Според мои сметки получих преходник към DIP-10  .

Да си призная: преди четири месеца бях пълен противник за използване на т. нар. breadboard (пластмасова "платка" с отвори, с контактни пластинки отдолу, свързани електрически по редове и стълбове), където с помощта на проводници се осъществява контакт на ел. елементи с цел тестове при проектиране, главно за цифрови ел. схеми.

Всичко това ми се струваше страшно "паешко" и ненадеждно, но магията явно "работи". Логически схеми с интегрални схеми "тръгваха от раз", а последващите експерименти на какви ли не схеми доказа, че почти всичко (разбира се: не "много ВЧ") "оживява" там.

Целите на упражнението по нареждането на елементи върху breadboard вероятно е за спестяване на време и нерви (като че ли на съвременните конструктори им липсва поялник?).

С микроконтролерите свикнах с плетеницата от цветни кабелчета и подреждането им, особено за програмки от сериите на "Здравей, свят" (разбирай "ЛЕД блинк") с един, два, три или повече светодиода .

Та за първоначалната тестова установка на бъдещия FM приемник, без да се замисля много, използвах въпросната breadboard. "Много-ВЧ сигнали" (88-108 MHz) има само на един извод на радиочестотното блокче (и той е входа за антена), а за управлението по i2c bus (с честота 100 kHz) и липса на специални изисквания към фронтовете на импулсите, дължината на 10-те сантиметрови свързващи проводници не се оказа някакъв проблем. Аз се застраховах допълнително, като "натоварих" SDA и SCL с резистори 4,7k.

Използвам платформата на Arduino по няколко причини: ниска цена (особено китайските клонинги), широко приложение, безкрай безплатни, споделени библиотеки за нови компоненти и готови модули, устойчива работа, висока надеждност, (почти) невъзможност развойната платка да дефектира при неправилно свързване на входове, изходи и др.

Не на последно място (за мен) е прилично "чистия" език за писане (C, C++), където първоначално замисления алгоритъм на работа (у главата на автора, hi ) почти праволинейно се "превежда" на разбираем "полуанглийски език" за "машинарията". За "новобранци" в писането на програмен код (като мене ) средата е прекрасна и лесно усвояема.

Друга особено добра страна е модулното му програмиране - днес може да програмираш основната, работна задача за бъдещото си устройство. Утре, когато намериш свободно време, може да "оцветиш" дисплея с допълнителни функции като волтметри, измервателни бар-графи, шрифтове, знаци, да добавиш и управляваш външни блокове и компоненти, които ще подобрят комфорта при експлоатацията. Въобще "направи си устройство както и доколкото можеш, а после може приятел-разбирач, колега, програмист и др., да ти го подобри".

Така се получи при мен: първата вечер се занимавах къде с примерите в интернет, къде с "чесане по главата" дотогава, докъдето ми се "изясни раб'тата" ... и с голяма помощ от приятели (които отговаряха на безкрайните ми на пръв поглед много и елементарни въпроси) сборих първия, начален "препъни камък": зареждане на няколко числа последователно по i2c, без индикация, без управление, без проверки, без бутони, като експеримента приключи с програмно кодче, версия 01 и приемник на една-единствена честота.

Вярно, готови решения ("топли води", hi ) има вече "измислени", но тръпката при тоталното повторение за мен там няма.

Новопостроеното устройство (със събран "алгоритъм на работа" и код оттук-оттам + собствен такъв), благодарение на собственото ни отношение към него в процеса на изработка, ни става "по-близко до душата".

    "Пътя на тока" е заменен с "пътя през програмния код", като "самоделството" се пренася в софтуерната част на готовите хардуерни компоненти. По-важно за мен е удоволствието от самото занимание.

И без това в къщи съм "заровен" с поне двадесетина броя фабрични, други - на платки, спасени от изхвърляне, трети - от "направи си сам" FM приемници, та този ли ще е последния ...

Инсталация на средата за разработка на Arduino няма да описвам. Само ще добавя, че използвам външна библиотека за управление на посоките при въртене на механичния енкодер / Ben Buxton: www.buxtronix.net/2011/10/rotary-encoders-done-properly.html, Richard Visokey AD7C: http://www.ad7c.com/projects/ad9850-dds-vfo/ (tnx!). Харесва ми с нея как работи енкодера - без забавене, прекъсвания в работата, без самопроизволни действия и др. За мен библиотеката е доказала устойчивостта и ефективността си в няколко други мои начални проекта.

Външната библиотека Rotary (rotary.h, rotary.cpp) трябва да се добави ръчно в средата на Arduino. Написано по-просто: копирайте папка Rotary в "My Documents\Arduino\libraries".

Няма да описвам и кода.

Функциите на приемника са основните: "ръчно избиране на честота" и "запомнени станции". Авто-сканирания, интелигентни заглъхвания на сигналите, авто-превключване от стерео режим на моно и др. такива "екстри" могат да се добавят, но не са ми нужни. В новите приемници за мен са по-скоро дразнещи! Пето меню, шесто подменю ... Понякога от опции забравяш за какво си "влязъл" там ...

Преди повече от 20 години си бях модифицирал българския тунер РСТ-201 с друга ВЧ част, като му използвах блоковете по междинна честота, ЧД, стерео-декодер и частта на АМ радио.

За настройка тогава използвах потенциометър и 8 бутонен превключвател-регулатор за избиране на каналите от цветен телевизор ITT със сензорно управление (на ИС SAS560, SAS570), индикатори с миниатюрни лампички и механични потенциометри за запомняне на честота, от което ми остана само споменът и шепа вехти части ...

Ех, времена ...

Та такава ми беше и първоначалната идея за подреждане на менюто и надписите по дисплея: простота преди всичко.

Отбелязвам, че всеки надпис може да си променя лесно мястото на изписване, разредеността и др. Добавяйте, премахвайте, променяйте функциите, слагайте нови бутони, памети, дисплеи. Arduino "не се чупи", "не пуши" и "не издава странни звуци", ако в кода нещо не е в ред. На мен ми беше необходима седмица, за да се престраша да модифицирам (и дописвам) от "чужди" кодове това , което искам и да изразя на ардуиновския език моите си размисли.

Вариантите на реакцията на средата на Arduino са 3:

Първи вариант: Има "синтактическа грешка", червени надписи (като черга) следват края на кода - "словоредът" е неправилен и програмата не се компилира.

Чукча сказал (за бутилка водка): Четене трябва.

Втори вариант: Програмата се компилира успешно, изпраща се и се стартира на устройството, но има логическа грешка: действията на периферията са грешни (надписи, математически сметки, честоти, състояния на устройства и други).

За отстраняване трябва дълго взиране в монитора, писане с молив върху хартия на случващите се събития, изпълняване стъпка по стъпка и понякога – сериозна поправка в кода.

Трети вариант: устройството заработва така, както сте го запланували. Тогава се радвате на работата му няколко дни, след това добавяте някоя екстра, после се хвалите на приятели, споделяте кода на творението си и пишете статия .

Реално "разбивам" цялата си идея за работа на малки, елементарни действия, които дописвам с код. Свързвам ги едно за друго в отделна, копирана част от програмата. Така при фал трия написаното и се връщам една стъпка назад, до предното проверено и работещо състояние.

Вярно, папката с проекта расте, бъркотията от версиите и преплетения код е неуправляема (виж "Спагети-код" [5]).

След една-две седмици, по максимално 20-30 мин на ден "писане" на код, учудващо за вас събраните чаркалаци, платки и жици започват да се сработват едно с друго и устройството придобива живот съгласно идеята.

Пишете коментари! Те са само и единствено за ваше собствено разяснение на процесите и са особено полезни (примерно) след месец, като отворите програмката и гледате безкрайните и безсмислените (на пръв поглед) редове. Аз не съм намерил място къде да да описвам действието на частично готовите версии, но експериментирам (не много успешно) на български език в имената на файловете. За мен си е разбираемо .

Именувайте константи и променливи смислено, с подсещащо название, което е пак само за вас. Компютърът си ги превежда после по свой си начин и хич не му пука дали ще е s, tt, ucs, А9 или old_frecuency, но за вас това е важно от гледна точка на реда и яснотата.

Мен лично не ми допада (почти) стандартизираното именуване по метода CamelCase [4]. Не мога да свикна с (примерно):

БроячНаСтанциитеВЕфира = 8;

От програмирането на Pascal ми остана писането с малки букви и с разделител "долно тире". Използвам и дълги линии от "средно тире" за разделител между функциите. Въобще ... "на вкус и цвет товарищей нет".

Да спомена с изречение теоретичната вероятност за дефект на микроконтролера (в случая ATmega328P) след 100 000 записа във вътрешния EEPROM или след 10 000 записа във Flash (препрограмиране). Те и записите често не са прости записи, а с едно записване машинката прави неколкократно няколко такива, но това е по-скоро статистика.

След тестове, правени в интернет се вижда, че нещата не са толкова "черни" - цифрите реално са умножени по 10. Имам и уверения на мои приятели (които се занимават от дълго време с такава дейност), че нямат случаи на нецеленасочено "изпичане" на микроконтролери, породено от записи (tnx LZ3GH, LZ2DVM).

А и чипчето е нискобюджетно (вкл. и целия Arduino-модул). Случи ли се непредвиденото - вадиш, сменяш и продължаваш заниманията.

Добре е все пак да не се прекалява със записи във вътрешния EEPROM на често изменящи се променливи, за което си има други начини на реализиране.

Какво се получи накрая:


FM радиоприемник под управление на Arduino UNO

FM стерео-радиоприемник с ИС TEA5767 под управление на Arduino:

   
- консумация: 58 mA, на 12V шина преди стабилизатора, с индикация с подсветка, без консумацията на нискочестотния усилвател;

    - честотен диапазон: (87,6 ÷ 108,0) MHz (за моя екземпляр, захранен на 5V: реален честотен диапазон: (78 ÷ 117) MHz;

    - индикатор на честота на приеманата станция (ХХ,Х MHz);

    - стъпка на изменение на честотата: ± 100 kHz;

    - STEREO/MONO режим с индикатор, без възможност за ръчно превключване на режимите;

    - стандартна след-корекция на двата канала: deemphasis 50 μS (Европа, Австралия) / 75 μS (Северна Америка) с избор - в кода;

    - индикатор за силата на сигнала (в случая: нивото на AGC) с числена стойност и бар-граф;

    - управление с един орган на настройка (механичен енкодер с бутон);

    - режим "ЗАПАМЕТЕНИ СТАНЦИИ" и "НАСТРОЙКА" (TU). Двата режима се превключват алтернативно с кратко натискане на бутона на енкодера.

    - запомняне на станции (от 1 до 16, броя им лесно се променя в кода). Записът се извършва с по-дълго натискане на бутона на енкодера в режим "НАСТРОЙКА" (TU) върху клетка с текущ номер, изобразена в "ЗАПАМЕТЕНИ СТАНЦИИ";

    - възможност за нулиране на запаметените станции (reset default). Извършва се с много дълго задържане на бутона на енкодера (> 5 сек) и включване на устройството. Всички запомнени честоти в EEPROM се заместват със 108 MHz.


Arduino sketch: arduino_fm_rx_tea5767_lz2wsg_v21а.zip [ino,spl7,gif,txt,h,cpp][2,1mb]

Чувствителността не съм мерил (няма с какво), но е "добра" - радиото "хваща" с антена тип "жичка" всички местни радиопредаватели .

Предвид ниската междинна честота от "само" 225 kHz, наличието на "двойно приемане" и по "огледална честота", съвсем близко до основното приемане, автоматично поставя приемника в ниския клас, но това не е пречка за творчество за новите ни самоделни непретенциозни приемници, конструкции за удоволствие и дори за детски играчки.

За нискочестотен усилвател може да се използва всеки наличен стерео/моно аудио усилвател. Аз пробвах готовите си усилвателчета с LM386, К174УН7 и лампов такъв, с 6Ж4П.

LM386 се представи зле - вероятно нефилтрираните остатъци от междинната честота на 225 kHz караха понякога усилвателя да работи нестабилно. Старата, изпитана ИС К174УН7 се представи прекрасно, с добър звук, а съм си оставил приемника засега да работи за ежедневен / вечерен фон в стаята с ламповото стъпалце.

При реализацията на платка, наред с външния стабилизатор на 5V, може да добавите допълнителна верига (напр. CLC/CRC филтър) по захранването на радио-модула. Добра идея е и добавянето и на по-сериозен входен филтър към антенния вход.   

Приемникът тествах и настройвах с Arduino Uno. По същия начин работи и с Arduino Nano. Необходимо е само да обявите вида на използваната платка (Nano) в менютата на средата Arduino IDE.


FM радиоприемник под управление на Arduino Nano

Остава ми прехвърлянето на схемата на платка и монтирането на "всичката карантия" в подходящ корпус, но това занимание не ми е интересно .

Имам идея за бъдеща реализация на запис на "последно използваната честота" (или запаметена станция), но предвид вероятното често активиране, бих изнесъл паметта във външен EEPROM или F-RAM?  Засега оставам проекта отворен за бъдещи хрумвания и допълнения. Затова вероятно ще изнеса USB порта извън кутията за бъдещите "ъпгрейти".

На пазара има още няколко типа ИС (и модулчета, реализирани с тях), които са също толкова миниатюрни. По обявени параметри са по-добри от ТЕА5767. Ще трябва да се снабдя с AR1010, RDA5807M, RDA5820, SI4730 за сравнение.
 

*** Допълнение 1:

Премахването на грешки, оптимизация на кода, дописванията и допълненията на удобства и нови функции към съществуващия софтуер може да се извършва до безкрайност. Това във времето е свързано с нервите и желанието на автора дотолкова, доколкото той иска да променя и усъвършенства устройството си.

След няколко часово слушане на ефирни радиостанции ми направи впечатление, че максимума на настройка върху станция е леко изместен встрани. Това грубо може да се провери и без уреди: на ръчен режим (TU) настройте се върху позната радиостанция (на която знаете точно честотата) и добавете честотно отклонение (с помощта на енкодера) от ± (1 ÷ 2) стъпки или ± (100 ÷ 200) kHz от истинската честота. Затихването и пропадането на звука в двете страни трябва да е симетрично.

Необходимо е измерване на генерираната честота на кварцовия резонатор (32,768 kHz) и извършване на корекция (с полупроменливи или постоянни кондензатори). Това действие не бих казал, че просто и изисква наличие на измервателни уреди с висока точност, които не притежавам. Бих се съгласил в настройката да има неточност, но да не запоявам нищо по микроскопичната платчица.

Постъпих по следния начин: в кода коригирах честотата на кварцовия резонатор (участващ в пресмятането на честотата на PLL) с толкова, с колкото относително да се възстанови симетрията.

ред 142:

в програмния код е: frequencyB = 4 * (frequency * 100000 + 225000) / 32768;
след корекцията става примерно: frequencyB = 4 * (frequency * 100000 + 225000) / 32760;

С вашето радиоприемно модулче на ИС TEA5767 корекция може да не е необходима или тя да е с друг знак или стойност.

След "настройката" приемникът засвири с по-чист тон, а загубеното време за това е точно 10 секунди .



*** Допълнение 2:

На електронната си поща получих молба за добавяне на нова функционалност: бутон за заглушаване на радио-възпроизвеждането (MUTE) (tnx, Mr. Raajjesh!).
Като вариант за употреба добавям изменението в принципната схема и кода на програмата към Arduino.

На експерименталния етап при дописването на кода (на работното си място) лично харесах действието на бутона за заглушаването на звука: при нужда от разговор с повишено внимание просто натискам един бутон и възпроизвеждането спира .


FM радиоприемник под управление на Arduino UNO, с MUTE функция

Arduino sketch: arduino_fm_rx_tea5767_lz2wsg_v21а_4.zip [ino,spl7,gif,h,cpp][229kb]

Вариантът за по-компактна конструкция също е приложим с използване на Arduino Nano, при което програмният код е същия.


FM радиоприемник под управление на Arduino Nano, с MUTE функция

   
С пожелания за хубава музика. Приятно слушане .


продължение: www.kn34pc.com: FM радиоприемник с ИС TEA5767 и дистанционно управление под управление на Arduino


Помощни препратки:
1. Подключение FM-радиомодуля TEA5767 к Arduino [madebyme]
2. AD9850 DDS VFO,  Richard Visokey, AD7C
3. Arduino
4. Wikipedia, CamelCase
5. Wikipedia, Spaghetti code
6. AR1010, RDA5807M, RDA5820, SI4730, TEA5767 [zip,pdf][3,8mb]
7. VFO DDS Arduino - AD9850 - IR Remote, PY2OHH

LZ2WSG, KN34PC
9 февруари 2016 година, доп. 20 март 2016 година