Работа со звуком

Автор Deny, 20:54:54

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Deny

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

Deny

Один из интересных проектов по звуку, правда для самолетов, но все же.

https://www.rcgroups.com/forums/showpost.php?p=31088398




  [attach=1,msg6048]


#include <SD.h>                      // need to include the SD library
  #define SD_ChipSelectPin 4  //using digital pin 4 on arduino nano 328, can use other pins
  #include <TMRpcm.h>           //  also need to include this library...
  #include <SPI.h>
 
  TMRpcm tmrpcm;   // create an object for use in this sketch
 
  unsigned long time = 0;
  int numLoop = 0;
  int throttle = 0;
  int prevThrottle = 0;
  int currThrottle = 0;
  int playingSound = 0;
 
  //RC scale
  int rc_pin = 2;
  unsigned long duration;
  unsigned long prevDuration;
 
 
  void setup(){
    tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
    Serial.begin(9600);
    if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
      Serial.println("SD fail"); 
      return;   // don't do anything more if not
    }
    else{   
      Serial.println("SD ok");   
    }
    //PLay init file to tell sound version
    Serial.println("beginsound.wav");
    tmrpcm.play("beginsound.wav");
    while(tmrpcm.isPlaying()){
    delay(2000);
  };
    Serial.println("setup end");
  }
 
  void loop(){ 
 
    //Read throttel value
   ++numLoop;
    if (numLoop == 30000){
        noInterrupts();
        duration = pulseIn(rc_pin, HIGH);
        interrupts();
       
        numLoop = 0;
        Serial.println(currThrottle);
        //Set new throttle value
       
     if(duration <= 990){
        currThrottle = 0;
     };
     if((duration > 990) && (duration <= 1050)){
        currThrottle = 1;
     };
      if((duration > 1050) && (duration <= 1167)){
        currThrottle = 2;
      };
      if((duration > 1167) && (duration <= 1332)){
        currThrottle = 3;
      };
      if((duration > 1332) && (duration <= 1498)){
        currThrottle = 4;
      };
      if((duration > 1498) && (duration <= 1664)){
        currThrottle = 5;
      };
      if((duration > 1664) && (duration <= 1830)){
        currThrottle = 6;
      };
      if(duration > 1830){
        currThrottle = 7;
      };
   
      //If currThrottle != prevThrottle set start playing new file
      if(currThrottle != prevThrottle){
       
        if((currThrottle == 0) && (prevThrottle > 0)){
            tmrpcm.play("shut.wav");
             Serial.println("shut.wav)");
             while(tmrpcm.isPlaying()){}
             prevThrottle = currThrottle;
        }
        if(currThrottle == 1){
             if(currThrottle > prevThrottle){
             tmrpcm.play("start.wav");
             Serial.println("start.wav");
             while(tmrpcm.isPlaying()){}
             }
             playingSound = 1;
             prevThrottle = currThrottle;
        }
        if(currThrottle == 2){
          tmrpcm.play("1.wav");
          Serial.println("1.wav");
          prevThrottle = currThrottle;
          playingSound = 1;
        }
        if(currThrottle == 3){
          tmrpcm.play("2.wav");
          Serial.println("2.wav");
          prevThrottle = currThrottle;
          playingSound = 2;
        }
        if(currThrottle == 4){
          tmrpcm.play("3.wav");
          Serial.println("3.wav");
          prevThrottle = currThrottle;
          playingSound = 3;
        }
         if(currThrottle == 5){
          tmrpcm.play("4.wav");
          Serial.println("4.wav");
          prevThrottle = currThrottle;
          playingSound = 4;
        }
         if(currThrottle == 6){
          tmrpcm.play("5.wav");
          Serial.println("5.wav");
          prevThrottle = currThrottle;
          playingSound = 5;
         }
         if(currThrottle == 7){
          tmrpcm.play("6.wav");
          Serial.println("6.wav");
          prevThrottle = currThrottle;
          playingSound = 6;
        }
    }
    // Serial.println(tmrpcm.isPlaying());
     if((currThrottle = prevThrottle) && (tmrpcm.isPlaying() == 0)){
   
        if(playingSound == 1){
          tmrpcm.play("1.wav");
          Serial.println("again 1.wav");
          prevThrottle = currThrottle;
        }
        if(playingSound == 2){
          tmrpcm.play("2.wav");
          Serial.println("again 2.wav");
          prevThrottle = currThrottle;
        }
        if(playingSound == 3){
          tmrpcm.play("3.wav");
          Serial.println("again 3.wav");
          prevThrottle = currThrottle;
        }
         if(playingSound == 4){
          tmrpcm.play("4.wav");
          Serial.println("again 4.wav");
          prevThrottle = currThrottle;
         }
         if(playingSound == 5){
          tmrpcm.play("5.wav");
          Serial.println("again 5.wav");
          prevThrottle = currThrottle;
         }
         if(playingSound == 6){
          tmrpcm.play("6.wav");
          Serial.println("again 6.wav");
          prevThrottle = currThrottle;
        }
     }
  }
}


