Официальный сайт компании Arduino по адресу arduino.cc
Полицейская мигалка
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 23/04/2015 - 16:49
Добрый день.
На просторах интернета нашел код для полицейской мигалки
{
digitalWrite(ledPin, HIGH); // Зажигаем светодиод 1
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPin, LOW); // Гасим светодиод 1
delay(40); // Держим его погасшим 40 мс.
//==========Повторяем цикл====================
digitalWrite(ledPin, HIGH); // Зажигаем светодиод 1
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPin, LOW); // Гасим светодиод 1
delay(40); // Держим его погасшим 40 мс.
//==========Повторяем цикл====================
digitalWrite(ledPin, HIGH); // Зажигаем светодиод 1
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPin, LOW); // Гасим светодиод 1
delay(500); // Держим его погасшим пол секунды.
//==========Переходим к светодиоду 2====================
digitalWrite(ledPina, HIGH); //Зажигаем светодиод 2
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPina, LOW); // Гасим светодиод 2
delay(40); // Держим его погасшим 40 мс.
digitalWrite(ledPina, HIGH); //Зажигаем светодиод 2
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPina, LOW); // Гасим светодиод 2
delay(40); // Держим его погасшим 40 мс.
digitalWrite(ledPina, HIGH); //Зажигаем светодиод 2
delay(40); // Держим его гореть 40 мс.
digitalWrite(ledPina, LOW); // Гасим светодиод 2
delay(500); // Держим его гореть пол секунды.
}
Работа мигалкис такими интервалами вполне устраивает. поскольку хочу вставить в код управления сервомашинкой с блютузом delay() вешает программу и команды с блютуза не проходят.
Если использовать milllis(), то блютуз отрабатывает как положено, но эффекта мигалки получитьне могу.
Помогите переработать код с использованием millis().
На таймере совсем компактным решение получается :)
Спасибо за подборку. Буду изучать.
На таймере совсем компактным решение получается :)
Спасибо, но хотелось бы самому понимать, что делаю. Увы, но с таймерами пока далеко не все понятно.
Компилятор то ведь на С писан. Компилятору то все равно какой стиль написания. Упрощенный С-и или прародитель читсый С или прародитель ассемблер, не важно. Главное чтобы вы сами понимали и помнили, что написали. Смогли это обьяснить почему так, а не другие стили. Если знаешь сколько и каких таймеров есть внутри можно напрямую коды в настроечные регистры кидать. Можно напрямую делить, отсчитывать, ножки внешние дергать.
Пишите как угодно, что угодно, но комментируйте чтобы самим потом вспомнить и найти лучшее решение. Эх риторика. Я от такого стиля отошел много лет назад. Продуктивность на экспериментах низкая. Такой стиль эфективен если поток и нехватка возможностей.
Вот Димах даром готовое решение выдал.
Спасибо.
Может в железе проверю. Может даже сегодня вечером. :) Отдам целую плату под такой умный и компактный код с прямыми настройками таймеров. И будет бездельничать остальная часть микроконтроллера. Сегодня у нас выбор красавицы на огромном холдинге. Если не утащю женское тело и с телом не загуляю. Код на станочек с ЧПУ и двумя светодиодиками волью минут 20. Поробую как там таймеры таймерятся. :)
арт, это Ваш первый пост, который мне удалось прочесть с первого раза. Браво!
https://yadi.sk/i/wVJKQNy8gDoAy
Спасибо димах
Мигает
art100, на здоровье) Я тайминги правда не такие как у Т.С. поставил, паузу между переключениями светодиодов сделал не 500, а раза в два меньше. А последнюю паузу совсем убрал. Что б было как в Т.З. нужно немного поменять:
art100, на здоровье) Я тайминги правда не такие как у Т.С. поставил, паузу между переключениями светодиодов сделал не 500, а раза в два меньше. А последнюю паузу совсем убрал. Что б было как в Т.З. нужно немного поменять:
Чтобы вместо 12 и 13 ног задействовать аналоговые выходы A1 и A2 исправлять так?
guardauto, нет. Будут PORTC^=(1<<1) и PORTC^=(1<<2)
Спасибо, попробую.
art100, на здоровье) Я тайминги правда не такие как у Т.С. поставил, паузу между переключениями светодиодов сделал не 500, а раза в два меньше. А последнюю паузу совсем убрал. Что б было как в Т.З. нужно немного поменять:
кино https://yadi.sk/i/t4kxu6U9gECaD
Запись камеры подтормаживает и смазывает паузы между 6 вспышками. Все похоже в результате на мигалку.
Димах спасибо.
Видео с Вашим кодом. Ребенок одобрил!
У меня видео подтормаживает, в реале довольно неплохо смотрится.
https://yadi.sk/i/mBye_B4LgExXJ
Попробую со своим кодом, что получилось. Позже покажу.
Спасибо за помощь, не ожидал такой заинтересованности :).
Ещё бы звук теперь к мигалке сделать, квакалку.
Можно сирену простенькую прикрутить.. тот-же скетч, добавил таймер2 для генерации звука от 600 Гц до 1500 Гц. На 11 ногу ардуины повесить динамик через ключевой транзистор, или хотя бы через резистор ом на 100.
Доступно пишет же :)
мне норм.
Можно сирену простенькую прикрутить..
Собрался я было весь код до кучи собрать, да вот беда. Таймер мигалки не хочет с библиотекой сервы дружить:
guardauto, видимо библа сервы использует таймер1, который занят мигалкой. Можно на таймере2 сделать, но менее удобно, придётся сильно перепахать всю логику работы, т.к. у него самый длинный интервал 16мс. Если тайминги не принципиальны, можно на вотчдог перекинуть. Его никто не использует, кроме "библиотек сна" . У него либо раз в 32мс будет прерывание, либо раз в 64. 32 маловато, а вот 64 наверно пойдёт..
Спасибо, вроде все получилось. Вот мой кусок кода. Ссервой дружит, мигалка включается и выключается, но иногда при выключении бывает подзависнет один из светодиодов и остается включенным. Но это мелочи, включение-выключение мигалки помогает. Тайминги вполне устраивают.
guardauto, ничё так, аккуратно. Но ради одной-двух строк можно в отдельную функцию не выделять) Что-б наверняка гасло, можно специально послать команду что-б обнулить биты: PORTC&=B11111001;.
dimax подскажите пожалуйста, как сирену подключить к 10 выходу Arduino. C выходами на светодиоды разобрался, переподключил на 8 и 9 выходы. А вот с сиреной не понял.
if (n<=6) PORTB^=(1<<1);//6 тиков моргать светодиодом на 9 ноге (1 это PB1 это 9 выход arduino )
if (n>=18&&n<=23) PORTB^=(1<<0);//6 тиков моргать светодиодом на 8 ноге(0 это PB0 это 8 выход arduino )
san73, без существенного изменения кода можно только на 3 вывод ардуины сирену переделать. Для этого вывод 3 сделать OUTPUT, и в строчке, где упоминается COM2A0 поменять на COM2B0.
Согласен, OC2A к 11 ноге привязан, к 10 OC1B. У меня на 3 и 11 выводах motor shieid висит, 8 и 9 на мигалку отвел, машинка должна получиться. Пытаюсь разобраться с таймерами, портами.., но программист из меня не очень.
san73, в принципе можно сирену к любой ноге приживить почти без изменения кода, если задействовать функцию tone(),
dimax Спасибо большое за идею. Буду разбираться, заодно и про tone почитаю.
К сожалению, на tone тоже не получается. Сирена похрипывает и не работают двигатели. Отключаю сирену, двигатели работают. Собираю программу блоками, прошу сильно не ругать за неграмотность.
san73, конечно не получится, вы же используете команду analogwrite, а она использует таймер2, через который так-же работает и tone(). Тут единственный выход мигалку перенести на таймер вотчдога, как в #18, а сирену переделать на таймер 1.
Мигалку на вотчдог перенес, мигает немного медленнее, но в принципе пойдет. С сиреной пока не получается.
san73, как-то так мне видится:
Мигалка на вотч-доге, в егойных прерываниях мигает и говорит таймеру1 с какой частотой ему пищать. Динамик на 10 ногу малыми силами не перенести, таймер в нужном режиме (mode15) её не поддерживает. Так что динамик на 9 ногу сажать.
dimax, молодец, спасибо, таймеры как орехи щелкаешь. Все работает отлично. Для меня это немного тяжеловато дается. Если не трудно подскажи как сиреной можно управлять, включить – выключить.
san73, тут масса вариантов. Можно например таймер1 просто остановить командой TCCR1B^=1<<CS12; ей же можно и снова запустить (это команда инверсии) . Или стандартно включать: TCCR1B|=1<<CS12 и выключать: TCCR1B&=~(1<<CS12)
Спасибо, всё получилось.