PS2/USB billentyűzet emulálás

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Sziasztok,

segítséget kérnék, mivel eléggé kezdő vagyok a témában.
Tulajdonképpen egy egyszerű makrót szeretnék megírni, amit egy gomb nyomásra kiküldené egy PC-re. Ilyen jobbra nyíl 3x, le 2x, enter stb.
Meg egy kimenetet is átváltana (monitor váltó kapcsoló) stb. Az ilyen gomb kezelés kimenet váltás stb. könnyű feladat a példa tárak és a tanfolyam után.
Gondolom, hogy lehet valami hasonló megoldással "kezelni" a PS2 vagy USB billentyűzet kimenetet, mint ahogy a soros portra küldök ki ilyen kis szöveges üzeneteket
Mint pl. ez is: UsbKeyboard.sendKeyStroke(KEY_H);

Találtam is valamit ami szerintem nekem való: http://code.rancidbacon.com/ProjectLogArduinoUSB
Viszont nem értem én teljesen ezt.
Sem az UsbKeyboardDemo1.pde-ben

Kód: Egész kijelölése

#include "UsbKeyboard.h"

#define BUTTON_PIN 12

// If the timer isr is corrected
// to not take so long change this to 0.
#define BYPASS_TIMER_ISR 1

void setup() {
  pinMode(BUTTON_PIN, INPUT);
  digitalWrite(BUTTON_PIN, HIGH);
  
#if BYPASS_TIMER_ISR
  // disable timer 0 overflow interrupt (used for millis)
  TIMSK0&=!(1<<TOIE0); // ++
#endif
}

#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
   /*
  */ 
  for (int i = 0; i < ms; i++) {
    delayMicroseconds(1000);
  }
}
#endif

void loop() {
  
  UsbKeyboard.update();

  digitalWrite(13, !digitalRead(13));

  if (digitalRead(BUTTON_PIN) == 0) {
    
    //UsbKeyboard.sendKeyStroke(KEY_B, MOD_GUI_LEFT);
    
    UsbKeyboard.sendKeyStroke(KEY_H);
    UsbKeyboard.sendKeyStroke(KEY_E);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_O);

    UsbKeyboard.sendKeyStroke(KEY_SPACE);

    UsbKeyboard.sendKeyStroke(KEY_W);
    UsbKeyboard.sendKeyStroke(KEY_O);
    UsbKeyboard.sendKeyStroke(KEY_R);
    UsbKeyboard.sendKeyStroke(KEY_L);
    UsbKeyboard.sendKeyStroke(KEY_D);
    //UsbKeyboard.sendKeyStroke(KEY_B, MOD_GUI_LEFT);

    UsbKeyboard.sendKeyStroke(KEY_ENTER);
#if BYPASS_TIMER_ISR  // check if timer isr fixed.
    delayMs(20);
#else
    delay(20);
#endif
    
   }

} 
Sem az UsbKeyboard.h-ban

Kód: Egész kijelölése

/*
 * Based on Obdev's AVRUSB code and under the same license.
 *
 * TODO: Make a proper file header. :-)
 */
#ifndef __UsbKeyboard_h__
#define __UsbKeyboard_h__

#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <string.h>

#include "usbdrv.h"

// TODO: Work around Arduino 12 issues better.
//#include <WConstants.h>
//#undef int()

typedef uint8_t byte;


#define BUFFER_SIZE 4 // Minimum of 2: 1 for modifiers + 1 for keystroke 


static uchar    idleRate;           // in 4 ms units 


/* We use a simplifed keyboard report descriptor which does not support the
 * boot protocol. We don't allow setting status LEDs and but we do allow
 * simultaneous key presses. 
 * The report descriptor has been created with usb.org's "HID Descriptor Tool"
 * which can be downloaded from http://www.usb.org/developers/hidpage/.
 * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted
 * for the second INPUT item.
 */
PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
  0x05, 0x01,                    // USAGE_PAGE (Generic Desktop) 
  0x09, 0x06,                    // USAGE (Keyboard) 
  0xa1, 0x01,                    // COLLECTION (Application) 
  0x05, 0x07,                    //   USAGE_PAGE (Keyboard) 
  0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl) 
  0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI) 
  0x15, 0x00,                    //   LOGICAL_MINIMUM (0) 
  0x25, 0x01,                    //   LOGICAL_MAXIMUM (1) 
  0x75, 0x01,                    //   REPORT_SIZE (1) 
  0x95, 0x08,                    //   REPORT_COUNT (8) 
  0x81, 0x02,                    //   INPUT (Data,Var,Abs) 
  0x95, BUFFER_SIZE-1,           //   REPORT_COUNT (simultaneous keystrokes) 
  0x75, 0x08,                    //   REPORT_SIZE (8) 
  0x25, 0x65,                    //   LOGICAL_MAXIMUM (101) 
  0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated)) 
  0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application) 
  0x81, 0x00,                    //   INPUT (Data,Ary,Abs) 
  0xc0                           // END_COLLECTION 
};



/* Keyboard usage values, see usb.org's HID-usage-tables document, chapter
 * 10 Keyboard/Keypad Page for more codes.
 */
#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT        (1<<2)
#define MOD_GUI_LEFT        (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT     (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)

#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       28
#define KEY_Z       29
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39

#define KEY_ENTER   40

#define KEY_SPACE   44

#define KEY_F1      58
#define KEY_F2      59
#define KEY_F3      60
#define KEY_F4      61
#define KEY_F5      62
#define KEY_F6      63
#define KEY_F7      64
#define KEY_F8      65
#define KEY_F9      66
#define KEY_F10     67
#define KEY_F11     68
#define KEY_F12     69

#define KEY_ARROW_LEFT 0x50


class UsbKeyboardDevice {
 public:
  UsbKeyboardDevice () {
    PORTD = 0; // TODO: Only for USB pins?
    DDRD |= ~USBMASK;

    cli();
    usbDeviceDisconnect();
    usbDeviceConnect();


    usbInit();
      
    sei();

    // TODO: Remove the next two lines once we fix
    //       missing first keystroke bug properly.
    memset(reportBuffer, 0, sizeof(reportBuffer));      
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }
    
  void update() {
    usbPoll();
  }
    
  void sendKeyStroke(byte keyStroke) {
    sendKeyStroke(keyStroke, 0);
  }

  void sendKeyStroke(byte keyStroke, byte modifiers) {
      
    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
      
    memset(reportBuffer, 0, sizeof(reportBuffer));

    reportBuffer[0] = modifiers;
    reportBuffer[1] = keyStroke;
        
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));

    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keystroke
      //       so we know the previous keystroke was
      //       sent.
    }
      
    // This stops endlessly repeating keystrokes:
    memset(reportBuffer, 0, sizeof(reportBuffer));      
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));

  }
    
  //private: TODO: Make friend?
  uchar    reportBuffer[4];    // buffer for HID reports [ 1 modifier byte + (len-1) key strokes]

};

UsbKeyboardDevice UsbKeyboard = UsbKeyboardDevice();

#ifdef __cplusplus
extern "C"{
#endif 
  // USB_PUBLIC uchar usbFunctionSetup
uchar usbFunctionSetup(uchar data[8]) 
  {
    usbRequest_t    *rq = (usbRequest_t *)((void *)data);

    usbMsgPtr = UsbKeyboard.reportBuffer; //
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){
      /* class request type */

      if(rq->bRequest == USBRQ_HID_GET_REPORT){
	/* wValue: ReportType (highbyte), ReportID (lowbyte) */

	/* we only have one report type, so don't look at wValue */
        // TODO: Ensure it's okay not to return anything here?    
	return 0;

      }else if(rq->bRequest == USBRQ_HID_GET_IDLE){
	//            usbMsgPtr = &idleRate;
	//            return 1;
	return 0;
      }else if(rq->bRequest == USBRQ_HID_SET_IDLE){
	idleRate = rq->wValue.bytes[1];
      }
    }else{
      /* no vendor specific requests implemented */
    }
    return 0;
  }
#ifdef __cplusplus
} // extern "C"
#endif


#endif // __UsbKeyboard_h__ 
Nem találok utalást az USB csatlakozásra, melyik lábat hova kössem, csak a sima nyomógomb bemenetet találom definiálva.
Van egy kapcsolási rajz: http://code.rancidbacon.com/files/ardui ... it_001.pdf
De most akkor ez valahol máshol lehet megadva? Mármint a pin configja? Vagy ezek a lábak valami dedikált USB lábak?
Illetve a nagy kérdés, hogy ezt simán le tudom fordítani az arduino-s kis programmal (pde-ino) , hogy egy mini proban fusson (ATmega328)?