Мной протестировано, все работает! тут как раз используется картридер, недостаток нужен еще усилитель звука. в Mp3  плеере он уже есть! Далее использование нескольких библиотек, иногда  конфликт с IRLIB2
​Не говорите, если это не изменит тишину к лучшему.

Sergevk

Из того что я видел по звуку (включая австралийцев - http://rctanksaustralia.com/guides/index.php?title=Asp2) для каждого звукового модуля идет отдельный динамик. Т.е. как я понимаю нельза подключить один динамик к 2-каналом - что нибудь может сгореть

Deny

ВОт интересная тема про звук, будет возможность прочитай http://cyber-place.ru/showthread.php?t=274.

Насчет сгорит, не сгорит, это я тебе говорю как  радиоинженер по первому образованию, заморочка только в том  как подключить динамик, а австралийцы намерено делали стереозвучание и не заморачивались)))) Могут только появляться не желательные  "хрипы" при накладке частот. Кстати у Люка на плате такое периодически наблюдается((( Когда работает звук мотора, выстрел иногда хрипит! Сергей если будет возможность приезжай завтра (пятница)  ко мне, часиков до 17 спокойно, без никого можем повозиться и что-нибудь потестить!
​Не говорите, если это не изменит тишину к лучшему.

Sergevk

Не, завтра никак не могу - работы море

Deny

Цитата: Sergevk;6054Не, завтра никак не могу - работы море
Жаль! Следующий раз могу только в среду 17-го (не включая встречу в воскресение) , работа с субботы начинается)))
​Не говорите, если это не изменит тишину к лучшему.

Deny

Да забыл указать к первому посту, что большой минус картридера - это много пинов забирает у ардуино - 6 шт, а мп3 плеер  - 4 шт, хотя можно обойтись и тремя.
​Не говорите, если это не изменит тишину к лучшему.

Deny

Сергей, я сделал свет и звук для пушки
​Не говорите, если это не изменит тишину к лучшему.

Deny

Теперь продолжим тему работы со звуком!


1. Плата ардуино мега https://ru.aliexpress.com/item/Mega-2560-CH340G-ATmega2560-16AU-Compatible-for-Arduino-Mega-2560/32517341214.html?ws_ab_test=searchweb0_0,searchweb201602_0_10152_10151_10065_10344_10068_10342_10343_10340_10341_10543_10084_10083_10307_10615_10301_10059_10314_10534_100031_10604_10103_10607_10606_10142_10125,searchweb201603_0,ppcSwitch_0&algo_expid=1f495e13-101f-4a0e-9f3a-56836ac5c9ba-8&algo_pvid=1f495e13-101f-4a0e-9f3a-56836ac5c9ba&priceBeautifyAB=0
2. Шилд с SDcard  для ардуино меге https://amperkot.ru/products/plata_rasshireniya_dlya_arduino_mega_s_sdregistratorom/24261961.html
3. Mp3  модуль https://ru.aliexpress.com/item/1Pcs-Mini-MP3-Player-Module-with-Simplified-Output-Speaker-MP3-TF-16P-For-arduino-UNO/32655318932.html?spm=a2g0v.search0104.3.1.IcS5lx&ws_ab_test=searchweb0_0,searchweb201602_3_10152_10151_10065_10344_10068_10342_10343_10340_10341_10543_10084_10083_10307_10615_10301_10059_10314_10534_100031_10604_10103_10607_10606_10142_10125,searchweb201603_32,ppcSwitch_3&algo_expid=fbea7824-470e-43f7-ba53-1561c1035508-0&algo_pvid=fbea7824-470e-43f7-ba53-1561c1035508&transAbTest=ae803_5&priceBeautifyAB=0
4. Усилитель ардуино для SD http://www.siletnews.com/double-amplifier-power-does-not-double-the-volume.html
5. Два динамика от фирмы Тайген
6. Приемо-передачик флай скай (передача сигнала по  IBUS)

