Модуль TEA5767

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Пришел модуль, все классно, радио ловит. Но вот захотелось мне выключить это радио, а МК я обестачивать не намерен, т.к. ему еще и другие функции положено выполнять.

Возможно ли как то програмно выключать TEA5767 или только разрыв VCC может его выключать и включать?

 

P.S. силы тока от Analog и Digital pins не хватает, проверенно.

maksim
Offline
Зарегистрирован: 12.02.2012

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

 

Спасибо Максим.

Пойду, попробую разобраться, как послать туда эти 6 бит.

maksim
Offline
Зарегистрирован: 12.02.2012

Не 6-ть бит, а как установить шестой бит четвертого байта в единицу.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

Не 6-ть бит, а как установить шестой бит четвертого байта в единицу.

блин.... ну почему на информатике в школе, техникуме и институте такое не преподавали....

Могу я вас сразу пример написать, а то к этому в итоге и придем...

maksim
Offline
Зарегистрирован: 12.02.2012

Покажите код как вы управляете модулем.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

Покажите код как вы управляете модулем.

Да пока только так

 

// TEA5767 Example

#include <Wire.h>
#include <TEA5767Radio.h>

TEA5767Radio radio = TEA5767Radio();

void setup()
{ 
  Wire.begin();
  radio.setFrequency(93.0); // pick your own frequency
}

void loop()
{
}

Библиотека с arduino.cc

maksim
Offline
Зарегистрирован: 12.02.2012
void Standby()
{
  Wire.beginTransmission(0x60); 
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.write(0xB0);
  Wire.write(0x20);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(100);  
}

Так попробуйте. Что бы выйти из режима Standby достаточно вызвать метод setFrequency().

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

void Standby()
{
  Wire.beginTransmission(0x60); 
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.write(0xB0);
  Wire.write(0x20);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(100);  
}

Так попробуйте. Что бы выйти из режима Standby достаточно вызвать метод setFrequency().

 

Ок, попробую, спасибо.

Но могли бы вы еще и логику объяснить, что эти строки значат и как здесь реализован, по пунктам, метод установки шести бит четвертого байта в единицу.

maksim
Offline
Зарегистрирован: 12.02.2012

Кстати, ошибся

void Standby()
{
  Wire.beginTransmission(0x60); 
  Wire.write(0x00); // 1-й байт
  Wire.write(0x00); // 2-й байт
  Wire.write(0xB0); // 3-й байт
  Wire.write(0x40); // 4-й байт, тот самый байт 0x40 в бинарном виде 0b01000000
  Wire.write(0x00); // 5-й байт
  Wire.endTransmission();
  delay(100);  
}

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

Кстати, ошибся

void Standby()
{
  Wire.beginTransmission(0x60); 
  Wire.write(0x00); // 1-й байт
  Wire.write(0x00); // 2-й байт
  Wire.write(0xB0); // 3-й байт
  Wire.write(0x40); // 4-й байт, тот самый байт 0x40 в бинарном виде 0b01000000
  Wire.write(0x00); // 5-й байт
  Wire.endTransmission();
  delay(100);  
}

 

а почему 3-й байт B0?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Работает!

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

При воспроизведении радиосигнала слышен писк. Пищит так:

5 пиков раз в секунду, перерыв 2 секнды и опять 5 пиков.

 

Что это? Помехи от МК? Как убрать?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Может по питанию надо канденсаторов понаставить ? на 0.1мкф например от вч помех.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

MaksMS пишет:

Может по питанию надо канденсаторов понаставить ? на 0.1мкф например от вч помех.

надо попробывать

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Попробуй этот скетч 

#include <Wire.h>
#include <TEA5767Radio.h>

TEA5767Radio radio = TEA5767Radio();

void setup()
{ 
  Wire.begin();
  setfr();
}

void loop()
{
}

void setfr()
{
  radio.setFrequency(90.6); 
}

пищать не должно ... 

Частоту поменяй на свою.

maksim
Offline
Зарегистрирован: 12.02.2012

И чем он отличается от этого?

// TEA5767 Example

#include <Wire.h>
#include <TEA5767Radio.h>

TEA5767Radio radio = TEA5767Radio();

void setup()
{ 
  Wire.begin();
  radio.setFrequency(93.0); // pick your own frequency
}

void loop()
{
}

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

И чем он отличается от этого?

// TEA5767 Example

#include <Wire.h>
#include <TEA5767Radio.h>

TEA5767Radio radio = TEA5767Radio();

void setup()
{ 
  Wire.begin();
  radio.setFrequency(93.0); // pick your own frequency
}

void loop()
{
}

 

 

Я разглядел только 

setfr();

Вот только что это?

 

vdk
Offline
Зарегистрирован: 14.04.2013

ingener.solovyev пишет:

Я разглядел только 

setfr();

Вот только что это?

