Стробоскоп
- Войдите на сайт для отправки комментариев
Привет всем!
Я начинающий в этом деле. С паяльником на ты, а вот с программированием как то.....
Есть проблема.
Предыстория.
Есть задумка на основе АРДУИНО создать стробоскоп. Обязательное условие блютз модуль- управление со смартфона. С этим все понятно. Перемигивание светодиодов ( два светодиода ) на основе скетча Blink. Требуется изменение частоты перемигивания после некоторого события ( получения сигнала с портрет блютуз). Казалось бы все просто, Но как заставить
digitaWrite(13, HIGH);
delay(100);
digitalWrite(13,LOW);
delay(100);
крутиться бесконечно до наступления события, переключающего на другую частоту перемигивания
Пробовал while()- не удаётся выйти из цыкла!
Помогите, за ранее спасибо!!!
Оно и так будет крутиться бесконечно в loop(). Чтобы менялась частота мигания, в delay() пишем не цифру в миллисекундах, а название переменной в которой будет храниться это значение. Переменную надо объявить заранее. Потом, по какому-либо событию меняем значение переменной, это значение автоматически попадет в delay()
Спасибо! вчером попробую!
Оператор "==" не присвоит переменным новых значений, это оператор сравнения. Короче говоря, не x==20; , а x=20;
Странно, не помогло.
Просто светятся оба светодиода!
Код немного изменился, но это ни чего не дало!
1. Код желательно вставлять так, как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
2. Отсутствует Serial.begin в setup() http://arduino.ru/Serial/Begin
3. y== 500; - не исправили на y=500;
Я не планируют использовать Serial порт. С какой целью есть в том необходимость? Если не затруднительно, пожалуйста!
Спасибо за совет о вставке кода!
Я не планируют использовать Serial порт.
В этом есть некое противоречие с тем, что он уже используется в скетче :
Я имею введу отображение обратных данных с ардуино- то есть односторонняя связь.
Или это необходимо,и я просто не совсем что то понимаю?
Для данного конкретного скетча необходим Serial.begin в setup().
Спасибо!!!
Ещё один теоретический вопросов.
Переменная i принимает какое либо значение в соответствии с полученной командой. Вопрос, значение i изменится только при получении команды, или изменится сразу после прекращения подачи команды?
Простой ответ такой : например, если в скетче прописано iii = 1; , то значение 1 будет в iii до тех пор, пока скетч его не изменит на iii = 2. Однако, не всё так просто с переменными, поэтому я бы Вам для начала посоветовал почитать хотя бы
http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-pamyat-1-chto-i-kak-ne-nado-delat
и
http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-pamyat-2-staticheskie-peremennye
Если собираетесь сами возиться со скетчем стробоскопа, то без минимального объёма теории будет тяжело, а отвечать здесь на простейшие вопросы вряд ли кто возьмётся.
Спасибо!
Zawertim, у вас сама идеология не хорошая. Не нужно тут не tone(), ни delay(). Всё делается на таймере1.
Для запуска в терминалке (предварительно выставить скорость 9600) нужно ввести 2 числа, раздёлённых пробелом. Первое -сколько времени должен гореть светодид, второе число сколько времени должен быть потушен. В миллисекундах. Например: 30 100
Выход будет на 9 ноге ардуино.
dimax как напишет так жутко. какие-то регистры... зато коротко и красиво. хотя и на delay не длиньше было бы
Не мужики, чем дальше в лес тем страшнее!
После такого чувствую себя идиотом
Нельзя ли как-то прокомментировать последний скетч?
Ахахах, dimax, побойтесь Бога, топикстартер в азах нетвёрд, а Вы ему ТАКОЕ советуете... )))
Прикольно!!
Был уверен мне здесь помогут
Araris, да я ж не в качестве учебного пособия.. Просто как готовое решение, что б человек так не мучался :))
Zawertim, если я озвучу настройку регистров таймера, думаете что-то будет яснее? )) А из общего принципа - тут функция Serial() ловит из UART циферки, и с помощью них перепрограммируется таймер на отсчёт нужных отрезков времени. Но думаю это и так понятно было. Минимальная единица времени в данном скетче -1 миллисекунда. Максимальная 4000 с чем-то, в общем для стробоскопа самое то.
Дело в том, что несовсем понимю предложенный вами валиант, сказывается недостаток опыта. Спасибо огромное за готовое решение, но хотелось бы понимать, что происходит.
Zawertim, если вкратце: в микроконтроллере есть аппаратные таймеры. Их нужно настраивать определённым образом, чтобы они работали в определённом режиме и тикали так, как Вам надо. Настраиваются они через регистры, как и любая переферия микроконтроллера. В эти регистры нужно записывать определенные значения. Узнать про регистры и их значения можно в даташите на конкретный микроконтроллер. На распространённых Arduino UNO, Nano, Pro Mini стоит микроконтроллер фирмы Atmel семейства AVR, а конкретно ATmega328P). То есть, это уже несколько выходит за рамки Arduino, которая расчитана в основном на новичков. Тут нужно углубляться в изучение "железной части" на более низком уровне.
Можете вот статьи почитать:
http://easyelectronics.ru/avr-uchebnyj-kurs-tajmery.html
http://www.doneathome.ru/archives/364
http://chipenable.ru/index.php/programming-avr/item/171-avr-timer-t0-ch1.html
http://chipenable.ru/index.php/programming-avr/item/187-uchebnyy-kurs-avr-taymer-schetchik-t0-rezhim-normal-ch2.html
http://chipenable.ru/index.php/programming-avr/item/191-uchebnyy-kurs-avr-taymer-schetchik-t0-rezhim-ctc-ch2.html
http://mainloop.ru/avr-atmega/avr-timer-counter.html
http://www.stepwood.com/mcucodes/2012/03/10/atmega-rezhimyi-rabotyi-taymerov-schetchikov/
http://samou4ka.net/page/tajmer-schetchik-mikrokontrollerov-avr
http://articles.greenchip.com.ua/1-0-35-0.html
http://avr-start.ru/?p=414
Я понял. Будем изучать теоретическую часть. А так хотелось чего-то по быстренькому сделать. Общение наше краткое, но и почерпнул для себя нечто новое. Спасибо за помощь буду вникать!!!
Zawertim, у вас сама идеология не хорошая. Не нужно тут не tone(), ни delay(). Всё делается на таймере1.
Для запуска в терминалке (предварительно выставить скорость 9600) нужно ввести 2 числа, раздёлённых пробелом. Первое -сколько времени должен гореть светодид, второе число сколько времени должен быть потушен. В миллисекундах. Например: 30 100
Выход будет на 9 ноге ардуино.
Добрый день, а как переписать под MEGA 2560 или где почитать?
Kursin, поменять выходной пин на 11
ура, спасибо
Еще вопрос, разница заданого значения длительности имульса и измеренная осциллографом 1 мс - это нормально, если нет то в чем может быть причина. Нестабильность кварца?
Kursin, в данном случае нормально, т.к. следствие сильных округлений при рассчёте.
Спасибо за ответ. Тоесть если надо точнее то надо тип не интежер?
Zawertim, у вас сама идеология не хорошая. Не нужно тут не tone(), ни delay(). Всё делается на таймере1.
Для запуска в терминалке (предварительно выставить скорость 9600) нужно ввести 2 числа, раздёлённых пробелом. Первое -сколько времени должен гореть светодид, второе число сколько времени должен быть потушен. В миллисекундах. Например: 30 100
Выход будет на 9 ноге ардуино.
Dimax, а данный скетч можно настроить для генератора сигнала от 40 до 1400 Гц со скважностью 80%? или точность на каком-то диапазоне будет низкая?
хочу использовать управление таймером вместо библиотеки PWM для решения задачи в теме http://arduino.ru/forum/programmirovanie/generator-signala-kolenvala-i-raspredvala
MaksVV, нет. Скетч писался под конкретную задачу. Вам нужно брать алгоритм как у меня в генераторе. Там есть возможность плавно менять частоту и скважность, и пересчитывать сразу под неё параметры таймера.
пасиб, буду изучать.