Требуется помощ по библиотеке TMRpcm

Hobigo
Offline
Зарегистрирован: 14.01.2013

Добрый день! Использую библиотеку TMRpcm.h для воспроизведения звуковых файлов с карты. Все работает хорошо. Файлы воспроизводятся и все норм. Вопрос собственно, вот в чем. Мне нужно сделать так чтобы при нажатии на кнопку воспроизводился звуковой файл, а происходит следующее. Я нажимаю на кнопку и файл воспроизводится несколько раз, то 3 то 4 то 5. Короче непонятно почему так происходит и как это исправить. Надеюсь я все более менее понятно описал. Заранее спасибо за помощ!!

#include <SD.h>                      
#define SD_ChipSelectPin 4  
#include <TMRpcm.h>           
TMRpcm tmrpcm;   
int val = 0;
void setup(){
pinMode(A0, INPUT);
tmrpcm.speakerPin = 9; 
if (!SD.begin(SD_ChipSelectPin)) {  
  return;  
  }
 tmrpcm.volume(1);
}
void loop()
{  
val=digitalRead(A0);
if(val==HIGH)
{
if(tmrpcm.isPlaying()==0)  
tmrpcm.play("6.wav");
}
}
 
  

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Hobigo, помню уже давал вам совет как запустить этот скетч :)

По сути нового вопроса: -тут по идее не должен влиять дребезг, так что остаётся подключение кнопки к плате. Если вы подаёте на вход HIGH, значит этот вход дополнительно нужно притянуть через внешний резистор к LOW. Можно обойтись без резистора поменяв логику.  Подключите кнопку между выводом A0 и общим, но в сетапе поменяйте строчку инициализации на: pinMode (A0, INPUT_PULLUP); Соответственно и в условии поменять if (val==LOW)

Hobigo
Offline
Зарегистрирован: 14.01.2013

Попробовал програмный путь решения проблеммы. Так ничего вообще не работает



#include <SD.h> 
#define SD_ChipSelectPin 4 
#include <TMRpcm.h> 
TMRpcm tmrpcm; 
int val = 0;
void setup(){
pinMode(A0, INPUT_PULLUP);
tmrpcm.speakerPin = 9; 
if (!SD.begin(SD_ChipSelectPin)) { 
return; 
}
tmrpcm.volume(1);
}
void loop()
{ 
val=digitalRead(A0);
if(val==LOW)
{
if(tmrpcm.isPlaying()==0) 
tmrpcm.play("6.wav");
}
}

Попробовал поставить резистор и все заработало! Спасибо вам большое! 

 

kolyanych26
Offline
Зарегистрирован: 02.04.2015

Здравствуйте,помогите пожалуйста с кодом.                                                 Нужен такой алгоритм работы   : при удержании кнопки 2 -играет мелодия 2 однократно.             при удержании кнопки 3 играет мелодия 3 циклично.A у меня работает так :нажал-отпустил кнопку проиграл файл 2,вторая кнопка аналогично.

код:

01 #include <SD.h>
02 #define SD_ChipSelectPin 10
03 #include <TMRpcm.h>
04  
05 TMRpcm tmrpcm;
06  
07 void setup()
08 {  
09   pinMode(2,INPUT);
10    pinMode(3,INPUT); 
11   tmrpcm.speakerPin = 9;
12   if (!SD.begin(SD_ChipSelectPin))
13   {
14     return;
15   }
16  tmrpcm.volume(1);
17  tmrpcm.play("start.wav");
18  
19   }
20  
21  
22 void loop()
23 {
24   if (digitalRead(2) == LOW)
25   tmrpcm.play("2.wav");               
26   if (digitalRead(3) == LOW)
27  tmrpcm.play("3.wav");
28  
29 }


 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

вместо 26 и 27 строки:  while (digitalRead(3)==LOW) {tmrpcm.play("3.wav");}

Хотя может тоже не помочь, в той библе была какая-то особенность..а какая я уже забыл)

Вот эта особенность: http://arduino.ru/forum/apparatnye-voprosy/pomoshch-po-vosproizvedeniyu-wav-c-sd-karty#comment-60118

Нужно сначала проверить не воспроизводится ли что...

Вобщем 26 строка должна быть как-то так: if (digitalRead(3) == LOW && tmrpcm.isPlaying()==0)

kolyanych26
Offline
Зарегистрирован: 02.04.2015

Большое вам спасибо!!!Мелодия воспроизводится циклично без проблем.       А как сделать чтобы нажал и держишь кнопку 2 ,файл 2 проиграл один раз?                                                                                                              Кстати на счёт библиотеки не было никаких проблем,собрал схему,прошил и сразу всё заработало.Единсвенный косяк в конце воспроизведения файла слышен мерзский скрип,но для моего устройства это не критично.       

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kolyanych26, что б один раз.. тут могут быть варианты. Например можно проиграть, и сразу застопорить loop, ждать пока кнопку отпустят..

if (digitalRead(2)==LOW) {
tmrpcm.play("2.wav"); 
while (digitalRead(2)==LOW);
}

 

kolyanych26
Offline
Зарегистрирован: 02.04.2015

Спасибо за помощь,всё работает.

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

Помогите установить данную библиотеку , скачал там же https://github.com/TMRh20/TMRpcm/wiki почитал как влить в IDE . создалась папка в \Documents\Arduino\libraries\TMRpcm-master в ней вот это 

туда сюда перекидывал эти файлы между этими папками для проверки ваш первый скейч проверяю , вылазят ошибки 

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

примеры из этой  библиотеки тоже  выдают ошибки , 2 часа колдую с наладкой 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нужна не вся папка TMRpcm-master, а только папка TMRpcm, которая внутри неё. То есть, должно быть так: \Documents\Arduino\libraries\TMRpcm

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

Спасибо саработала, но странность есть что в версии 1,06 работает а в 1,6,3 немного ошибок есть нет там какого то файла , ругается в общем,  папки у обоих версий для библиотек те же 

CMEXIRK
Offline
Зарегистрирован: 03.04.2015
\libraries\SD\src\utility\Sd2Card.cpp:26:17: fatal error: SPI.h: No such file or directory
 #include <SPI.h>
                 ^
compilation terminated.
Ошибка компиляции.
вот эта ошибка в версии 1,6,3 хотя  библиотеку добавил как и в 1,0,6 и папка для обоих одна для  библий
 
CMEXIRK
Offline
Зарегистрирован: 03.04.2015

D:\Insta\arduino-1.6.3\libraries\SD\src\utility   перекинул вот этот Sd2Card.cpp фаил из 1,0,6 версии и ошибка исчезла , надеюсь я не нарушил работу 1,6,3 версии тем самым , теперь можно собрать схему и проверить 

kolyanych26
Offline
Зарегистрирован: 02.04.2015

как отсюда сообщение удалить ,а то немного затупил

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

подкажите , а у вас тоже воспроизводит нормально на частоте  только 22050 , моно, 8 бит, остальные частоты коряво звучат, но на частоте 22050 , присутствуют щелчки , заметил эти щелчки (помехи) тикают только на ниских басах мелодий , пробывал фильтры из кондёров потом к уселку подключаль пин колонки всё равно тикает , вы решили эту проблему если она есть у вас ? или это такая корявая библиотека ?

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

в общем тикает у меня приналичии звука в файле, пробывал уменьшить программно фаил с мелодией до 0 громкости и воспроизвести 0 этого треска нет , воспроизводилась тишина так как громкость в самом аудиофайле 0 была записана, но поднял даже на 20 -30 % громкость и записал на карту  треск сразу появился , в чём это может быть проблема 

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

приношу свои  звининения не  внимательно читал мануа по библиотеке 

 

1- Format SD card and make sure the setting as attached picture.
2- Convert your music to .WAV files and make sure the below:
-Samples Per second(Hz):16000   и НИЖЕ  - выше уже трещит в динамике
-Channel :Mono
- Bits Per Sample: 8

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

запутался в коде , необходимо поочерёдно воспроизводить мелодии по 1 разу после каждого нажатия кнопки 1 раз, а выходит что как буд то в хаотичном порядек они звучать инога даже одна и таже несколько раз при нажатии кнопки 