Ну вы как в первый раз родились... это вызов функции (которая ниже по тексту программы)

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

vdk пишет:

ingener.solovyev пишет:

Я разглядел только 

setfr();

Вот только что это?

Ну вы как в первый раз родились... это вызов функции (которая ниже по тексту программы)

дак и без нее работает все чудесно, от писка она врят ли прекроет.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Конденсатор поставил паралельно питанию. Помехи пропали, но писк остался.

По экспереминтировал, писк идет с i2c. Пробовал и туда конде ставить, толку нет, i2c просто перестает работать вообще.

Как убрать писк? 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Скетч бы используемый увидеть .. оно там цикле ничего постоянно в i2c не передает ? Может Wire.endTransmission() после передачи ставить ?

У самого этот модуль закуплен,но пока ещё не подключал.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

MaksMS пишет:

Скетч бы используемый увидеть .. оно там цикле ничего постоянно в i2c не передает ? Может Wire.endTransmission() после передачи ставить ?

У самого этот модуль закуплен,но пока ещё не подключал.

Туда же, по i2c, включены: DS1307, LCD 2004, TEA5767.  Оставлял только FM модуль, писк все равно стоит.

Sinister
Offline
Зарегистрирован: 14.06.2012

ingener.solovyev. У вас ещё что-нибудь подключнено к ардуике (например кнопки). 
Сейчас вспомнил! В ходе обкатки скетча были прописаны кнопки на цифровые выводы 3, 4 ,5 и прикосновению к плате с кнопками был писк. Кнопки убрал из скетча и отпаял провода от выводов на ардуинке. Остались только кнопки на цифровых выводах 6 и 7. Писк при прикосновеню к плате пропал.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Sinister пишет:

ingener.solovyev. У вас ещё что-нибудь подключнено к ардуике (например кнопки). 
Сейчас вспомнил! В ходе обкатки скетча были прописаны кнопки на цифровые выводы 3, 4 ,5 и прикосновению к плате с кнопками был писк. Кнопки убрал из скетча и отпаял провода от выводов на ардуинке. Остались только кнопки на цифровых выводах 6 и 7. Писк при прикосновеню к плате пропал.

Подключена аналоговая клавиатура с 5-ю кнопками. Как ее убрать, если управление через клаву?

Sinister
Offline
Зарегистрирован: 14.06.2012

Попробуйте мой код. 


#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h>

unsigned char frequencyH = 0;
unsigned char frequencyL = 0;

unsigned int frequencyB;
double frequency = 0;

#define radioON 2
#define upButton 6 // Кнопка перебора каналов Вверх
#define downButton 7 // Кнопка перебора каналов Вниз


byte savedRadioChannel = 2;

float fmFreq[5] = {101.7, 102.3, 105.4, 106.2, 106.6};  // Частоты вещания в Вашем городе
char* fmName[5] = {"Umor FM", "Avto radio", "Gayropa + ", "Love radio ", "Shanson"}; // Названия стаций вещания
                      
int currentChannel = 4;  // Число каналов. Нумерация начинается с 0

void setup() {
  // Сохоранение канала в EEPROM
  currentChannel = EEPROM.read(savedRadioChannel);
  if ((currentChannel < 0) || (currentChannel > 9)) currentChannel = 0;
  frequency = fmFreq[currentChannel];   
 
  
  // Initialize I2C for radio chip
  Wire.begin();
  
 Serial.begin (9600);
 
  pinMode(upButton, INPUT);                      // UP
  pinMode(downButton, INPUT);                    // Down
  pinMode(radioON, INPUT);   


  setFrequency();
  
}


void loop() {

  
    if (digitalRead(upButton) == HIGH)   checkUpButton(); // Вызов checkUpButton() если нажата кнопка upButton
    if (digitalRead(downButton) == HIGH)   checkDownButton(); // Вызов checkDownButton() если нажата кнопка downButton
    
     if ((digitalRead(radioON) == HIGH)) {
    showChannel();
  }
  }

void showChannel() {
  Serial.print("Channel ");
      Serial.println(fmName[currentChannel]);
}

void setFrequency() // Запись частоты в ТЕА5767
{
   
    frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;

  frequencyH = frequencyB >> 8;
  frequencyL = frequencyB & 0XFF;
 delay(100);
  Wire.beginTransmission(0x60);
  
  Wire.write(frequencyH);  
  Wire.write(frequencyL);
     Wire.write(0xB0);
   Wire.write(0x10);
  Wire.write(B00011010);  // 32kHz xtal, soft mute, stereo noise reduction
  Wire.write((byte)0x00);


  Wire.endTransmission();
  delay(50); 
}

