Форум ModelldepO  

Вернуться   Форум ModelldepO > Моделизм > Электрика и DCC > Arduino
Ответ
 
Опции темы Опции просмотра
Старый 26.04.2016, 21:00   #51
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Понял, спасибо. Про последовательный порт - отличная затея.

Для себя остановился на "шилд"-варианте интерфейса локонет + правки 3-х констант в библиотеке, чтобы выводы под локонет отдать. Плюс питание 5В(или более) на разъеме под отвертку, плюс еще усилитель НЧ надо приделать )) громкостью управлять на звуковом модуле
shalex вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 26.04.2016, 21:16   #52
Alexmit
Местный
 
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,827
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 971
Поблагодарили 2,639 раз(а) в 1,561 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (2665)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
плюс еще усилитель НЧ надо приделать
Компьютерные колонки.

Цитата:
Сообщение от shalex Посмотреть сообщение
громкостью управлять на звуковом модуле
MP3player.setVolume(80,80);
MP3player.setVolume(val, val);
Я так понимаю, там стерео выход.
Alexmit вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 14.05.2016, 21:05   #53
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Попробовал модуль из первого сообщения...

В итоге, сделал вывод, что этот девайс вполне годится для фоновых звуков.

Также высянил, что можно ардуиновские выводы D7,D8, которые использую для интерфейса Loconet, у этого модуля отобрать и переназначить на другие свободные выводы (поправить код в библиотеке).

Пока травится плата шилда для Loconet, задумался - а какой же функционал нужен декодеру?
Проблема осложняется тем, что вроде как в Локонет нельзя передать какое то число библиотечными способами, зато можно дергать "стрелочные" адреса, передавая через них 1 или 0, по сути.

Основные соображения:
1. Девайс "одноголосый", т.е. может отвечать только за один источник звука, в идеале.
2. Пусть в локонет нельзя передать число, зато можно получать сигналы макетного времени.
3. Фоновые звуки привязать ко времени, например, разделить сутки по часам и составить карту случайных звуков для каждого часа (например, 24часа х 20 звуков на один час, примерно 480 переменных CV(!), возможно стоит подумать о диаппазонах)
3. Думаю точно нужен один "стрелочный" адрес на команду SoundOn, SoundOff ))
4. Еще пара-тройка для звуков "прерываний", которые могу прервать фоновый звук, воспроизвести что-то и снова продолжить фоновый звук. (соотв. тоже несколько CV со списком случайных звуков)
5. Все звуковые карты/списки должны редактироваться через CV.
6. Несколько стрелочных адресов отдать на регулировку громкости. например, 5 уровней.

Комментарии категорически приветствуются!

Последний раз редактировалось shalex; 15.05.2016 в 17:47.
shalex вне форума  
Вверх
3 пользователя(ей) сказали cпасибо:
Старый 15.05.2016, 01:08   #54
pandrey
Местный
 
Аватар для pandrey
 
Регистрация: 12.01.2010
Адрес: Геленджик
Сообщений: 2,772
Сказал(а) 'не согласен(а)'!: 28
Сказали 'не согласен'! 10 раз(а) в 9 сообщениях
Сказал(а) спасибо: 7,160
Поблагодарили 5,541 раз(а) в 1,368 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (5581)
По умолчанию

Вариант, описанный в третьем пункте, прикольный, но все ж таки, вариант с выбором конкретного звука, конкретной командой (стрелочной, либо функциональной для локомотивного звукового декодера) мне кажется более универсальным. Тот же РокРаил может в любых вариациях воспроизводить звуки. Так же особо актуально при реализации посредством РокРайла объявлений поездов на вокзале. (Что то есть сомнения, что в РокРайле уже реализована штатными инструментами данная фишка. )
pandrey на форуме  
Вверх
Пользователь сказал cпасибо:
Старый 15.05.2016, 09:06   #55
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,693
Сказал(а) 'не согласен(а)'!: 10
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,942
Поблагодарили 4,844 раз(а) в 1,822 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (5127)
По умолчанию

Цитата:
Сообщение от pandrey Посмотреть сообщение
Что то есть сомнения, что в РокРайле уже реализована штатными инструментами данная фишка.
Андрей, если тебя устроит качество голосового воспроизведения текста, то вполне реально сделать, что ПК будет объявлять прибытие и отправление поезда, в зависимости от его ID и маршрута следования, но это не есть гуд. Можно также запускать воспроизведение того или иного аудиофайла, через экшены или через скрипты, по различным условиям. Однако хочется получить локализацию звука в конкретном месте. С этим справиться только установленное в этом месте некое аудио-устройство(декодер, плеер и т.д).
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!
laba вне форума  
Вверх
Старый 15.05.2016, 12:39   #56
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Спасибо за комментарии!

Насчет источников звуков солидарен с laba, т.к. хочется попробовать сделать адресный звук.

Из новостей...

Добавлю еще одну CV - для режима моно/стерео )))

Вчера выяснилось, что памяти Uno не хватает для организации карты звуков с настройкой через CV.
Придется звуковые карты делать через файлы на SD-карте.

Размышления:
Поскольку у меня макет из 2-х модулей (длина макета поряка 240см) , то задумался насчет фоновых звуков... может имеет смысл сделать по звуковому декодеру на каждый модуль для извлечения звуков?

По хорошему, намечается столько звуковых декодеров:
1. Фоновые звуки, левый модуль
2. Фоновые звуки, правый модуль
3. Вокзал
4. Депо
5. Погодные явления (ближе к центру)
6. Фабрика

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

Задумался, как реализовать "пассажирский № ххх прибывает к х платформе" и почти тоже самое для "прибыл". Два поезда и три платформы, итого 6 треков.

А объявления для маневровых можно "навесить" на декодер фабрики - там все равно нечленораздельные звуки )))

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

И еще смущает размер модуля и необходимость под каждый ставить усилитель НЧ.

Последний раз редактировалось shalex; 15.05.2016 в 16:09.
shalex вне форума  
Вверх
Старый 15.05.2016, 16:08   #57
Alexmit
Местный
 
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,827
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 971
Поблагодарили 2,639 раз(а) в 1,561 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (2665)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
И сразу возник вопрос - как моделировать погодные явления типа дождя и грозы. По-хорошему, звуки цикад и пение птиц надо отключать во время грозы, причем сразу на двух модулях сразу.
А может сразу файл на сутки.

Цитата:
Сообщение от shalex Посмотреть сообщение
Вчера выяснилось, что памяти Uno не хватает для организации карты звуков с настройкой через CV.
Придется звуковые карты делать через файлы на SD-карте.
Скажу честно, вот этой фразы не понял.
Но перечитывая тему увидел своё сообщение #45 и возникла мысль задействовать протокол LAN, т.к. там можно даже текст передать (в поле ID).
Т.е. имя стрелки = имени файла, а положение = вкл. и выкл.
Alexmit вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 15.05.2016, 16:13   #58
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Цитата:
Сообщение от Alexmit Посмотреть сообщение
А может сразу файл на сутки.
Лучше по часам - это ускорит навигацию )) Имя файла со списком треков соотв номеру часа. например, для 0 часов - "000", для 1-го часа - "001" и т.д. до 023.

Плюс еще жесткие требования к названиям файлов - названия одинак.длины по той же причине. Названия от "0000.mp3" до "9999.mp3".


Цитата:
Сообщение от Alexmit Посмотреть сообщение
Скажу честно, вот этой фразы не понял.
Но перечитывая тему увидел своё сообщение #45 и возникла мысль задействовать протокол LAN, т.к. там можно даже текст передать (в поле ID).
Т.е. имя стрелки = имени файла, а положение = вкл. и выкл.
Пока будет "одна стрелка = один прерывающий звук". Прерывающий в смысле для фоновых звуков, например, объявления на вокзале.

Плюс есть возможность тоже задавать пулы треков для случайного выбора, в том числе и для "прерывающих" звуков. Названия файлов со списками треков для "прерывающих" звуков нумерются от "100" до "119", по кол-ву стрелочных адресов(пока 20 шт) под вызов "прерывающих" звуков.

Последний раз редактировалось shalex; 15.05.2016 в 21:41.
shalex вне форума  
Вверх
Старый 15.05.2016, 16:23   #59
Alexmit
Местный
 
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,827
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 971
Поблагодарили 2,639 раз(а) в 1,561 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (2665)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
И еще смущает размер модуля и необходимость под каждый ставить усилитель НЧ.
Берите колонки и не мучайтесь динамики же тоже нужны. (как пример DEFENDER SPK 33)
Alexmit вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 15.05.2016, 16:31   #60
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Если можете - пожалуйста, подскажите схему микшера, подходящего для нескольких таких звуковых модулей?
shalex вне форума  
Вверх
Старый 15.05.2016, 17:04   #61
Alexmit
Местный
 
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,827
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 971
Поблагодарили 2,639 раз(а) в 1,561 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (2665)
По умолчанию

http://radiokot.ru/circuit/audio/other/07/
Alexmit вне форума  
Вверх
2 пользователя(ей) сказали cпасибо:
Старый 15.05.2016, 22:10   #62
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Получилось как то так:






схема шилда есть интерфейс от Филиппа Гатова:

shalex вне форума  
Вверх
3 пользователя(ей) сказали cпасибо:
Старый 16.05.2016, 08:18   #63
pandrey
Местный
 
Аватар для pandrey
 
Регистрация: 12.01.2010
Адрес: Геленджик
Сообщений: 2,772
Сказал(а) 'не согласен(а)'!: 28
Сказали 'не согласен'! 10 раз(а) в 9 сообщениях
Сказал(а) спасибо: 7,160
Поблагодарили 5,541 раз(а) в 1,368 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (5581)
По умолчанию

Цитата:
Сообщение от shalex Посмотреть сообщение
Получилось как то так:
Работает?
pandrey на форуме  
Вверх
Старый 16.05.2016, 08:43   #64
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Фоновые треки проигрывает, осталось проверить локонет и звуки по прерываниям )))
shalex вне форума  
Вверх
2 пользователя(ей) сказали cпасибо:
Старый 16.05.2016, 14:19   #65
BR95009
Brocken-Meister
 
Аватар для BR95009
 
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,603
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,012
Поблагодарили 9,313 раз(а) в 3,305 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (9354)
По умолчанию

Цитата:
Сообщение от Alexmit Посмотреть сообщение
http://radiokot.ru/circuit/audio/other/07/
Огромное спасибо. Искал.
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка.
Московский Модуль H0-присоединяйтесь!
BR95009 вне форума  
Вверх
Старый 16.05.2016, 18:18   #66
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

В-общем, работает (проигрывает фон, прерывается на спец.звуки, упрвляется по стрелочным адресам), но пока есть 2 небольшие проблемы:

