Проблемы с аналоговыми входами на Arduino Uno
- Войдите на сайт для отправки комментариев
Здравствуйте!
Делаем умную книжную полку. Смысл её состоит в том, что с фоторезистора идёт сигнал на аналоговый вход 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); //устанавливаем громкость для нашего плеера }
Так, я понял. Сам дурак)
Music Shield использует аналоговые входы А0-А3. Поэтому А4 и А5 как раз остаются свободными
Вопрос - можно ли как-либо освободить А0-А3 для собственного использования?
А у меня другая проблема, не работает комманда opStop.
Выдает ошибку: