W tym artykule pokaże jak sami możemy zbudować nasze prowizoryczne radio. W projekcie zostanie użyty również Moduł enkodera obrotowego KY-040 który pozwoli nam na zmianę częstotliwości odbiornika. Po krótce zostanie również przedstawiony opis tunera FM.

Spis treści
- Krótki opis
- Specyfikacja
- Przykład
- Pliki do pobrania
Krótki opis
Moduł TEA5767 pozwala nam po podpięciu do niego anteny na odbiór nadawanej częstotliwości. Jednak poza odbieraniem stacji istnieje również możliwość odbioru MONO lub STERO jak i wyświetlenie informacji o sile nadawanego sygnału.
Specyfikacja
Przykład
Elementy
- TEA5767
- enkodera KY-040
- Arduino Uno Lub Mega
- Słuchawki lub Głośnik z wejściem Jack
- Oled 128×64
Podłączenie
- Arduino -> Tuner FM
- GND – GND
- 5V – VCC
- SDA REF3(ostatni pin po prawej stronie nad GND i AREF) – SDA
- SCL REF3(przed ostatni pin po prawej stronie nad GND i AREF) – SCL
- pin 21(MEGA)/A5(UNO) – SCL
- Arduino -> Encoder
- GND – GND
- 5V(nad pinem 22) – +
- pin 9 -SW
- pin 10 – DT
- pin 11 – CLK
- Arduino->Oled
- GND(pod pinem 53) -> GND
- 5V(nad pinem 22 obok w równej linii) -> VCC
- pin 20(MEGA)/A4(UNO)- SDA
- pin 21(MEGA)/A5(UNO) -SCL
Kod
Na początku dołączamy wszystkie potrzebne nam biblioteki(zamieszczone poniżej) oraz definiujemy zmienne jakie będziemy później wykorzystywać w kodzie. Dla oled ustawimy wysokość i szerokość oraz deklaracje dla I2C. Jeżeli masz problemy z obsługą wyświetlacza odsyłam do tego artykułu
WYŚWIETLACZE OLED 0.91, 0.96 – AJmaker
#include <Wire.h> #include <SPI.h> #include <SoftwareSerial.h> #include <TEA5767.h> #include <Encoder.h> TEA5767 FMRadio; #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Encoder FRQ(4, 5); // avoid using pins with LEDs attached double Nf = 0; int stereo; int signal_level; unsigned char buff[5];
Następnym krokiem będzie funkcja void setup() w której najpierw ustalamy że jeżeli wyświetlacz nie rozpocznie wyświetlać obrazu pojawi nam się błąd na monitorze portu szeregowego. Rozpoczynamy również transmisję na porcie szeregowym.
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
}Ostatnią rzeczą będzie ustawienie funkcji loop(). Po pierwsze musimy utworzyć 5 tabel zawierających częstotliwości stacji na które będziemy mogli ustawić radio. Zauważ, że te elementy są przypisane co drugiej liczby od 0 do 10. Ustawiłem je w ten sposób aby mieć większą wygodę zmiany stacji za pomocą enkodera. Następnie definiujemy kolejne 2 zmienne które będą nas informować o jakości sygnału stacji oraz czy jest ona wyposażona w tryb stereo. Potem wyświetlamy te wartości na Oledzie. Kolejnym krokiem jest odczyt stanu enkodera (na jakiej pozycji się obecnie znajduje). Jeżeli wartość jest inna od poprzedniej wykona się if który najpierw zweryfikuje czy wartość znajduje się w odpowiednim przedziale. Jeżeli nie to zmieni ją na właściwą. A potem nadpisze starą wartość obrotu. Po wykonaniu się tego działania funkcja for sprawdzi czy dla dana wartość jest równą któremuś elementowi tabeli. Jeśli tak na radiu zostanie ustawiona częstotliwość przypisana adekwatnemu elementowi tabeli.
long beforeF = -999;
void loop() {
double f[11];
f[0] = 104.9;
f[2] = 92.9;
f[4]= 90.4;
f[6] = 93.6;
f[8] = 95.1;
f[10] = 95.8;
stereo = FMRadio.stereo(buff);
signal_level = FMRadio.signal_level(buff);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5,1);
display.print("FRQ:");
display.print(Nf);
if(stereo){
display.setCursor(5,15);
display.print("Stereo");
} else {
display.setCursor(5,15);
display.print("Mono");
}
display.setCursor(7,29);
display.print("SigLv:");
display.println(signal_level);
display.println("/15");
display.display();
long currentF = FRQ.read();
if(currentF != beforeF) {
if(currentF > 10){
FRQ.write(10);
currentF = 10;
}
if(currentF < 0) {
FRQ.write(0);
currentF = 0;
}
beforeF = currentF;
for(int i = 0; i <= 10; i++){
if(currentF == i){
FMRadio.set_frequency(f[i]);
Nf = f[i];
}
}
}
}Pliki do pobrania
Biblioteka Enkodera – github.com/PaulStoffregen/Encoder
Biblioteka tuneraFM – github.com/andykarpov/TEA5767