1. Если в коде стартовать mp3 плеер - MP3player.begin(), то после не работает интерфейс локонет (((
Точнее на прием еще работает, а вот на ответ уже не может. Соотв. чтение-запись в CV не работает

2. В момент, когда "прерывающий" звук закончился, и начинает продолжаться игравший на момент прерывания трек - слышен артефакт типа "пууум".

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

То ли уперся в производительность Attmega328P, то ли в библиотеке плеера на D7 какое-то прерываение навешано - непонятно, в-общем.

Локонет без плеера (без вызова MP3player.begin() ) работает на ура.

Пока, наверное, оставлю его в таком виде, т.к. настройки CV можно и на SD карте сохранить, пусть и без чтения-записи со стороны КС.
shalex вне форума  
Вверх
Старый 16.05.2016, 20:48   #67
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Все таки задышал и локонет )))

меняем в SFEMP3ShieldConfig.h строку
Код:
#define USE_MP3_REFILL_MEANS USE_MP3_INTx
на
Код:
#define USE_MP3_REFILL_MEANS USE_MP3_Polled
и часть прерываний высвобождается. Правда в loop() придется добавить MP3player.available(), чтобы плеер заработал.

С таким тюнингом локонет успешно читает и пишет переменные. Осталось вычистить баги переходов между режимами, разобраться с восстановлением проигрывания фонового трека после "прерывания" (как простой вариант - поставить трек заново и можно ставить на макет, главное - чтобы SD-карту рукой можно было бы достать )))


p.s. в итоге отказался от режима без прерываний вернул изменения в SFEMP3ShieldConfig.h обратно

Последний раз редактировалось shalex; 19.05.2016 в 14:18.
shalex вне форума  
Вверх
2 пользователя(ей) сказали cпасибо:
Старый 16.05.2016, 23:27   #68
BR95009
Brocken-Meister
 
Аватар для BR95009
 
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,603
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,012
Поблагодарили 9,313 раз(а) в 3,305 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (9354)
По умолчанию

Уважаемый shalex,

Раз уж пошла такая пьянка, может копнёте дальше в сторону многоголосости? А там уже и до звукового декодера рукой подать...
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка.
Московский Модуль H0-присоединяйтесь!
BR95009 вне форума  
Вверх
Старый 16.05.2016, 23:48   #69
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

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

Пока и этот девайс глючит без использования прерываний - затыкается на библиотечном методе refill() после серии cтоп/стартов и паузу почему то не отрабатывает. Из шаманства - если побольше отладночных Serial.print расставить, то боле менее стабильно работать начинает.

Вот они, 20/80 и всплыли - потрачу на оставшиеся 20% работы все 80% времени ))

p.s. В конце отключил USB-питание и ужаснулся: при питании от макетных +5В в динамиках слышны сильные помехи/наводки. Есть подозрение, что это шумы преобразователей напряжения DC-DC, которые я использую для понижения с 19В до 5В. Вечером попробую поставить кондеры на питание и попробую 7805, если не одни кондеры не помогут. В итоге питание оказалось не причем, видим была ошибка в коде.

p.p.s. пожалуй закуплю еще немного вариантов mp3 проигрывателей, благо стоят 3-4 уе. Вдруг они будут стабильнее и менее требовательны к питанию.

Последний раз редактировалось shalex; 28.05.2016 в 13:03.
shalex вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 18.05.2016, 16:41   #70
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Пока осталась только одна, но очень серьезная проблема - после серии старт/стопов проигрывателя скетч клинит намертво, хотя трек при при этом продолжает проигрываться какое то время )))
shalex вне форума  
Вверх
Старый 18.05.2016, 22:00   #71
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Вроде заработал как надо, пока поставил на тестирование с питанием от макетной шины, пусть погоняет пение птиц и звуки дождя))

Как ни странно - взял похожую библиотеку, перевел обратно на прерывания и это помогло.
Чтение-запись CV по локонету тоже работает, но только когда проигрыватель остановлен, т.к. за передачу данных от SD к проигрывателю тоже отвечает ардуина. Из минусов: на одном треке, при старте слышны какие то артефакты (короткий писк).

Список CV:
Скрытый текст
Код:
#define CV_ADDR 0 
#define CV_SOUND_OFF 1
#define CV_TURNOFF_BG 2
#define CV_MONO 3
#define CV_VOL25_LEVEL 4
#define CV_VOL50_LEVEL 5
#define CV_VOL75_LEVEL 6
#define CV_LAST_VOLUME 7


И смещения (от базового адреса в CV0) фунциональных адресов для управления декодером:
(надеюсь, названия говорят сами за себя, BG - background, т.е. фоновые звуки)
Скрытый текст
Код:
#define ADDR_SOUND_OFF 0
#define ADDR_TURNOFF_BG 1
#define ADDR_VOL00 2
#define ADDR_VOL25 3
#define ADDR_VOL50 4
#define ADDR_VOL75 5
#define ADDR_VOL100 7

#define ADDR_INT0 8
#define ADDR_INT1 9
#define ADDR_INT2 10
#define ADDR_INT3 11
#define ADDR_INT4 12
#define ADDR_INT5 13
#define ADDR_INT6 14
#define ADDR_INT7 15
#define ADDR_INT8 16
#define ADDR_INT9 17
#define ADDR_INT10 18
#define ADDR_INT11 19
#define ADDR_INT12 20
#define ADDR_INT13 21
#define ADDR_INT14 22
#define ADDR_INT15 23
#define ADDR_INT16 24
#define ADDR_INT17 25
#define ADDR_INT18 26
#define ADDR_INT19 27


