Переключение режимов. С программированием очень плохо. Подскажите или поправьте.
- Войдите на сайт для отправки комментариев
Сгорел контроллер на плате. Если в схемотехнике еще разбираюсь, то с программированием контроллеров туговато.
Принцип работы понятен.
1. Замыкается микропереключатель, подается + на ногу контроллера, контроллер видит +, включает один лазер (всего лазеров 3). И загорается сигнальный светодиод(Power ON).
2. Одна кнопка переключает лазеры по кругу, включая их по очереди. Первый, следом второй, потом третий, потом только первый и по кругу.
3. Вторая кнопка включает импульсный режим, для работы с детектором, ШИМ 10кГц со скважностью 50%. Импульсный режим включается сразу на все лазеры, не важно как они включены, он либо включен, либо выключен. Так же включается сигнальный светодиод (Impulse ON).
4. Измерение напряжение на делителе, что бы сигнализировать о разряде. Сигнальный светодиод тот же, что и Power ON, только он начинает мигать.
Вот написал (напихал) строчек. Сейчас прошу помочь в том, как включить импульсный режим и он не выключался кнопкой 1. И лазер при включении не загорается, не пойму почему, так как в Setup выставил ногу в 1.
Сейчас при включении загорается сигнальный светодиод. При нажатии первой кнопки включается/выключается лазер. При нажатии второй загорается сигнальный светодиод и включается импульсный режим, но при нажатии первой кнопки естественно в коде конкретно прописано digitalWrite и он просто включается отключая импульсный режим.
#include <GyverPWM.h> //библиотека с частотой boolean butt_flag = 0; boolean butt_flag2 = 0; boolean led_flag = 0; boolean led_flag2 = 0; boolean butt; boolean butt2; unsigned long last_press; void setup() { pinMode (3, OUTPUT); // светодиод Impulse Mode pinMode (4, OUTPUT); // светодиод Power ON + (мигание о разряде батареи - до этого еще не дошло)))) pinMode (9, OUTPUT); // лазер pinMode (10, OUTPUT); // лазер digitalWrite(4, LOW); //по умолчанию свтодиод пин 4 включен Power ON - работает digitalWrite(3, HIGH); //по умолчанию свтодиод пин 3 выключен Impulse Mode - работает digitalWrite(10, HIGH); //по умолчанию на пин 10 высокий уровень, на базу транзистора - почему то не работает!!! Только после нажатия на кнопку срабатывает pinMode (2, INPUT_PULLUP); //1 кнопка pinMode (5, INPUT_PULLUP); //2 кнопка Serial.begin(115200); Serial.println(led_flag); //выводит состояние флага PWM_frequency(10, 10000, FAST_PWM); //Выставляем 10 пин на частоту 10кГц } void loop() { butt = !digitalRead(2); //читаем текушее положение кнопки 1 if (butt == 1 && butt_flag == 0 && millis() - last_press > 300) { butt_flag = 1; led_flag = !led_flag; millis(); digitalWrite(10, led_flag); //Включаем/отключаем лазер laser on/off по флагу if (led_flag == 1){ Serial.println("Лазер включен"); } if (led_flag == 0){Serial.println("Лазер выключен"); } Serial.println(led_flag); last_press = millis(); //Serial.println("Нажата кнопка 1"); //вывод в порт } if (butt == 0 && butt_flag == 1) { butt_flag = 0; //Serial.println("Отжата кнопка 1"); //вывод в порт } butt2 = !digitalRead(5); //читаем текушее положение кнопки 2 if (butt2 == 1 && butt_flag2 == 0 && millis() - last_press > 300) { butt_flag2 = 1; led_flag2 = !led_flag2; Serial.println(led_flag2); last_press = millis(); //Serial.println("Нажата кнопка 2"); //вывод в порт if (led_flag2 == 1 && led_flag == 1 ) //если лазер выключен, то кнопкой 2 его не надо включать { Serial.println("Импульсный режим включен"); analogWrite(10, 127); // включает скважность 50% и заодно включает ШИМ 10кГц (Импульсный режим) digitalWrite(3, LOW); //включаем светодиод сигнализирующий, что Impulse mode on } if (led_flag2 == 0){Serial.println("Импульсный режим выключен"); PWM_detach(10); //Отключение ШИМ digitalWrite(3, HIGH); //включаем светодиод сигнализирующий, что Impulse mode off digitalWrite(10, led_flag); //лазер в исходное состояние } //PWM_set(10, 255 - analogRead(0) / 2); } if (butt2 == 0 && butt_flag2 == 1) { butt_flag2 = 0; //Serial.println("Отжата кнопка 2"); //вывод в порт } }
нужно завести два независимых флага :
1) Лазер включен/ выключен
2) импульс включен/выключен
и в зависимости от комбинации их значений включать то что нужно:
Laser ON and IMPULSE ON => включаем импульс
Laser ON and IMPULSE OFF => включаем просто лазер
LASER OFF = > выключаем все
Да вроде есть 2 флага led_flag и led_flag2.
Судя по вопросу, два флага это Чарли и Новембер вместе? ;))))
Чет не въехал в шутку)))) или это не шутка
Судя по вопросу, два флага это Чарли и Новембер вместе? ;))))
Типа сигнал бедствия))) ну в принципе ты прав. Так как в коде я скажем мягко 0. Начитался море статей и вот накидал такую прогу. Ковыряю по вечерам её. И вдруг кто ещё накидает советов.
Предложу такой вариант
Спасибо огромное. Разобраться бы, что куда вставлять.
Пины выставил, скетч залил, но чет ничего не делается)
{vibro=!vibro;
вместо
Вообще нужно еще посмотреть на счет косяков. По идее при старте получаем 1 на выходе lazer_1, нажатием кнопки butt_select (на землю!!) последовательно получаем единицы на выходах lazer_2, lazer_3 циклически.
При нажатии кнопки butt_modul (на землю!!) сигнал на выбранном выходе lazer_х должен модулироваться частотой 10 кГц скважностью 50. При втором нажатии модуляция снимается
Что такое dd
Спасибо огромное. Разобраться бы, что куда вставлять.
Щас гусары налетят, расскажут )))
Наверное немного не правильно выразился.
При включении загорается laser 1, при нажатии кнопки вместе с laser 1 загорается laser 2 при следующем нажатии загораются все 3 лазера, а потом опять первый и по кругу.
dd-параметр, который передается функции, при ее вызове, Функция вызывается 20 к раз в секунду с параметром 1 и следующий вызов с параметром 0( если переменная mdulation=false), если mdulation=false то только с параметром 1
Вполне возможно мой косяк в функции void control (), сможете сами исправить?
Сомневаюсь. Я в своем то с горем пополам копаюсь))))
Кстати по яркости, как будто ШИМ включен постоянно.
исправьте в функцию void modul() после 52 строки, должно получиться как-то так
Кнопка modul_butt не работает?
rastaman29 - а ШИМ обязательно именно 10 КГц? - 8 КГц не подойдет? - тогда можно использовать ардуино-ШИМ и код станет значительно проще
Я полагаю что это для приемника лазерного нивелира а там частота регламентируется
1
if
(digitalRead(!butt_select))
2
{
3
digitalWrite(lazer_1, LOW);
4
digitalWrite(lazer_2, LOW);
5
digitalWrite(lazer_3, LOW);
остальное удалить?
Alexey_Rem - вставьте код по правилам форума. чтобы можно было обсуждать по номерам строк
rastaman29 - а ШИМ обязательно именно 10 КГц? - 8 КГц не подойдет? - тогда можно использовать ардуино-ШИМ и код станет значительно проще
В принципе приемник ловит от 5 до 15 кГц. Но потыкав разные частоты, среднее значение было этим. Хотя на 8 будет тоже работать, только вот какая будет дальность надо экспериментировать.
Нет, просто вставить, это для выключения всех лазеров в момент перед включением выбранного
потому что они назначаются автоматом. Вставляйте весь код. а не кусками - будут правильные номера.
Работает?
Вставил. Не изменилось поведение.
Кнопки не реагируют. Все диоды светятся.
Вставили - молодцы.
Теперь ответьте - нафига нужны строчки 54-56? Выключаете лазеры при любом нажатии кнопки? - а нафига?
И еще - что это за операция такая в строке 46?
modul_cnt -
false
;
Исправил на
modul_cnt =
false
; Ничего не изменилось.
Замерил частоту цешкой, показывает 2.2кГц.
еще косяк, должно быть:
вместо
057
if
(digitalRead(!butt_select))
052
select_debunc =
true
;
053
{
054
digitalWrite(lazer_1, LOW);
055
digitalWrite(lazer_2, LOW);
056
digitalWrite(lazer_3, LOW);
057
modul_cnt -
false
;
Исправил на
modul_cnt =
false
; Ничего не изменилось.
Замерил частоту цешкой, показывает 2.2кГц.
правильно так:
modul_debunc=false;
Косяк на косяке :(,
Цешкой - это тесер Ц-4...?
еще косяк, должно быть:
Поправил. Ничего не изменилось))
[/quote]
Цешкой - это тесер Ц-4...?
[/quote]
Мультиметр CEM DT-931N
modul_debunc=false; поправил теперь при старте не зажигается лазер и так же не реагирует на кнопки.
Мне к сожалению сейчас не на чем проверить, пересмотрю программку может чего еще найду
вот в таком виде работает на МЕГЕ2560:
Ноги естественно мои Вам поменять
Alexey_Rem - скажите честно. как художник художнику - вы программировать умеете? - судя по коду - не очень...
В коде опять какия-то бредятина с дебонсом... смотрите - у вас счетчик дебонса, например в строчках 62-70 - считает сам по себе, независимо от кнопки. У вас никакой дребезг не подавляется. это просто курам на смех.
Если не понимаете принципа антидребезга - возьмите готовую библиотеку кнопки, да хоть того же гайвера. Все лучше будет.
А то взялись помогать ТС-у, а вместо этого забросали его каким копрокодом :)
На самом деле, если вы посмотрите внимательно кнопки опрашиваются с частотой ок 250 Гц и антидребезг считает кол-во обращений к кнопке после установки соотв флага при нажатии кнопки и при достижении опр значения сбрасывает этот флаг. А в программировании я действительно не великий спец но у меня работает очень нормально и если хлопцу помогу то буду рад.
На самом деле, если вы посмотрите внимательно кнопки опрашиваются с частотой ок 250 Гц и антидребезг считает кол-во обращений к кнопке после установки соотв флага при нажатии кнопки и при достижении опр значения сбрасывает этот флаг.
ну не совсем так. ТС заказывал частоту ШИМ 10 КГц и ваш код претендует именно на такую частоту - у вас в ЛУПе настроен таймер на исполнение кода каждые 50 мкс
А ваш антидребезг, в принципе, единственное что делает - он опрашивает кнопку не чаще 90 периодов этого таймера - то есть примерно раз 5мс. В некотором смысле это, конечно, "антидребезг" - но очень относительный, кнопки надо нажимать быстро и нежно и не задерживать на них палец дольше 5мс.
Правильная работа с кнопками должна давать строго одно страбатывание на одно нажатие, что несколько отличается от того. что сейчас в коде
Товарищ, посмотрите внимательно на строки 117-123 там организован счетчик-делитель частоты модуляции на 40 и именно он вызывает функцию модул(), счетчик в самой функции отсчитывает еще 90 периодов этой частоты, таким образом получаем время антидребезга ок 0.36 сек что мне кажется вполне достаточно.
В принципе работает. Завтра навешаю лазеров(сейчас только один, на остальных диоды посажены).
При зажатой кнопке переключаются по кругу как говорил b707.
Частоту цешка показывает 8.7 кГц.
Выражаю благодарность Alexey_Rem.
Сигнальные диоды думаю допилю сам.
Рад помочь всегда
А можно что бы по кругу не переключались при зажатой кнопке?
И подскажите как регулировать частоту?
У меня АНЕНг показал частоту 22 кГц(О), но думаю это не показатель:) Подправить частоту можно здесь:
после>= должно быть пол периода требуемой частоты в микросекундах.
как отключить круговое переклюючение пока не знаю, скорее всего нужен еще таймер нажатия кнопки...
Добавил сигнальный светодиод powerOn и включение сигнального светодиода impulseOn.
как отключить круговое переклюючение пока не знаю, скорее всего нужен еще таймер нажатия кнопки...
не нужен таймер - достаточно прописать так, что новое нажатие регистрируется только после отжатия кнопки. И все эти многочисленные делители сначала на 40. а потом на 90 - будут не нужны
Может и частота поднимется. когда из кода кучу лишнего уберете
не нужен таймер - достаточно прописать так
Можно пример с данным кодом?)
Можно пример с данным кодом?)
с данным "антидребезгом" ничего не выйдет - для этого надо читать кнопку хотя бы раз в 1мс, а в вашем коде ее игнорят аж по 0.4 секунды :)
Схема следующая - учитывать не только нынешнее состояние кнопки, но и состояние при прошлом опросе. Если сейчас кнопка нажата, а в прошлый раз была отпущена - это и только это - нажатие, а все остальные варианты - пропускаем.
На самом деле я, как бы на словах то понимаю, но как я писал в шапке, в коде полный 0. Ну и знал бы сюда бы не написал. А схемы то и я могу придумывать. Если кнопка нажата, если кнопка удержана, два нажатия и т.д.
У меня в коде в шапке примерно так и сделано (вроде как). Но внедрить его в этот у меня точно не получится. Хотя буду все равно думать. Может получится их скрестить. Благо времени на это не лимитировано))).
ну если никто другой не опередит, я вам попозже ночью выложу пример
Тута вродибы кольцевание поборото ;), благодаря камраду b707.
К стати а нет ли смысла повысить скважность при модуляции что бы яркость падала меньше?