Например TDA7294

Форум РадиоКот • Просмотр темы - Параллельное выполнение команд на Arduino.
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 25, 2024 02:10:03

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 11:29:57 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 13, 2015 17:50:29
Сообщений: 56
Рейтинг сообщения: 0
Доброго времени суток!

Есть: платформа Arduino

MP3 модуль как в этой статье (подключён к Arduino так же как в статье (через резисторы 1кОм)):
https://lesson.iarduino.ru/page/urok-17 ... k-arduino/

Пироэлектрический инфракрасный (PIR) датчик движения вот такой:
http://arduino-diy.com/arduino-piroelek ... dvizheniya

Сверодиоды.

Задача: Сделать что-то вроде свето-музыки. Чтобы при срабатывании датчика движения начинали моргать светодиоды и с MP3 модуля воспроизводился записанный заранее трек.

Проблема: Необходимо, чтобы Arduino ОДНОВРЕМЕННО запускала трек и мигала диодами. Поиски в гугле привели меня к функции millis, которая позволяет производить несколько действий одновременно, однако все приводимые примеры идут без датчика, а просто по времени и я в силу неопытности не смог их переложить на свой случай.

Прикладываю свой (заведомо не правильный) код через delay. Подскажите пожалуйста, как данную задачу разрешить?
Схему приложить не получилось, на этом компьютере её негде нарисовать. Думаю по коду должно быть понятно что да как.

Спойлер#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

int led1 = 9;
int led2 = 10;

int brightness1 = 0;
int fadeAmount1 = 6;

int brightness2 = 255;
int fadeAmount2 = 8;

void setup () {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);