#include <SD.h> 
#define SD_ChipSelectPin 10
#include <TMRpcm.h> 
TMRpcm tmrpcm; 
int val = 0;
int z = 1;
void setup(){
pinMode(A0, INPUT_PULLUP);
tmrpcm.speakerPin = 9; 
if (!SD.begin(SD_ChipSelectPin)) { 
return; 
}
}
void loop()
{
val=digitalRead(A0);
if(z == 1){
if(val==LOW)
{
tmrpcm.play("1.wav");
z = 2;
}}
val=digitalRead(A0);
if( z == 2){
if(val==LOW)
{
tmrpcm.play("2.wav");
z = 3;
}}
val=digitalRead(A0);
if( z == 3){
if(val==LOW)
{
tmrpcm.play("4.wav");
z = 4;
}}
val=digitalRead(A0);
if( z == 4){
if(val==LOW){
tmrpcm.play("6.wav");
z = 1;
}}
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

CMEXIRK, да, это нормально, потому что нажав кнопку программа может успеть прокрутится десяток раз. Что бы этого избежать можно применить дополнительные ухищрения. Как-то так:

#include <SD.h> 
#define SD_ChipSelectPin 10
#include <TMRpcm.h> 
TMRpcm tmrpcm; 
boolean work = 0;
byte z = 1;
void setup(){
Serial.begin(9600);
pinMode(A0, INPUT_PULLUP);
tmrpcm.speakerPin = 9; 
if (!SD.begin(SD_ChipSelectPin)) { 
    return; }
}
void loop() {
if (digitalRead(A0)==LOW && work==0) { 
   work=1;
       switch (z) {
              case 1:
                     tmrpcm.play("1.wav"); break;    
              case 2:
                     tmrpcm.play("2.wav"); break;
              case 3:       
                     tmrpcm.play("3.wav"); break;
              case 4:
                     tmrpcm.play("4.wav"); break;
                  } //end switch-case 
           z==4? z=1:z++ ;
    }  //end if digitalRead
  if (tmrpcm.isPlaying()==0&&digitalRead(A0)==HIGH&&work==1) work=0;;               
} //end loop

Если вы нажали на кнопку -ставится флажок работы, он не даёт запустится повторно пока не проверятся условия что:  ничего уже не играет и кнопка была отпущена.

CMEXIRK
Offline
Зарегистрирован: 03.04.2015

Спасибо проверю вашу логику, соорудил из примеров в теме с кнопкой вот как то так , проверил работает 

#include <SD.h> 
#define SD_ChipSelectPin 10
#include <TMRpcm.h> 
TMRpcm tmrpcm; 
int regim = 1;

int val=0;
int flag =0;
void setup()
{
pinMode(A0, INPUT);
tmrpcm.speakerPin = 9; 
if (!SD.begin(SD_ChipSelectPin)) { 
return; 
}
}
void loop()
{
       val=digitalRead(A0);
       if(val==HIGH&&flag==0)
       {
          regim++;
          flag=1;
          if(regim>8)
          {
            regim=1;
           }
        }
      if (val==LOW&&flag==1)
          {
            flag=0;
          }
  if(regim==1)
    { if(val==LOW)
      tmrpcm.play("1.wav");
    }
    
  if(regim==2)
    {if(val==LOW)
      tmrpcm.play("2.wav");
    }
    
  if(regim==3)
    {if(val==LOW)
      tmrpcm.play("3.wav");
    }
 
  if(regim==4)
    {if(val==LOW)
      tmrpcm.play("4.wav");
    }
    
     if(regim==5)
    {if(val==LOW)
      tmrpcm.play("5.wav");
    }
    
       if(regim==6)
    {if(val==LOW)
      tmrpcm.play("6.wav");
    }
         if(regim==7)
    {if(val==LOW)
      tmrpcm.play("7.wav");
    }
         if(regim==8)
    {if(val==LOW)
      tmrpcm.play("8.wav");
    }
}

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Подскажите,что не так-хочу ,чтоб по приходу символа проигрывался трек с флешки позаимствовал код,с флешки вавки играют,а вот при отсылке символа через терминал ARDUINO IDE тишина

#include<SPI.h>;
#include <SD.h> //you will need this library
#include <TMRpcm.h> // and this one too…
#define SD_ChipSelectPin 4
TMRpcm tmrpcm; // Create an object
char mychar;
int powerPin = 5;
void setup(){
tmrpcm.speakerPin = 9; //11 na Mega, 9 na Uno, Nano…
Serial.begin(9600);
pinMode(powerPin, OUTPUT);
digitalWrite(powerPin, LOW);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
if (!SD.begin(SD_ChipSelectPin)) {
Serial.println("SD fail");
return;
}
digitalWrite(powerPin, HIGH);
tmrpcm.play("9.wav"); //File”sfx03.wav” will play on each Arduino start or reset
}
void loop(){
if(Serial.available()){
mychar = Serial.read();
if(mychar == 'q'){ //File will play only after pressing “q” key in “Serial Monitor”
tmrpcm.play("alloff.wav");
}
}
}

 

Vadim0312
Offline
Зарегистрирован: 27.11.2016

А с вами можно пообщаться насчет библтотеки TMRpcm ???  Я ни как  не могу запустить воспроизведение . Ни кто толком ничего не говорит, а у вас это уже пройденный этап. Мне нужна не большая помощь. Вот моя личка :topoludoma@rambler.ru.

lexa
Offline
Зарегистрирован: 14.03.2018

Здраствуйте , подскажите пожалуста , что надо изменить в скейче чтобы проигрывалось один раз при нажатой кнопки . 

#include <pcmConfig.h>
#include <pcmRF.h>
#include <TMRpcm.h>
 
#include <SD.h>             // необходимо включить SD библиотеку
#define SD_ChipSelectPin 4  // использование цифрового вывода 4 на arduino nano 328
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
 
TMRpcm tmrpcm;   // создать объект для использования в данном скетче
 
int SW1; 
int SW2;
int SW3;
int SW4;
int SW5;
int SW6;
 
void setup()
{
  pinMode(14,INPUT);  // Определить A0 как цифровой вход.
  pinMode(15,INPUT);  // Определить A1 как цифровой вход. 
  pinMode(16,INPUT);  // Определить A2 как цифровой вход.
  pinMode(17,INPUT);  // Определить A3 как цифровой вход.
   pinMode(18,INPUT);  // Определить A4 как цифровой вход.
    pinMode(19,INPUT);  // Определить A5 как цифровой вход.
 
  tmrpcm.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
 
  if (!SD.begin(SD_ChipSelectPin)) // проверить, есть ли карта, и может ли она быть инициализирована:
  {  
    return;                        // если нет, то ничего не делать
  }
  
  tmrpcm.volume(1);
  tmrpcm.play("1.wav"); // звуковой файл "1" будет проигрываться при каждом включении или перезагрузке arduino
}
 
void loop()
{  
  SW1=digitalRead(14); 
  SW2=digitalRead(15);
  SW3=digitalRead(16);
  SW4=digitalRead(17);
  SW5=digitalRead(18);
  SW6=digitalRead(19);
  
   if (SW1 == LOW) 
  { // если SW1 нажата, то воспроизвести файл "6.wav"
    tmrpcm.play("6.wav");
    
 
}
 
  
  else if(SW2 == LOW)
  { // если SW2 нажата, то воспроизвести файл "4.wav"
    tmrpcm.play("4.wav");
    
  } 
  else if(SW3 == LOW)
  { // если SW3 нажата, то воспроизвести файл "5.wav"
    tmrpcm.play("5.wav");
    
  } 
  else if(SW4 == LOW)
  { // если SW4 нажата, то воспроизвести файл "3.wav"
    tmrpcm.play("2.wav");
   
  }
  else if(SW5 == LOW)
  { // если SW5 нажата, то воспроизвести файл "3.wav"
      tmrpcm.play("1.wav"); 
  }
   else if(SW6 == LOW)
  { // если SW6 нажата, то воспроизвести файл "3.wav"
    if(tmrpcm.isPlaying()==0)  tmrpcm.play("6.wav");
  }
  
}
  
 
 
  
 
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Перед посдедней скобочкой } написать

