PC booten via IR

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 00:18

Hallo,

Ik ben vrij nieuw met Arduino en heb 2 projecten die beide gelukt zijn.

1. Teensy bord dat als USB keyboard werkt via IR. (voor bediening van mediacenter)
2. Arduino Uno, om via een optocoupler de PC te booten (via de Switch jumpers op het moederbord)

Beide doen wat ze moeten doen, zonder problemen.
Nu wil ik graag alles op het Teensy bord steken maar dat lukt me niet helemaal. Ik zie aan de statusled dat het Teensy bord de hex code van de IR correct binnen krijgt, maar om één of andere reden doet de optocoupler het niet via de Teensy.

In de code heb ik een extra case aangemaakt (zie: BEGIN BOOT) die reageert op een bepaalde toets, specifiek voor het boot gedeelte. Dit is de code van beide projecten samengevoegd:
csharp code
/*
* IRusb - Provide USB keyboard/mouse control via an IR remote.
* Runs on the Teensy, not a standard Arduino: http://www.pjrc.com/teensy/
*
* An IR detector/demodulator must be connected to the input RECV_PIN (10).
* This uses the IRremote library: http://arcfn.com/2009/08/multi-protocol ... brary.html
*
* Copyright 2010 Ken Shirriff
* http://arcfn.com
*/

#include <IRremote.h>


int optoschakel = 4; // BOOT CODE

int teller; // IR CODE
int statusled = 3; // IR CODE
int RECV_PIN = 11; // IR CODE
IRrecv irrecv(RECV_PIN); // IR CODE
decode_results results; // IR CODE

void setup()


{
pinMode(optoschakel, OUTPUT);
pinMode(statusled, OUTPUT); //Voor Statusled // IR CODE
irrecv.enableIRIn(); // Start the receiver // IR CODE
Serial.begin(9600); //irrecv.blink13(true); // Activeren indien Status LED van bordje ipv aparte led // IR CODE

}




int step = 1;

unsigned long lastTime = millis();

#define GAP 10 // ms - tijd tussen toets aanslagen





void loop() {





if (teller < 1100)
{
teller++;
}



if (irrecv.decode(&results))
{
digitalWrite(statusled,HIGH); //voor statusled
//delay(10); //voor statusled
teller = 0;







// We want to repeat mouse moves as long as the button is pressed
// but we don't want to repeat keypresses. So we wait for
// a gap before processing keypresses.
if (millis() - lastTime > GAP) {
step = 1;
}
else if (step < 20) {
step += 1;
}
switch (results.value) {
case 0x9eb92:
Mouse.move(0, -step); // up
break;
case 0x5eb92:
Mouse.move(0, step); // down
break;
case 0xdeb92:
Mouse.move(-step, 0); // left
break;
case 0x3eb92:
Mouse.move(step, 0); //right
break;
default:
if (millis() - lastTime > GAP) {
switch (results.value) {
case 0xd0b92:
Mouse.click();
break;
case 0x20DF08F7:
Keyboard.print("0");
break;
case 0x20DF8877:
Keyboard.print("1");
break;
case 0x20DF48B7:
Keyboard.print("2");
break;
case 0x20DFC837:
Keyboard.print("3");
break;
case 0x20DF28D7:
Keyboard.print("4");
break;
case 0x20DFA857:
Keyboard.print("5");
break;
case 0x20DF6897:
Keyboard.print("6");
break;
case 0x20DFE817:
Keyboard.print("7");
break;
case 0x20DF18E7:
Keyboard.print("8");
break;
case 0x20DF9867:
Keyboard.print("9");
break;

//ZELF TOEGEVOEGDE KEYS LG REMOTE

case 0x20DF10EF: //POWER
Keyboard.print("s");
break;

case 0x20DF9C63: //SUBTITLES
Keyboard.print("t");
break;

case 0x20DF40BF: //VOLUME UP
Keyboard.print("+");
break;

case 0x20DFC03F: //VOLUME DOWN
Keyboard.print("-");
break;

case 0x20DFF10E: //REWIND
Keyboard.print("r");
break;

case 0x20DF718E: //FAST FORWARD
Keyboard.print("r");
break;

case 0x20DF55AA: //INFO
Keyboard.print("i");
break;

case 0x20DF0DF2: //PLAY
Keyboard.print("p");
break;

case 0x20DF8D72: //STOP
Keyboard.print("x");
break;

case 0x20DF4EB1: //OSD ON SCREEN
Keyboard.print("m");
break;

case 0x20DF8E71: //CONTEXTUAL MENU
Keyboard.print("c");
break;

//***************BEGIN BOOT GEDEELTE
case 0x20DF8679: //OSD ON SCREEN
digitalWrite(optoschakel, HIGH);
delay(500);
digitalWrite(optoschakel, LOW);
break;
//***************EINDE BOOT GEDEELTE

case 0x20DF02FD: // UP ARROW
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_UP_ARROW);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF827D: // DOWN ARROW
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_DOWN_ARROW);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DFE01F: // LEFT ARROW
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_LEFT_ARROW);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF609F: // RIGHT ARROW
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_RIGHT_ARROW);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF22DD: // ENTER
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF14EB: // BACK
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_BACKSPACE);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF906F: // MUTE
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_F8);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DF5DA2: // PAUSE
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_SPACE);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;