Serial.begin (9600);
mp3_set_serial (Serial);
delay (100);
mp3_set_volume (10);
}
void loop ()
{

if(analogRead(A0)>500)
{

mp3_play (2);

analogWrite(led1, brightness1);
fadeAmount1 = 10 + fadeAmount1;
brightness1 = brightness1 + fadeAmount1;
if (brightness1 == 0 || brightness1 == 255)
{
fadeAmount1 = -fadeAmount1 ;
delay(10);
}

analogWrite(led2, brightness2);
fadeAmount2 = 5 + fadeAmount2;
brightness2 = brightness2 + fadeAmount2;

if (brightness2 == 0 || brightness2 == 255)
{
fadeAmount2 = -fadeAmount2 ;
delay(30);
}
delay(30);
}

else
{
pinMode(led1, LOW);
pinMode(led2, LOW);
}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 13:31:44 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Сб сен 19, 2009 07:02:19
Сообщений: 378
Рейтинг сообщения: 1
А Вы посчитайте время отправки сообщения на воспроизведение этому модулю. Даже при программной реализации протокола обмена, получится "ОДНОВРЕМЕННО" ( по человеческим меркам ). :D Не бывает у МК ничего одновременного. По-крайней мере не у этого. Я, к счастью, с Arduino не знаком, но может там и есть что подобное RTOS. В любом случае используйте по-возможности "железо" в МК, это сильно Вас приблизит к "одновременно". По Вашему коду вижу вызов mp3_play( 2 ). Если у трека в начале есть время тишины, то оно Вам всё и портит. Подготовьте треки в соответствии с задачей ( отрежьте тишину в начале ), fade in, так это, кажется, называется.


Последний раз редактировалось shindax Пн мар 13, 2017 13:51:26, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 13:51:23 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18526
Рейтинг сообщения: 0
В чем конкретно тут проблема неодновременности ? Пробежал по диагонали код - вы вроде запускаете какой то трек и начинаете мигать светодиодами, насколько я понимаю эти паузы ничему не мешают или мешают ? Как должны светодиоды мигать ?

Основная идея "параллельного выполнения" - это делать что то по "флагам" либо не делать ничего на данном шаге, выполняя дальнейший код.

К примеру вы запустили трек, теперь вам нужно или использовать какую то функцию из той библиотеки чтобы понять играет трек или нет либо добавить в программу "флаг" запуска трека и присвоить ему TRUE в момент запуска (нужно не забыть по какому то событию или событиям его сбрасывать). Теперь, попав в код запуска трека, мы всегда можем проверить играет уже он или нет и если играет - просто пройти мимо.

Со светодиодами. К примеру нам нужно менять яркость светодиода каждую 0.1 сек без остановки программы.

unsigned long led_1_nexteventtime = 0; // в этой переменной храним время следующей обработки светодиода 1 (тоже как бы флаг)

setup()
...

loop()
...
if (analogRead(A0) > 500) {
// произошло событие, запускающее плавное включение светодиода
// вместо обработки прям тут с паузами взводим "флаг", помещая туда наше системное время (с таймера)
// в данном случае событие наступит уже в этой итерации loop, но можно сделать и отложенное включение, например через 0.1с: millis() + 100;
led_1_nexteventtime = millis();
}
...
// а вот тут обрабатываем одну итерацию по светодиоду 1 если пришло время и светодиод вообще нужно обрабатывать
// весь этот кусок кода просто игнорируется если светодиод не нужно обрабатывать или назначенное время обработки еще не настало
if ((millis() >= led_1_nexteventtime)&&(led_1_nexteventtime != 0)) {
if ((brightness1) < 245) brightness1 = brightness1 + 10; else brightness1 = 255;
analogWrite(led1, brightness1);
if (brightness1 == 255) {
// яркость достигла максимума, отключаем обработку события по светодиоду 1
led_1_nexteventtime = 0;
} else {
// яркость еще не достигла максимуму - назначаем сами себе время следующей обработки светодиода "текущее время + 100 мс"
led_1_nexteventtime = millis() + 100;
}
}

(не проверено, только в качестве объяснения)

Вам нужно найти и прочитать книжку или статью про конечные автоматы. На ПЛИС реально параллельно можно выполнять команды, но программировать их сложнее.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 14:15:59 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 14
Зарегистрирован: Сб сен 19, 2009 07:02:19
Сообщений: 378
Рейтинг сообщения: 1
Morroc писал(а):
...чтобы понять играет трек или нет...

У тех модулей, с которыми мне довелось поработать был отдельный вывод BUSY. ТС мало информации по модулю выдает.
Morroc писал(а):
...На ПЛИС реально параллельно можно выполнять команды, но программировать их сложнее.

IMHO перебор. ТС с Arduino "плавает", а Вы ему про ПЛИС. Задача - ни о чём.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 15:28:36 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 13, 2015 17:50:29
Сообщений: 56
Рейтинг сообщения: 0
В том то и дело, что я когда вбил код в таком виде, я ожидал что запустится трек и пока он проигрывается, будут мерцать диоды... но не тут то было. На сколько я понимаю: МК хочет воспроизвести трек (mp3_play (2);), но сразу же, практически в тот же момент переходит к дальнейшему коду и начинает мигать диодами. Т.е. другими словами как такового воспроизведения не получается, он просто перескакивает эту строчку.

По факту получается так: при срабатывании датчика начинают мигать диоды и мигают они до момента завершения движения перед датчиком. А вот потом (не всегда кстати) уже воспроизводится трек.

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

Я понимаю что точной одновременности добиться не получится... она и не требуется. Просто сейчас 2 действия происходят последовательно((

Я даже не знаю почему, но millis даётся мне с трудом))

Morroc
Возможно где-то эту задачу решить проще, но у меня уже есть всё "железо", нужно только программу допилить.

Есть 2 куска кода:

1:
Спойлерmp3_play (2);


2:
СпойлерanalogWrite(led1, brightness1);
fadeAmount1 = 10 + fadeAmount1;
brightness1 = brightness1 + fadeAmount1;
if (brightness1 == 0 || brightness1 == 255)
{
fadeAmount1 = -fadeAmount1 ;
delay(10);
}

analogWrite(led2, brightness2);
fadeAmount2 = 5 + fadeAmount2;
brightness2 = brightness2 + fadeAmount2;

if (brightness2 == 0 || brightness2 == 255)
{
fadeAmount2 = -fadeAmount2 ;
delay(30);
}
delay(30);
}

else
{
pinMode(led1, LOW);
pinMode(led2, LOW);
}


Они должны идти параллельно (одновременно). Пусть что-то отстаёт на пол секунды, это не критично, главное, что-бы и музыка играла и диоды мигали.


P.S. Пока писал это сообщение подумал вот о чём... может после строчки запуска трека сделать паузу в пол-секунды чтобы модуль инициализировался или типа того... однако ведь когда цикл дойдёт до конца примерно через 80 мс, ведь снова начнёт проигрываться трек, верно? И получится что диоды будут мигать (только тормозить из-за доп. задержки), а трек будет каждый раз проигрываться по пол секунды.