cli(); while(true);

И се.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

Перед посдедней скобочкой } написать

cli(); while(true);

И се.

От жеж экстремист :)

Мне особенно cli понравилось, шедеврально ! Дайте две !

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ачонетак? Можно и abort() написать, там то же самое, да православные против. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Когда ТС научится ПРАВИЛЬНО формулировать мысли и вставлять код, мошт и без cli() абойдемса.

lexa
Offline
Зарегистрирован: 14.03.2018

Пробывал вставить перед последней скобкой cli(); while(true); , не одна кнопка не играет ,в чем может причина . Подскажите пожалуста 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

A до этого играла?

значит сначала 

else return; а потом 

cli(); while(true);

lexa
Offline
Зарегистрирован: 14.03.2018

Играло , чето не помогает , пишит ошибка. 

vovk69
Offline
Зарегистрирован: 23.02.2019

почему не воспроизводит одновременно 2 wav файла?  Arduino uno

/*
Схема подключения
* SD карточка подсоеденина к SPI шине:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/

#include <SD.h>
#define SD_ChipSelectPin 4
#include "TMRpcm.h"
#include "SPI.h"




TMRpcm wav;

void setup()
{
 
  wav.speakerPin = 9;
 
  Serial.begin(9600);
  
  pinMode(10, OUTPUT);
  

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }

  Serial.println("initialization done.");

  
wav.setVolume(5);
delay (500);

  wav.play("1.wav",1);
  delay (5000);
  wav.play("22.wav",0);
  delay (10000);
  wav.play("22.wav",0);
}

void loop()
{


}

при запуске 22.wav воспроизведение 1.wav прекращается...

настройки в pcmConfig.h:

/*
This library was intended to be a simple and user friendly wav audio player using standard
Arduino libraries, playing bare-bones standard format WAV files.

Many of the extra features have been added due to user request, and are enabled
optionally only to preserve the out of the box simplicity and performance initially
intended.

Code/Updates: https://github.com/TMRh20/TMRpcm
Wiki: https://github.com/TMRh20/TMRpcm/wiki
Blog: https://tmrh20.blogspot.com/

*/