Közben megpróbáltam, hogy bemásoltam a könyvtárakat a programéba, és ezt kaptam hiba üzenetként:

Kód: Egész kijelölése



UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice':
C:\Portable\arduino-1.0.5-r2\libraries\UsbKeyboard/UsbKeyboard.h:139: undefined reference to `usbInit()'
UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice::update()':
C:\Portable\arduino-1.0.5-r2\libraries\UsbKeyboard/UsbKeyboard.h:150: undefined reference to `usbPoll()'
Szóval most akkor mi van? Bocs, hogy ilyen értetlen vagyok, de bízom benne, hogy lesz valakinek türelme hozzám... :oops:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: Robert »

Két megoldás van USB-re:
- emulált USB porttal, ekkor az egyik INT lábat és egy tetszőlegest használsz.
Erőforrásigényes, macerás.
- Beépített USB portos IC-t használsz, ilyen a Leonardo, Arduino ProMicro (ATMega32U4).
Itt a gyári! alkalmazással készen is van.


Amit linkeltél azok az emulált USBsek.
Itt egy rajzzal, kóddal:
http://www.practicalarduino.com/project ... b-keyboard


Leonardo alapú:
http://arduino.cc/en/Reference/MouseKeyboard
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Elnézést kicsit sokasodtak a munkáim, az időm meg a kipusztulás határán...
Az ára miatt marad az emulált.
Majd jelzem, hogy beletört e a bicskám.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: csabeszq »

Emulált USB eszközt lehet csinálni, host-ot nem (a billentyűzet az eszköz, a számítógép a host).

Egy eszköz esetén a specifikáció szerint kiválaszthatod, hogy milyen kommunikációt támogatsz, meg minden mást.
Ha host-ot akarsz készíteni, akkor kismillió baromságnak kell megfelelned, amit szofterből nehéz megcsinálni, vagy egyenesen lehetetlen.

A hostra az USB sokkal szigorúbb előírásokat tartalmaz.
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Köszönöm az eddigi infókat. Sajnos idő hiány miatt nem értem rá foglalkozni ezzel a projectel. Ezért egy nagyon szégyenletes megoldást tervezek, 500 HUF-os Ps2-es billentyűzet elektronika lesz a PS2 illesztő, és csak a gombokat fogja "nyomkodni" az arduino panel. Tudom nem nagyvonalú megoldás, én sem vagyok rá büszke de gyorsan és stabilan meg kell oldanom a problémát. Ráadásul elég messzire fognak kerülni a kis paneljaim, bolondbiztosnak kell lenniük.

Kérnék megint egy kis segítséget.
Egy kapcsolóval indítanám a makrót, vagyis amikor bekapcsolom akkor lefutna makro1 (jobbra nyíl, lefele nyíl enter, stb.) itt meg kellene állnia, addig amíg a kapcsolót ki nem kapcsolom, akkor lefutna a makro2 (jobbra nyíl, jobbra nyíl stb.).
Arra gondoltam, hogy simán beírnám a két makrót egy egy "void makro1()" -be meg "void makro2()" -be.
Viszont az a gondom, hogy élvezérlésre kellene indítani a két makrót, az egyiket lefutóra, a másikat meg felfutóra.
Így amíg a kapcsoló bekapcsolt/kikapcsolt állapotban van nem lenne semmi reakció, szépen lefut a két makró.
Sima delay/HIGH/LOW parancsos lenne a két makró, nem kell közben mással foglalkoznia a programnak, hiába pazarlás stb.
Opcionálisan lehet, hogy lenne makro3 és 4 is, amit egy másik bemenet indíthatna.

Szóval, hogyan lehetne ezt az élvezérlést megoldani?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: kapu48 »

Ha softveres megoldásra gondolsz?

1.: Simán megjegyzed a régi állapotot, és ha megváltozott végrehajtod a teendőket.
2.: És most már az új állapot lesz a régi.
1.: …
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

kapu48 írta:Ha softveres megoldásra gondolsz?

