Помогите объединить два скетча
- Войдите на сайт для отправки комментариев
Всем привет!
Есть скетч управления двухколесным шаси пультом дистанционногоуправления через ИК.
#include <IRremote.h> #include <AFMotor.h> int RECV_PIN = 9;//вход ИК приемника AF_DCMotor motor_a(1, MOTOR12_64KHZ); AF_DCMotor motor_b(2, MOTOR12_64KHZ); IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); // включить приемник motor_a.setSpeed(255); motor_b.setSpeed(255); } void loop() { if (irrecv.decode(&results)){ if (results.value == 0x806FE01F) { //вперед motor_a.run(FORWARD); motor_b.run(FORWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } if (results.value == 0x806FF00F) { //назад motor_a.run(BACKWARD); motor_b.run(BACKWARD); delay(1000); motor_a.run(RELEASE); motor_b.run(RELEASE); } if (results.value == 0x806F20DF) { //налево motor_a.run(BACKWARD); motor_b.run(FORWARD); delay(500); motor_a.run(RELEASE); motor_b.run(RELEASE); } if (results.value == 0x806F50AF) { //направо motor_a.run(FORWARD); motor_b.run(BACKWARD); delay(500); motor_a.run(RELEASE); motor_b.run(RELEASE); } irrecv.resume(); } }
но работает это все только по нажатию соответствующей кнопки заданное количество времени и пока например робот не проедет заданные заранее 3 секунды он не реагирует на нажатие других кнопок и т.д.
Хочется сделать чтобыробот двигался например вперед только до тех пор пока нажата соответствующая кнопка на пульте и после того как отпускаю кнопку робот останавливался...
Нашел вот такой скетч:
#include <IRremote.h> // это скачанная библиотека int RECV_PIN = 11; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; //eventTime, для паузы, вместо delay,будем использовать функцию millis. unsigned long eventTime=0; //индикация таймера int timer = 12; int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно. int L2 = 2; int L3 = 3; int L4 = 4; int L5 = 5; int L6 = 6; int L7 = 7; int L8 = 8; void setup(){ irrecv.enableIRIn(); // включить приемник pinMode(L13, OUTPUT); // назначаем пины как выходы pinMode(L2, OUTPUT); pinMode(L3, OUTPUT); pinMode(L4, OUTPUT); pinMode(L5, OUTPUT); pinMode(L6, OUTPUT); pinMode(L7, OUTPUT); pinMode(L8, OUTPUT); pinMode(timer, OUTPUT); } void loop() { // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный. //После появление и пропадания сигнала, состояние сразу не меняется! а ждет 100 миллисекунд. //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд. //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен. // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал if (digitalRead(RECV_PIN) == LOW) // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH); eventTime=millis(),digitalWrite(timer, HIGH); // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW) if(millis()-eventTime>100) digitalWrite(timer, LOW) // и вЫключаем все ,digitalWrite(L13, LOW),digitalWrite(L2, LOW),digitalWrite(L3, LOW) ,digitalWrite(L4, LOW),digitalWrite(L5, LOW),digitalWrite(L6, LOW),digitalWrite(L7, LOW),digitalWrite(L8, LOW); if (irrecv.decode(&results)) { //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, - //-у вашего пульта будет другой код, замените на свой! // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала, чтобы обойти эту проблему //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77 // Теперь неважно какой код отправлен с кнопки пульта, первый или второй // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809 //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH) // включаем нужный нам pin, digitalWrite(L13, HIGH); if (results.value == 0x1000809 || results.value == 0xF7283C77 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH); if (results.value == 0x1008889 || results.value == 0x757FB4DF && (digitalRead(timer) == HIGH) )digitalWrite(L2, HIGH); if (results.value == 0x1004849 || results.value == 0xB33B4597 && (digitalRead(timer) == HIGH) )digitalWrite(L3, HIGH); if (results.value == 0x100C8C9 || results.value == 0x3C03E507 && (digitalRead(timer) == HIGH) )digitalWrite(L4, HIGH); if (results.value == 0x1002829 || results.value == 0xE705551F && (digitalRead(timer) == HIGH) )digitalWrite(L5, HIGH); if (results.value == 0x100A8A9 || results.value == 0xA4A58EC7 && (digitalRead(timer) == HIGH) )digitalWrite(L6, HIGH); if (results.value == 0x1006869 || results.value == 0xE2E45F7F && (digitalRead(timer) == HIGH) )digitalWrite(L7, HIGH); if (results.value == 0x100E8E9 || results.value == 0x6BACFEEF && (digitalRead(timer) == HIGH) )digitalWrite(L8, HIGH); irrecv.resume(); } }
Но этот скетч сделан на примере светодиодов и на библиотеке <IRremote.h>
Подскажите как можно объеденить эти два скетчана библиотеках <IRremote.h> и <AFMotor.h> (или без них) чтобы робот двигался только когда нажата соответствующая кнопка?
Мои попытки объединения не увенчались успехом....
Заранее благодарю каждого откликнувшегося и пошедшего мне на помощь!
Что ж все никак не осилите, то... ведь тут не навыки программирования нужны, а всего лишь придумать логику работы...
Если как то не так заработает, то думаю ход мыслей ясен...
Что ж все никак не осилите, то... ведь тут не навыки программирования нужны, а всего лишь придумать логику работы...
Если как то не так заработает, то думаю ход мыслей ясен...
Блин, все работает, только не всегда стабильно реагирует на кнопки, видимо из-за хлама которые сыпятся при нажитии на ту или иную кнопку, но это можно поправить (добавив параллельные коды кнопок) спасибо вам за помощь, я уже несколько дней не могу добиться этого эффекта.
P.S. По моим наблюдениям Вы на этом форуме единственный настоящий профессианал который не просто знает, но и не брезгует в помощи тем людям которые хотят, но по каким то причинам не могут сделать то что хотят! Когда создаю новую тему всегда надеюсь и жду когда Вы будете в онлайне! Спасибо Вам!
только не всегда стабильно реагирует на кнопки
только не всегда стабильно реагирует на кнопки
Да, уже попробовал, уменьшил до 30 стало дергаться рывками, увеличил до 200 стало заметно лучше но после нажатия кнопки нужно немного больше времени ждать для следующего нажатия,оставил 150-вроде самое оптимальное получилось))
Скажите, а можно как то сделать чтобы мое "творение" ехало прямо когда я нажимаю вперед, просто у меня сейчас она едет по небольшому радиусу как бы слегка поворачивает направо, а вот когда еду назад то едет ровно?!
есть такие штуковины и еще такая незнаю может ли это как топомочь в моей проблеме....
Снизте скорость левого мотора, когда едете вперед:
Снизте скорость левого мотора, когда едете вперед:
Получилось)Спасибо!
Немного отойду от темы...
подключаю сонар по этой схеме
заливаю этот скетч
Но при попытке залить скетч выскакивает ошибка
В чем может быть проблема?