Имею ардуино нано, ресивер spektrum (ШИМ сигнал с 2 каналов), плеер, усилок к нему, динамик на 0.5 Вт 8 Ом, микросд на 2 гб, 2 драйвера l293d параллельно соединенных (ардуино думает, что он один), 3 двигателя n20 300 об/мин 12В (если надо). Вот код (вставляю впервые, вроде бы правильно вставляю): Код (C++): #include <DFPlayer_Mini_Mp3.h> #include <SoftwareSerial.h> int channel; int channel2; byte Speedmotor; int diapazonSpeed; byte iz; int max1, max2, min1, min2, maxa1, maxa2, mina1, mina2; //SoftwareSerial mp3(9, 10); //const int ledPin = ; // номер выхода, подключенного к светодиоду //int ledState = LOW; // этой переменной устанавливаем состояние светодиода //long previousMillis = 0; // храним время последнего переключения светодиода //long interval = 400; void setup() { pinMode(3, INPUT); pinMode(5, INPUT); pinMode(8, OUTPUT); pinMode(7, OUTPUT); pinMode(6, OUTPUT); // pinMode(ledPin, OUTPUT); Serial.begin(9600); max1=1890 ; //вверх верхний предел min1=1510 ; //вверх нижний предел max2=1490 ; //вниз верхний предел min2=1215 ; //вниз нижний предел maxa1=1820 ; //правый стик (лево-право) правый предел mina1=1520 ; //правый минимум maxa2=1500 ; //левый минимум mina2=1245 ; //левый предел // mp3.begin(9600); mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3 delay(1); // задержка в 1ms для установки громкости mp3_set_volume(25); // устанавливаем громкость от 0 до 30 mp3_set_EQ(0); // устанавливаем эквалайзер от 0 до 5 } void loop() { //получаем данные с приемника channel=pulseIn(3,HIGH); channel2=pulseIn(5,HIGH); //мониторим данные // Serial.print(channel); // Serial.print(" - "); // Serial.print(channel2); // Serial.print(" - "); // Serial.print(Speedmotor); // Serial.print(" - "); // Serial.print(diapazonSpeed); // Serial.print(" - "); // Serial.println(iz); //управление мотором if (channel>min1) { //ход вперед digitalWrite(7, LOW); //7 HIGH назад digitalWrite(8, HIGH); //8 HIGH вперед Speedmotor=(channel-min1)/1.5; analogWrite(6, Speedmotor); diapazonSpeed=2; } if (channel>(max1-10)) { //ход вперед max digitalWrite(7, LOW); digitalWrite(8, HIGH); Speedmotor=254; analogWrite(6, Speedmotor); diapazonSpeed=2; } if (channel<max2) { //ход назад digitalWrite(8,LOW); digitalWrite(7,HIGH); Speedmotor=((max2-channel)/1.083); analogWrite(6, Speedmotor); diapazonSpeed=3; } if (channel<(min2+10)) { //ход назад max digitalWrite(8,LOW); digitalWrite(7,HIGH); Speedmotor=254; analogWrite(6, Speedmotor); diapazonSpeed=3; } if (min1>channel && channel>max2 || channel<1100) { //на месте Speedmotor=0; digitalWrite(7,LOW); digitalWrite(8,LOW); analogWrite(6, Speedmotor); diapazonSpeed=1; } //поворотники //unsigned long currentMillis = millis(); //if (min1<channel2 || max2>channel2) { // if(currentMillis - previousMillis > interval) { // // сохраняем время последнего переключения // previousMillis = currentMillis; // // // если светодиод не горит, то зажигаем, и наоборот // if (ledState == LOW) // ledState = HIGH; // else // ledState = LOW; // // digitalWrite(ledPin, ledState); // } // if (mina1>channel2>maxa2){ // digitalWrite(ledPin, LOW); // } //} //звук if (diapazonSpeed != iz){ mp3_play(diapazonSpeed); iz=diapazonSpeed; } } Кратко, что хочу сделать: Принимаем сигнал, переводим значения, определяем какой трек играть (1, 2 или 3) и распределяем на пины 6 (скорость), 7 и 8 (крутить вперед или назад). Команды на плеер отправляю через rx-1кОм-tx и tx-1кОм-rx. Проблема, без строчки №29 "Serial.begin(9600);" звук не работает (что логично), но ардуино не зависает вообще (что тоже логично), но включаем строчку в код звук работает, но ардуино зависает на секунду-две. То есть двигаю стик пульта, машина стоит, звука нет, прошла секунда машина выполняет команду отправленную секунду назад и звук полностью соответствует движению. Если стик отпустить машина еще выполняет данные ей команды, то есть едет дальше еще секунду со звуком. Почему зависает и как можно решить? Код вроде бы не тяжелый, 12% памяти и 11% динамической ------------------------ Есть идея использовать Adkey_1 и Adkey_2 Кратковременно открывать транзистор напряжением с необходимых ног ардуино, тем самым замыкая gnd и adkey_1, в зависимости от скорости будут открываться различные транзисторы замыкающие цепи с различными резисторами по схеме: Тут столкнулся с проблемой, что при замыкание adkey_2 запускается не пятый трек, а второй и только при наличии пятого. Конфуз. Помогите пожалуйста, уже полгода постепенно колдую над машиной. UPD А если передавать команды через другие пины а не через RX TX?
А что за звуки воспроизводятся? Мне кажется, что вы хотите чтобы операции выполнялись параллельно, но ардуина занята воспроизведением (могу ошибаться). Резисторы на Rx и Тх не нужны, но проблема не в них. "другие пины rx/tx" не вижу смысла использовать.
Вы не правы, читайте даташит на DFPlayer. Резистор на Rx плеера на 1К - нужен, иначе - будет шипение в динамике.
Библиотеки под этот плеер все кривые, надо давать команду без них. Номера треков не зависят от их названий, а зависят от физической очередности записи на флешку. Первым считается записанный первым и так далее. TX ардуины соединять с RX плеера через резистор. ТХ плеера соединять с RX ардуины не нужно вообще, там ничего нет.
Я сегодня утром это заметил. Когда записал звук с названием не имеющим цифр. Что я хочу сделать: Когда нужно играть трек №1 (холостой ход, ход на месте) на пин d2 подаем HIGH. Этот пин подключен к Базе транзистора. Коллектор подключен к Adkey_1, Эмиттер к GND. Когда нужно играть трек №2 (малый ход вперед или назад не имеет значения) мы подаем HIGH на d4 который подключен к другому транзистору аналогично предыдущему, но к IO_1 (следующий трек) Когда нужно играть трек №3 (быстрый ход) мы подаем HIGH с d12 на транзистор к IO_2. Скорость сбавляется играет №2, скорость 0 играет №1, скорость повышается назад №2, скорость еще повышается №3 и т.д. Получится или не будет работать? Транзистор 2N2222A NPN Upd Или же управлять через аналоговые функцией digitalWrite значением, которое соответствует 0,6-1,2 вольт
Значительно упростил код и использовал библиотеку, вместо транзисторов. Основные компоненты работают, но окончательно всё проверится в сборке.
Всё пашет отлично, но сам плеер переключает не моментально, а с тишиной в десятые секунды. Но это меня устраивает. На WTV020SD вообще задержка в секунду. Качество звука в сравнении с компом хуже, но похоже, что здесь динамик виноват. Код (C++): #include <DFPlayer_Mini_Mp3.h> #include <SoftwareSerial.h> int channel; int channel2; int Speedmotor; int diapazonSpeed; int iz; int a; int b; int max1, max2, min1, min2, maxa1, maxa2, mina1, mina2; void setup() { Serial.begin(9600); pinMode(3, INPUT); pinMode(5, INPUT); pinMode(8, OUTPUT); pinMode(7, OUTPUT); pinMode(6, OUTPUT); a=2; b=60; max1=1890 ; //вверх верхний предел min1=1510 ; //вверх нижний предел max2=1477 ; //вниз верхний предел min2=1215 ; //вниз нижний предел maxa1=1820 ; //правый стик (лево-право) правый предел mina1=1520 ; //правый минимум maxa2=1500 ; //левый минимум mina2=1245 ; //левый предел mp3_set_serial(Serial); mp3_set_volume(20); mp3_play(4); } void loop (){ channel=pulseIn(3,HIGH); channel2=pulseIn(5,HIGH); if (a!=b) { a=b; delay(5000); } if (channel>min1) { //ход вперед digitalWrite(7, LOW); //7 HIGH назад digitalWrite(8, HIGH); //8 HIGH вперед Speedmotor=map(channel, min1, max1, 0, 253); analogWrite(6, Speedmotor); } if (channel<max2) { //ход назад digitalWrite(8,LOW); digitalWrite(7,HIGH); Speedmotor=map(channel, min2, max2, 253, 0); analogWrite(6, Speedmotor); } if (min1>channel && channel>max2 || channel<1100) { //на месте Speedmotor=0; digitalWrite(7,LOW); digitalWrite(8,LOW); analogWrite(6, Speedmotor); } if (Speedmotor<10 && Speedmotor>=0){ diapazonSpeed=1; } if (Speedmotor<160 && Speedmotor>0){ diapazonSpeed=2; } if (Speedmotor<255 && Speedmotor>160){ diapazonSpeed=3; } if (diapazonSpeed != iz){ mp3_play (diapazonSpeed); iz = diapazonSpeed; } }