Как это работает:
Скрытый текст
1. Управляется по интерфейсу Loconet
2. Управляется сигналами перевода стрелок.
3. Стрелочными сигналами можно:
- включить/выключить звук,
- вызвать воспроизведение внеочередного звука (который прервет фоновый)
- управлять громкостью, градации: 0, 25, 50, 75, 100%
- включить/выключить воспроизведение фоновых звуков
4. Макетное время устройство получает из сети Loconet
5. Если включен флаг воспроизведения фона (ADDR_TURNOFF_BG), из плей-листа, соответствующего текущему макетному часу выбирается случайный файл и воспроизводится.
6. Если включено воспроизведение "прерывающего" звука, то если в этот момент воспроизводился фоновый звук, то фоновый звук останавливается. Далее воспроизводится "прерывающий" звук. После завершения воспроизведения "прерывающего" звука возобновляется воспроизведение фоновых звуков.
7. "Прерывающий" звук не может прервать сам себя, но может быть прерван другим "прерывающим" звуком.
8. Для прерывающих звуков, как и для фоновых звуком. могут быть использованы плей-листы. Конкретный файл для воспроизведения также выбирается из списка случайно, как и для фоновых звуков.
9. При отключении питания рельс звук декодера выключается.
10. Внимание: для операций чтения/записи CV необходимо остановить воспроизведение фоновых звуков.


Требования к файлам на SD-карте:
Скрытый текст

1. Названия треков должны быть вида от "0001.mp3" до "9999.mp3"
2. Для каждого часа и для каждого прерывающего звука есть отдельный плей-лист.
3. Файл плей-листа представляет собой список названий mp3 файлов. Внимание, после финального элемента списка должен быть перевод строки. Как проверить - в итоге размер любого файла плей-листа должен быть кратен 10 байтам.
3.1 Фоновые звуки: название файлов плей-листа для каждого часа формата "000", т.е. файл для 0 часов: "000", файл для 1-часа : "001", для 2-часа: "002" и т.д.
3.2. Прерывающие звуки: название файлов плей-листа должно быть в формате - "100", т.е. нумерация начинается со 100. Иными словами, для звука INT0, т.е. с номером 0 название файла будет "100", для звука INT1 - "101" и т.д.
4. Из любого плей-листа (для фоновых или прерывающих) звук выбирается случайным образом.


Loconet:
Скрытый текст
1. У MP3-шилда физически переподключены сигналы, чтобы освободить D7, D8 для интерфейса Loconet. Тот, который был от D8 переносится на D5. Который был на D7 - на D4.
2. Также надо внести изменения в конфигурации библиотеки плеера, файл SFEMP3ShieldConfig.h

Было:
Код:
#else // otherwise use pinout of typical Sparkfun MP3 Player Shield.
  #define MP3_XCS              6 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS             7 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ             2 //Data Request Pin: Player asks for more data
  #if defined(__AVR_ATmega32U4__)
    #define MP3_DREQINT          1 //Corresponding INTx for DREQ pin
  #else // swapped between Uno and Leonardo.
    #define MP3_DREQINT          0 //Corresponding INTx for DREQ pin
  #endif
  #define MP3_RESET            8 //Reset is active low
  #if ( GRAVITECH == 1 )
    #define SD_SEL               4 //select pin for SD card
  #else
    #define SD_SEL               9 //select pin for SD card
  #endif // GRAVITECH
#endif // none SEEEDUINO
Стало:
Код:
#else // otherwise use pinout of typical Sparkfun MP3 Player Shield.
  #define MP3_XCS              6 //Control Chip Select Pin (for accessing SPI Control/Status registers)
  #define MP3_XDCS             4 //Data Chip Select / BSYNC Pin
  #define MP3_DREQ             2 //Data Request Pin: Player asks for more data
  #if defined(__AVR_ATmega32U4__)
    #define MP3_DREQINT          1 //Corresponding INTx for DREQ pin
  #else // swapped between Uno and Leonardo.
    #define MP3_DREQINT          0 //Corresponding INTx for DREQ pin
  #endif
  #define MP3_RESET            5 //Reset is active low
  #if ( GRAVITECH == 1 )
    #define SD_SEL               4 //select pin for SD card
  #else
    #define SD_SEL               9 //select pin for SD card
  #endif // GRAVITECH
#endif // none SEEEDUINO


Последняя версия кода:
Скрытый текст
Код:
#include <LocoNet.h>
#include <EEPROMex.h>
#include <SPI.h>


//Add the SdFat Libraries
#include <SdFat.h>
#include <SdFatUtil.h> 

//and the MP3 Shield Library
#include <SFEMP3Shield.h>

//create and name the library object
SFEMP3Shield MP3player;
SdFat sd;
SdFile file;
LocoNetFastClockClass  FastClock ; 

// Item Number (Art.-Nr.): 5005
#define ARTNR 5006

#define LOCONET_TX_PIN 7

unsigned long EEPROM_VERSION = 7; //0-99
unsigned long EEPROM_KEY = (ARTNR - 5000) * 100 + EEPROM_VERSION;

enum TMode {
  MODE_HOUR = 0,
  MODE_BREAK = 1
};

enum TPlayerMode {
  PL_NONE = 0,
  PL_STOP = 1,
  PL_PLAY_HOUR,
  PL_PLAY_BREAK
};

struct TBG {
  long CurrentHour; //current hour for BG
  long PlayingHour; // hour for playing now
  long CurrentBreak; //current break to play;
  long PlayingBreak; // break for playing now
  TMode Mode;       //current mode 
};

#define MAX_INT_SOUND 20

//addresses for commands
#define ADDR_SOUND_OFF 0
#define ADDR_TURNOFF_BG 1
#define ADDR_VOL00 2
#define ADDR_VOL25 3
#define ADDR_VOL50 4
#define ADDR_VOL75 5
#define ADDR_VOL100 6

