Требуется помощ по библиотеке TMRpcm
- Войдите на сайт для отправки комментариев
Втр, 25/03/2014 - 22:15
Добрый день! Использую библиотеку 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");
}
}
Hobigo, помню уже давал вам совет как запустить этот скетч :)
По сути нового вопроса: -тут по идее не должен влиять дребезг, так что остаётся подключение кнопки к плате. Если вы подаёте на вход HIGH, значит этот вход дополнительно нужно притянуть через внешний резистор к LOW. Можно обойтись без резистора поменяв логику. Подключите кнопку между выводом A0 и общим, но в сетапе поменяйте строчку инициализации на: pinMode (A0, INPUT_PULLUP); Соответственно и в условии поменять if (val==LOW)
Попробовал програмный путь решения проблеммы. Так ничего вообще не работает
#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"); } }Попробовал поставить резистор и все заработало! Спасибо вам большое!
Здравствуйте,помогите пожалуйста с кодом. Нужен такой алгоритм работы : при удержании кнопки 2 -играет мелодия 2 однократно. при удержании кнопки 3 играет мелодия 3 циклично.A у меня работает так :нажал-отпустил кнопку проиграл файл 2,вторая кнопка аналогично.
код:
01#include <SD.h>02#define SD_ChipSelectPin 1003#include <TMRpcm.h>0405TMRpcm tmrpcm;0607voidsetup()08{09pinMode(2,INPUT);10pinMode(3,INPUT);11tmrpcm.speakerPin = 9;12if(!SD.begin(SD_ChipSelectPin))13{14return;15}16tmrpcm.volume(1);17tmrpcm.play("start.wav");1819}202122voidloop()23{24if(digitalRead(2) == LOW)25tmrpcm.play("2.wav");26if(digitalRead(3) == LOW)27tmrpcm.play("3.wav");2829}вместо 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)
Большое вам спасибо!!!Мелодия воспроизводится циклично без проблем. А как сделать чтобы нажал и держишь кнопку 2 ,файл 2 проиграл один раз? Кстати на счёт библиотеки не было никаких проблем,собрал схему,прошил и сразу всё заработало.Единсвенный косяк в конце воспроизведения файла слышен мерзский скрип,но для моего устройства это не критично.
kolyanych26, что б один раз.. тут могут быть варианты. Например можно проиграть, и сразу застопорить loop, ждать пока кнопку отпустят..
if (digitalRead(2)==LOW) { tmrpcm.play("2.wav"); while (digitalRead(2)==LOW); }Спасибо за помощь,всё работает.
Помогите установить данную библиотеку , скачал там же https://github.com/TMRh20/TMRpcm/wiki почитал как влить в IDE . создалась папка в \Documents\Arduino\libraries\TMRpcm-master в ней вот это
туда сюда перекидывал эти файлы между этими папками для проверки ваш первый скейч проверяю , вылазят ошибки
примеры из этой библиотеки тоже выдают ошибки , 2 часа колдую с наладкой
Нужна не вся папка TMRpcm-master, а только папка TMRpcm, которая внутри неё. То есть, должно быть так: \Documents\Arduino\libraries\TMRpcm
Спасибо саработала, но странность есть что в версии 1,06 работает а в 1,6,3 немного ошибок есть нет там какого то файла , ругается в общем, папки у обоих версий для библиотек те же
D:\Insta\arduino-1.6.3\libraries\SD\src\utility перекинул вот этот Sd2Card.cpp фаил из 1,0,6 версии и ошибка исчезла , надеюсь я не нарушил работу 1,6,3 версии тем самым , теперь можно собрать схему и проверить
как отсюда сообщение удалить ,а то немного затупил
подкажите , а у вас тоже воспроизводит нормально на частоте только 22050 , моно, 8 бит, остальные частоты коряво звучат, но на частоте 22050 , присутствуют щелчки , заметил эти щелчки (помехи) тикают только на ниских басах мелодий , пробывал фильтры из кондёров потом к уселку подключаль пин колонки всё равно тикает , вы решили эту проблему если она есть у вас ? или это такая корявая библиотека ?
в общем тикает у меня приналичии звука в файле, пробывал уменьшить программно фаил с мелодией до 0 громкости и воспроизвести 0 этого треска нет , воспроизводилась тишина так как громкость в самом аудиофайле 0 была записана, но поднял даже на 20 -30 % громкость и записал на карту треск сразу появился , в чём это может быть проблема
приношу свои звининения не внимательно читал мануа по библиотеке
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
запутался в коде , необходимо поочерёдно воспроизводить мелодии по 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; }} }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Если вы нажали на кнопку -ставится флажок работы, он не даёт запустится повторно пока не проверятся условия что: ничего уже не играет и кнопка была отпущена.
Спасибо проверю вашу логику, соорудил из примеров в теме с кнопкой вот как то так , проверил работает
#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"); } }Подскажите,что не так-хочу ,чтоб по приходу символа проигрывался трек с флешки позаимствовал код,с флешки вавки играют,а вот при отсылке символа через терминал 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"); } } }А с вами можно пообщаться насчет библтотеки TMRpcm ??? Я ни как не могу запустить воспроизведение . Ни кто толком ничего не говорит, а у вас это уже пройденный этап. Мне нужна не большая помощь. Вот моя личка :topoludoma@rambler.ru.
Здраствуйте , подскажите пожалуста , что надо изменить в скейче чтобы проигрывалось один раз при нажатой кнопки .
Перед посдедней скобочкой } написать
cli(); while(true);
И се.
Перед посдедней скобочкой } написать
cli(); while(true);
И се.
От жеж экстремист :)
Мне особенно cli понравилось, шедеврально ! Дайте две !
Ачонетак? Можно и abort() написать, там то же самое, да православные против.
Когда ТС научится ПРАВИЛЬНО формулировать мысли и вставлять код, мошт и без cli() абойдемса.
Пробывал вставить перед последней скобкой cli(); while(true); , не одна кнопка не играет ,в чем может причина . Подскажите пожалуста
A до этого играла?
значит сначала
else return; а потом
cli(); while(true);
Играло , чето не помогает , пишит ошибка.
почему не воспроизводит одновременно 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:
?
Заранее спасибо!
Потому что внутри play() для single track mode сидит stopPlayback()