IR-управление в режиме удержания
- Войдите на сайт для отправки комментариев
Втр, 25/06/2013 - 17:14
Собрал вот такой скетч с функцией включения пинов в тригерном режиме:
#include <IRremote.h> // int RECV_PIN = 2; //vkhod IK priyemnika IRrecv irrecv(RECV_PIN); decode_results results; int a=0; // peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1 int b=0; // void setup() { irrecv.enableIRIn(); // vklyuchit? priyemnik pinMode(3, OUTPUT); pinMode(5, OUTPUT); // naznachayem piny kak vykhody } void loop() { if (irrecv.decode(&results)) { delay(300); // zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye if (results.value == 0xCD1A) {a=a+1;} // obrabotka nazhitya klavishi , zdes? peremennaya prinimayet znacheniye +1 if (results.value == 0xCD9A) {b=b+1;} //kod knopki pulta // nachinayem vklyuchat? svetodiody na pinakh if (a==1){digitalWrite(3, HIGH);} else {digitalWrite(3, LOW); a=0;} // deystviye posle nazhatiya knopki , yesli peremennaya stala ravna 1 to if (b==1){digitalWrite(5, HIGH);} else {digitalWrite(5, LOW); b=0;} // proizvesti pereklyucheniye pina v rezhim HIGH, yesli zhe net to vernut? peremennuyu v iskhodnoye sostoyaniye { // delay(50); //pauza mezhdu povtorami // } // irrecv.resume(); // } }
Как написать аналогичный скетч с режимом удержания кнопки (горит при нажатие, гаснет при отпускание кнопки)?.
тоже ломал голову. дело в том что когда я делал управление танком ик пультом и через терминал смотрел коды пульта от телека и не только все пульты первую команду выдают свою а при дальшейшем нажатии FFFFFF. может конечно библиотека не очень была, незнаю. попытался сделать условие удрежания последней команды если идет команда FFFFFF. не получилось. не держит. может на самом деле там не чисто FFFFFF а сплошной поток F был. незнаю. ну или больше символов и изза этого не отрабатывала. в итоге забил. сделал триггер и кнопку сброса всех кнопок
тоже ломал голову. дело в том что когда я делал управление танком ик пультом и через терминал смотрел коды пульта от телека и не только все пульты первую команду выдают свою а при дальшейшем нажатии FFFFFF. может конечно библиотека не очень была, незнаю. попытался сделать условие удрежания последней команды если идет команда FFFFFF. не получилось. не держит. может на самом деле там не чисто FFFFFF а сплошной поток F был. незнаю. ну или больше символов и изза этого не отрабатывала. в итоге забил. сделал триггер и кнопку сброса всех кнопок
А как сделать кнопку сброса?
да просто. я делал так.
нажимаю вперед- оба двигателя вперед
нажимаю назад-оба двигателя назад
нажимаю влево- левый назад, правый вперед
нажимаю вправо-левый вперед, правый назад
нажимаю среднюю кнопку (ее сделал для сброса)- все двигатели стоп
управление неудобное скажу честно, но для теста пойдет
потом прикрутил к ардуине беспроводной джойстик от PS2, стоит в районе 300 рублей
http://www.ebay.com/itm/Black-2-4Ghz-Wireless-Game-Pad-Game-Controller-Joystick-For-PS2-With-Receiver-/111093953985?pt=US_Video_Game_Controllers&hash=item19ddb735c1
библиотеку и скетч могу дать. теперь он у меня и вперед, и вперед и одновременно налево, и все с регулировкой скорости, то есть может быстро ехать а можно и помедленее, и в повороте можно немного сбросить скорость
вечером фотки выложу своего танка с пушкой гаусса
к тому же скоро решу вопрос с ардуино на атмега8, будет очень маленькая плата, и драйвер на 74HC00 и транзисторых сборках. тоже поделюсь как опробую в железе. в протеусе все гуд
а дальше хочу сделать управление с телефона на андройде по блютуз. вроде как проблемм пока никаких не нашел. блютуз вчера пришел. скоро буду тестить.
блютуз стоит 160 рублей плата. питание 3.3 в и логические уровни 3.3. есть напаянные на плату переходник с питанием 5В и логикой 5В, но стоит почти на 100 рублей дороже. я подумал стабилизатор и 4 резистора+плата не стоят 100 рублей и купил вот эту:
http://www.ebay.com/itm/New-High-Quality-Wireless-Bluetooth-Transceiver-Module-RS232-TTL-Antenna-/280766901603?pt=AU_B_I_Electrical_Test_Equipment&hash=item415f02ed63
программы на google play имеются, у многих в свободном доступе библиотеки
например эти:
https://play.google.com/store/apps/details?id=appinventor.ai_picoware.BTBotControlLite&feature=search_result
https://play.google.com/store/apps/details?id=org.projectproto.btjoystick&feature=search_result
https://play.google.com/store/apps/details?id=com.ebarch.ipgamepad&feature=search_result
Скинь конечно. Управление джостиком от PS2 очень интересно.
Я только так и не понял, как сделать сброс всех кнопок...
Скинь конечно. Управление джостиком от PS2 очень интересно.
Скину завтра. можно использовать как проводной так и беспроводной (беспроводной конечно интереснее)
тестировал на 10 метров через 2 стены межкомнатные. в принципе достаточно
Я только так и не понял, как сделать сброс всех кнопок...
ну не знаю. попробую по другому. вперед назад налево направо это понятно. а сброс это на самом деле не сброс а просто остановить все двигатели. то есть ничего не подавать, а точнее подать 0 на все четыре входа драйвера
тот пульт питается от 4 мизинчиковых батареек, что очень недобно.
советую переделать по li-ion аккумулятор
удобно использовать модуль зарядки
http://www.ebay.com/itm/KDQ10-NEW-5V-USB-CHARGING-BOARD-CHARGER-MODULE-FOR-1A-LITHIUM-BATTERY-SCA-1706-/370846534295?pt=Battery_Chargers&hash=item56582d0a97
и какой нибудь преобразователь 5В, например этот
http://www.ebay.com/itm/1PC-New-1A-3V-to-5V-DC-DC-Converter-Step-Up-Boost-Module-/380655215690?pt=AU_B_I_Electrical_Test_Equipment&hash=item58a0d1a44a
от 5 вольт нормально работает
Библиотека для джойстика
http://yadi.sk/d/Os8hIZO26QM3k
а вот скетч на работе. завтра если не удалил выложу
как и обещал скетчи для пульта от PS2
1 вариант управление аналоговым джойстиком
2 вариант с крестиком. мне лично больше понравился так как проще сделать полный ход с небольшим поворотом. с аналоговым тяжелее. сам попробуешь написать программу поймешь
Как написать аналогичный скетч с режимом удержания кнопки (горит при нажатие, гаснет при отпускание кнопки)?.
Я видел видео этого человека и использовал его библиотеку. только вот у него 1 из 3 пультов выдавал при долгом нажатии один и тот же код , а 2 других после своего кода выдавал если держать дальше FFFFFFFF. у меня дома ни один пульт так и не выдавал свой код постоянно. может дело конечно в библиотеке. поэтому я незнаю. я конечно его не пробовал этот код по возможности попробую. но врядли
Димка, спасибо! Очень благодарен за видео и примеры.
Все проверил. Все работает!
Димка, спасибо! Очень благодарен за видео и примеры.
Все проверил. Все работает!
Димка, спасибо! Информация бесценная и очень полезная. Дмитрий а ты не хотел собрать маленький ЧПУ-станок на базе Arduino? Вот ссылка посмотри: http://www.estlcam.com/
Дмитрий, скажите как написать скетч в режиме триггера, что бы нажатие на последующую кнопку останавливало работу работающих пинов?
Пример: Имеем две кнопки ">>-вправо", "<<- влево" и два светодиода на пинах 5, 6.
Нажимаем на кнопку ">>-вправо" загорается светодиод на пине 5. Далее нажимаем кнопку "<<-влево" эта команда сначала должна отключить работающий светодиод на 5-м пине (отключение первой команды ">>-вправо") и зажечь уже свой светодиод на пине 6.
Тоесть перед выполнением своей команды кнопка должна сначала сбросить выполнение команд других уже работающих кнопок.
Заносите нажатие кнопки в массив (пин), а при необходимости проходите его "гася" пины и обнуляете значения.
Заносите нажатие кнопки в массив (пин), а при необходимости проходите его "гася" пины и обнуляете значения.
Можно на примере?
Смотрите, у меня вот такой скетч, он управляет пинами с ИК-пульта в режиме триггер. Как подружить Ваши команды с моими?
01
#include <IRremote.h> //
02
03
int
RECV_PIN = 2;
//vkhod IK priyemnika
04
IRrecv irrecv(RECV_PIN);
05
decode_results results;
06
int
a=0;
// peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1
07
int
b=0;
//
08
09
void
setup
()
10
{
11
irrecv.enableIRIn();
// vklyuchit? priyemnik
12
13
pinMode(3, OUTPUT);
14
pinMode(5, OUTPUT);
// naznachayem piny kak vykhody
15
}
16
void
loop
() {
17
if
(irrecv.decode(&results)) {
18
delay(300);
// zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye
19
20
if
(results.value == 0xCD1A) {a=a+1;}
// obrabotka nazhitya klavishi , zdes? peremennaya prinimayet znacheniye +1
21
if
(results.value == 0xCD9A) {b=b+1;}
//kod knopki pulta
22
// nachinayem vklyuchat? svetodiody na pinakh
23
if
(a==1){digitalWrite(3, HIGH);}
else
{digitalWrite(3, LOW); a=0;}
// deystviye posle nazhatiya knopki , yesli peremennaya stala ravna 1 to
24
if
(b==1){digitalWrite(5, HIGH);}
else
{digitalWrite(5, LOW); b=0;}
// proizvesti pereklyucheniye pina v rezhim HIGH, yesli zhe net to vernut? peremennuyu v iskhodnoye sostoyaniye
25
26
{
//
27
delay(50);
//pauza mezhdu povtorami //
28
}
//
29
irrecv.resume();
//
30
31
}
32
33
}
Вы код не из ворда случайно вставляли? Редактировать его нет никакой возможности )))) Если Вы будете "правильно" (тут реальный вброс на много страниц флуда :) форматировать код, то его будет легче (и Вам тоже) читать. Как пример посмотрите как у меня отформатирован if. У Вас значения а и b не могут принимать значения > 1, поэтому 4 if-a можно сократить до двух
Вы код не из ворда случайно вставляли? Редактировать его нет никакой возможности )))) Если Вы будете "правильно" (тут реальный вброс на много страниц флуда :) форматировать код, то его будет легче (и Вам тоже) читать. Как пример посмотрите как у меня отформатирован if. У Вас значения а и b не могут принимать значения > 1, поэтому 4 if-a можно сократить до двух
Из блокнота). Я реально не понимаю, что мне нужно делать в данном скетче. Я пробывал
else
{digitalWrite(5, LOW); b=0;} при нажатие на кнопку управляющую пином 3. При такой комбинации противоположный пин гаснет как надо но вот, что бы запустить следущий пин нужно отжимать всеровно кнопку пина 5. Вобщем данная комбинация не подходит. Если не трудно помоги?!
В комментариях есть поле "code" - туда надо вставлять прямо из скетча, он сам прваильно отформатирует. Вы знаете как на бумаге правильно составлять алгоритмы? Это я не к тому что я такой умный :) Вам написать скетч или Вы хотите разобраться научиться?
В комментариях есть поле "code" - туда надо вставлять прямо из скетча, он сам прваильно отформатирует. Вы знаете как на бумаге правильно составлять алгоритмы? Это я не к тому что я такой умный :) Вам написать скетч или Вы хотите разобраться научиться?
Хочу и то и другое)
С процесингом все очень плохо. Радует одно, что было еще хуже.
почитайте вот это http://mini-soft.ru/soft/vba/r_2.php и попробуйте нарисовать свой алгоритм на бумажке
И код свой из скетча вставьте сюда правильно, тогда я смогу его менять :)
так мы уличшим читаемость:
смотри, у тебя переменные a и b как только принимают значение 1, так сразу выполняется ниже условия и они сбрасываются на 0, значит мы можем действия запихнуть в один if
так мы уличшим читаемость:
смотри, у тебя переменные a и b как только принимают значение 1, так сразу выполняется ниже условия и они сбрасываются на 0, значит мы можем действия запихнуть в один if
Почемуто не первый не второй скетч не работают.
первый это твой, просто с пробелами и отступами
первый это твой, просто с пробелами и отступами
Я знаю. Только он тоже почему то перестал работать((( Тот который некоректированный работает.
Он уже в самом первом варианте нерабочий был - смотрим строки 26-28 из ниоткуда фигурные скобки. чтото при копировании потерялось )))
Он уже в самом первом варианте нерабочий был - смотрим строки 26-28 из ниоткуда фигурные скобки. чтото при копировании потерялось )))
У меня не получается(((
Максим, спасибо! Ты прям в точку попал. Супер-скетч!
я наверняка зануда, но Вы бы не могли объяснить зачем в этом скетче переменные a и b?
Я переделал то, что меня попросили. Потому сильно ничег оне менял. В переменную a сохраняем как бы статус первой кнопки пульта, в переменную b - статус второй.
Подскажите, пожалуйста. Можно реализовать смешанный режим (удержания и тригерный). Объясню на примере:
Есть светодиод и пульт. Пришел сигнал с пульта - светодиод включился, отпустили кнопку пульта, нажали еще раз - светодиод погас. При удержании кнопки светодиод включается и выключается. Нужно усложнить задачу:
Нажимаем на кнопку пульта - светодиод включается, не отпуская удерживаем кнопку - ничего не происходит (светодиод горит), отпускаем кнопку - светодиод продолжает гореть, нажимаем еще раз кнопку - светодиод гаснет, удерживаем кнопку - ничего не происходит (светодиод не горит).
Хочется релизовать включение обычного бытового телевизора, ведь если мы его включаем и удерживаем кнопку, то телевизор просто включается и далее ничего не происходит. Мне же пока удалось добиться, что при удержании кнопки светодиод включается и сразу же выключается, что не является допуститмым.
Dimka, делаю клиент на ESP8266, который принимает коды от пульта и отправляет состояние нажатой/отжатой кнопки на сервер. На сервер приходят сообщения с частотой примерно 0,5 сек, что состояние кнопки меняется, хотя кнопка удерживается. При этом timerPin тоже меняет свое значение (BTN12=1 BTN12=0 BTN12=1 BTN12=0 BTN12=1 BTN12=0 BTN12=1 BTN12=0)
Не хватает мне знаний, где искать. Если этот код без клиентской части и отправлять значения просто в Serial то все четко. #include <IRremoteESP8266.h> #include <ESP8266WiFi.h> WiFiClient client; const char* ssid = "****"; const char* password = "****"; const char* host = "192.168.100.63"; const int Port = 2400; //переменные для ИК приемника #define MAXBTN 42 int RECV_PIN = 12; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; //eventTime, для паузы, вместо delay,будем использовать функцию millis. unsigned long eventTime=0; //индикация таймера int timer = 13; int timerFlag = 0; int counter[MAXBTN]={}; // для всех кнопок кроме тех, которые нужны для последовательных команд,например UP,DOWN,LEFT,RIGHT, VOL-, VOL+, CH-, CH+ String tempCmd; long hexCodeArray[MAXBTN]= { 0xE0E020DF,0xE0E0A05F,0xE0E0609F,0xE0E010EF,0xE0E0906F,0xE0E050AF,0xE0E030CF,0xE0E0B04F,0xE0E0708F,0xE0E0C43B, 0xE0E08877,0xE0E0D32C,0xE0E0E01F,0xE0E0D02F,0xE0E0C837,0xE0E0F00F,0xE0E048B7,0xE0E008F7,0xE0E058A7,0xE0E013EC, 0xE0E0F30C,0xE0E006F9,0xE0E08679,0xE0E0A659,0xE0E046B9,0xE0E016E9,0xE0E0738C,0xE0E0F807,0xE0E08F70,0xE0E036C9, 0xE0E028D7,0xE0E0A857,0xE0E06897,0xE0E05EA1,0xE0E01FE0,0xE0E053AC,0xE0E0C23D,0xE0E034CB,0xE0E0807F,0xE0E0B34C, 0xE0E0B44B,0xE0E040BF }; void setup() { irrecv.enableIRIn(); // включить приемник pinMode(timer, OUTPUT); Serial.begin(115200); delay(10); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ir_recv(); } void ir_recv() { if (digitalRead(RECV_PIN) == LOW) { // Если обнаружен орицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH); eventTime=micros(); digitalWrite(timer, HIGH); timerFlag = 1; } // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW) if (micros()-eventTime > 100000) { // индикация и флаг digitalWrite(timer, LOW); timerFlag = 0; for (int i=0;i<MAXBTN;i++){ // определение долгого/короткого удержания кнопок if (counter[i] > 0){ tempCmd = "BTN" + String(i) + "=" + String(timerFlag); //sendCmd(tempCmd); client.connect(host, Port); client.println(tempCmd); Serial.println(); Serial.println("disconnecting."); client.stop(); } counter[i] = 0; } } //прием ИК команд if (irrecv.decode(&results)) { for (int k=0;k<MAXBTN;k++){ if (results.value == hexCodeArray[k] && timerFlag == 1){ counter[k]++; //счетчик присланных команд от кнопки } if (timerFlag && counter[k] == 1){ tempCmd = "BTN" + String(k) + "=" + String(timerFlag); //sendCmd(tempCmd); client.connect(host, Port); client.println(tempCmd); Serial.println(); Serial.println("disconnecting."); client.stop(); } } irrecv.resume(); } }
тоже ломал голову. дело в том что когда я делал управление танком ик пультом и через терминал смотрел коды пульта от телека и не только все пульты первую команду выдают свою а при дальшейшем нажатии FFFFFF. может конечно библиотека не очень была, незнаю. попытался сделать условие удрежания последней команды если идет команда FFFFFF. не получилось. не держит. может на самом деле там не чисто FFFFFF а сплошной поток F был. незнаю. ну или больше символов и изза этого не отрабатывала. в итоге забил. сделал триггер и кнопку сброса всех кнопок
Конечно чтобы включить-выключить нужна одна кнопка, а не две. Сделал пример для светодиода - светит пока удерживаем кнопку, гаснет после отпускания с задержкой 200 мс.