#define ADDR_INT0 7
#define ADDR_INT1 8
#define ADDR_INT2 9
#define ADDR_INT3 10
#define ADDR_INT4 11
#define ADDR_INT5 12
#define ADDR_INT6 13
#define ADDR_INT7 14
#define ADDR_INT8 15
#define ADDR_INT9 16
#define ADDR_INT10 17
#define ADDR_INT11 18
#define ADDR_INT12 19
#define ADDR_INT13 20
#define ADDR_INT14 21
#define ADDR_INT15 22
#define ADDR_INT16 23
#define ADDR_INT17 24
#define ADDR_INT18 25
#define ADDR_INT19 26

const byte ADDR_LAST = ADDR_INT19;

#define CV_ADDR 0 
#define CV_SOUND_OFF 1
#define CV_TURNOFF_BG 2
#define CV_MONO 3
#define CV_VOL25_LEVEL 4
#define CV_VOL50_LEVEL 5
#define CV_VOL75_LEVEL 6
#define CV_LAST_VOLUME 7
#define CV_SERIAL_DEBUG 8

#define DEF_SOUND_OFF 0
#define DEF_ADDR 10
#define DEF_TURNOFF_BG 0
#define DEF_MONO 1
#define DEF_VOL25_LEVEL 25
#define DEF_VOL50_LEVEL 50
#define DEF_VOL75_LEVEL 70
#define DEF_LAST_VOLUME 0
#define DEF_SERIAL_DEBUG 1


const int LNCV_COUNT = CV_SERIAL_DEBUG + 1;
volatile unsigned int  lncv[LNCV_COUNT] = {DEF_ADDR, DEF_SOUND_OFF, DEF_TURNOFF_BG, DEF_MONO, DEF_VOL25_LEVEL, DEF_VOL50_LEVEL, DEF_VOL75_LEVEL, DEF_LAST_VOLUME, DEF_SERIAL_DEBUG};

LocoNetCVClass lnCV;
char FileName[10] = "xxxx.mp3";
volatile boolean programmingMode = 0;
volatile unsigned long programmingModeStart = 0;
unsigned long ledCycle = 500;
#define PROG_MODE_TIMEOUT 30000 //mills, 60sec

//for led indication
unsigned long LedLastBlink = 0;
byte          LedState = 0;

unsigned long StartTime;
unsigned long LastVolume;

//const int ALARM_LED = 13;


lnMsg        *LnPacket;
volatile TBG           Sound;


bool RunRandomSound(byte HourIntCode, char* resultFileName) { 

bool res = 0;
unsigned int SoundCount;
long rndres;

char HourfileName[] = "0000"; 
  if (HourIntCode<10) {
    HourfileName[2] = 48 + HourIntCode;
  }
  if ((HourIntCode > 10) && (HourIntCode < 24)) {
    HourfileName[1] =  48 +(HourIntCode / 10);
    HourfileName[2] =  48 +(HourIntCode % 10);
  }
  if ((HourIntCode >= 100) && (HourIntCode < 100 + MAX_INT_SOUND)) {
    HourfileName[0] = '1';
    HourfileName[1] =  48 + ((HourIntCode - 100) / 10);
    HourfileName[2] =  48 + ((HourIntCode - 100) % 10);
  }
  HourfileName[3]=0;

  if (file.open(HourfileName, O_READ)) {
    SoundCount =  file.fileSize()/10;
    rndres = random(0, SoundCount);
    rndres = random(0, SoundCount);
    file.seekSet(10*rndres);
    file.read(resultFileName, 8);
    resultFileName[8] = 0;
    file.close();
    res = 1;
  }
  return res;
}



void setup() {

  byte result;
  // First initialize the LocoNet interface

  LocoNet.init(LOCONET_TX_PIN);

  // Configure the serial port for 57600 baud
  Serial.begin(57600);
  
  
  Serial.print("Sound v");
  Serial.println(EEPROM_VERSION);
  Serial.print("Art: ");
  Serial.println(ARTNR);
  randomSeed(analogRead(0));
  
  result = sd.begin(SD_SEL, SPI_HALF_SPEED);
  
  //boot up the MP3 Player Shield
  result = MP3player.begin();

  if(result != 0) {
    Serial.print("MP3: ");
    Serial.println(result);
  }

// Initialize the Fast Clock
 FastClock.init(0, 1, 1);

// Poll the Current Time from the Command Station
  FastClock.poll();
//  pinMode(ALARM_LED, OUTPUT);
//  digitalWrite(ALARM_LED, LOW);


unsigned long key;

  EEPROM.readBlock(0, key);

  if (key != EEPROM_KEY) {
    EEPROM.writeBlock(0,EEPROM_KEY);
    EEPROM.writeBlock(sizeof(EEPROM_KEY),lncv);
  }
  else {
    EEPROM.readBlock(sizeof(EEPROM_KEY),lncv);
  }

  commitLNCVUpdate();
  programmingMode = false;
  
  Sound.Mode = MODE_HOUR;
  Sound.CurrentHour = 0;
  Sound.PlayingHour = -1;
  Sound.PlayingBreak = -1;
  
  if (lncv[CV_SOUND_OFF]) MP3player.setVolume(uint8_t(20)); else SoundRestore(); 
  MP3player.setMonoMode(lncv[CV_MONO]);
  randomSeed(analogRead(random(4)));
}

unsigned long LastTick;

