Полицейская мигалка
- Войдите на сайт для отправки комментариев
Чт, 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().
На таймере совсем компактным решение получается :)
void setup() { TCCR1A=0; OCR1A=624;// 40ms TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode TIMSK1=1<<OCIE1A; pinMode(13,OUTPUT);// светодиод на 13 ноге pinMode(12,OUTPUT); // светодиод на 12 ноге } void loop() { } ISR (TIMER1_COMPA_vect) { static byte n=1; if (n<=6) PORTB^=(1<<5);//6 тиков моргать светодиодом на 13 ноге if (n>=13&&n<=18) PORTB^=(1<<4);//6 тиков моргать светодиодом на 12 ноге n==18? n=1:n++; }Спасибо за подборку. Буду изучать.
На таймере совсем компактным решение получается :)
Спасибо, но хотелось бы самому понимать, что делаю. Увы, но с таймерами пока далеко не все понятно.
Компилятор то ведь на С писан. Компилятору то все равно какой стиль написания. Упрощенный С-и или прародитель читсый С или прародитель ассемблер, не важно. Главное чтобы вы сами понимали и помнили, что написали. Смогли это обьяснить почему так, а не другие стили. Если знаешь сколько и каких таймеров есть внутри можно напрямую коды в настроечные регистры кидать. Можно напрямую делить, отсчитывать, ножки внешние дергать.
Пишите как угодно, что угодно, но комментируйте чтобы самим потом вспомнить и найти лучшее решение. Эх риторика. Я от такого стиля отошел много лет назад. Продуктивность на экспериментах низкая. Такой стиль эфективен если поток и нехватка возможностей.
Вот Димах даром готовое решение выдал.
Спасибо.
Может в железе проверю. Может даже сегодня вечером. :) Отдам целую плату под такой умный и компактный код с прямыми настройками таймеров. И будет бездельничать остальная часть микроконтроллера. Сегодня у нас выбор красавицы на огромном холдинге. Если не утащю женское тело и с телом не загуляю. Код на станочек с ЧПУ и двумя светодиодиками волью минут 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.
void setup() { //настройка сирены TCCR2A=(1<<COM2A0)| (1<<WGM21); //CTC mode, OC2A Enable TCCR2B=(1<<CS22)|(1<<CS20); //div 128 OCR2A=40; pinMode(11,OUTPUT); // speaker на 11 ноге //настройка мигалки TCCR1A=0; OCR1A=624;// 40ms TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode TIMSK1=1<<OCIE1A; pinMode(13,OUTPUT);// светодиод на 13 ноге pinMode(12,OUTPUT); // светодиод на 12 ноге } void loop() { } ISR (TIMER1_COMPA_vect) { static byte n=1; static byte spik=40; static boolean count_direct=false; if (n<=6) PORTB^=(1<<5);//6 тиков моргать светодиодом на 13 ноге if (n>=18&&n<=23) PORTB^=(1<<4);//6 тиков моргать светодиодом на 12 ноге n==35? n=1:n++; if (count_direct==false){ spik==100? count_direct=true : spik++; } if (count_direct==true){ spik==40? count_direct=false : spik--; } OCR2A=spik; }Доступно пишет же :)
мне норм.
Можно сирену простенькую прикрутить..
Собрался я было весь код до кучи собрать, да вот беда. Таймер мигалки не хочет с библиотекой сервы дружить:
guardauto, видимо библа сервы использует таймер1, который занят мигалкой. Можно на таймере2 сделать, но менее удобно, придётся сильно перепахать всю логику работы, т.к. у него самый длинный интервал 16мс. Если тайминги не принципиальны, можно на вотчдог перекинуть. Его никто не использует, кроме "библиотек сна" . У него либо раз в 32мс будет прерывание, либо раз в 64. 32 маловато, а вот 64 наверно пойдёт..
void setup(){ WDTCSR=B00011000; WDTCSR=(1<<WDIE)|(1<<WDP1); pinMode(A1,OUTPUT);// светодиод на 13 ноге pinMode(A2,OUTPUT);// светодиод на 12 ноге } void loop(){ } ISR (WDT_vect){ //входит в прерывание каждые 64ms static byte n=1; if (n<=6) PORTC^=(1<<1); if (n>=13&&n<=18) PORTC^=(1<<2); n==25? n=1:n++; }Спасибо, вроде все получилось. Вот мой кусок кода. Ссервой дружит, мигалка включается и выключается, но иногда при выключении бывает подзависнет один из светодиодов и остается включенным. Но это мелочи, включение-выключение мигалки помогает. Тайминги вполне устраивают.
#include <Servo.h> // Подключаем библиотеку для сервоприводов #include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты #include <AFMotor.h> //Подключаем заголовочный файл библиотеки //Создаем объект для двигателя на 1 канале (M1) AF_DCMotor motor(1); #define servoPin 9 int pos = 0; // для хранения позиции Servo myServo; SoftwareSerial BTSerial(0, 1); // RX, TX // Создаем переменную для команд Bluetooth char vcmd; void setup() { pinMode(A1,OUTPUT);// светодиод на 13 ноге pinMode(A2,OUTPUT);// светодиод на 12 ноге // Устанавливаем скорость передачи данных по Bluetooth BTSerial.begin(9600); // Устанавливаем скорость передачи данных по кабелю Serial.begin(9600); // Выбираем пин к которому подключен сервопривод myServo.attach(9); // Поворачиваем сервопривод в положение 90 градусов при каждом включении myServo.write(90); } ISR (WDT_vect){ //входит в прерывание каждые 64ms static byte n=1; if (n<=6) PORTC^=(1<<1); if (n>=13&&n<=18) PORTC^=(1<<2); n==25? n=1:n++; } void loop() { // Если есть данные if (BTSerial.available()) { // Читаем команды и заносим их в переменную. char преобразует код символа команды в символ vcmd = (char)BTSerial.read(); // Отправляем команду в порт, чтобы можно было их проверить в "Мониторе порта" Serial.println(vcmd); //Мигалка вкл if (vcmd == 'X') { strob_on(); } //Мигалка выкл. if (vcmd == 'x') { strob_off(); } } } //Включена мигалка void strob_on() { WDTCSR=B00011000; WDTCSR=(1<<WDIE)|(1<<WDP1); } //Выключена мигалка void strob_off() { WDTCSR &= ~(1<<WDIE)|(1<<WDP1); }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(),
void setup() { //настройка сирены pinMode(10,OUTPUT); // speaker на 10 ноге tone(10,300); // с какой частоты начинать гудеть //настройка мигалки TCCR1A=0; OCR1A=624;// 40ms TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode TIMSK1=1<<OCIE1A; pinMode(13,OUTPUT);// светодиод на 13 ноге pinMode(12,OUTPUT); // светодиод на 12 ноге } void loop() { } ISR (TIMER1_COMPA_vect) { static byte n=1; static byte spik=40; static boolean count_direct=false; if (n<=6) PORTB^=(1<<5);//6 тиков моргать светодиодом на 13 ноге if (n>=18&&n<=23) PORTB^=(1<<4);//6 тиков моргать светодиодом на 12 ноге n==35? n=1:n++; if (count_direct==false){ spik==100? count_direct=true : spik++; } if (count_direct==true){ spik==40? count_direct=false : spik--; } OCR2A=spik; }dimax Спасибо большое за идею. Буду разбираться, заодно и про tone почитаю.
К сожалению, на tone тоже не получается. Сирена похрипывает и не работают двигатели. Отключаю сирену, двигатели работают. Собираю программу блоками, прошу сильно не ругать за неграмотность.
#include <BTCA2ALite.h> btca2aLite btca2aLite; #define D1 12 // Направление вращение двигателя 1 #define M1 3 // ШИМ вывод для управления двигателем 1 #define D2 13 // Направление вращение двигателя 2 #define M2 11 // ШИМ вывод для управления двигателем 2 bool direction = 0; // Текущее направление вращения int value; // Текущее значение ШИМ int n1; int n2; int LED1 = 2; // Пин светодиода 1 int LED2 = 4; // Пин светодиода 2 void setup() { btca2aLite.SetupHardwareSerial(0, 9600); pinMode(D1, OUTPUT); pinMode(D2, OUTPUT); pinMode(LED1, OUTPUT); // Инициализируем пин светодиода 1 pinMode(LED2, OUTPUT); // Инициализируем пин светодиода 2 digitalWrite(LED1, LOW); // Светодиод 1 выключен value = 0; n1=1; //n2=1; //настройка сирены pinMode(10,OUTPUT); // speaker на 10 ноге tone(10,300); // с какой частоты начинать гудеть //настройка мигалки TCCR1A=0; OCR1A=624;// 40ms TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode TIMSK1=1<<OCIE1A; pinMode(9,OUTPUT);// светодиод на 9 ноге pinMode(8,OUTPUT); // светодиод на 8 ноге } void loop() //мигалка { } ISR (TIMER1_COMPA_vect) { static byte n=1; static byte spik=40; static boolean count_direct=false; 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 ) n==35? n=1:n++; //сиренка if (count_direct==false){ spik==100? count_direct=true : spik++; } if (count_direct==true){ spik==40? count_direct=false : spik--; } OCR2A=spik; btca2aLite.ReadCommand(); //управление мигалкой if (btca2aLite.Button(KEYCODE_BUTTON_R2)) { n1=1; } if (n1==1){ PORTB&=B00000000; } if (btca2aLite.Button(KEYCODE_BUTTON_R1)) { n1=0; } else (n1==0); { } //управление сиреной if (btca2aLite.Button(KEYCODE_BUTTON_L2)) { noTone(10);}//n2=1; if (btca2aLite.Button(KEYCODE_BUTTON_L1)) { tone(10,300);}//n1=0; // управление моторами if (btca2aLite.ButtonPressed(KEYCODE_DPAD_UP)) { value = 150; digitalWrite(D1, 0); digitalWrite(D2, 0); } else if (btca2aLite.ButtonPressed(KEYCODE_DPAD_DOWN)) { value = 100; digitalWrite(D1, 1); digitalWrite(D2, 1); } else if (btca2aLite.ButtonPressed(KEYCODE_DPAD_RIGHT)) { value = 80; digitalWrite(D1, 0); digitalWrite(D2, 1); } else if (btca2aLite.ButtonPressed(KEYCODE_DPAD_LEFT)) { value = 80; digitalWrite(D1, 1); digitalWrite(D2, 0); } else { value = 0; } // управление фарами if (btca2aLite.Button(KEYCODE_BUTTON_X)) { digitalWrite(LED1, HIGH); //PORTB&=(0<<0);PORTB&=(0<<0); } if (btca2aLite.Button(KEYCODE_BUTTON_Y)) { digitalWrite(LED1, LOW); } // включение светодиода if (btca2aLite.ButtonPressed(KEYCODE_BUTTON_A)) { digitalWrite(LED2, HIGH); } else{ digitalWrite(LED2, LOW); } { analogWrite(M1, value); // Задаем скорость вращения analogWrite(M2, value); } }san73, конечно не получится, вы же используете команду analogwrite, а она использует таймер2, через который так-же работает и tone(). Тут единственный выход мигалку перенести на таймер вотчдога, как в #18, а сирену переделать на таймер 1.
Мигалку на вотчдог перенес, мигает немного медленнее, но в принципе пойдет. С сиреной пока не получается.
void setup(){ WDTCSR=B00011000; WDTCSR=(1<<WDIE)|(1<<WDP1); pinMode(8,OUTPUT);// светодиод на 8 ноге pinMode(9,OUTPUT);// светодиод на 9 ноге } void loop(){ } ISR (WDT_vect){ //входит в прерывание каждые 64ms static byte n=1; if (n<=6) PORTB^=(1<<1); if (n>=13&&n<=18) PORTB^=(1<<0); n==22? n=1:n++; }san73, как-то так мне видится:
void setup() { pinMode(9,OUTPUT); // speaker pinMode(13,OUTPUT);// светодиод pinMode(12,OUTPUT); // светодиод WDTCSR=(1<<WDCE)|(1<<WDE); WDTCSR=(1<<WDIE)|(1<<WDP0); TCCR1A=(1<<COM1A0)|(1<<WGM11)|(1<<WGM10); //FastPWM Mode15 TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS12); //div 256 } void loop() { } ISR (WDT_vect){ //входит в прерывание каждые 32ms static byte n=1; static byte spik=40; static boolean count_direct=true; if (n<=6) PORTB^=(1<<5);//6 тиков моргать светодиодом на 13 ноге if (n>=18&&n<=23) PORTB^=(1<<4);//6 тиков моргать светодиодом на 12 ноге n==35? n=1:n++; if (count_direct==false) spik==100? count_direct=true:spik++; if (count_direct==true) spik==40? count_direct=false:spik--; OCR1A=spik; }Мигалка на вотч-доге, в егойных прерываниях мигает и говорит таймеру1 с какой частотой ему пищать. Динамик на 10 ногу малыми силами не перенести, таймер в нужном режиме (mode15) её не поддерживает. Так что динамик на 9 ногу сажать.
dimax, молодец, спасибо, таймеры как орехи щелкаешь. Все работает отлично. Для меня это немного тяжеловато дается. Если не трудно подскажи как сиреной можно управлять, включить – выключить.
san73, тут масса вариантов. Можно например таймер1 просто остановить командой TCCR1B^=1<<CS12; ей же можно и снова запустить (это команда инверсии) . Или стандартно включать: TCCR1B|=1<<CS12 и выключать: TCCR1B&=~(1<<CS12)
Спасибо, всё получилось.
san73, в принципе можно сирену к любой ноге приживить почти без изменения кода, если задействовать функцию tone(),
Светодиоды получилось сменить (на А1, А2), а сирену с 10 на 7 нет. Что-то еще заменить?
photomuza, а что строка tone(10,300) ни на что не намекает?
Так есть она у меня, вот код полностью:
void setup() {
//настройка сирены
pinMode(7,OUTPUT); // speaker на 10 ноге
tone(10,300); // с какой частоты начинать гудеть
//настройка мигалки
TCCR1A=0;
OCR1A=624;// 40ms
TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode
TIMSK1=1<<OCIE1A;
pinMode(A1,OUTPUT);// светодиод на A1 ноге
pinMode(A2,OUTPUT); // светодиод на A2 ноге
}
void loop() { }
ISR (TIMER1_COMPA_vect) {
static byte n=1;
static byte spik=40;
static boolean count_direct=false;
if (n<=6) PORTC^=(1<<1);//6 тиков моргать светодиодом на A1 ноге
if (n>=18&&n<=23) PORTC^=(1<<2);//6 тиков моргать светодиодом на A2 ноге
n==35? n=1:n++;
if (count_direct==false){
spik==100? count_direct=true : spik++;
}
if (count_direct==true){
spik==40? count_direct=false : spik--;
}
OCR2A=spik;
}
Так есть она у меня, вот код полностью:
вы правда тупой такой?
Посмотреть описание функции tone() в голову не пришло?
Поторопился ответить. Подумал, в той строке 10 к высоте тона относится. Заменил на 7, работает, спасибо.
вы правда тупой такой?
Посмотреть описание функции tone() в голову не пришло?
В том то и дело что Ардуино для кухарок. Так ведь и до революции недалеко.) Не думаю что это правильно. А ведь раньше это было дело избранных...
Как вставить сирену в код приемника? Настройки сирены - нормально проходят, а вот при вставке самого кода, выдает ошибку. Вставил как у dimax, после void loop(). В самый конец тоже пробовал, та же ошибка. Полный код приемника:
#include <SPI.h> // Подключаем библиотеку для работы с SPI-интерфейсом #include "nRF24L01.h" // Подключаем файл конфигурации из библиотеки RF24 #include "RF24.h" // Подключаем библиотеку для работа для работы с модулем NRF24L01 #include "GyverMotor.h" #include <Servo.h> GMotor motor0(DRIVER2WIRE, 2, 5, HIGH); //IN1 -> PIN2, IN2 -> PIN3 GMotor motor1(DRIVER2WIRE, 4, 6, HIGH); //IN3 -> PIN4, IN4 -> PIN5 Servo myservo; byte servo = 3; // сервопривод на 3 цифровом RF24 radio(9, 10); // CE, CSN модуль nrf24l01 + pa + lna на пинах RF24 radio(9,10); Для Уно/нано. RF24 radio(9,53); для Меги. byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб int recieved_data[15]; //Для nrf24 void setup() { /////////////////настройка сирены/////////////////// pinMode(7,OUTPUT); // speaker на 7 ноге tone(7,300); // цифровой пин, с какой частоты начинать гудеть //настройка мигалки TCCR1A=0; // Если закомментить, мигают по 1 разу OCR1A=624;// 40ms TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //div 1024 CTC mode TIMSK1=1<<OCIE1A; pinMode(A1,OUTPUT);// светодиод на A1 ноге pinMode(A2,OUTPUT); // светодиод на A2 ноге /////////////////настройка сирены/////////////////// Serial.begin(9600); //открываем порт для связи с ПК myservo.attach(servo); // Пины D5 и D6 - 31.4 кГц TCCR0B = 0b00000001; // x1 TCCR0A = 0b00000001; // phase correct motor0.setSmoothSpeed(20); // установка скорости изменения скорости (ускорения) мотора motor0.setMode(AUTO); motor1.setSmoothSpeed(20); // установка скорости изменения скорости (ускорения) мотора motor1.setMode(AUTO); Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) сигнал постабильние radio.enableAckPayload();//разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32);//размер пакета, в байтах radio.openReadingPipe(1, address[0]);//хотим слушать трубу 0 radio.setChannel(0x71);//выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { NRF24L01(); myservo.write(recieved_data[2]); // повернуть серво на угол 0..180 // значение получено с 1 элемента массива setMotorL298(); } void NRF24L01() { if (radio.available() > 0) { radio.read(&recieved_data, sizeof(recieved_data)); } } //////////////////////////КОД СИРЕНЫ////////////////////////////////// ISR (TIMER1_COMPA_vect) { static byte n=1; static byte spik=40; static boolean count_direct=false; if (n<=6) PORTC^=(1<<1);//6 тиков моргать светодиодом на A1 ноге if (n>=18&&n<=23) PORTC^=(1<<2);//6 тиков моргать светодиодом на A2 ноге n==35? n=1:n++; if (count_direct==false){ spik==60? count_direct=true : spik++; // 50-150 - скорость завывания сирены } if (count_direct==true){ spik==40? count_direct=false : spik--; } OCR2A=spik; } //////////////////////////КОД СИРЕНЫ///////////////////////////////// void setMotorL298() { if (recieved_data[0] > 5 || recieved_data[0] < -5) { motor0.smoothTick(recieved_data[0]); } else { recieved_data[0] = 0; motor0.smoothTick(recieved_data[0]); } if (recieved_data[1] > 5 || recieved_data[1] < -5) { motor1.smoothTick(recieved_data[1]); } else { recieved_data[1] = 0; motor1.smoothTick(recieved_data[1]); } }ОШИБКА:
libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':
(.text+0x0): multiple definition of `__vector_11'
sketch\new-RX_Priyoum6_6.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Nano.
сирена использует настройки таймера1, серво тоже использует тот же таймер. Вывод - вместе это работать не будет.
надо разнести на разные таймеры или решать задачу как-то по другому
Ясно, спасибо.
надо разнести на разные таймеры...
Как это реализовать, где почитать про таймеры?