[attach=1,msg6060]  [attach=2,msg6060]  [attach=3,msg6060]  [attach=4,msg6060]  [attach=5,msg6060]  [attach=6,msg6060]  [attach=7,msg6060]  [attach=8,msg6060] 

мной было протестировано:
1. SD-card (подключение к ардуино, воспроизведение звука)
2. MP3  плеер (подключение к ардуино, воспроизведение звука)
3. Работа SD  and MP3
Тест выполнен успешно.
Минус- использование доп усилителя и два динамика

Собственно код

#include <SD.h> // need to include the SD library
#define SD_ChipSelectPin 10 //using digital pin 4 on arduino nano 328, can use other pins
#include <TMRpcm.h> // also need to include this library...
#include <SPI.h>
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include "FlySkyIBus.h"
#include <Servo.h>//Using servo library to control ESC
Servo esc; //Creating a servo class with name as esc
Servo esc1;
SoftwareSerial mySerial(5, 14); // RX, TX
TMRpcm tmrpcm; // create an object for use in this sketch
int ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, pwm_R, pwm_L; //каналы


unsigned long time = 0;
int numLoop = 0;
int throttle = 0;
int prevThrottle = 0;
int currThrottle = 0;
int playingSound = 0;


//RC scale
int rc_pin = 2;
unsigned long duration;
unsigned long prevDuration;
unsigned long duration2;


void setup() {
  tmrpcm.speakerPin = 46; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
  Serial.begin(9600);
  if (!SD.begin(SD_ChipSelectPin)) { // see if the card is present and can be initialized:
    Serial.println("SD fail");
    return; // don't do anything more if not
  }
  else {
    Serial.println("SD ok");
  }
  //PLay init file to tell sound version
  Serial.println("beginsound.wav");
  tmrpcm.volume(4); //Как видно выше из функций - это громкость.
  tmrpcm.play("start.wav");
  while (tmrpcm.isPlaying()) {
    delay(2000);
  };
  Serial.println("setup end");
  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  mp3_set_volume (25);       //Громкость работы звукового модуля от 0 до 30
  IBus.begin(Serial1);
  esc.attach(23); //Specify the esc signal pin,Here as D8
  esc.writeMicroseconds(1000); //initialize the signal to 1000
  esc1.attach(22);
  esc1.writeMicroseconds(1000); //initialize the signal to 1000
}


