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 година