void loop() {  
  // Check for any received LocoNet packets
  static int addr = 0;

  LnPacket = LocoNet.receive();
  if (LnPacket) {
    uint8_t packetConsumed(LocoNet.processSwitchSensorMessage(LnPacket));
    if (packetConsumed == 0) {
      packetConsumed = lnCV.processLNCVMessage(LnPacket);
    }
    FastClock.processMessage(LnPacket);
  }

// programmode indication
  ProgrammingModeIdle();
  
// Below is only needed if not interrupt driven. Safe to remove if not using.
#if defined(USE_MP3_REFILL_MEANS) \
    && ( (USE_MP3_REFILL_MEANS == USE_MP3_SimpleTimer) \
    ||   (USE_MP3_REFILL_MEANS == USE_MP3_Polled)      ) 
  MP3player.available();
#endif 
  SoundIdle();
  delay(50);
}
byte MP3IsFree() {
   return (MP3player.getState() == ready) || (MP3player.getState()== initialized) || (MP3player.getState()== paused_playback);
}
byte MP3IsBusy() {  
  return !MP3IsFree(); 
}

void MP3Stop() {
  Serial.print("STOP<");
  MP3player.stopTrack();
  Serial.println(">STOP");
}

int MP3Play() {
  Serial.print("PLAY<");
  Serial.print(FileName);
  unsigned long res = MP3player.playMP3(FileName);
  Serial.print(" res:");
  Serial.print(res);
  Serial.println(">PLAY");
  return res;
}

void SoundIdle(){
TPlayerMode PlayerMode = PL_NONE;
unsigned long res;

  switch (Sound.Mode) {
    case MODE_HOUR:
      if ( lncv[CV_TURNOFF_BG] && MP3IsBusy() ) {   
        PlayerMode = PL_STOP; break; 
      }
      if ( lncv[CV_TURNOFF_BG] ) {                  
        PlayerMode = PL_NONE; break; 
      }
      if ((Sound.PlayingHour != Sound.CurrentHour) && (Sound.PlayingHour != -1) && (Sound.CurrentHour != -1) && MP3IsBusy()) { 
        PlayerMode = PL_STOP; break; 
      }

      if ( MP3IsFree() && (Sound.CurrentHour != -1)) { 
        if (RunRandomSound(Sound.CurrentHour, FileName)) { 
            Serial.println(MP3player.getState());
            PlayerMode = PL_PLAY_HOUR; break;  
         }
      }
      break;
    case MODE_BREAK:
      if ((Sound.PlayingBreak == Sound.CurrentBreak) &&  (MP3IsFree())) { 
        Sound.Mode = MODE_HOUR; 
        Sound.PlayingBreak = -1;
        Sound.CurrentBreak = -1;
        break;
      }
      if ((Sound.PlayingBreak != Sound.CurrentBreak) && (Sound.CurrentBreak != -1) && MP3IsBusy()) { 
        PlayerMode = PL_STOP; 
        break; 
      }
      if ((Sound.PlayingBreak != Sound.CurrentBreak) && (Sound.CurrentBreak != -1) && MP3IsFree()) { 
        if (RunRandomSound(Sound.CurrentBreak, FileName)) { 
          PlayerMode = PL_PLAY_BREAK; 
          break; 
        }
      }
      break;
    default:
      break;
  }

  switch (PlayerMode) {
    case PL_NONE:
      break;
    case PL_PLAY_HOUR:
      res = MP3Play();
      if (!res) Sound.PlayingHour = Sound.CurrentHour; else Serial.println(res);
      break;
    case PL_PLAY_BREAK:
      res = MP3Play();
      if (!res) Sound.PlayingBreak = Sound.CurrentBreak; else Serial.println(res);
      break;
    case PL_STOP:
      MP3Stop();
      Sound.PlayingHour = -1;
      Sound.PlayingBreak = -1;
      break;
    default:
      break;
  }
}

void notifyFastClock( uint8_t Rate, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Sync ) {

Serial.print("Re: "); Serial.print(Rate, DEC);
	Serial.print(" D:"); Serial.print(Day, DEC);
	Serial.print(" H:"); Serial.print(Hour, DEC);
	Serial.print(" M:"); Serial.print(Minute, DEC);
	Serial.print(" Sy:"); Serial.println(Sync, DEC);
 
  Sound.CurrentHour = Hour;
} 

volatile bool IntSountUse = false;

void DoInterruptSound(byte intNumber){
    if (IntSountUse) return; else IntSountUse = true;
    Sound.CurrentBreak = intNumber + 100;
    //Sound.PlayingBreak = -1;
    Sound.Mode = MODE_BREAK;
    IntSountUse = false;
}


void SoundOff(){
  MP3player.setVolume(100,100);
}

unsigned long GetInternalVolume(byte Vol){
    return map(Vol,0,100,100,0);
}
void SetVolume(int Vol){
  lncv[CV_LAST_VOLUME] = Vol; 
  EEPROMSaveCV(CV_LAST_VOLUME, lncv[CV_LAST_VOLUME]);
  MP3player.setVolume(uint8_t(GetInternalVolume(lncv[CV_LAST_VOLUME])),uint8_t(GetInternalVolume(lncv[CV_LAST_VOLUME])));
}

void SoundRestore(){
  MP3player.setVolume(uint8_t(GetInternalVolume(lncv[CV_LAST_VOLUME])),uint8_t(GetInternalVolume(lncv[CV_LAST_VOLUME])));
}


