Проблемы с аналоговыми входами на Arduino Uno

barya
Offline
Зарегистрирован: 07.05.2013

Здравствуйте!

Делаем умную книжную полку. Смысл её состоит в том, что с фоторезистора идёт сигнал на аналоговый вход Arduino Uno. Если этот сигнал превышает какое-то пороговое значение (т.е. фоторезистор достаточно освещён), то с помощью Music Shield начинает воспроизводиться определённый трек.

Схема должна работать с пятью фоторезисторами. Т.е. должно быть задействовано 5 аналоговых входов. Но проблема в том, что корректро программа работает толко со входами А4 и А5. Написал программу для проверки (код см. ниже)

Как видите, в данном коде считываю сигнал со входа А4. Происходят два глюка.

Первая проблема - как только раскомменчиваю строки myplayer.attachAnalogOperation(A2,adjustVolume); или myplayer.attachAnalogOperation(A3,adjustVolume); работоспособность программы сразу же теряется
Вторая проблема - когда в коде делаю в строке vol_1 = analogRead(A4); считывание с A0 или A1 (соответственно, перетыкаю контакт на них) программа, кажется, работает, но судя про громкости звучания сигнал из этих входах идёт намного ниже.
В инете нашёл про порты А4 и А5 только такую отличительную особенность: I2C: 4 (SDA) и 5 (SCL)

Подскажите плз, как тут быть

#include <Fat16.h>
#include <Fat16Util.h>
#include <NewSPI.h>
#include <arduino.h>
#include "pins_config.h"
#include "vs10xx.h"
#include "newSDLib.h"
#include "MusicPlayer.h"
 
MusicPlayer myplayer;  //вводим переменную нашего myplayer плеера, которая имеет тип MusicPlayer. все функции для этого типа описаны в библиотеке MusicPlayer.h
 
int track_1=0;		//флаги воспроизведения треков №1 и №2. если соответствующий флаг равен 0, то данный трек в этоть момент не воспроизводится
 
int no_volume=0;	  //флаг тишины в эфире. если равен 0, то в данный момент ничего не играет. если равен 1, то что-то в данный момент воспроизводится
 
int koef=3;			//коэффициент освещённости. вводится в следствие различой освещённости в местах испытания
					  //если оч светло, то сделать около 1.5, если темнее (тусклый комнатный свет), то сделать 4-5
 
void setup()											//функция setup является обязательной и выполняется только один раз при запуске устройства (а значит и самой программы)
{
 
  Serial.begin(9600);									//начинаем вести журнал контроллера, чтоб если что посмотреть события на нём (Меню Сервис - Монитор порта)
 
  myplayer.keyDisable();								//отключаем управление кнопками на Music Shield
 
  myplayer.analogControlEnable();						//разрешаем Music Shield отслеживать сигнал на аналоговых портах A4 и A5
 
  myplayer.begin();									  //инициализируем начало работы на Music Sield
 
  myplayer.attachAnalogOperation(A0,adjustVolume);
  myplayer.attachAnalogOperation(A1,adjustVolume);	
  //myplayer.attachAnalogOperation(A2,adjustVolume);
  //myplayer.attachAnalogOperation(A3,adjustVolume);	
  myplayer.attachAnalogOperation(A5,adjustVolume);		//разрешаем нашей функции adjustVilume, которую мы опишем дальше,
  myplayer.attachAnalogOperation(A4,adjustVolume);		//использовать значения сигналов с аналоговых входов A4 и A5
 
  myplayer.setVolume(200);								//устанавливаем начальную громкость Music Shield равную 200.
														  //для справки, диапазон громкости Music Shield меняется от 0 до 255. чем меньше значение громкости, тем звучание громче.
														  //диапазон громкости, слышимый человеком примерно равен 0-155 (0 - самая большая громкость)
}
 
void loop()											  //функция loop - обязательная функция, которая выполняется постоянно раз за разом постоянно
{
  myplayer.setPlayMode(MODE_REPEAT_ONE);				  //ставим плеер в режим повторения одного трека
 
  myplayer.playSong("02.mp3");							//запускаем плеер (пока с помощью трека 02.mp3)
 
  if (track_1 == 1)									  //если флаг трэка №1 стал равен 1, то:
  {
	myplayer.playSong("01.mp3");						  //запускаем его на воспроизведение
	no_volume=1;										  //флаг тишины делаем равным 1
	track_1++;											//увеличиваем флаг трека №1, т.к. он уже запущен
  }
 
}
 