Morroc писал(а):
добавить в программу "флаг" запуска трека и присвоить ему TRUE в момент запуска (нужно не забыть по какому то событию или событиям его сбрасывать)

Вот-вот, нужно запустить трек и как-то его "задержать" во включённом состоянии, например на 10 секунд, а параллельно мигать диодами так, чтобы это не мешало воспроизведению.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 16:59:00 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18526
Рейтинг сообщения: 1
Так вы его не перезапускайте каждые 80 мс :)) По коду похоже так и есть. MP3 модуль вероятно работает как раз параллельно ардуине и получив команду будет проигрывать трек без участия мк если его не дергать. Посмотрите - у модуля нет выхода BUSY как shindax писал ? С ним было бы проще.

mp3_play (2); не должен идти параллельно т.к. не ардуино проигрывает музыку, он именно что должен выполнится раз и пока не закончится трек больше не вызываться

Есть у модуля Busy - 16я нога. Значит заводите ее на ногу ардуины. И делаете проверку перед вызовом функции модуля:

if (digitalRead(MP3BusyPin) == HIGH) mp3_play(2);

А если нужно прекратить проигрывание просто вызываете mp3_stop(); когда надо. В вашем случае действительно достаточно delay чтобы помигать, может если посложнее что то навернуть потребуется возня с параллельностью.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 17:28:28 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 19
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Сообщений: 119
Откуда: С-Пб
Рейтинг сообщения: 0
Чего-то не понял. А что вам мешает прокручивать трек, а время вкл/выкл светодиода формировать через таймер и обрабатывать через прерывание, хоть через 5 сек, хоть через 5 мсек ? И будет музыка и будет свет. :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 17:42:03 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18526
Рейтинг сообщения: 0
Этот MP3 модуль вообще самостоятельный, если кнопки подключить ему и мк не нужен, так что тут уже железячно все запараллелено.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 18:07:44 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 13, 2015 17:50:29
Сообщений: 56
Рейтинг сообщения: 0
Morroc

Нога Busy действительно есть... попробую завтра её задействовать.

Morroc писал(а):
MP3 модуль вероятно работает как раз параллельно ардуине и получив команду будет проигрывать трек без участия мк если его не дергать.


Я на это и рассчитывал... что МК подаст сигнал на модуль и займётся диодами, однако по коду получается, что МК вроде-бы подаёт сигнал на включение трека, переходит к миганию диодами, а потом, перейдя в начало цикла опять подаёт команду на МП3 модуль. Как бы сделать, чтобы команда подавалась только первый раз?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Пн мар 13, 2017 18:57:40 
Встал на лапы
Аватар пользователя

Карма: 1
Рейтинг сообщений: 19
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Сообщений: 119
Откуда: С-Пб
Рейтинг сообщения: 1
BuLLiT777 писал(а):
Morroc

Нога Busy действительно есть... попробую завтра её задействовать.

Morroc писал(а):
MP3 модуль вероятно работает как раз параллельно ардуине и получив команду будет проигрывать трек без участия мк если его не дергать.


Я на это и рассчитывал... что МК подаст сигнал на модуль и займётся диодами, однако по коду получается, что МК вроде-бы подаёт сигнал на включение трека, переходит к миганию диодами, а потом, перейдя в начало цикла опять подаёт команду на МП3 модуль. Как бы сделать, чтобы команда подавалась только первый раз?

Вам же уже предложили вариант:
if (digitalRead(MP3BusyPin) == HIGH) mp3_play(2);
Проверяйте сигнал занятости. Если уровень высокий - музыка играет, если низкий - то нет.
1. Проверили сигнал, если низкий-запускаем трек
2. Если уровень высокий, то зажигаем светодиод (если уже горит, то меняем яркость) и делаем с ним все что хотим, иначе гасим.
3. Возврат на п. 1.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Вт мар 14, 2017 07:57:33 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 13, 2015 17:50:29
Сообщений: 56
Рейтинг сообщения: 0
Сегодня проверил все идеи, высказанные в теме. Добился ПОЧТИ того, чего хотел. Использовал BusyPin.

Новый код под Спойлером.

Спойлер#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

int MP3BusyPin = 8;
int led1 = 9;
int led2 = 10;

int brightness1 = 0;
int fadeAmount1 = 6;

int brightness2 = 0;
int fadeAmount2 = 8;