void DoCommand(uint16_t Address, uint8_t Output, uint8_t Direction ){
  switch (Address) {
    case ADDR_SOUND_OFF:
      lncv[CV_SOUND_OFF] = Direction ? 1 : 0;
      EEPROMSaveCV(CV_SOUND_OFF, lncv[CV_SOUND_OFF]);
      if (Direction) SoundOff(); else SoundRestore();
      break;
    case  ADDR_TURNOFF_BG:
      lncv[CV_TURNOFF_BG] = Direction ? 1 : 0;
      EEPROMSaveCV(CV_TURNOFF_BG, lncv[CV_TURNOFF_BG]);
      break;
      
    case  ADDR_VOL00:
      if (Direction) SetVolume(0);
      break;
    case ADDR_VOL25:
      if (Direction) SetVolume(lncv[CV_VOL25_LEVEL]);
      break;
    case ADDR_VOL50:
      if (Direction) SetVolume(lncv[CV_VOL50_LEVEL]);
      break;
    case ADDR_VOL75:
      if (Direction) SetVolume(lncv[CV_VOL75_LEVEL]);
      break;
    case ADDR_VOL100:
      if (Direction) SetVolume(100);
      break;

    case ADDR_INT0:
      if (Direction) DoInterruptSound(0);
      break;
    case ADDR_INT1:
      if (Direction) DoInterruptSound(1);
      break;
    case ADDR_INT2:
      if (Direction) DoInterruptSound(2);
      break;
    case ADDR_INT3:
      if (Direction) DoInterruptSound(3);
      break;
    case ADDR_INT4:
      if (Direction) DoInterruptSound(4);
      break;
    case ADDR_INT5:
      if (Direction) DoInterruptSound(5);
      break;
    case ADDR_INT6:
      if (Direction) DoInterruptSound(6);
      break;
    case ADDR_INT7:
      if (Direction) DoInterruptSound(7);
      break;
    case ADDR_INT8:
      if (Direction) DoInterruptSound(8);
      break;
    case ADDR_INT9:
      if (Direction) DoInterruptSound(9);
      break;
      
    case ADDR_INT10:
      if (Direction) DoInterruptSound(10);
      break;      
    case ADDR_INT11:
      if (Direction) DoInterruptSound(11);
      break;      
    case ADDR_INT12:
      if (Direction) DoInterruptSound(12);
      break;      
    case ADDR_INT13:
      if (Direction) DoInterruptSound(13);
      break;      
    case ADDR_INT14:
      if (Direction) DoInterruptSound(14);
      break;      
    case ADDR_INT15:
      if (Direction) DoInterruptSound(15);
      break;      
    case ADDR_INT16:
      if (Direction) DoInterruptSound(16);
      break;      
    case ADDR_INT17:
      if (Direction) DoInterruptSound(17);
      break;      
    case ADDR_INT18:
      if (Direction) DoInterruptSound(18);
      break;      
    case ADDR_INT19:
      if (Direction) DoInterruptSound(19);
      break;      
    default:
      break;
  }
  
}


void notifyPower( uint8_t State ) {
    if (!State) SoundOff();
      else SoundRestore();
}

void commitLNCVUpdate() {
  if (lncv[CV_SERIAL_DEBUG]) {
    Serial.print("Addr: ");
    Serial.println(lncv[CV_ADDR]);
  }
}

void ProgrammingModeIdle(){
unsigned long CurrentMillis;
  
  if (programmingMode){
     CurrentMillis = millis();
     if (CurrentMillis - LedLastBlink > ledCycle) {
        LedState = !LedState;
        LedLastBlink = CurrentMillis;
        //digitalWrite(ALARM_LED, LedState);
     }
     if (CurrentMillis - programmingModeStart > PROG_MODE_TIMEOUT) {
        LedState = LOW;
        //digitalWrite(ALARM_LED, LedState);
        programmingMode = false;
        programmingModeStart = 0;
        if (lncv[CV_SERIAL_DEBUG]) Serial.print("End Prog Mode (Auto).\n");
     }
  }
}



bool InUse = false;
  // This call-back function is called from LocoNet.processSwitchSensorMessage
  // for all Switch Request messages
void notifySwitchRequest( uint16_t Address, uint8_t Output, uint8_t Direction ) {

  if ((Address >= lncv[CV_ADDR]) && (Address < lncv[CV_ADDR] + ADDR_LAST + 1)) 
    if (!InUse) {InUse = true; DoCommand(Address - lncv[CV_ADDR], Output, Direction); InUse = false; }
   
}


  /**
   * Notifies the code on the reception of a read request.
   * Note that without application knowledge (i.e., art.-nr., module address
   * and "Programming Mode" state), it is not possible to distinguish
   * a read request from a programming start request message.
   */
int8_t notifyLNCVread(uint16_t ArtNr, uint16_t lncvAddress, uint16_t,
    uint16_t & lncvValue) {
      
  // Step 1: Can this be addressed to me?
  // All ReadRequests contain the ARTNR. For starting programming, we do not accept the broadcast address.
  if (programmingMode) {
    if (ArtNr == ARTNR) {
      if (lncvAddress < LNCV_COUNT) {
        lncvValue = lncv[lncvAddress];
        return LNCV_LACK_OK;
      } else {
        // Invalid LNCV address, request a NAXK
        return LNCV_LACK_ERROR_UNSUPPORTED;
      }
    } else {
      if (lncv[CV_SERIAL_DEBUG]) Serial.print("Art inv.\n");
      return -1;
    }
  } else {
    if (lncv[CV_SERIAL_DEBUG]) Serial.print("Ignor\n");
    return -1;
  }
}