1.: Simán megjegyzed a régi állapotot, és ha megváltozott végrehajtod a teendőket.
2.: És most már az új állapot lesz a régi.
1.: …

Köszönöm.
Ara gondoltam, hogy kap egy

Kód: Egész kijelölése

void gomb() {
  //LOW makro1 - HIGH makro2
    if (val2 == HIGH) {     
        makro1();
  } 
  else {
makro2();
  }
Amiben val2 a gomb bemenet változója

Kód: Egész kijelölése

val2 = digitalRead(2);
De ezt az összehasonlítós dolgot nem tudom megvalósítani.
A feltétel rendszerben a változó és a gomb állapotát kellene összehasonlítanom? A kettő között meg egy kis delay?
Valami ilyesmivel, hogy

Kód: Egész kijelölése

digitalRead(2) == val2
ha teljesül a feltétel akkor egy kis delay, meg valami LED villogtatás (hogy fut a program), ha nem teljesül akkor meg a "void gomb()" végrehajtása.
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Volt egy kis időm foglalkozni a témával, de nem igazán tudom jól megfogni.

Kód: Egész kijelölése

int val2 = 0; // a nyomogomb allapotat tarolo valtozo


void setup() {                
  pinMode(2, INPUT);
  // D2 labon kapcsolo bemenet
  pinMode(8, OUTPUT);
  // D8 lab: kimenet_1
  pinMode(9, OUTPUT);
  // D9 lab: kimenet_2
  pinMode(10, OUTPUT);
  // D10 lab: kimenet_3
  pinMode(11, OUTPUT);
  // D11 lab: kimenet_4
  pinMode(12, OUTPUT);
  // D12 lab: kimenet_5
  pinMode(13, OUTPUT);
  // D13 lab: LED
  digitalWrite(2, HIGH);
  // D2-on felhuzo bekapcsol

} 

void loop() { 

  val2 = digitalRead(2);
  delay(50);



  if (digitalRead(2) == val2) {     
    // nincs gomb nyomas    
    villog();
  } 
  else {
    gomb();
  }




  digitalWrite(13, HIGH); // fut a program
  delay(18);            
  digitalWrite(13, LOW);
  delay(18);




}

void gomb() {
  //Alacsony funkcio_1 - magas funkcio_2
  if (val2 == HIGH) {     

    funkcio_2();
  } 
  else {
    funkcio_1();
  }

}



void funkcio_1() {
  //LED be - var - LED ki

  digitalWrite(9, HIGH); 
  delay(250);  
  digitalWrite(10, HIGH); 
  delay(250);            
  digitalWrite(9, LOW);
  delay(250);            
  digitalWrite(10, LOW);
  delay(250);  
   

}


void funkcio_2(){
  //LED be - var - LED ki
  digitalWrite(11, HIGH); 
  delay(250);  
  digitalWrite(12, HIGH); 
  delay(250);            
  digitalWrite(11, LOW);
  delay(250);            
  digitalWrite(12, LOW);
  delay(250);  
 



}
void villog() {
  //LED be - var - LED ki
  digitalWrite(8, HIGH);
  delay(20); 
  digitalWrite(8, LOW);
  delay(20);
  digitalWrite(8, HIGH);
  delay(20); 
  digitalWrite(8, LOW);
  delay(20);

}
Ezt dobtam össze, de nem jó mert csak rövid idő szeletekben tudja "elkapni" a bemenet állapotváltozását.
Ráadásul valamiért pont fordítva indítja el a "funkcio_1"-et vagy "funkcio_2"-t. Gomb megnyomásra indítja a funkcio_2-t pedig akkor alacsony szinten van a bemenet.
Gondolom valami megszakításkezelést kellene használnom, vagy valahogy a gomb figyelést kellene másként kiértékelnem.
Amikor már az adott funkciót hajtja végre, akkor nem gond, hogy nem foglalkozik a gombbal, csak ha már lezajlott akkor kell ellenőriznie, hogy hogy is áll.
Pls...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: kapu48 »

És ha így próbálnád:

Kód: Egész kijelölése

// Csak Nyomógomb állapot változásra történjen valami?

int val1 = 1; // Induláskór, Az elengedet gomb állapota legyen 1! 
int val2 = 1; // Elöző nyomogomb allapotat tarolo valtozo is 1.


void setup() {                
  pinMode(2, INPUT);
  // D2 labon kapcsolo bemenet
  pinMode(8, OUTPUT);
  // D8 lab: kimenet_1
  pinMode(9, OUTPUT);
  // D9 lab: kimenet_2
  pinMode(10, OUTPUT);
  // D10 lab: kimenet_3
  pinMode(11, OUTPUT);
  // D11 lab: kimenet_4
  pinMode(12, OUTPUT);
  // D12 lab: kimenet_5
  pinMode(13, OUTPUT);
  // D13 lab: LED
  digitalWrite(2, HIGH);
  // D2-on felhuzo bekapcsol

} 

void loop() { 
do { // Várakozunk Gomb állapot változásra.
   digitalWrite(13, HIGH); // fut a program
   delay(25);            
   digitalWrite(13, LOW);
   delay(25);
   val1 = digitalRead(2);
  
  } while (val1 != val2);  // Most megváltozótt az állapot
  
   val2 = val1;  // Tároljuk az új állapotot      
  
  if (val1 == 0) {     
// Ha meg nyomták
    funkcio_2();
  } 
  else {
    // Ha el engedték
    funkcio_1();
  }   
 
}


void funkcio_1() {
  //LED be - var - LED ki
  digitalWrite(9, HIGH); 
  delay(250);  
  digitalWrite(10, HIGH); 
  delay(250);            
  digitalWrite(9, LOW);
  delay(250);            
  digitalWrite(10, LOW);
  delay(250);  
 }


void funkcio_2(){
  //LED be - var - LED ki
  digitalWrite(11, HIGH); 
  delay(250);  
  digitalWrite(12, HIGH); 
  delay(250);            
  digitalWrite(11, LOW);
  delay(250);            
  digitalWrite(12, LOW);
  delay(250);  
 }
 
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: kapu48 »

Legyen inkább boolean a változónk tipusa:

Kód: Egész kijelölése

boolean  val1 = 1; // Induláskór, Az elengedet gomb állapota legyen 1! 
boolean  val2 = 1; // Elöző nyomogomb allapotat tarolo valtozo is 1.
...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: kapu48 »

És ugyan ez 2 gombra:

Kód: Egész kijelölése

// Csak Nyomógomb állapot változásra történjen valami?

boolean  vala1 = 1; // Induláskór, Az elengedet, gomb állapota legyen 1! 
boolean  vala2 = 1; // Előző nyomógomb állapotát taroló változó is 1.
boolean  valb1 = 1; // Induláskór, Az elengedet, gomb állapota legyen 1! 
boolean  valb2 = 1; // Előző nyomógomb állapotát taroló változó is 1.

void setup() {                
  pinMode(2, INPUT);
  // D2 lábon kapcsoloA bemenet
 pinMode(3, INPUT);
  // D3 lábon kapcsoloB bemenet  
  pinMode(8, OUTPUT);
  // D8 lab: kimenet_1
  pinMode(9, OUTPUT);
  // D9 lab: kimenet_2
  pinMode(10, OUTPUT);
  // D10 lab: kimenet_3
  pinMode(11, OUTPUT);
  // D11 lab: kimenet_4
  pinMode(12, OUTPUT);
  // D12 lab: kimenet_5
  pinMode(13, OUTPUT);
  // D13 lab: LED
  digitalWrite(2, HIGH);
  // D2-on felhúzó bekapcsol
  digitalWrite(3, HIGH);
  // D3-on felhúzó bekapcsol
} 

void loop() { 
do { // Várakozunk Gomb állapot változásra.
   digitalWrite(13, HIGH); // fut a program
   delay(25);            
   digitalWrite(13, LOW);
   delay(25);
   vala1 = digitalRead(2);
   valb1 = digitalRead(3); 
  } while ((vala1 != vala2) || (valb1 != valb2));  // Most megváltozott valamelyik állapot

  if (vala1 != vala2){  // Ha GombA változott?
     vala2 = vala1;  // Tároljuk az új A állapotot      
     if (vala1 == 0) {     
    // Ha A megnyomták
      funkcio_2();
     } 
     else {
    // Ha A elengedték
      funkcio_1();
     }
  }
  
  if (valb1 != valb2){  // Ha GombB változott?
     valb2 = valb1;  // Tároljuk az új B állapotot      
     if (valb1 == 0) {     
    // Ha B megnyomták
      funkcio_3();
     } 
     else {
    // Ha B elengedték
      funkcio_4();
     }
  }   
}  // END loop

void funkcio_1() {
  //LED be - var - LED ki
  digitalWrite(9, HIGH); 
  delay(250);  
  digitalWrite(10, HIGH); 
  delay(250);            
  digitalWrite(9, LOW);
  delay(250);            
  digitalWrite(10, LOW);
  delay(250);  
 }


void funkcio_2(){
  //LED be - var - LED ki
  digitalWrite(11, HIGH); 
  delay(250);  
  digitalWrite(12, HIGH); 
  delay(250);            
  digitalWrite(11, LOW);
  delay(250);            
  digitalWrite(12, LOW);
  delay(250);  
 }
 
void funkcio_3(){
  
}

void funkcio_4(){
  
}
 
Tesztelni, hibát javítani Neked kel! 8)
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Köszönöm :)
Én is próbáltam egy második változó bevonásával megoldani a feladatot, de nem volt túl sikeres.
Egyenlőre küzdök vele mint malac a jégen!
Mert csak egyszer kellene lefutna az adott funkciónak, az egyiknek akkor amikor bekapcsolom a kapcsolót, a másiknak meg akkor amikor kikapcsolom a kapcsolót.
Majd referálok, hogy mire jutottam.
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