case 0x20DFC639: // ESC
Serial.print(lastTime - millis(), DEC);
Keyboard.set_key1(KEY_ESC);
Keyboard.send_now();
Keyboard.set_key1(0);
Keyboard.send_now();
break;







default:
Serial.print("Received 0x");
Serial.println(results.value, HEX);
break;
}
}
}
lastTime = millis();
irrecv.resume(); // Resume decoding (necessary!)


}




if (teller > 1000)



{
digitalWrite(statusled,LOW); //voor statusled
//delay(10); //voor statusled


}



}



Iemand tips?

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PC booten via IR

Berichtdoor shooter » 24 Jan 2016, 10:46

het lijkt inderdaad allemaal goed, ik heb natuurlijk wel de opmerking over de delay, die kan roet in het eten gooien omdat de GAP dan niet gehaald wordt.
dus dat kun je ook beter met een millis() doen.
ofwel
in de loop kijk je of de bootled HIGH en timer > 500 dan bootled uit.
in jouw case hoef je dan alleen maar de led en de timer aan te zetten.

Verder is het niet slim om cases te nesten, want dat leest moeilijk.
omdat je gap op 10 staat krijg je vanzelf een mouse.move.
dan doe je bij default het nog een keer en dat hoeft niet.
beter is om alle toetsen in 1 case te zetten .
en als het wat langer wordt dan een functie schrijven voor die toets.
case boot
functieboot();
break

ook voor keyboard send onderste gedeelte een functie maken bijv, keyboardreset.
probeer het allemaal zo te schrijven dat een functie telekns op 1 pagina past.
ook de setup en de loop
paul deelen
shooter@home.nl

Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

Re: PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 11:26

Hey,


Bedankt voor de tips. Ik heb bij wijze van test de code zo simpel mogelijk gemaakt en enkel de opto proberen te schakelen op de Teensy maar dat werkt ook niet. Lijkt me dus dat ik het aan de hardware kant moet zoeken van de Teensy...

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PC booten via IR

Berichtdoor shooter » 24 Jan 2016, 11:40

heb je teensyduino erbij staan, ofwel de juiste board gekozen in de IDE.
en zet je code dan weer hier, dan kijk ik weer.
paul deelen
shooter@home.nl

Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

Re: PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 11:49

Doe ik dadelijk!

Kan het zijn dat de teensy de opto niet kan schakelen omdat hij als USB keyboard ingesteld staat?

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: PC booten via IR

Berichtdoor shooter » 24 Jan 2016, 12:04

dan moet je zoeken of die pin al gebruikt wordt, maar dat lijkt mij niet.
paul deelen
shooter@home.nl

Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

Re: PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 12:30

Als test enkel deze code op de teensy gezet, en hij schakelt nog steeds niet:
Aansluitingen zijn correct want deze code doet het op de Arduino wel. De Teensy is correct geinstalleerd, board staat op Teensy 3.1/3.2, USB type op keyboard/mouse/joystick.

csharp code
#include <IRremote.h> // use the library for IR

int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11
int optoschakel = 4;


IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;




void setup()

{
pinMode(optoschakel, OUTPUT);
irrecv.enableIRIn();
}



void loop()
{
if (irrecv.decode(&results))
{
if (results.value == 0x20DF8679)
{
digitalWrite(optoschakel, HIGH);
delay(100);
digitalWrite(optoschakel, LOW);
//}
}



irrecv.resume();
}
}

Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

Re: PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 12:38

Deze opto gebruik ik, http://www.ti.com/lit/ds/symlink/4n35.pdf
Vraag me nu vooral af of de Teensy wel voldoende spanning geeft tov de Arduino Uno om de optocoupler te schakelen.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: PC booten via IR

Berichtdoor nicoverduin » 24 Jan 2016, 14:47

De teensy heeft 3.3V. Dus moet je de weerstand naar de opto aanpassen. Wat gebruik je nu?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 11
Geregistreerd: 24 Jan 2016, 00:09

Re: PC booten via IR

Berichtdoor JMCSN » 24 Jan 2016, 14:51

nicoverduin schreef:De teensy heeft 3.3V. Dus moet je de weerstand naar de opto aanpassen. Wat gebruik je nu?

Er stond een 220 ohm tussen voor gebruik met de Arduino. Als ik correct ben, heb ik er dan één van 165 ohm nodig. Of ben ik verkeerd? (heb ze helaas niet in huis)

Ik zou ook 5V kunnen nemen van de VIN of VUSB, maar die werken dan niet als output pinmodes. Tenzij ik iets over het hoofd zie.

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 45 gasten