Найти тему
aviamihanika

Имитатор звука двигателя

Схема подключения
Схема подключения

Имитатор звука мотора, версия 2, доработка первой версии.

Теперь звук мотора включается и останавливается по нажатию кнопки №1 (смотри рисунок выше). Кнопка №2 уменьшает уровень громкости до нуля. Для того чтобы громкость опять увеличилась, необходимо переподключить питание или нажать на кнопку Reset - припаяна к плате (красная). Питается устройство от 5 вольт, ток потребления около 1 ампера. Динамик 1 - 2 ватта мощностью подключается к точкам: красная - плюс динамика, желтая - минус динамика (смотри рисунок выше).

/*
* Скетч имитатора звука двигателя и звуковых эффектов.
* MC - Arduino Pro Mini (поддерживаемые МС: Arduino Uno, Nano, Mega и т.д.).
* Имитатор воспроизводит PCM/WAV напрямую с SD карты.
* Формат файлов: WAV файлы, 8-бит (PCM 8-битный - PCM unsigned 8-bit), частота дискретизации 16 кГц, моно.
* Асинхронное воспроизведение: позволяет работать коду в основном цикле программы во время воспроизведения звука.
* Работа на одном таймере: TIMER1 (Uno, Mega) или TIMER3, 4 или 5 (Mega).
* Библиотека TMRpcm audio для управления воспроизведением:
* audio.play("filename"); // воспроизвести файл
* audio.play("filename",30); // воспроизвести файл, начиная с 30-ой секунды
* audio.speakerPin = 9; // установить в значение 5, 6, 11 или 46 для Mega, 9 для Uno, Nano и т.д.
* audio.disable(); // выключить таймер на выходном выводе и остановить воспроизведение
* audio.stopPlayback(); // остановить воспроизведение, но таймер остается запущенным
* audio.isPlaying(); // возвращает 1, если идет воспроизведение, в противном случае - 0
* audio.pause(); // поставить воспроизведение на паузу / снять с паузы
* audio.quality(1); // установить 1 для удвоения частоты дискретизации
* audio.volume(0); // управление громкостью: 1 - увеличить на 1, 0 - уменьшить на 1
* audio.loop(1); // 0 или 1. Может быть изменено во время воспроизведения для управления зацикливанием
* audio.setVolume(7); // установка уровня громкости от 0 до 7
* Файл 0.wav для "приветствия".
* Для звука мотора используется 1 файл: 1.wav.
* Звуковые файлы пишем в корень SD карты.
* pin D2 - управление звуком мотора: вкл/выкл.
* pin D3 - уменьшение громкости.
* УНЧ подключается к 9 порту (pin D9).
*
* / Рязань 2024, Лазарев Е.В. /
*/

//********************************************* BUTTONS ***********************************************

#include <GyverButton.h> // библиотека управления кнопкой управления
#define PIN_BUT1 2 // кнопка подключена к D2 (PIN --- КНОПКА --- GND)
#define PIN_BUT2 3 // кнопка подключена к D3 (PIN --- КНОПКА --- GND)
GButton butt1(PIN_BUT1, HIGH_PULL, NORM_OPEN); // инициализировать кнопку управления
GButton butt2(PIN_BUT2, HIGH_PULL, NORM_OPEN); // инициализировать кнопку управления
boolean butt1Sing = false; // флаг однократного нажатия на кнопку

const int ledPin = 8; // номер порта (D8), для подключения светодиода
int ledState = LOW; // этой переменной устанавливаем состояние светодиода

#include "SD.h"
#define SD_ChipSelectPin 10 // пин (D10) сигнала "CS"
#include "TMRpcm.h"
#include "SPI.h"
TMRpcm tmrpcm;

///////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// GO! //////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////

void setup(){

Serial.begin(9600);

//********************************************* BUTTONS ***********************************************
butt1.setDebounce(50); // настройка антидребезга (по умолчанию 80 мс)
butt1.setTimeout(2000); // настройка таймаута на удержание (по умолчанию 500 мс)
butt1.setClickTimeout(600); // настройка таймаута между кликами (по умолчанию 300 мс)

tmrpcm.speakerPin = 9; // выход на УНЧ, pin D9
Serial.begin(9600);
if (!SD.begin(SD_ChipSelectPin)) {
return;
} else {
//tmrpcm.volume(1);
tmrpcm.setVolume(5);
tmrpcm.play("0.wav");
delay(3000);
tmrpcm.loop(1);
// задаем режим выхода для порта, подключенного к светодиоду:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
}

}

void loop() {

//********************************************* BUTTONS ***********************************************
butt1.tick(); // постоянно опрашивать 1 кнопку управления
butt2.tick(); // постоянно опрашивать 2 кнопку управления

if (!butt1Sing) {
if (butt1.isClick()) { Serial.println("PLAY"); butt1Sing = true; tmrpcm.play("1.wav");}
}

if (butt1Sing) {
if (butt1.isClick()) { Serial.println("NO PLAY"); butt1Sing = false; tmrpcm.stopPlayback(); }
}

if (butt2.isClick()) { Serial.println("VOL-"); tmrpcm.volume(0); }

}