int8_t notifyLNCVprogrammingStart(uint16_t & ArtNr, uint16_t & ModuleAddress) {
  // Enter programming mode. If we already are in programming mode,
  // we simply send a response and nothing else happens.
  if (ArtNr == ARTNR) {
    if (ModuleAddress == lncv[0]) {
      programmingMode = true;
      programmingModeStart = millis();
      return LNCV_LACK_OK;
    } else if (ModuleAddress == 0xFFFF) {
      ModuleAddress = lncv[0];
      return LNCV_LACK_OK;
    }
  }
  else 
  return -1;
}

  /**
   * Notifies the code on the reception of a write request
   */
int8_t notifyLNCVwrite(uint16_t ArtNr, uint16_t lncvAddress,
    uint16_t lncvValue) {
  if (!programmingMode) {
    return -1;
  }

  if (ArtNr == ARTNR) {
    if (lncvAddress < LNCV_COUNT) {
      lncv[lncvAddress] = lncvValue;
      programmingModeStart = millis();
      EEPROMSaveCV(lncvAddress, lncvValue);
      return LNCV_LACK_OK;
    }
    else {
      return LNCV_LACK_ERROR_UNSUPPORTED;
    }

  }
  else {
    if (lncv[CV_SERIAL_DEBUG]) Serial.print("Art Inv\n");
    return -1;
  }
}

  /**
   * Notifies the code on the reception of a request to end programming mode
   */
void notifyLNCVprogrammingStop(uint16_t ArtNr, uint16_t ModuleAddress) {
//  if (lncv[CV_SERIAL_DEBUG]) Serial.print("LNCVprogStop");
  if (programmingMode) {
    if (ArtNr == ARTNR && ModuleAddress == lncv[CV_ADDR]) {
      programmingMode = false;
      programmingModeStart = 0;
      if (lncv[CV_SERIAL_DEBUG]) Serial.print("End PrgMode.\n");
      commitLNCVUpdate();
    }
    else {
      if (ArtNr != ARTNR) {
        if (lncv[CV_SERIAL_DEBUG]) Serial.print("Inv Art.\n");
        return;
      }
      if (ModuleAddress != lncv[CV_ADDR]) {
        if (lncv[CV_SERIAL_DEBUG]) Serial.print("Inv Module Addr\n");
        return;
      }
    }
  }
  else {
    if (lncv[CV_SERIAL_DEBUG]) Serial.print("Ignor\n");  }
}


void EEPROMSaveCV(int CV, int Value) {
  lncv[CV] = Value;
  EEPROM.writeBlock(sizeof(EEPROM_KEY) + sizeof(lncv[0]) * CV, lncv[CV]);
}


Может пригодиться:
http://www.billporter.info/forum/top...must-be-const/
http://www.elecrow.com/wiki/index.ph...053_MP3_Shield

p.s. прошу извинить за обилие постов с промежуточными новостями ))

Последний раз редактировалось shalex; 28.05.2016 в 13:02.
shalex вне форума  
Вверх
5 пользователя(ей) сказали cпасибо:
Старый 19.05.2016, 08:34   #72
pandrey
Местный
 
Аватар для pandrey
 
Регистрация: 12.01.2010
Адрес: Геленджик
Сообщений: 2,772
Сказал(а) 'не согласен(а)'!: 28
Сказали 'не согласен'! 10 раз(а) в 9 сообщениях
Сказал(а) спасибо: 7,160
Поблагодарили 5,541 раз(а) в 1,368 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (5581)
По умолчанию

shalex, ай спасибо!
Попробую повторить Вашу работу.
pandrey на форуме  
Вверх
Пользователь сказал cпасибо:
Старый 19.05.2016, 10:34   #73
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Пожалуйста ))
Пост с кодом будет редактироваться - буду добавлять детали по мере сил.
shalex вне форума  
Вверх
Пользователь сказал cпасибо:
Старый 20.05.2016, 22:00   #74
shalex
оффтопик

Последний раз редактировалось shalex; 28.05.2016 в 12:58.
shalex вне форума   Ответить с цитированием Вверх
Старый 30.05.2016, 17:57   #75
shalex
Местный
 
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,853
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,634
Поблагодарили 3,271 раз(а) в 1,169 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
1 Всего
Репутация: репутация неоспорима (3282)
По умолчанию

Приехали относительно дешевые ардуины уно и еще пару mp3-шилдов.
Перепаял mp3-шилд, залил прошивку - работает )))

p.s. на фотке не видно, но у mp3-шилда отрезаны пины D7 и D8 от общей "гребенки" и выпаяны, чтобы они не подключались к ардуине и проводками перекинуты на D4 и D5

Скрытый текст


p.s. предыдущий mp3-шилд неудачно упал на рельсы под напряжением и приказал долго жить, прихватив с собой SD-карту )))


Последний раз редактировалось shalex; 16.07.2016 в 17:48.
shalex вне форума  
Вверх
2 пользователя(ей) сказали cпасибо:
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аксессуарный декодер ServoMotion1 на 4 выхода Rokfor Цифровая аппаратура Modelldepo 245 21.05.2023 01:16
Аксессуарный декодер AJL2 Power Rokfor Цифровая аппаратура Modelldepo 296 25.11.2022 13:34
Аксессуарный декодер и поворотный круг от Walthers Eddypennsy Цифровая аппаратура Modelldepo 2 15.06.2016 12:22
Аксессуарный декодер AJL2 Power Ver 4.0 Pav Электрика и DCC 1 24.09.2012 14:12
Аксессуарный декодер Kuehn-digital WD10 kutepoff Электрика и DCC 5 02.06.2012 00:22


Текущее время: 08:01. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
Copyright © ModelldepO.ru 2006 -