void loop() {


  IBus.loop();


  ch1 = IBus.readChannel(0);
  ch2 = IBus.readChannel(1);
  ch3 = IBus.readChannel(2);
  ch4 = IBus.readChannel(3);
  ch5 = IBus.readChannel(4);
  ch6 = IBus.readChannel(5);
  ch7 = IBus.readChannel(6);
  ch8 = IBus.readChannel(7);
  ch9 = IBus.readChannel(8);
  ch10 = IBus.readChannel(9);
  Serial.print("ch1 - ");
      Serial.print(ch1);
      Serial.print("  ");
      Serial.print("ch2 - ");
      Serial.print( ch2);
      Serial.print("  ");
      Serial.print("ch3 - ");
      Serial.print(ch3);
      Serial.print("  ");
      Serial.print("ch4 - ");
      Serial.println(ch4);


  //Read throttel value
  ++numLoop;
//  if (numLoop == 30000) {
//    //noInterrupts();
//    duration = IBus.readChannel(1);
//   interrupts();


    numLoop = 0;
    Serial.println(currThrottle);
    //Set new throttle value
duration = IBus.readChannel(1);
    if (duration <= 990) {
      currThrottle = 0;
    };
    if ((duration > 990) && (duration <= 1050)) {
      currThrottle = 1;
    };
    if ((duration > 1050) && (duration <= 1167)) {
      currThrottle = 2;
    };
    if ((duration > 1167) && (duration <= 1332)) {
      currThrottle = 3;
    };
    if ((duration > 1332) && (duration <= 1498)) {
      currThrottle = 4;
    };
    if ((duration > 1498) && (duration <= 1664)) {
      currThrottle = 5;
    };
    if ((duration > 1664) && (duration <= 1830)) {
      currThrottle = 6;
    };
    if (duration > 1830) {
      currThrottle = 7;
    };
duration2 = IBus.readChannel(4);
if (duration2 > 1830)
{
  mp3_play (4);
}
    //If currThrottle != prevThrottle set start playing new file
    if (currThrottle != prevThrottle) {


      if ((currThrottle == 0) && (prevThrottle > 0)) {
        tmrpcm.play("shut.wav");
        Serial.println("shut.wav)");
        while (tmrpcm.isPlaying()) {}
        prevThrottle = currThrottle;
      }
      if (currThrottle == 1) {
        if (currThrottle > prevThrottle) {
          tmrpcm.play("start.wav");
          Serial.println("start.wav");
          while (tmrpcm.isPlaying()) {}
        }
        playingSound = 1;
        prevThrottle = currThrottle;
      }
      if (currThrottle == 2) {
        tmrpcm.play("1.wav");
        Serial.println("1.wav");
        prevThrottle = currThrottle;
        playingSound = 1;
      }
      if (currThrottle == 3) {
        tmrpcm.play("2.wav");
        Serial.println("2.wav");
        prevThrottle = currThrottle;
        playingSound = 2;
      }
      if (currThrottle == 4) {
        tmrpcm.play("3.wav");
        Serial.println("3.wav");
        prevThrottle = currThrottle;
        playingSound = 3;
      }
      if (currThrottle == 5) {
        tmrpcm.play("4.wav");
        Serial.println("4.wav");
        prevThrottle = currThrottle;
        playingSound = 4;
      }
      if (currThrottle == 6) {
        tmrpcm.play("5.wav");
        Serial.println("5.wav");
        prevThrottle = currThrottle;
        playingSound = 5;
      }
      if (currThrottle == 7) {
        tmrpcm.play("6.wav");
        Serial.println("6.wav");
        prevThrottle = currThrottle;
        playingSound = 6;
      }
    }
    // Serial.println(tmrpcm.isPlaying());
    if ((currThrottle = prevThrottle) && (tmrpcm.isPlaying() == 0)) {


      if (playingSound == 1) {
        tmrpcm.play("1.wav");
        Serial.println("again 1.wav");
        prevThrottle = currThrottle;
      }
      if (playingSound == 2) {
        tmrpcm.play("2.wav");
        Serial.println("again 2.wav");
        prevThrottle = currThrottle;
      }
      if (playingSound == 3) {
        tmrpcm.play("3.wav");
        Serial.println("again 3.wav");
        prevThrottle = currThrottle;
      }
      if (playingSound == 4) {
        tmrpcm.play("4.wav");
        Serial.println("again 4.wav");
        prevThrottle = currThrottle;
      }
      if (playingSound == 5) {
        tmrpcm.play("5.wav");
        Serial.println("again 5.wav");
        prevThrottle = currThrottle;
      }
      if (playingSound == 6) {
        tmrpcm.play("6.wav");
        Serial.println("again 6.wav");
        prevThrottle = currThrottle;
      }
    }
  }
[\code]
​Не говорите, если это не изменит тишину к лучшему.

Deny

Нашел интересную тему по  RC   звуку http://www.parkflyer.ru/ru/blogs/view_entry/9979/ , хочу сделать тестовую модель! мне кажется это интересным
​Не говорите, если это не изменит тишину к лучшему.