Модуль TEA5767
- Войдите на сайт для отправки комментариев
Пт, 06/12/2013 - 17:49
Пришел модуль, все классно, радио ловит. Но вот захотелось мне выключить это радио, а МК я обестачивать не намерен, т.к. ему еще и другие функции положено выполнять.
Возможно ли как то програмно выключать TEA5767 или только разрыв VCC может его выключать и включать?
P.S. силы тока от Analog и Digital pins не хватает, проверенно.
Спасибо Максим.
Пойду, попробую разобраться, как послать туда эти 6 бит.
Не 6-ть бит, а как установить шестой бит четвертого байта в единицу.
Не 6-ть бит, а как установить шестой бит четвертого байта в единицу.
блин.... ну почему на информатике в школе, техникуме и институте такое не преподавали....
Могу я вас сразу пример написать, а то к этому в итоге и придем...
Покажите код как вы управляете модулем.
Покажите код как вы управляете модулем.
Да пока только так
// 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
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().
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().
Ок, попробую, спасибо.
Но могли бы вы еще и логику объяснить, что эти строки значат и как здесь реализован, по пунктам, метод установки шести бит четвертого байта в единицу.
Кстати, ошибся
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); }Кстати, ошибся
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?
Работает!
При воспроизведении радиосигнала слышен писк. Пищит так:
5 пиков раз в секунду, перерыв 2 секнды и опять 5 пиков.
Что это? Помехи от МК? Как убрать?
Может по питанию надо канденсаторов понаставить ? на 0.1мкф например от вч помех.
Может по питанию надо канденсаторов понаставить ? на 0.1мкф например от вч помех.
надо попробывать
Попробуй этот скетч
#include <Wire.h> #include <TEA5767Radio.h> TEA5767Radio radio = TEA5767Radio(); void setup() { Wire.begin(); setfr(); } void loop() { } void setfr() { radio.setFrequency(90.6); }пищать не должно ...
Частоту поменяй на свою.
И чем он отличается от этого?
// 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() { }И чем он отличается от этого?
// 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() { }Я разглядел только
Вот только что это?
Я разглядел только
Вот только что это?
Ну вы как в первый раз родились... это вызов функции (которая ниже по тексту программы)
Я разглядел только
Вот только что это?
Ну вы как в первый раз родились... это вызов функции (которая ниже по тексту программы)
дак и без нее работает все чудесно, от писка она врят ли прекроет.
Конденсатор поставил паралельно питанию. Помехи пропали, но писк остался.
По экспереминтировал, писк идет с i2c. Пробовал и туда конде ставить, толку нет, i2c просто перестает работать вообще.
Как убрать писк?
Скетч бы используемый увидеть .. оно там цикле ничего постоянно в i2c не передает ? Может Wire.endTransmission() после передачи ставить ?
У самого этот модуль закуплен,но пока ещё не подключал.
Скетч бы используемый увидеть .. оно там цикле ничего постоянно в i2c не передает ? Может Wire.endTransmission() после передачи ставить ?
У самого этот модуль закуплен,но пока ещё не подключал.
Туда же, по i2c, включены: DS1307, LCD 2004, TEA5767. Оставлял только FM модуль, писк все равно стоит.
ingener.solovyev. У вас ещё что-нибудь подключнено к ардуике (например кнопки).
Сейчас вспомнил! В ходе обкатки скетча были прописаны кнопки на цифровые выводы 3, 4 ,5 и прикосновению к плате с кнопками был писк. Кнопки убрал из скетча и отпаял провода от выводов на ардуинке. Остались только кнопки на цифровых выводах 6 и 7. Писк при прикосновеню к плате пропал.
ingener.solovyev. У вас ещё что-нибудь подключнено к ардуике (например кнопки).
Сейчас вспомнил! В ходе обкатки скетча были прописаны кнопки на цифровые выводы 3, 4 ,5 и прикосновению к плате с кнопками был писк. Кнопки убрал из скетча и отпаял провода от выводов на ардуинке. Остались только кнопки на цифровых выводах 6 и 7. Писк при прикосновеню к плате пропал.
Подключена аналоговая клавиатура с 5-ю кнопками. Как ее убрать, если управление через клаву?
Попробуйте мой код.
#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кОм
Попробуйте мой код.
#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, не вижу. Думаю ничего не поменяется.
давно купил данный модуль. вот наконец потестил
в принципе понравился
http://youtu.be/kb_8PcngFzo
А какую ты используешь библиотеку при работе с LCD ???
https://github.com/adafruit/Adafruit-ST7735-Library
использовал эту, но переделанную немного для увеличения FPS
кстати может есть какие нибудь варианты как на таком дисплее красиво оформить радио (имею в виду в таких габаритах). хоть ручкой нарисованное.
кроме частоты еще выводить stereo/mono, уровень сигнала, название станции
потом может логотип станции, но пока SD не подцепил, и на логотип пока места нет во флеше
а то честно сказать в голову ничего не идет как покрасивее оформить