void checkUpButton() {
  int oldChannel = currentChannel;
  if (digitalRead(upButton) == HIGH) {
    while (digitalRead(upButton) == HIGH) {
      currentChannel++;
      if (currentChannel > 4) currentChannel = 0;
      frequency = fmFreq[currentChannel];     
      setFrequency();

    }
  }
  if (currentChannel != oldChannel) {
    EEPROM.write(savedRadioChannel, currentChannel);
  }
}

void checkDownButton() {
  int oldChannel = currentChannel;
  if (digitalRead(downButton) == HIGH) {
    while (digitalRead(downButton) == HIGH) {
      currentChannel--;
      if (currentChannel < 0) currentChannel = 4;
      frequency = fmFreq[currentChannel];     
      setFrequency();

    }
  }  
  if (currentChannel != oldChannel) {
    EEPROM.write(savedRadioChannel, currentChannel);
  }
}

Кнопки подтянуты к - резисторами 10кОм

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Sinister пишет:

Попробуйте мой код. 


#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h>

unsigned char frequencyH = 0;
unsigned char frequencyL = 0;

unsigned int frequencyB;
double frequency = 0;

#define radioON 2
#define upButton 6 // Кнопка перебора каналов Вверх
#define downButton 7 // Кнопка перебора каналов Вниз


byte savedRadioChannel = 2;

float fmFreq[5] = {101.7, 102.3, 105.4, 106.2, 106.6};  // Частоты вещания в Вашем городе
char* fmName[5] = {"Umor FM", "Avto radio", "Gayropa + ", "Love radio ", "Shanson"}; // Названия стаций вещания
                      
int currentChannel = 4;  // Число каналов. Нумерация начинается с 0

void setup() {
  // Сохоранение канала в EEPROM
  currentChannel = EEPROM.read(savedRadioChannel);
  if ((currentChannel < 0) || (currentChannel > 9)) currentChannel = 0;
  frequency = fmFreq[currentChannel];   
 
  
  // Initialize I2C for radio chip
  Wire.begin();
  
 Serial.begin (9600);
 
  pinMode(upButton, INPUT);                      // UP
  pinMode(downButton, INPUT);                    // Down
  pinMode(radioON, INPUT);   


  setFrequency();
  
}


void loop() {

  
    if (digitalRead(upButton) == HIGH)   checkUpButton(); // Вызов checkUpButton() если нажата кнопка upButton
    if (digitalRead(downButton) == HIGH)   checkDownButton(); // Вызов checkDownButton() если нажата кнопка downButton
    
     if ((digitalRead(radioON) == HIGH)) {
    showChannel();
  }
  }

void showChannel() {
  Serial.print("Channel ");
      Serial.println(fmName[currentChannel]);
}

void setFrequency() // Запись частоты в ТЕА5767
{
   
    frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;

  frequencyH = frequencyB >> 8;
  frequencyL = frequencyB & 0XFF;
 delay(100);
  Wire.beginTransmission(0x60);
  
  Wire.write(frequencyH);  
  Wire.write(frequencyL);
     Wire.write(0xB0);
   Wire.write(0x10);
  Wire.write(B00011010);  // 32kHz xtal, soft mute, stereo noise reduction
  Wire.write((byte)0x00);


  Wire.endTransmission();
  delay(50); 
}

void checkUpButton() {
  int oldChannel = currentChannel;
  if (digitalRead(upButton) == HIGH) {
    while (digitalRead(upButton) == HIGH) {
      currentChannel++;
      if (currentChannel > 4) currentChannel = 0;
      frequency = fmFreq[currentChannel];     
      setFrequency();

    }
  }
  if (currentChannel != oldChannel) {
    EEPROM.write(savedRadioChannel, currentChannel);
  }
}

void checkDownButton() {
  int oldChannel = currentChannel;
  if (digitalRead(downButton) == HIGH) {
    while (digitalRead(downButton) == HIGH) {
      currentChannel--;
      if (currentChannel < 0) currentChannel = 4;
      frequency = fmFreq[currentChannel];     
      setFrequency();

    }
  }  
  if (currentChannel != oldChannel) {
    EEPROM.write(savedRadioChannel, currentChannel);
  }
}

Кнопки подтянуты к - резисторами 10кОм

 

Особой разници вашего кода, при работе по i2c, не вижу. Думаю ничего не поменяется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

давно купил данный модуль. вот наконец потестил

в принципе понравился

http://youtu.be/kb_8PcngFzo

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

А какую ты используешь библиотеку при работе с LCD ???

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

https://github.com/adafruit/Adafruit-ST7735-Library

использовал эту, но переделанную немного для увеличения FPS

кстати может есть какие нибудь варианты как на таком дисплее красиво оформить радио (имею в виду в таких габаритах). хоть ручкой нарисованное. 

кроме частоты еще выводить stereo/mono, уровень сигнала, название станции

потом может логотип станции, но пока SD не подцепил, и на логотип пока места нет во флеше

а то честно сказать в голову ничего не идет как покрасивее оформить