void setup () {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(MP3BusyPin, INPUT);

Serial.begin (9600);
mp3_set_serial (Serial);
delay (100);
mp3_set_volume (10);
}
void loop ()
{

if(analogRead(A0)>500)
{
if (digitalRead(MP3BusyPin) == HIGH)
{
mp3_play(2);
delay (1000);
}
analogWrite(led1, brightness1);
fadeAmount1 = 10 + fadeAmount1;
brightness1 = brightness1 + fadeAmount1;
if (brightness1 == 0 || brightness1 == 255)
{
fadeAmount1 = -fadeAmount1 ;
delay(10);
}

analogWrite(led2, brightness2);
fadeAmount2 = 5 + fadeAmount2;
brightness2 = brightness2 + fadeAmount2;

if (brightness2 == 0 || brightness2 == 255)
{
fadeAmount2 = -fadeAmount2 ;
delay(30);
}
delay(30);
}

else
{
pinMode(led1, LOW);
pinMode(led2, LOW);
mp3_stop();
}
}


После танцев с бубном понял, что нужна задержка после команды запуска трека (такое ощущение, что МП3-модуль в это время что-то типа инициализируется). Величину задержки выбирал методом тыка. Как ни странно, если её уменьшить, то МП3-модуль тупит дольше.

Сейчас работа системы выглядит следующим образом:
При появлении движения перед датчиком, примерно через 2 секунды начинают мигать диоды с периодом 1 секунда. Затем ещё примерно через 2-3 секунды запускается трек и диоды мигают быстро, как и должны.
Это конечно не совсем то, что хотелось бы увидеть (снизить задержки примерно до 500 мс), но уже что-то. Буду мучать схему дальше, о результатах отпишусь.

Большое спасибо тем кто откликнулся и давал советы!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Вт мар 14, 2017 08:49:44 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18526
Рейтинг сообщения: 0
А если убрать все что связано с mp3 модулем - нет задержки ?

На всякий случай и тут поставьте проверку, вдруг _stop() тоже какое то время выполняется приличное.

if (digitalRead(MP3BusyPin) == LOW) {
mp3_stop();
}

Если модуль подтупливает тут наверное ничего не сделать, разве что другой найти. Я когда то ковырялся с модулем на vs1063 или vs1053 - вроде не тупило, но вот там надо самому через ардуину перегонять данные с SD в проигрыватель, само не играет.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Вт мар 14, 2017 09:50:12 
Открыл глаза
Аватар пользователя

Зарегистрирован: Пт ноя 13, 2015 17:50:29
Сообщений: 56
Рейтинг сообщения: 0
Morroc писал(а):
А если убрать все что связано с mp3 модулем - нет задержки ?


В смысле если оставить только диоды? Тогда задержки нет совсем.

Сейчас немного решил изменить концепцию... хочу, чтобы при срабатывании движения, трек проигрывался полностью и в это же время мигали диоды, т.е. трек проигрывается - диоды мигают, трек закончился - диоды сразу же гаснут.

Вот это код на данный момент оптимален. Задержка составляет около 2-ух секунд, всё работает синхронно))

Если у вас есть идеи как можно ещё уменьшить задержку (если это в принципе возможно), охотно выслушаю.

Ещё раз всем большое спасибо!!!

Спойлер#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

int MP3BusyPin = 8;
int led1 = 9;
int led2 = 10;

int brightness1 = 0;
int fadeAmount1 = 6;

int brightness2 = 0;
int fadeAmount2 = 8;