void adjustVolume()									  //описываем нашу функцию, которая запускается каждый момент, как только меняется значение на входах A4 или A5,
{														//а значит и освещённость какого-либо из фоторезистров
 
unsigned int vol_1 = analogRead(A4);					//вводим вспомогательныепеременные vol_1 и vol_2, из которых будет рассчитываться громкость звука (сами они не равны громкости)
														  //в vol_1 считываем значение со входа A4
 
vol_1=vol_1*koef;										//масштабируем это значение в соответствии с нашей общей освещённостью, используя коэффициент, заданный выше (обычно koef=2-3)
 
if (vol_1 >= 80)										//экспериментально установлено, что освещённость фоторезисторов меняется примерно от 2 до 80
  vol_1=79;											  //ограничим на всякий случай параметр vol_1 значением 79. итого 0 < vol_1 < 80.
														  //79 - значение максимально освещённого первого фоторезистора. при нём громкость равна 1 (самое громкое значение)
 
 
if ((track_1==0) && (vol_1 > 10) )					  //если в данный момент трек №1 не воспроизводится, но значение освещённсти первого фоторезистора
{														//превысило 10 (заданный на основе экспериментовнами порог), то пора запускать трек 01.mp3. для этого:
 
  myplayer.opStop();									//останавливаем всё, что воспроизводится на данный момент
 
  track_1=1;											//ставим значение флага трека №1 в значение, равное 1. т.е. как только цикл loop увидит, что мы поменяли здесь
														  //значение track_1 на 1 вместо 0, то он запускает трек 01.mp3 (см. выше по тексту кода)
}
 
if ((vol_1 <= 10) && (no_volume != 0))  //как только значения освещённостей обоих фоторезисторов стали ниже порогового, но флаг тишины no_volume
{														//всё ещё равен 1, то пора глушить музыку. для этого:
 
  myplayer.opStop();									//останавливаем воспроизведение на Music Shield
 
  track_1=0;											//ставим флаги обоих треков в значение, равное 0
 
  no_volume=0;										  //ставим флаг тишины в эфире в значение, равное 0
 
}
 
unsigned char volume=230;								//вводим переменную, которая равна громкости звука на Music Shield. Пока она равна 230 (т.е. тишина)
 
if (vol_1 > 10)										  //если освещённость первого фоторезистора выше порогового значения, т.е. играет первый трек,
  volume = (80-vol_1);								  //то и общую громкость рассчитываем из значения vol_1 для первого фоторезистора
 
myplayer.setVolume(volume);							  //устанавливаем громкость для нашего плеера
}

 

barya
Offline
Зарегистрирован: 07.05.2013

Так, я понял. Сам дурак)
Music Shield использует аналоговые входы А0-А3. Поэтому А4 и А5 как раз остаются свободными
Вопрос - можно ли как-либо освободить А0-А3 для собственного использования?

freearduino
Offline
Зарегистрирован: 21.04.2014

А у меня другая проблема, не работает комманда opStop.

Выдает ошибку:

Arduino: 1.5.8 (Windows 7), Board: "Arduino Uno"
 
Build options changed, rebuilding all
 
muz_rab_.cpp.o: In function `MusicPlayer::opStop()':
C:\Users\artur\Google Диск\Программы\arduino-1.5.8-windows\arduino-1.5.8\libraries\MusicPlayer_v1_7/MusicPlayer.h:100: undefined reference to `playingState'
C:\Users\artur\Google Диск\Программы\arduino-1.5.8-windows\arduino-1.5.8\libraries\MusicPlayer_v1_7/MusicPlayer.h:100: undefined reference to `playingState'
collect2: error: ld returned 1 exit status
Ошибка компиляции.
 
  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Код программы:
#include <TimerOne.h>
#include <QuadDisplay.h>
#define DISPLAY_PIN 4
float Tm = 59.59;
int chel;
//Для работы с Мюзик шилдом
#include <Fat16.h>
#include <Fat16Util.h>
#include <NewSPI.h>
#include <arduino.h>
#include "pins_config.h"
#include "vs10xx.h"
#include "newSDLib.h"
#include "MusicPlayer.h"
MusicPlayer myplayer;
void setup()
{
  Timer1.initialize(); // 1 секунда по умолчанию - то, что надо
  Timer1.attachInterrupt(Timer1_action);
  Serial.begin(9600);
  myplayer.begin();
  myplayer.keyDisable(); //отключаем встроенное управление воспроизведением
  myplayer.analogControlEnable(); //включаем возможность слушать аналоговые входы
  myplayer.digitalControlEnable(); //включаем возможность слушать цифровые входы
  myplayer.setVolume(1);
}

void Timer1_action()
{

  if (Tm == 0.00) {
    Tm = 00.00;
    displayDigits(DISPLAY_PIN, QD_0, QD_0, QD_0, QD_0);
    //delay(100);
    // displayClear(DISPLAY_PIN);

  } else {
    //Здесь проверяем и получаем дробную часть
    int drob = (Tm - (int)Tm) * 100;
    chel = (int)Tm;
    // Serial.println(chel);
    if (drob > 60) {
      drob = 60;
      Tm = chel + 0.60;
    }
    Tm = Tm - 00.01;
    // LED секунду горит, секунду - нет
    displayFloat(DISPLAY_PIN, Tm, 2);


  }

}

void loop()
{
  //myplayer.setPlayMode(MODE_SHUFFLE); //SHUFFLE
 // myplayer.creatPlaylist();
  // myplayer.opRepeatList();
 // myplayer.setPlayMode(MODE_REPEAT_ONE);
  //Для теста
   while(Tm <= 59 ){
     myplayer.playSong("7.mp3");
     delay(1000);
     myplayer.opStop();
  }
  //Звучат треки каждые 8 мин
  while (Tm <= 57 ) {
    myplayer.playSong("4.mp3");
  }
  while (Tm <= 56 ) {
    myplayer.playSong("3.mp3");
  }
  while (Tm <= 35 ) {
    //myplayer.playSong("Skrillex.mp3");
  }
  while (Tm <= 27 ) {
    //myplayer.playSong("Skrillex.mp3");
  }
  while (Tm <= 19 ) {
    //myplayer.playSong("Skrillex.mp3");
  }
  while (Tm <= 11 ) {
    //myplayer.playSong("Skrillex.mp3");
  }
  while (Tm <= 5 ) {
    myplayer.playSong("Skrillex.mp3");
  }
  while (Tm <= 0.01 ) {

  }
  if (Tm == 0.00) {

  }
}