#ifndef pcmConfig_h   // if x.h hasn't been included yet...
#define pcmConfig_h   //   #define this so the compiler knows it has been included

#include <Arduino.h>



/****************** GENERAL USER DEFINES *********************************
 See https://github.com/TMRh20/TMRpcm/wiki for info on usage

   Override the default size of the buffers (MAX 254). There are 2 buffers, so memory usage will be double this number
   Defaults to 64bytes for Uno etc. 254 for Mega etc. note: In multi mode there are 4 buffers*/
#define buffSize 128 //must be an even number

  /* Uncomment to run the SD card at full speed (half speed is default for standard SD lib)*/
// #define SD_FULLSPEED

  /* HANDLE_TAGS - This options allows proper playback of WAV files with embedded metadata*/
#define HANDLE_TAGS

  /*Ethernet shield support etc. The library outputs on both timer pins, 9 and 10 on Uno by default. Uncommenting this
    will disable output on the 2nd timer pin and should allow it to function with shields etc that use Uno pin 10 (TIMER1 COMPB).*/
 #define DISABLE_SPEAKER2

  /* Use 8-bit TIMER2 - If using an UNO, Nano, etc and need TIMER1 for other things*/
// #define USE_TIMER2

//#define debug
/****************** ADVANCED USER DEFINES ********************************
   See https://github.com/TMRh20/TMRpcm/wiki for info on usage

   /* Use the SDFAT library from http://code.google.com/p/sdfatlib/            */
//#define SDFAT

   /* MULTI Track mode currently allows playback of 2 tracks at once          */
#define ENABLE_MULTI  //Using separate pins on a single 16-bit timer

   /* Enables 16-bit samples, which can be used for stereo playback, or to produce a
	   pseudo 16-bit output.                                                   */
 #define STEREO_OR_16BIT

   /* In Normal single track mode, MODE2 will modify the behavior of STEREO or 16BIT output
        With MODE2 off, stereo tracks will be played using 2 pins, for 2 speakers in non-complimentary mode (pin to ground)
	    With MODE2 on, stereo tracks will be played using 4 pins, for 2 speakers in complimentary mode
	  In MULTI dual track mode, MODE2 will use a second timer for the second track.
	    With MODE2 off, each track will use a separate pin, but the same timer
	                                                                           */
#define MODE2  //Using separate 16-bit timers with up to 4 pins (Arduino Mega etc only)

   /* The library uses two different ramping methods to prevent popping sounds
      when PWM is enabled or disabled. This option is autodetected unless defined here*/
//#define rampMega

?

Заранее спасибо!

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Потому что внутри play() для single track mode сидит stopPlayback()