Kód: Egész kijelölése

void loop() { 
do { // Várakozunk Gomb állapot változásra.
   digitalWrite(13, HIGH); // fut a program
   delay(25);            
   digitalWrite(13, LOW);
   delay(25);
   val1 = digitalRead(2);
  
  } while (val1 != val2);  // Most megváltozótt az állapot
  
       
  
  if (val1 != val2) {     
// Ha meg nyomták
    gomb();
  } 
  else {
    // Ha el engedték
    villog();
  }   
 
}
void gomb() {
  //Alacsony funkcio_1 - magas funkcio_2
  if (digitalRead(2) == HIGH) {     

    funkcio_2();
  } 
  else {
    funkcio_1();
  }

}
Nem értem... ha megnyomom a gombot (kapcsoló) akkor amíg nyomom addig a "villog" fut, de a két funkcio az nem...
De nem azt kellene tennie, hogy amikor a két változó nem egyezik meg akkor nem a "villog"-ot futtatja le, hanem a "gomb"-ot, amiben meg a magas vagy alacsony szintje szerint futna az 1-es vagy a 2-es "funkcio"...
A végén tényleg az lesz, hogy a körmömre ég a munka és rakok egy 4538-at két gomb bemenet elé, élvezérlős monostabil módban... :oops: :(
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: kapu48 »

Már ne haragudj, de ez neked tényleg nem megy! :?

Inkább a „kapu48 » 2014. november 16. vasárnap, 0:59” hsz-emet kipróbálnád! :roll:
Avatar
arnd
DrótVégénSzéndarab
Hozzászólások: 18
Csatlakozott: 2005. május 8. vasárnap, 6:00

Re: PS2/USB billentyűzet emulálás

Hozzászólás Szerző: arnd »

kapu48 írta:Már ne haragudj, de ez neked tényleg nem megy! :?

Inkább a „kapu48 » 2014. november 16. vasárnap, 0:59” hsz-emet kipróbálnád! :roll:
Nem haragszom meg érte, tisztában vagyok vele :cry:
Jaj azt elfelejtettem mondani, hogy nem működik, ezért is próbáltam átalakítani. Különben nem küzdenék vele...
Délután megnézem újra, mert elkezdtem áttúrni, és már nem emlékszem, hogy mi nem ment vele, de úgy rémlik, hogy csak az egyik funkció ment, és nem tolerálta a folyamatos gomb nyomást sem...
Majd még kipróbálom, hogy mi van akkor ha 2 bemenetet kötök párhuzamosan, és az egyik a változást indítja a másik meg a stacioner állapotával határozza meg a funkciót.
Persze egy bemenettel feltöltve a változókat is így kellene működnie, de lehet valami más összeakadás talán, amit a keretprogram elfed...
Válasz küldése