void setup () {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(MP3BusyPin, INPUT);

Serial.begin (9600);
mp3_set_serial (Serial);
delay (100);
mp3_set_volume (10);
}
void loop ()
{

if(analogRead(A0)>500)
{
if (digitalRead(MP3BusyPin) == HIGH)
{
mp3_play(2);
delay (2200);
}
}
if (digitalRead(MP3BusyPin) == LOW)
{
analogWrite(led1, brightness1);
fadeAmount1 = 9 + fadeAmount1;
brightness1 = brightness1 + fadeAmount1;
if (brightness1 == 0 || brightness1 == 255)
{
fadeAmount1 = -fadeAmount1 ;
delay(10);
}

analogWrite(led2, brightness2);
fadeAmount2 = 4 + fadeAmount2;
brightness2 = brightness2 + fadeAmount2;
if (brightness2 == 0 || brightness2 == 255)
{
fadeAmount2 = -fadeAmount2 ;
delay(30);
}
delay(30);
}
else
{
pinMode(led1, LOW);
pinMode(led2, LOW);
}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Вт мар 14, 2017 10:11:45 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
я, конечно, с темой ознакомился бегло, но рискну предложить нестандартное решение, если, конечно, вопрос энергоэффективности не стоит очень остро: запускайте свой плейер сразу после подачи питания, но делайте громкость равной нулю, а по датчику включайте громкость. тогда задержки не будет вообще никакой, даже если плейер тупит невыносимо.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Ср мар 15, 2017 15:41:06 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 141
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1384
Рейтинг сообщения: 0
Вкратце, грубо.
Как работает, к примеру, Windows. Для пользователя это выглядит, как одновременное выполнение программ. А на самом деле, каждая программа выполняется определенное время. Отработала задача свое время, система переключается на следующую задачу. И так по кругу. Время выполнения задач микро и миллисекунды и для пользователя это выглядит как одновременное выполнение всех задач.
Процессор, микроконтроллер не может выполнять параллельные процессы, только покомандные инструкции. И любая программа - это цикл. И не важно, что понимается под циклом. Линейный код, диспетчеры, RTOS.
Чтобы добиться псевдопараллельности выполнения программных модулей, нужно соблюдать некоторые правила.
Модульность. Программа состоит из программных модулей. Каждый модуль в свою очередь дробится на подзадачи, условиями, флагами, состояниями конечных автоматов, временными засечками (вытесняющие RTOS). То есть, каждый программный модуль в течении итерации основного цикла выполняет часть кода. Итерация основного цикла должна с запасом выполняться за системный тик, к примеру, 1 мс. Такой подход исключает долгие циклы (напоминаю, итерация основного цикла должна выполняться с запасом).


В вашей программе есть такие строки: delay (1000);
Во время выполнения таких задержек микроконтроллер выполняет единственную задачу, подсчет тактов.

Я занят, допишу позже. А пока ознакомьтесь с циклом статей. При таком подходе не важно, на каком языке вы пишете свои программы. На ассемблере, си, бейсике. Важно понять подход. Дробление процессов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Ср мар 15, 2017 16:25:09 
Друг Кота

Карма: 49
Рейтинг сообщений: 523
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 18526
Рейтинг сообщения: 0
ARV писал(а):
я, конечно, с темой ознакомился бегло, но рискну предложить нестандартное решение, если, конечно, вопрос энергоэффективности не стоит очень остро: запускайте свой плейер сразу после подачи питания, но делайте громкость равной нулю, а по датчику включайте громкость. тогда задержки не будет вообще никакой, даже если плейер тупит невыносимо.

Смторя что там за трек. Если сирена какая то и пофиг с какого места слушать и правда неплохой вариант :)) Но может и при повторе трека тоже тупить.

Demiurg писал(а):
В вашей программе есть такие строки: delay (1000);
Во время выполнения таких задержек микроконтроллер выполняет единственную задачу, подсчет тактов.

Тут в другом уже проблема. После подачи команды плеер первые 2 секунды молчит.

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Ср мар 15, 2017 16:38:50 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 141
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1384
Рейтинг сообщения: 0
Попробуйте другую флешку поставить. Посмотрите документацию на микросхему, может что то не учли.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Параллельное выполнение команд на Arduino.
СообщениеДобавлено: Чт мар 30, 2017 09:17:54 
Родился

Зарегистрирован: Чт мар 30, 2017 09:00:56
Сообщений: 4
Рейтинг сообщения: 0
BuLLiT777 писал(а):
Вот это код на данный момент оптимален. Задержка составляет около 2-ух секунд, всё работает синхронно))


Я второй день вожусь с Ардуиной и, соответственно, понемногу изучаю C++. При реализации своего учебного проекта натолкнулся на эту тему и ваш код, который реализует часть моей задачи (мигать лампочками во время проигрывания мп3).

Но, мне кажется, что у вас в нескольких местах ошибки

Код:
if (brightness1 == 0 || brightness1 == 255)

Вот эта строчка у вас не сработает, т.к. из-за того, что вы ввели поправку fadeAmount, то brightness с большой вероятностью пробежит значение 255 и побежит увеличиваться дальше, в итоге при первом срабатывании лампочки мигать будут, потом уже нет.

Код:
pinMode(led1, LOW);

Тут я могу ошибаться, но мне думается, что так вы led в конце проигрывания трека не выключите.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y