Цитата:
Сообщение от yuriy m
И тут Остапа понесло...  в хорошем смысле 
|
Когда я искал хоть какую нибудь инфу, чтобы делать самому с нуля - нифига нету, только на одном сайте печатка+HEX прошивка, так только за деньги ( с платного аккаунта).
А тут простая схема, ардуину любую цеплять, пины только переназначить.
Бери и повторяй.
Навыдёргивал из другого скетча управление энкодером, быстро, практически без переработки, без обработки дребезга.
PHP код:
//Для запуска tda7442 достаточно загрузить скетчь который ниже в ардуино
/*
вход к джеку наушников телефона
выход - на линейный вход активной акустики.
Прицепил 2 кнопки для теста ( подтяжку не надо, использую внутренние резаки; один конец кнопок на минус, второй на 52 и 53 пины)
Энкодер подключается так: общий на массу, остальные на 50 и 53 пины.
При нажатии кнопок громкости в ком порт идут значения громкости
0-80 звук есть, 80-255 Mute.
Монитор ком порта работает только когда есть питание на TDA7442!
*/
// про энкодер http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder
#include "Wire.h" //добавление библиотеки I2C шины
//настройка кнопок громкости
const int volUPbutton = 52; // номер пина на подключение кнопки VOL+
const int volDNbutton = 53; // номер пина на подключение кнопки VOL-
//для энкодера
int stepVOLamount = 2; // шаг изменения громкости энкодером
unsigned long currentTimeVoumeControl;
unsigned long loopTimeVoumeControl;
const int pin_A = 50; //
const int pin_B = 51; //
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
//конец для энкодера
int buttonStateVOLup = 0; //переменная для чтения статуса кнопки
int buttonStateVOLdn = 0; //переменная для чтения статуса кнопки
byte MasterVolume = 36; // переменная, хранящая в себе громкость выходного звука, 0 - макс громкость, 79- минимальная, 80-255 MUTE http://arduino.ru/Reference/Byte Тип данных byte 8-ми битное беззнаковое целое число, в диапазоне 0..255
void setup()
{
pinMode(13, OUTPUT); // настройка пина встроенного светодиода на выход (чтоб моргать мог)
pinMode(volUPbutton, INPUT); //настройка порта ардуины на вход - приём данных от кнопки громкости +
pinMode(volDNbutton, INPUT); //настройка порта ардуины на вход - приём данных от кнопки громкости -
digitalWrite(volUPbutton, HIGH); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
digitalWrite(volDNbutton, HIGH); // включить подтягивающий резистор
Wire.begin(); // включение библиотеки I2C шины
delay(1000);
Serial.begin(9600); // ком порт
Serial.println(MasterVolume);
pinMode(pin_A, INPUT); //настройка пинов энкодера
digitalWrite(pin_A, HIGH); // включить подтягивающий резистор http://arduino.ru/Tutorial/DigitalPins
pinMode(pin_B, INPUT);
digitalWrite(pin_B, HIGH);
currentTimeVoumeControl = millis(); //для энкодера
loopTimeVoumeControl = currentTimeVoumeControl;//для энкодера
}
void loop(){
buttonStateVOLup = digitalRead(volUPbutton); // читаем статус кнопки volUPbutton
// проверяем, нажата ли кнопка
if (buttonStateVOLup == LOW) {
digitalWrite(13, HIGH);
if (MasterVolume==0){Serial.println ("I tak VOLUME MAX (0dB)"); } else (MasterVolume--);
Serial.println(MasterVolume); delay(50);
} //если нажата кнопка VOL+, то включаем светик, уменьшаем переменную громкости (для увеличения звука)выводим значение громкости в порт и паузу от дребезга
else { digitalWrite(13, LOW); }//если нет - просто тушим светик.
buttonStateVOLdn = digitalRead(volDNbutton); // читаем статус кнопки volDNbutton
// проверяем, нажата ли кнопка
if (buttonStateVOLdn == LOW)
{ if (MasterVolume==80){Serial.println ("I tak VOLUME MIN (80dB-MUTE)");} else (MasterVolume++);
Serial.println(MasterVolume); delay(30);
}//если нажата кнопка VOL- увеличиваем переменную громкости (для уменьшения звука)выводим значение громкости в порт и паузу от дребезга
/*
tda7442(0, 0b01100000); //INPUT ATTENUATION -16dB (0b - показывает, что данные будут в двоичной форме. )
потом идут разряды
D7 D6 D5 D4 D3 D2 D1 D0
по даташиту (5,1 пункт) D7 это B ( в табличке, B = 1 incremental bus; active B = 0 no incremental bus;X = indifferent 0,1)поэтому D7 будет 0.
D7 D6 D5 D4 D3 D2 D1 D0
B X X X 0 0 0 0 INPUT ATTENUATION (из даташита)
X X X 0 0 0 0 INPUT ATTENUATION
*/
tda7442(0, 0b01000000); //INPUT ATTENUATION приглушение ВХОДНОГО (IN1-IN4) канала (0 ~ -31.5dB)(0db-макс громкость, без приглушения)
tda7442(1, 0b00000110); //SURROUND & OUT & EFFECT CONTROL( -6 FIX OFF)
tda7442(2, 0b00000011); //SURROUND PHASE RESISTOR( 37KOm)
tda7442(3, 0b00011111); //BXXX0011 BASS SELECTION (0dB)-14dB
tda7442(4, 0b01111110); //BXXX0100 TREBLE (0dB)
//tda7442(5, 0b00000000); //BXXX0101 SPEAKER ATTENUATION "L" (0dB)( SPEAKER SELECTION = 0dB ~ -79dB) громкость правого канала
//tda7442(6, 0b00000000); //BXXX0110 SPEAKER ATTENUATION "R" (0dB) громкость левого канала
// регулировку громкости можно делать 0dB ~ -79dB в DEC c шагом 1. если (80-255) - то MUTE
tda7442(5, MasterVolume); //0 - макс громкость, 80-255 - MUTE .
tda7442(6, MasterVolume);
tda7442(7, 0b00000000); //BXXX0111 NOT ALLOWED
tda7442(8, 0b00000000); //BXXX1000 NOT ALLOWED
tda7442(9, 0b00000110); //BXXX1001 INPUT MULTIPLEXER выбор источника IN1-4
}
void tda7442(byte subaddress, byte data) //Вызов tda7719 char??
{
Wire.beginTransmission(0x40); //СТАРТ и Адрес микросхема tda7442
//или Wire.beginTransmission(0b1000000);
//после beginTransmission дуина ждёт по линии ДАТА ответа от tda7442 ( присаживание линии на землю)и потом передает
Wire.write(subaddress); //Подадрес команды
Wire.write(data); //Команда
//Serial.println(subaddress); //Пишем подадрем в монитор
//Serial.println(data); //Пишем команду в монитор
Wire.endTransmission(); //СТОП
//delay(500);
//для энкодера
currentTimeVoumeControl = millis();
if(currentTimeVoumeControl >= (loopTimeVoumeControl + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) { // выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем громкость, не более чем до 80
if(MasterVolume + stepVOLamount <= 80) (MasterVolume += stepVOLamount); Serial.println(MasterVolume);
}
else { // выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем громкость, но не ниже 0
if(MasterVolume - stepVOLamount >= 0) (MasterVolume -= stepVOLamount); Serial.println(MasterVolume);
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
loopTimeVoumeControl = currentTimeVoumeControl; }
//конец для энкодера
}