Реализация включение пк с помощью реле и ардурино с ПДУ.
- Войдите на сайт для отправки комментариев
Сб, 19/09/2015 - 21:10
Помогите, пожалуРасказываю свою проблему подробно. Давно мечтал сделать из старого компьютера HTPC. Но не как не мог подобрать хороший пульт. На форуме XBMC люди реализовали пульт с помощью arduino. ПДУ работает как клавиатура. А вкл/выкл пк происходит кратко временнымзамыканием реле на кнопку включение пк. Добрые людис форума поделились скетчем
// ===============================================
// Управление компьютером с помощью Arduino Micro и ИК-пульта
// IR2USB v 0.2
// (c) Nomad
// ===============================================
#include <IRremote.h>
// ===============================================
// пин, на который подключен ИК-датчик
#define ir_dataPin A3
// пин, на который подключен управляющий контакт
// реле включения ПК. Рабочие контакты реле должны
// идти на кнопку <POWER> компьютера.
#define PowerPin 10
#define hold_cycles 17000
// ===============================================
unsigned int nTurn;
unsigned long nPressedButton;
IRrecv irrecv( ir_dataPin );
void setup()
{
nTurn = 0;
nPressedButton = 0;
irrecv.enableIRIn();
Keyboard.begin();
Serial.begin( 9600 );
}
void ReleaseKey()
{
nTurn = 0;
nPressedButton = 0;
Keyboard.releaseAll();
}
decode_results ir_data;
void loop()
{
byte cNewKey = 0;
if( irrecv.decode( &ir_data ))
{
if( ir_data.decode_type == 3 ) ir_data.value |= 0x800;
else if( ir_data.decode_type == 4 ) ir_data.value |= 0x8000;
Serial.print( " type = " );
Serial.print( ir_data.decode_type, DEC );
Serial.print( " code = " );
Serial.print( ir_data.value, HEX );
Serial.print( " bits = " );
Serial.println( ir_data.bits, DEC );
if( ir_data.value == nPressedButton ) ir_data.value = REPEAT;
// Трансляция кодов кнопок пульта в клавиши клавиатуры
switch( ir_data.value )
{
case 0xE01F807F : // Реле включения/выключения компьютера
digitalWrite( 10, LOW );
delay( 100 );
digitalWrite( 10,HIGH );
break;
case 0x1: // Включение ТВ - F1 (10011)
cNewKey = KEY_F1;
break;
case 0x80C: // Выключение ТВ - F2
cNewKey = KEY_F2;
break;
case 0x80A: // Language - L
cNewKey = 'l';
break;
case 0x838: // Menu - O
cNewKey = 'o';
break;
case 0x836: // Guide - G (11111)
cNewKey = 'g';
break;
case 0x95F: // Context menu - C (22222)
cNewKey = 'c';
break;
case 0x83B: // Back
cNewKey = KEY_BACKSPACE;
break;
case 0x834: // [Blue] Home
cNewKey = KEY_ESC;
break;
case 0x945: // [Green] Переключение звука - ТВ/ресивер - F7 (00093)
cNewKey = KEY_F7;
break;
case 0x812: // Volume Up - F10 (00111)
cNewKey = KEY_F10;
break;
case 0x959: // Volume Down - F9 (00222)
cNewKey = KEY_F9;
break;
case 0x80D: // Mute - F8
cNewKey = KEY_F8;
break;
case 0x966: // ChUp (00001)
cNewKey = KEY_PAGE_UP;
break;
case 0x97E: // ChDown (00002)
cNewKey = KEY_PAGE_DOWN;
break;
case 0xE01F9A65: // Up
cNewKey = KEY_UP_ARROW;
break;
case 0xE01F1AE5: // Left
cNewKey = KEY_LEFT_ARROW;
break;
case 0xE01FBA45 : // OK
cNewKey = KEY_RETURN;
break;
case 0xE01F7A85: // Right
cNewKey = KEY_RIGHT_ARROW;
break;
case 0xE01F3AC5: // Down
cNewKey = KEY_DOWN_ARROW;
break;
case 0x83C:
// Rew - R
cNewKey = 'r';
break;
case 0x82B: // Play - P
cNewKey = 'p';
break;
case 0x83F: // FF - F
cNewKey = 'f';
break;
case 0xD35: // Prev - , (00091)
cNewKey = ',';
break;
case 0x829: // Pause - " "
cNewKey = ' ';
break;
case 0x94D: // Next - . (00092)
cNewKey = '.';
break;
case 0x82E: // Stop - X
cNewKey = 'x';
break;
case 0x801: // 1
cNewKey = '1';
break;
case 0x802: // 2
cNewKey = '2';
break;
case 0x803: // 3
cNewKey = '3';
break;
case 0x804: // 4
cNewKey = '4';
break;
case 0x805: // 5
cNewKey = '5';
break;
case 0x806: // 6
cNewKey = '6';
break;
case 0x807: // 7
cNewKey = '7';
break;
case 0x808: // 8
cNewKey = '8';
break;
case 0x809: // 9
cNewKey = '9';
break;
case 0x800: // 0
cNewKey = '0';
break;
default:
nTurn = 0;
}
irrecv.resume();
}
if( cNewKey )
{
if( nPressedButton ) ReleaseKey();
nPressedButton = ir_data.value;
Keyboard.press( cNewKey );
}
else if( nPressedButton )
{
if( ++nTurn >= hold_cycles ) ReleaseKey();
}
}
Проблема заключается в том что, поменял я код кнопки ПДУ на свой. Но замыкания реле не происходит. Реле куплено специально для ардуино
Удалите эту тему!
Для начала настрой 10 пин на выход - http://arduino.ru/Reference/PinMode
Удалите эту тему!
Ещё одну будешь открывать?
Я когда создал тему обнаружил, что моих висит уже две темы. открыл обе и обнаружил что одна дописана, а вот эта только кусок.
Подскажите в какуюстроку вставить pinmode. Я просто в этом полный ноль. впервые встретился ардуино.(
Подскажите в какуюстроку вставить pinmode. Я просто в этом полный ноль. впервые встретился ардуино.(
По ссылке выше есть пример кода. Вставляется в функцию void setup(), она у вас в скетче уже есть.
Да, ещё - реле у вас включается низким уровнем (LOW), поэтому нужно перед pinMode() установить высокий уровень digitalWrite(10, HIGH). Иначе реле будет включено сразу после включения ардуины.
Короче, должно быть так:
digitalWrite(10, HIGH);
pinMode(10, OUTPUT);
Подскажите в какуюстроку вставить pinmode. Я просто в этом полный ноль. впервые встретился ардуино.(
По ссылке выше есть пример кода. Вставляется в функцию void setup(), она у вас в скетче уже есть.
Да, ещё - реле у вас включается низким уровнем (LOW), поэтому нужно перед pinMode() установить высокий уровень digitalWrite(10, HIGH). Иначе реле будет включено сразу после включения ардуины.
Короче, должно быть так:
digitalWrite(10, HIGH); pinMode(10, OUTPUT);
Огромное спасибо) Реле заработало. Но остался один вопрос. Если я пишу high то на реле горит постоянно зеленый светодид. при нажатии кнопки тухнет и снова загорается. а если low то не горит и при нажатии загорается . Какой правильный алгоритм работы реле оно должно быть постоянно работать.(то есть зеленый светодиод горит или наоборот?
Огромное спасибо) Реле заработало. Но остался один вопрос. Если я пишу high то на реле горит постоянно зеленый светодид. при нажатии кнопки тухнет и снова загорается. а если low то не горит и при нажатии загорается . Какой правильный алгоритм работы реле оно должно быть постоянно работать.(то есть зеленый светодиод горит или наоборот?
смотрю количество идиотов прогресирует... может идиотизм это инфекция какая?
Если я пишу high то на реле горит постоянно зеленый светодид. при нажатии кнопки тухнет и снова загорается. а если low то не горит и при нажатии загорается . Какой правильный алгоритм работы реле оно должно быть постоянно работать.(то есть зеленый светодиод горит или наоборот?
Модуль реле обычно имеет три контакта для подключения нагрузки: центральный (общий) и два боковых. Один боковой контакт постоянно замкнут на центральный (общий) (нормально замкнутые контакты) и размыкается при включении реле. Второй боковой контакт наоборот - постоянно разомкнут с центральным (общим) (нормально разомкнутые контакты) и замыкается при включении реле.
Чтобы у вас "нажималась кнопка" кратковременной подачей высокого уровня, а в остальное время реле было выключено - нужно подключить эту "кнопку" к реле к нормально разомкнутым контактам.
P.S. Я так понял, реле всё-таки включается высоким уровнем (HIGH), Значит поменять ещё в коде:
.....
Модуль реле обычно имеет три контакта для подключения нагрузки: центральный (общий) и два боковых. Один боковой контакт постоянно замкнут на центральный (общий) (нормально замкнутые контакты) и размыкается при включении реле. Второй боковой контакт наоборот - постоянно разомкнут с центральным (общим) (нормально разомкнутые контакты) и замыкается при включении реле.
Чтобы у вас "нажималась кнопка" кратковременной подачей высокого уровня, а в остальное время реле было выключено - нужно подключить эту "кнопку" к реле к нормально разомкнутым контактам.
P.S. Я так понял, реле всё-таки включается высоким уровнем (HIGH), Значит поменять ещё в коде:
.....
Еще раз благодарю, выручили! Теперь не вставая с дивана буду управлять медиатекой)