Info zu Pollin IR Multimedia Keyboard "SEM-CIR" 2010-01-01 --- by kio@little-bat.de --- 2012-05-06 Nachtrag: Mittlerweile findet man mit googeln sogar was: http://www.m-display.co.kr/Productindex/computer/Keyboard/Wireless%20Keyboard/semcir.html - Communication Protocol: 4PPM(Pulse Position Modulation) - Carrier Frequency: 56KHz - Operation Angle:45(Horizontal) 20(Vertical) - Operation Distance: 16 feet(5 meters) - Battery: Two AA(alkaline), Over 3 months(4hrs a day) Remarks: -------- "The Windows logo is a registered trademark of Microsoft Corporation." würde ich natürlich auch überall drauf schreiben. Auch wenn es nirgendwo aufgedruckt ist. VOLTS: 5V AMPS: 200mA halte ich für eine kabellose Tastatur mit 2 AA-Batterien doch für reichlich hoch gegriffen. Zur Sache: ---------- Die Tastatur sendet mit ca. 38 kHz moduliert. Das Format hat ein festes Raster für Pulse: Basis-Pulsbreite ist 327 µsec (~ 3058.5 Hz) (aus Messung vom 30.12.09) Alle folgenden Diagramme sind auf diese Basispulsbreite bezogen:. Eine Message besteht aus einem 3-breiten Startpuls HHH und danach 17 4-breiten Feldern. Beispiele: HHH___HH___H___H___H___H___H___H___H___H____H__H_____H_H___H___H______H "A" HHH___HH___H___H___H___H___H___H___H___H___H___H_____H_H___H___H_____H_ "B" HHH___HH___H___H___H___H___H___H___H___H______H_H__H___H___H____H_____H "C" HHH___HH___H___H___H___H___H___H___H___H____H___H__H___H___H____H___H__ "D" HHH___HH___H___H___H___H___H___H___H___H_____H__H__H___H___H____H____H_ "E" HHH___HH___H___H___H_____H_H___H___H___H_____H__H__H___H___H______H__H_ "E" up HHH___HH___H___H___H___H___H___H___H___H___H_____H____HH___H_____H____H In den 4-breiten Feldern ist jeweils ein Puls High. Jedes Feld kann somit vier Werte, also 2 Bits speichern. Der Wert ist 0 ... 3 für High-Puls ganz links ... ganz rechts. Ein doppelt breiter High-Puls kann somit nur zwischen zwei Feldern vorkommen. Das erste Feld hat immer den Wert 3 <=> ___H. Das sollte im Decoder direkt geprüft werden. Dann verbleiben 16 weitere Felder, die genau 4 Bytes ergeben. Die letzten OFF-Pulse sind "unsichtbar", es wird kein abschließender Puls gesendet. Byte 1 unterscheidet Key- und Maus-Messages: Key = %00000xxx; Maus = %111110xx. Byte 2 und 3 enthalten Daten. Byte 4 ist ein Prüfbyte: %0000xxxx. Vom Prüfbyte prüfe ich nur die ersten beiden Felder auf %0000 und ignoriere die letzten 2 Felder. Insbesondere weil ich Probleme mit den Maustasten-Messages hatte, die bei den Prüfbits fast immer aus dem Zeitraster fielen. Key-Messages: Byte 1 = %00000xxx xxx = Überflüssige Statusbits: 4 = ON-Taste, 2 = OFF-Taste, 1 = '<'-Taste. Byte 2 = %xxxxxxxx Modifier Bits: $80 = Key Up Message; $40 = FN-Key Status $20 = linke Shift-Taste; $10 = rechte Shift-Taste $08 = linke ALT-Taste; $04 = rechte ALT-Taste $02 = linke Strg-Taste; $01 = rechte Strg-Taste Byte 3 = Scancode. Scancodes sind im Bereich $02 ... $7F. Tasten mit Scancode&$80 gibt es nicht. Byte 4 = Prüfbyte. Tastencodes werden repeatet, bis die Taste losgelassen wird. Auch für die Modifier-Tasten werden KeyUp- und KeyDown-Messages gesendet. Für alle Tasten wird eine Key-Up-Message gesendet. Sind mehrere Tasten gedrückt, können 'ältere' Tasten nach 'neueren' auch nochmal repeated werden. Das ist dämlich, weil beim schnellen Schreiben oft die nächste Taste schon gedrückt wird, bevor die vorherige schon hochgegangen ist. Das ergibt dann z.B. für A und B diese Message-Folge: A.dn B.dn A.dn A.up B.up Das muss beim Dekodieren der Key-Events beachtet werden, um nicht fehlerhaft A-B-A zu dekodieren. Scancodes: /*0*/ NOKEY,NOKEY,'b',TAB,RIGHT,SPACE,AE,SHIFT_L,SZ,UE, /*1*/ NOKEY,RETURN,EINFG,LEFT,NOKEY,NOKEY,NOKEY,NOKEY,'a','s', /*2*/ 'd','f','j',NOKEY,'k','l',LAUTER,OE,PAGE_DN,ENDE, /*3*/ OFF,NOKEY,NOKEY,NOKEY,'q','w','e','r','u',NOKEY, /*4*/ 'i','o',NOKEY,'p','+',WWW,NOKEY,NOKEY,NOKEY,NOKEY, /*5*/ 'y','x','c','v','m',SHIFT_R,',','.',NOKEY,'-', /*6*/ NOKEY,'n',NOKEY,NOKEY,NOKEY,ENTF,REC,PORTAL,PAUSE,'5', /*7*/ '6',NOKEY,STOP,FAST_BACKWARD,NOKEY,BACKTICK,BACKSPACE,POS1,NOKEY,NOKEY, /*8*/ NOKEY,NOKEY,FRAGEZEICHEN,UNBESCHRIFTET,PLAY,'g','h',NOKEY,REWIND_TO_START,FAST_FOREWARD, /*9*/ NOKEY,'#',UP,PAGE_UP,STRG_R,STRG_L,FN,NOKEY,'1','2', /*10*/ '3','4','7',0,'8','9',NOKEY,'0',DOWN,ON, /*11*/ NOKEY,NOKEY,ALT_R,ALT_L,NOKEY,CAPS_LOCK,LEISER,'t','z',NOKEY, /*12*/ FLOPPY,WIND_TO_END,NOKEY,MUTE,NOKEY,NOKEY,NOKEY,'<' Maus-Messages: Byte 1 = %111110RL +2 = R = rechte Maustaste; +1 = L = linke Maustaste. Byte 2 = dx signed 8-bit data; dx>0 => rechts Byte 3 = dy signed 8-bit data; dy>0 => hoch Mausmeldungen werden nicht repeated, Maus-Button-Up erzeugt aber ebenfalls eine Message, in der die Tastenbits den neuen Zustand widergeben.