ããŒã1æšæ¥ãArduinoããŒã¹ã®USB-IRPCã®æ§ç¯æ¹æ³ã«ã€ããŠè©±ããŸããã ãªãã§ïŒ ããã§ã¯ãã¬ã€ã¢ãŠããšè€éãããã°ããçµã¿ç«ãŠãæ¹æ³ã瀺ãããšã¯ç¹å¥ã§ã¯ãããŸããã
ä»æ¥ã¯æåŸ
ã©ããã«ãã¹ãŠãè¡ããŸãã æåãã-ã³ã³ã»ãããPCBãLUTããã ããã€ãã®éšåãåãããã©ã€ã«ã§ã³ãŒãã£ã³ã°ãããã¬ã©ã¹ç¹ç¶ãå®æããããã€ã¹ã«å€ããŸãã ãã¡ããããã®å Žåã泚æãå¿
èŠã§ãããïŒ
ç®æšã¯æ¬¡ã®ãšããã§ãã
USB-IRPCãã¢ããã³ã
USB-IRPCçµäºãããã£ãŠãã³ã³ã»ããããå§ããŸãã ãªã¬ãŒä»ããœã±ããã¢ãžã¥ãŒã«ãšLEDä»ãIRã¬ã·ãŒããŒã¯ãåšèŸºæ©åšãã§ãããå€æŽããã«äœ¿çšãããããå³ã«ã¯USB-IRPCã®ã¿ã衚瀺ãããŸãã
次ã®çç±ã§ãDipTraceã䜿çšããŠåè·¯ãšåè·¯åºæ¿ãæç»ããŸããã
- ããã¯ç§ã®ã¢ããã¥ã¢ã®ç®çã®ããã«ååã§ããæ倧1000ã®çµè«ãŸã§ç¡æã§ãã
- 圌ã¯çé¢ããŒããåé¡ãªãåºããããšãåŸæã§ãã
- ç§ã®æèŠã§ã¯ãéåžžã«ç¹æ®ãªã€ã³ã¿ãŒãã§ãŒã¹ãåããŠããEagleããããããã䜿çšããæ¹ãç°¡åã§äŸ¿å©ã§ãã
ããã«ã¯å€§ããªæ¬ ç¹ããããŸã-èŠçŽ ã®éåžžã«è±å¯ãªã©ã€ãã©ãªã§ã¯ãªãããã®äžã§æã䟿å©ãªæ€çŽ¢ã§ããããŸããã ãã ããã¢ã€ãã ã®ç·šéã¯ããã»ã©é£ãããããŸããã äžè¬çã«ããããŸã§ã®ãšãããããã¯ç§ã«ãšã£ãŠæãäžäŸ¿ãªããã°ã©ã ã§ã:)
ãã€ã¢ã°ã©ã èªäœã¯æ¬¡ã®ãšããã§ãïŒãªã³ã¯ãã¯ãªãã¯ããŠå
ã®ãµã€ãºã§éããšããã«ãµã€ãºããŒãžã§ã³ãèŠãã»ããé©åã§ãïŒã
USB-IRPCã¹ããŒã äžå€®ã«ã¯U1ããããŸã-ç§ã¯Atmega168PA-AUã䜿çšããŸããããAtmega88ãšAtmega328Pã¯äœ¿çšã§ããŸãã ãã¡ãŒã ãŠã§ã¢ã®ãµã€ãºã¯4 kbãå°ãè¶
ããŠããŸãã
16 MHzã®åšæ³¢æ°ã§ã®ãã€ã¯ãã³ã³ãããŒã©ïŒMKïŒã®åäœã¯ãæ°Žæ¶X1ãåããã³ã³ãã³ãµC4ããã³C5ã«ãã£ãŠæäŸãããŸãã
C2-åãªãããããã³ã°ã³ã³ãã³ãµã§ãé»æºåè·¯ã®ãªããã«ããããã«æ»ããã«ããŸãã
R3ãšU2ã®ãããã¯ã¯ãPCã®é»æºãã¿ã³ããæŒãã圹å²ãæãããŸãã
J1-é»æºãã¿ã³ãšäžŠè¡ããŠãã¶ãŒããŒãã«æ¥ç¶ããããã®ã³ãã¯ã¿ã
S1-ãªã»ãããã¿ã³ã ãããã°æã«äŸ¿å©ãªå ŽåããããŸãã
J5ããã³J6-ã€ã³ãµãŒãããããã°ã©ãã³ã°çšã®ISP6ã³ãã¯ã¿ïŒãã¡ãŒã ãŠã§ã¢ïŒã
J2-ãœã±ããã¢ãžã¥ãŒã«ããªã¬ãŒã«æ¥ç¶ããããã®ãœã±ããã
J3-IRã¬ã·ãŒããŒã¢ãžã¥ãŒã«ãLEDãšæ¥ç¶ããããã®ã³ãã¯ã¿ãŒã
D1-é»æµå¶éæµæR1ãä»ããŠæ¥ç¶ãããLEDã¯ãããŒãäžã®å€éšLEDãè€è£œããŸãã ãããã°åŸã¯ãã¢ã»ã³ããªåŸã¯ããã¯ã¹å
ã«è¡šç€ºãããªããããã¯ãã ä»ãããå¿
èŠã¯ãããŸããã R4-ã¬ã·ãŒããŒã¢ãžã¥ãŒã«ã®ãªã¢ãŒãLEDã®æµæã
J4-USB Mini-Bã³ãã¯ã¿ã
D2ãšD3ã¯3.6Vãã§ããŒãã€ãªãŒãã§ãã
R5ãR6ãR7-V-USBæäœçšã®æµæã
ããã§ãå®éã«ã¯ãã¹ããŒã å
šäœã
èšäºã®æåŸã«ã.sch圢åŒã§ããŠã³ããŒãããããã®ãªã³ã¯ïŒDipTraceïŒ
ããªã³ãåºæ¿ãåé¢ããããšã¯ããå°é£ã§ããããšãå€æããŸããã ããã¯ç§ã®æåã®çµéšã§ãããå°äœã®1ã€ã1ã€ã®ã¬ã€ã€ãŒã«åé¢ããããšã¯ã§ããŸããã§ããããžã£ã³ããŒãé¢ããªããã°ãªããŸããã§ããã ããã«ãããŒãäžã®ãã©ã°ãå察åŽã«åãä»ããããšãå¿ããŠããŸããããã°ã©ããŒçšã«å¥ã®ãã©ã°ãäœæããå¿
èŠããããŸããã ç§ãã誀ã£ãŠãªããã«ãã©ãŒãééã£ãåŽã«é
眮ããŸããããããã¯ã¯ãã ä»ããæ¢ããŸããã§ããã ããŠã³ããŒãçšã«æçš¿ããããŒãžã§ã³ã®ããªã³ãåè·¯åºæ¿ã§ããããã¹ãŠä¿®æ£ããŸããã ããªãã®ããŒãã¯ç§ã®åçã®ãã®ãšã¯å°ãç°ãªããŸãã ããè¯ãããã«:)
ãšã¬ã¡ã³ãã®ã·ãŒãªã³ã°äžã«ãé
ã®å
å¡«ç©ããã©ãã¯ã«è¿ããããšäžäŸ¿ããå¢ããå
å¡«ç©ãå€åãã島ããªããªãããã©ãã¯ããã®ã€ã³ãã³ããåºããªãããšãããããŸããã
èµ·ãã£ãããšã¯æ¬¡ã®ãšããã§ãã

ã¬ããã«ãŒãããã¯åé¢ã§ããªããžã£ã³ããŒã§ãã
çŽ æµãªããŒãã¹DipTrace-ããªã³ãåè·¯åºæ¿ã®å€èŠ³ã確èªããæ©èœã æ®å¿µãªãããã©ã€ãã©ãªã«ã¯ãã¹ãŠã®èŠçŽ ãå«ãŸããŠããããã§ã¯ãããŸããããå
šäœçãªçµæã¯ãã©ãã圢åŒãããã¯ããã«èŠèŠçã§ãã

ããŒãã«J7ã³ãã¯ã¿ãè¿œå ããŸãããPCã±ãŒã¹ããé»æºãã¿ã³ã³ãã¯ã¿ãæ¥ç¶ããããã«ãJ1ãšäžŠååããããã³ãããã«2ã€ã ãã§ãã
ããŠãåè·¯ãšãµã³ãã«PCBã®æºåãã§ããŸãããéšåã賌å
¥ããŠè£œé ããŸãã
éšåãªã¹ãïŒ
U1-Atmega168PA-AU-TQFP-32ããã±ãŒãž-64ã«ãŒãã«ïŒicdaromãæäœæ³šæ1500rãçŽå200ïŒããã1åã§130åãèªç±ã«è³Œå
¥ã§ããŸãã Atmega88PA-AUãŸãã¯Atmega328P-AUãè¡ããŸã
åºåèŠçŽ ïŒU2-PC817ãPDIP4ãšã³ã¯ããŒãžã£ãŒ
S1-DTS-61ãã¿ã³6x4-6.3ã
D2ãD3-3.6Vãã§ããŒãã€ãªãŒã
J2ãJ3-PBS-4
J5ãJ6-PBS-3
J1ãJ7-PBS-2
SMDãšã¬ã¡ã³ããµã€ãº0805R1ãR4-390ohm
R5ãR6-68ohm
R7-2.2 kOhm
D1-LEDïŒä»»æã®è²ããªã¬ã³ãžè²ããããŸãïŒ
J4-USB miniBã³ãã¯ã¿
C1ãC2-0.1ÎŒFã»ã©ããã¯ã³ã³ãã³ãµã
C4ãC5-22 pFã»ã©ããã¯ã³ã³ãã³ãµ
X1- 16MHzã¯ã©ãŒã
R3-100ãªãŒã ã
R2-10 kOhm
åºåèŠçŽ ã¯ã©ãžãªåžå Žã§è³Œå
¥ãããŸã-çŽ50ã«ãŒãã«ã
9.85ãã«ã®
ããã¯ã§ããã«SMDãšã¬ã¡ã³ãã賌å
¥ããŸãããåæµæå€ã40åãåã³ã³ãã³ãµã30åãããŸãã
ç§ã¯40pã§icdaromã§ç®±ãåããŸããããããã¯çŽ65ã«ãŒãã«ã®ç°ãªãè²ã®ä»ã®
BOX-KA08åºã§ããããŸãã
ããã¯éæã§ãèµ·ãããŸãïŒ

LUT-DiHALTã§ãã¹ãŠã
ç°¡åãã€æ確ã«èª¬æããããŒãã®äœææ¹æ³ã¯æããŸããã ã¡ãªã¿ã«ããžã£ã ã®æ¥ã«åœŒãç¥çŠããŸãã :)
DipTraceã«åºæã®ç¬éã«ã€ããŠã®ã¿èª¬æããŸãã å°å·ãããšãã¯ãã³ã³ããŒãã³ãã¢ãŠãã©ã€ã³ã®å°å·ããã©ãŒãªã³ã°ããŠç¡å¹ã«ããããšãå¿ããªãã§ãã ããã

DipTraceãªãã§ãå®è¡ã§ããŸãã PNGãã¡ã€ã«ã«ãšã¯ã¹ããŒããã
FastStone Viewerã䜿çšããŠæ¬¡ã®ããã«å°å·ããŸãã

å°å·å質ãæ倧ã«ããç¡å¹ã«ãã解å床ãæ倧ã«ããŸãã
600 PPIã§äœæãããPNGã
ãã®åŸããã¹ãŠãéåžžéãã§ãïŒç¿»èš³ãæ¯ããããŒã®æŽæµãã«ãããã¹ãºãããªã«ïŒ
USB-IRPCç§ã®çŽã¯ã€ãæ¶ãã§ããããŒã端ã«å°ãå·»ãä»ããŠããŸããããã¶ãã¢ã€ãã³ãããã£ãŠããªãã£ããããããŸããããããã«ã¯éèŠãªããšã¯äœããããŸããã
ã³ã³ããŒãã³ããã¯ãã ä»ãããããŒã¯ããŸãã
USB-IRPCãã¢ããã³ã
USB-IRPCãã¢ããã¯ééã£ãåŽã«PC817ããããISPã³ãã¯ã¿ã®æ«ã®åãéã®é åºã§ããããšã«æ³šæããŠãã ãã-ããã¯ç§ã®ééãã§ããããŒãäžã§ãã¹ãŠãæ£ãããªããŸãã
ãã®ããŒãžã§ã³ã®ãã¹ã¯ã¯ããŸãæåããŠããªãã£ããããèŠçŽ ãã¯ãã ä»ããããšãã¯ãã ã®æµããçŸããŸãããããããåãé€ãããšã¯éåžžã«å°é£ã§ãã ãŸãããã®ç¬éãèæ
®ããŠãããŒãã¬ã€ã¢ãŠãã®æçµããŒãžã§ã³ã§ä¿®æ£ããŸããã ãããã圌ã¯ããŒããããçŽããŸããã§ãã-ããã¯ããŸãæ©èœããŸãããæ®å¿µãªããããŸãèŠããŸããã æåã®ãã³ã±ãŒãã¯åžžã«ãŽããŽãããŠããŸãã ããããä»åã¯ããæ£ç¢ºã«æŽçã§ããŸããã
çµã¿ç«ãŠãšèšèš
èŠçŽ ã®ç¢æã1ïŒ1ã®ã¹ã±ãŒã«ïŒUSB-IRPC_pcb.jpgïŒã§è¡šèšããã«ã©ãŒåçãå°å·ããèŠçŽ ã®ã·ãŒã«ãšç©Žã®éãæ¹ã®ããŒãã·ãŒããšããŠäœ¿çšããããšããå§ãããŸãã
ãã¡ã€ã«ã䜿çšããŠãããã¯ã¹ã®ç©Žãæ
éã«åãåããŸãã ããŒã«ãŒãŸãã¯éçã§ã±ãŒã¹ã®ç©Žã®èŒªéãæããäºåçšãã€ãã§çŽãã³ãã¬ãŒãã®èŒªéãåãåãããã³ãã¬ãŒããã±ãŒã¹ã«åãä»ããŸãã åŽé¢ã«ã¯ãminiUSBã³ãã¯ã¿çšã®æºããããŸãã ããŒããæ¿å
¥ããŠè©ŠããŠãã ããïŒ
USB-IRPCãã¡ãŒã ãŠã§ã¢ãå€æŽããäºå®ããªãå Žåã¯ãISPã®ç©Žãåãæãå¿
èŠã¯ãããŸããããã³ã¯ã«ããŒã«æ¥ããŠããŸããã
次ã«ãããŒãã³ã°ãå°å·ããŠè²Œãä»ããŸãã ã¢ãŒã«ã€ãã«ã¯ãISPã®æç¡ã«ãããããã¹ããã«ãŒããŒãžã§ã³ããããŸãã ãã®äžã«ç©Žãéãããã©ããã«ãããŸãã ïŒãªã»ããã®ããã«ç©ŽãéããŸããããã¹ããã«ãŒã«ç©ŽãéããŸããã§ãããå¿
èŠã«å¿ããŠçªtoothæã§ç©Žãéããããšãã§ããŸããããŸã æçšã§ã¯ãããŸããïŒã

ãã¹ãŠãããŒããŠã§ã¢ã®æºåãã§ããŸããã
USB-IRPCãµã€ãºIRã¢ãžã¥ãŒã«ã«ãããã¡ã«ãæ¥çå€ãå
å¡«ããäž¡é¢ããŒãã§ã¢ãã¿ãŒèã«åãä»ããŸããã

â
USB-IRPC IR-LEDã¢ãžã¥ãŒã« â
ç§ã¯å®¶ã§æããå
ã奜ãã§ã¯ãããŸããããããŠéåžžã®ç
§æã§ã¯ããã¯ã»ãšãã©ç¥èŠã§ããŸãã-ãµã€ãºã¯1x3 cmã§ãã
ããã°ã©ãã³ã°è£
眮
ãã¡ãŒã ãŠã§ã¢ã¯ãã³ãŒã::ãããã¯IDEã®Cã§èšè¿°ãããŠããŸãã ã³ã³ãã€ã©
-AVRããŒã«ãã§ãŒã³ã® AVR GCC
ãããžã§ã¯ãã³ãŒããç解ã§ããããã«ãããã§äž»èŠãªãã€ã³ãã説æããŸãã ãœãŒã¹ã¯ãããžã§ã¯ãããŒãžã«ãããèšäºã®æåŸã«ãªã³ã¯ããããŸãã
次ã®ããã«ãDigitalReadããã³DigitalWriteé¢æ°ã®æš¡å£ãæžããŸããã ç§ã¯Arduinoããããã€ãã®ã©ã€ãã©ãªãååŸããããããæžãæããªãããã«ããããã«ãããããåŒã³åºãWiringé¢æ°ã®ããŒãžã§ã³ãã¹ãªããããŸãã
ir.hã¯ãIRåä¿¡æ©ãšã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã IRãªã¢ãŒãã³ã³ãããŒã«ã®å®éšçšã«äžåœã®ã»ããã«ä»å±ããŠããäŸã¯ãæ¥ç¥ããã«é©å¿ãããŸããã ã»ãšãã©å€ãããŸããã
usb_comm.h -PCãšäº€æããããã®ã³ãã³ãã³ãŒããšãããããéä¿¡ãããããŒã¿æ§é ãå®çŸ©ããŸãã
//USB Commands #define cmdGetIRPCState 1 // IRPC #define cmdSetDigitalPinStates 2 // - #define cmdDisableIR 3 // #define cmdEnableIR 4 // #define cmdGetIRBtnMapping 5 // #define cmdSetIRBtnMapping 6 // #define cmdGetIRBtn 7 // ( ) #define cmdSetLedState 8 // / #define cmdDoInternalFunc 9 // IRPC #define cmdSaveToEEPROM 10 // EEPROM #define cmdLoadFromEEPROM 11 // EEPROM //USB pinstate bits #define PWRRelay1Bit 0 #define PWRRelay2Bit 1 #define ledBit 7 //Internal functions #define fRelay1Switch 1 #define fRelay2Switch 2 #define fPCPwrSwitch 3 struct irpcdata_t // { uint8_t cmd; // Switches state uint8_t data[4]; // data };
USBãã³ã¹ããŒãããã-ããã±ãŒãžå
ã®ãªã¬ãŒããã³LEDã®å¶åŸ¡ãããã®æ°ã
å
éšIRPCæ©èœïŒ
fRelay1Switch-ã¹ã€ãããªã¬ãŒ1
fRelay2Switch-ã¹ã€ãããªã¬ãŒ2
fPCPwrSwitch-PCã®é»æºãã¿ã³ãæŒããŸã
irpcdata_tã¯ãããã€ã¹ãšPCã®éã§äº€æãããããã±ãŒãžæ§é ã§ãã
亀æã¯ãPCã®èŠæ±ã§çºçããŸãã
cmd-ã³ãã³ãã³ãŒãïŒäŸïŒcmdGetIRPCStateïŒ
data [] -4ãã€ãã®ããŒã¿é
åã åããŒã ã¯ç¬èªã®æ¹æ³ã§è§£éããŸãã
irrc.h-䟿å®äžããã¿ã³ã³ãŒããšååã®å¯Ÿå¿ã ãªã¢ã³ã³çšã«é²é³ããŸããã ãã®ãããªãã®ïŒ
//AverMedia RM-FR #define amTVFM 0xFE01 #define amPWR 0xFF00 #define amB1 0xFA05 #define amB2 0xF906 #define amB3 0xF807 #define amB4 0xF609
usbconfig.hãã¡ã€ã«ã§ãV-USBã©ã€ãã©ãªã®èšå®ã
ãã®èšäºããæ
å ±ãåŒãåºããŸããã
USBãããã³ã«ãç解ããŠããªãå Žåã¯ãããã«è§Šããããšã¯ã§ããŸããã
ããŒã¹ã®ããã°ã©ã
main.cSetPinStateãã¯ããå®çŸ©ããŸããããã¯ãåºåãå¿
èŠãªäœçœ®ã«èšå®ãããã®åºåã®ãããã®å¯Ÿå¿ããç¶æ
ãpinStateså€æ°ã«èšå®ããŸãã
åšèŸºæ©åšãæ¥ç¶ãããŠãããã³ãšãä¿åã§ããå
éšæ©èœã®ãã¿ã³ãããã³ã°ã®æ°ïŒMaxBtnMapingsïŒã決å®ããŸãã
//Usefull macroses #define SetPinState(Pin, State, bit) digitalWrite(Pin, State); if (State>0) pinStates |=_BV(bit); else pinStates &= ~_BV(bit); //PORTB #define PWRPin 16 // PC2 #define ledPin 9 // PB1 //PORTD #define PWRRelay1 6 // PD6 #define PWRRelay2 5 // PD5 #define MaxBtnMapings 15
å€æ°ïŒç§ã¯èªåèªèº«ã®ããã«ã³ã¡ã³ããäœæããããããã¡ã€ã«ã§ã¯ã»ãšãã©ãäžåšçšãªè±èªã§ã:)
// uint8_t ledState = 0; // uint8_t PWRRelay1State = 1; // 1 uint8_t PWRRelay2State = 1; // 2 uint8_t PWRPinState=0; // uint8_t IRBtnL, IRBtnH; // , uint8_t IREnabled=1; // struct btn_mapping btn_mappings[MaxBtnMapings]; // //-- uint8_t cmd; // uint8_t pinStates=0x00; // (0-PWRRelay1State, 1-PWRRelay2State) uint8_t cmdReceived=0; // PC () //IR variables uint16_t btn; // uint16_t LastBtn=0x00; // //----------------- USB Section--------------------------- struct irpcdata_t pdata, pcdata; //pdata - output buffer, pcdata - input buffer
PCããåä¿¡ããã³ãã³ãã¯pcdataã«ä¿åãããéä¿¡ãããã³ãã³ãã¯pdataã«ä¿åãããŸãã
ã¡ã€ã³ãµã€ã¯ã«
int main(void) { //Initialize ports DDRB = 0b00000010; // PB1 - DDRC = 0b00000100; // PC2 - DDRD = 0b01100000; // PD5, PD6 - //clear btn mappings for (i=0; i<MaxBtnMapings;i++){ btn_mappings[i].func=0; btn_mappings[i].btn_code=0; } loadStateFromEEPROM(); //USB Init & connect cli(); // Clear interrupts while perfoorming time-critical operations usbInit(); usbDeviceDisconnect(); // , ! uchar i = 0; while(--i){ // > 250 ms _delay_ms(1); } usbDeviceConnect(); // sei(); // //Timer1 Init for IR timer1_init(); // init IR timer loop(); return 0; }
ãªã¬ãŒãšLEDãåºåãšããŠæ¥ç¶ããããã³ãæ§æããŸãã
å
éšæ©èœãžã®ãã¿ã³ã®å¯Ÿå¿ãæ確ã«ããŸã-é»æºãå
¥ãããšãã«ã¡ã¢ãªã«å€ãã®ãŽãããããŸããã
ãªã¬ãŒã®ã¹ããŒã¿ã¹ãã€ããšLED-pinStatesãããŒãããloadStateFromEEPROMïŒïŒé¢æ°ã§å¯Ÿå¿ããç¶æ
ã«èšå®ããŸãã
å²ã蟌ã¿ããªãã«ããPCããåæããäžæåæ¢ããŠèŠã€ããŠãã ããã 次ã«ãå²ã蟌ã¿ãæå¹ã«ããŸãã
ç§ãã¡ã¯ãIRã¬ã·ãŒããŒã§åäœããã¿ã€ããŒãæºåããŠããŸãã
IRã¬ã·ãŒããŒãšPCããããŒã¿åŠçãµã€ã¯ã«ãéå§ããŸãã
void loop() { // Main loop for(;;){ // usbPoll(); // , - 50 ms if (cmdReceived) {processUSBcmd();} else if (IREnabled) { remote_decode(); process_IR(); } } return; }
ããã§ã¯ãã¹ãŠãç°¡åã§ãïŒ
- äœãããã°ãPCã«èå³ããããŸãã
- ã³ãã³ããåãå
¥ããããå ŽåãprocessUSBcmdïŒïŒã§åŠçããŸã
- ããã«ãIRãªã¢ãŒãã³ã³ãããŒã«ã³ãŒãã®åŠçãèš±å¯ãããŠããå Žåã¯ãåä¿¡ããã³ãã³ãŒãé¢æ°ãåŒã³åºããŸããããã¯ãå®è¡æéã®é¢ã§æãé·ãé¢æ°ã§ãã
- æŒããããã¿ã³ã®ã³ãŒããåŠçãããããæžãçããŠãèŠæ±ããããšãã«PCã転éããŸãã
PCãããã±ãŒãžãæäŸããå ŽåãããŒã¿ãã±ãããèŠæ±ãããšãã«usbFunctionWriteé¢æ°ïŒusbFunctionReadé¢æ°ïŒãåŒã³åºãããŸãã
ããããåæããŸãããïŒ
uchar usbFunctionRead(uchar *data, uchar len) { if(len > bytesRemaining) len = bytesRemaining; uchar *buffer = (uchar*)&pdata; if(!currentAddress) // . { // pdata.cmd=cmd; //last received cmd switch(cmd){ case cmdGetIRPCState: pdata.data[0]=pinStates; pdata.data[1]=IRBtnH; pdata.data[2]=IRBtnL; if (IREnabled){ //clear IR button code IRBtnL=0; IRBtnH=0; } break; case cmdGetIRBtnMapping: pdata.data[0]=pcdata.data[0]; pdata.data[1]=(btn_mappings[pcdata.data[0]].btn_code>>8); pdata.data[2]=(btn_mappings[pcdata.data[0]].btn_code & 0xFF); pdata.data[3]=btn_mappings[pcdata.data[0]].func; break; } } uchar j; for(j=0; j<len; j++) data[j] = buffer[j+currentAddress]; currentAddress += len; bytesRemaining -= len; return len; }
æåã«ãpdataæ§é äœã«å
¥åããŸã-ããã€ã¹ã®ç¶æ
ïŒcmdGetIRPCStateïŒãèŠæ±ãããå ŽåãpinStatesãšãªã¢ãŒãã§æŒããããã¿ã³ã®ã³ãŒããæžãçããŸã
ãã¿ã³ãšå
éšæ©èœã®å¯Ÿå¿ã®1ã€ãèŠæ±ããå Žåãéä¿¡ãããPCããã±ãŒãžã®æåã®ãã€ãããæ©èœçªå·ãååŸããŠãããè¿ããŸãïŒpcdata.data [0]ïŒ
ã³ãã³ããèªèããªãå Žåã¯ãpdataæ§é ãæå®ããã ãã§ããã³ãã³ããåŠçãããšãã«çµæãæžã蟌ãŸããŸãã
次ã«ããã€ãåäœã§ã
dataãã©ã¡ãŒã¿ãŒã§æž¡ããããã€ã³ã¿ãŒã䜿çšããŠããã±ãŒãžã
äœæããŸãã
uchar usbFunctionWrite(uchar *data, uchar len) { uchar *buffer = (uchar*)&pcdata; uchar j; for(j=0; j<len; j++) buffer[j]=data[j]; cmdReceived=1;
ããã§ã¯ããã«ç°¡åã§ã-äœãäœã§ããããç¥ããã«ãåã«pcdataã®ããŒã¿ãã±ãããæžãæããŸããåŠçã¯processUSBcmdïŒïŒã«ãã£ãŠå®è¡ãããã§ããã ãæ©ãå¶åŸ¡ãè¿ãå¿
èŠããããŸã-é¢æ°ã¯å²ã蟌ã¿ãçºçãããŸãã
ãããŠå®éãããã§åœŒå¥³ã¯ïŒ
void processUSBcmd(){ cmd=pcdata.cmd; switch(cmd) { case cmdSetDigitalPinStates: //Get pin states from USB cmd PWRRelay1State=(pcdata.data[0] & _BV(PWRRelay1Bit)); PWRRelay2State=(pcdata.data[0] & _BV(PWRRelay2Bit)); ledState=(pcdata.data[0] & _BV(ledBit)); //Execute cmd SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case cmdGetIRPCState: if (PWRRelay1State>0) pinStates |=_BV(PWRRelay1Bit); else pinStates &= ~_BV(PWRRelay1Bit); if (PWRRelay2State>0) pinStates |=_BV(PWRRelay2Bit); else pinStates &= ~_BV(PWRRelay2Bit); if (ledState>0) pinStates |=_BV(ledBit); else pinStates &= ~_BV(ledBit); break; case cmdGetIRBtn: pdata.data[1]=IRBtnH; pdata.data[2]=IRBtnL; IRBtnL=0; IRBtnH=0; break; case cmdSetLedState: ledState=(pcdata.data[0] & _BV(ledBit)); SetPinState(ledPin, ledState, ledBit); break; case cmdEnableIR: IREnabled=1; break; case cmdDisableIR: IREnabled=0; IRBtnL=0xFF; IRBtnH=0xFF; break; case cmdSetIRBtnMapping: btn_mappings[pcdata.data[0]].btn_code=(uint16_t)(pcdata.data[1]<<8)+pcdata.data[2]; btn_mappings[pcdata.data[0]].func=pcdata.data[3]; break; case cmdDoInternalFunc: switch (pcdata.data[0]){ case fRelay1Switch: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; case fRelay2Switch: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case fPCPwrSwitch: digitalWrite(PWRPin, 1); _delay_ms(100); digitalWrite(PWRPin, 0); break; } break; case cmdLoadFromEEPROM: loadStateFromEEPROM(); break; case cmdSaveToEEPROM: saveStatetoEEPROM(); break; } _delay_ms(5); cmdReceived=0; }
åä¿¡ããã³ãã³ãïŒpcdata.cmdãã£ãŒã«ãã®ã³ãŒãïŒã«å¿ããŠãpcdata.dataããã±ãŒãžã解æããŸã
ããã§ã¯ãã¹ãŠãéæã«ãªã£ãŠãããšæããŸãã
ã³ãã³ããå®è¡ããåŸãcmdReceivedãã©ã°ããªã»ããããŸãã
process_IRïŒïŒé¢æ°ã§ã16ããããã¿ã³ã³ãŒããåéããŸãã
// button code is 16 bit btn=(adrH_code << 8) + adrL_code;
ã³ãŒãã0ã§ãªãå ŽåãäœããæŒãããŠããŸããPCã転éããããã«ä¿åããLEDãç¹ç¯ããããã«å¿
èŠãªãã©ã°ãèšå®ããŸã-æŒããããã¿ã³ãèŠãããšã瀺ããŸãã
次ã«ããªã¢ã³ã³ã®ãã¿ã³ã³ãŒããåŠçããŸãã
//Button is "Power" if ((btn==ykPWR) || (btn==amPWR)) { PWRPinState=1; } switch (LastBtn){ // case ykB1: case amSNAPSHOT: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; // case ykB2: case am16CH: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; }
[é»æº]ãã¿ã³ã§ããªã¢ãŒãã³ã³ãããŒã«ãã¿ã³ãæŸããããŸã§PCã®é»æºãã¿ã³ãæŒããŸãã
ä»ã®2ã€ã®ãã¿ã³ã§ããªã¬ãŒã®ç¶æ
ãåãæ¿ããŸãã
次ã«ãå²ãåœãŠããããã¿ã³ã³ãŒããšå
éšæ©èœã®å¯Ÿå¿ã®é
åã確èªããŸããããã¯ä»ã®ãªã¢ãŒãã§äœ¿çšããããã®ãã®ã§ã察å¿ã¯PC cmdSetIRBtnMappingã³ãã³ãã§èšå®ãããŸãïŒãã¿ã³ããšã«1ã³ãã³ãïŒã äžèšã®processUSBcmdïŒïŒã§èŠããã®ã³ãã³ãã®åŠç
for (i=0; i<MaxBtnMapings;i++){ if (btn==btn_mappings[i].btn_code) { switch (btn_mappings[1].func){ case fRelay1Switch: PWRRelay1State=!PWRRelay1State; SetPinState(PWRRelay1, PWRRelay1State, PWRRelay1Bit); break; case fRelay2Switch: PWRRelay2State=!PWRRelay2State; SetPinState(PWRRelay2, PWRRelay2State, PWRRelay2Bit); break; case fPCPwrSwitch: digitalWrite(PWRPin, 1); _delay_ms(100); digitalWrite(PWRPin, 0); break; } } }
äžè¬ã«ãäž»ãªããšã¯ãå²ã蟌ã¿ããã°ããåŠçããIRã¬ã·ãŒããŒãå®æçã«ããŒãªã³ã°ããŠusbPollãåŒã³åºãããšã§ããããããªããšãPCã倱ãããŸã-ãUSBããã€ã¹ãèªèãããŸãããã
ãã®ããŒãžã§ã³ã¯ãçç±ã«ããã¢ã«ãã¡ãšããŠæå®ãããŠããŸã-ããªããæ°ã¥ããããã«ãç¹å®ã®ãªã¢ãŒãã³ã³ãããŒã«ãžã®ãã€ã³ãã£ã³ã°ããŸã ã³ã¡ã³ãã¢ãŠããããŠããªãããã€ãã®éšåããããŸããPCããã®ãã¿ã³ãšæ©èœã®ãããã³ã°ã®èšå®ããŸã æžãããŠããªãããã§ã ã·ã¹ãã ã§è¡šç€ºããããªã¢ãŒãã³ã³ãããŒã«ã®ãã¿ã³ã«æ£åžžã«åå¿ããã«ãããããããããã€ã¹ãPCããã®ã³ãã³ãã®åä¿¡ãåæ¢ããããšããããŸãã ããã¯IRã¬ã·ãŒããŒèª¿æ»ã®æéãé·ãããã§ããããæé©åããå¿
èŠããããšæããŸãã ãã ããããã¯ãŸãã§ãããç¹ã«äžäŸ¿ãªããšã¯ãããŸããã
次ã«ãPCããã°ã©ã ã«é²ã¿ãŸãã
ããªãããœãŒã¹ãç解ã§ããããã«ãç§ã¯ããŒãã€ã³ãã«çŠç¹ãåœãŠãŸãã
MKeyã®ãã©ã°ã€ã³ã®äŸã玹ä»ããŸã-ããããããã§ãã
MKeyã¯UnicodeããµããŒãããŠããªãããšãå€æããããããã©ã°ã€ã³ã¯Delphi7ã§èšè¿°ãããŠãããDelphi 2010ã§ã¯ANSIã䜿çšããå¿
èŠããããŸãã
è¿œå ã®ã©ã€ãã©ãªã®ãã¡ãJVCLã®ã¿ã䜿çšãããŸãã
äž»ãªäœæ¥ã¯uHID.pasã¢ãžã¥ãŒã«ã§å®è¡ãããŸã
ããã€ã¹ãšåãã³ãã³ãå®æ°ãå®çŸ©ããŸãããéè€ããŸããã
ããã±ãŒãžã説æããåãã¬ã³ãŒãã§ãreportIDã1ã€è¿œå ãããŠããŸããããã¯ãµããŒããããŠããããåžžã«0ã§ãããããã€ã¹ã«ã¯äžè¬ã«è€æ°ã®ã¬ããŒããå«ãŸããå ŽåããããŸãã 1ã€ã§ååã§ãã
è¿œå ã®å®æ°ã¯IDããã€ã¹ã®ã¿ã§ã-ãã³ããŒIDïŒVidïŒã補åIDïŒPidïŒãããã³DeviceNameã VidãšPidã«ãããæ¥ç¶ãããHIDããã€ã¹ãæ€çŽ¢ããŸãã
const
ããã€ã¹ãšã®ãã¹ãŠã®éä¿¡æ©èœã¯ã¯ã©ã¹ã«åéãããŸã
TIRPC=class private Dev:TJvHidDevice; HID:TJvHidDeviceController; fIRButtons:TStringList; fIRName:string; fIRLoaded:boolean; function IsConnected: boolean; public constructor Create; destructor Destroy; override; procedure Connect; procedure Disconnect; function ReadIRPCState(var Report:TIRPCReport):boolean; procedure WriteIRPCcmd(cmd:TIRPCReport); procedure LoadIRcodes(irFile:string); function BtnName(btnCode:word):string;overload; function BtnName(btnCode:string):string;overload; property Connected:boolean read IsConnected; property Device:TJvHidDevice read Dev; property IRButtons:TStringList read fIRButtons; property IRName:string read fIRName; end;
Devãã£ãŒã«ãã¯ããã€ã¹ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒã§ãããããã€ã¹ãžã®æ¥ç¶ãæåãããšãã«ååŸããŸãïŒæ¥ç¶ïŒã
åæïŒåæïŒããããšãnilã«èšå®ãããŸãã
ã¡ãœããã¯éåžžã«åçŽãªã®ã§ãããšãã°1ã€ã瀺ããŸãããæ®ãã¯ã»ãŒåãçšåºŠã®è€éãã§ãã
procedure TIRPC.Connect; begin if Assigned(dev) then Exit; HID.CheckOutByID(Dev,VID,Pid); end;
æ¥ç¶ã¹ããŒã¿ã¹ïŒConnectedããããã£ïŒã¯Devãã€ã³ã¿ãŒã«ãã£ãŠæ±ºå®ãããŸãã空ã§ãªãå Žåãæ¥ç¶ã¯æåããŸããã
WriteIRPCcmdïŒcmdïŒTIRPCReportïŒã¡ãœããã¯ãããã€ã¹ã«äºåå
¥åããã³ãã³ããå«ããã±ãããéä¿¡ããŸãã
ReadIRPCStateã¡ãœããïŒvar ReportïŒTIRPCReportïŒïŒããã€ã¹ã§ãã±ãããããŒã«zaroshivaetããŸãã ãã±ãããæ£åžžã«åä¿¡ãããå Žåãtrueãè¿ãããã±ããèªäœãReportãã©ã¡ãŒã¿ãŒã«æžã蟌ãŸããŸãã
ããã·ãŒãžã£LoadIRcodesïŒirFileïŒstringïŒ; -ãªã¢ã³ã³ã®ãã¿ã³ã®ååãšã³ãŒãã®å¯Ÿå¿ãã¡ã€ã«ãããŒãããŸãã ãã¡ã€ã«ã®åœ¢åŒã¯åçŽã§ããåè¡ã«ã¯ãã«ã³ãåºåãã®ãã¿ã³åãšã³ãŒããå«ãŸããŠããŸã
TVFMã$ FE01
ãã®ã¡ãœããã¯ãã©ã°ã€ã³ã§ã¯å¿
èŠãããŸãã-ãã¿ã³ã³ãŒãã¯Mkeyã«éä¿¡ãããŸããããã°ã©ã ã¯éä¿¡ãããã®ã衚瀺ããªããããèªåã§å¥œããªããã«åŒã³åºããŸãã ããããããã°ã©ã ã§ã¯ãéåžžã®äººéã®ãã¿ã³åã衚瀺ã§ããŸãã
BtnNameé¢æ°ã¯ã16ãããå€ãŸãã¯16é²æ°ã®æååãšããŠæž¡ãããã³ãŒãã«åŸã£ãŠããã¿ã³ã®ååãè¿ããŸãã
é¢æ°BtnNameïŒbtnCodeïŒwordïŒïŒæåå;ãªãŒããŒããŒã;
function BtnNameïŒbtnCodeïŒstringïŒïŒstring;ãªãŒããŒããŒã;
IRButtonsããããã£ã«ã¯ããã¿ã³ãšãã®ã³ãŒãã®ãªã¹ããå«ãŸããŠããŸã
property IRButtonsïŒTStringList read fIRButtons;
IRnameããããã£-LoadIRcodesã¡ãœããã«ãã£ãŠèªã¿èŸŒãŸãããªã¢ãŒãã³ã³ãããŒã«ã®ååïŒ.iræ¡åŒµåã®ãªããã¡ã€ã«åïŒã
ããããã£IRNameïŒæååèªã¿åãfIRName;
ããã€ã¹ããããã±ãŒãžãååŸããæ¹æ³ã¯ïŒ
function TIRPC.ReadIRPCState; begin Result:=false; if not Assigned(dev) then Exit; Result:=dev.GetFeature(report,sizeof(TIRPCReport)); end;
GetFeatureã¡ãœããã䜿çšããŠããã±ããã®ãããã¡ã転éãããã±ãããååŸããŸãã æ¥ç¶ããªãå Žåãã¡ãœããã¯Falseãè¿ããŸãã
ãã±ããã¯åãæ¹æ³ã§ããã€ã¹ã«è»¢éãããŸãã
dev.SetFeature(cmd,SizeOf(cmd));
å®éã«ã¯ããã©ã°ã€ã³èªäœã¯dll圢åŒã§äœæãããŸãã
圌ãå¿
èŠãšããæ©èœã¯å®è£
ãããŠããŸãïŒ
æå¹ãç¡å¹ãGetNameãGetInfoãGetVerãGetAuthorãIsInteractiveãIsHaveSettingsã
ãããã£ãŠãEnableã§ã¯ãConnectã¡ãœããã䜿çšããŠããã€ã¹ã«æ¥ç¶ããã¿ã€ããŒãéå§ããŠã500 msããšã«ReadStateã§ããã€ã¹ãããŒãªã³ã°ãããã¿ã³ã³ãŒããåä¿¡ããå Žåã¯MKeyã«éä¿¡ããŸãã
function Enable: boolean; stdcall; begin IRPCPlugin:=TIrPCPlugin.Create; IRPCPlugin.IRPC.Connect; tmrReadState:=TTimer.Create(nil); tmrReadState.Interval:=500; tmrReadState.OnTimer:=IRPCPlugin.ReadState; tmrReadState.Enabled:=true; result:=true; end;
procedure TIRPCPlugin.ReadState(Sender: TObject); var mainWnd:hWnd; pluginact:string; Btn:Word; begin IRPCPlugin.IRPC.Connect; If not IRPCPlugin.IRPC.Connected then MessageBox(0,'IRPC device not connected', 'IRPC', MB_ICONEXCLAMATION); if rep.cmd<>cmdGetIRPCState then begin rep.cmd:=cmdGetIRPCState; IRPCPlugin.IRPC.WriteIRPCcmd(rep); end; IRPCPlugin.IRPC.ReadIRPCState(rep); Btn:=rep.data[1] shl 8+rep.data[2]; If btn<>0 then begin pluginact:=Format('%x',[Btn]); mainwnd:=Findwindow('TMainForm', 'MKey'); SendMessage(mainwnd, WM_PLUGIN, plugin_interface_version, DWORD(PChar(pluginact))); end; end;
ç¡å¹åæé ã§ãããã€ã¹ããåæããŸãã
function Disable: boolean; stdcall; begin IRPCPlugin.IRPC.Disconnect; FreeAndNil(IRPCPlugin); FreeAndNil(tmrReadState); result:=true; end;
ãã©ã°ã€ã³ã®uHIDã¢ãžã¥ãŒã«ãšãã«ã³ã³ãããŒã«ããã°ã©ã ã¯åäžã§ãã
ãããŸã§ã¡ã€ã³ããã°ã©ã ãã³ã³ãã€ã«æžã¿ã®åœ¢åŒã§ã¬ã€ã¢ãŠãããŸãããããœãŒã¹ã³ãŒãã¯ã¢ããããŒãããŸãããæ©èœã«é¢ããäœæ¥ãé²è¡äžã§ãããããæ··ä¹±ããããŸããå€ããå°ãªãããŸãšããªãªãã·ã§ã³ã«ã€ããŠã¯ã[
ããŠã³ããŒã ]ã«é
眮ããŸãã
ãã®ããã«èŠããŸããïŒ

- éç¥é åã«æãããã¿ãŸãã
- ã¯ãªãã¯ãããšå±éããŸãã
- ããŒãªã³ã°æéã¯èšå®ã§æ§æãããŸã
- S-EEPROMã«ç¶æ
ãä¿åãã
- L-EEPROMããã®ããŒãç¶æ
- Power Btn-fPCPwrSwitché¢æ°ãå®è¡ããŸãïŒã€ãŸããPCã®é»æºãã¿ã³ãæŒããŸãïŒ
- ãã°ã衚瀺ãããšãã€ãã³ãã®ãªã¹ãã衚瀺ãããŸã-ç ãã«èœã¡ã/ PCãèµ·åããŸãã ïŒé»æºãã¿ã³ãã¹ãªãŒãç¶æ
ã«ããŸãïŒã
- æ®ãã¯ãã¹ããã¿ã³ã§ãã
- 3ã€ã®é»çã®ãããããã¯ãªãã¯ãããšãããã«å¿ããŠåãæ¿ãããŸã-LEDãRelay1ãRelay2ïŒããŒã«ãããããããç解ããã®ã«åœ¹ç«ã¡ãŸãïŒ
圌ã¯éèŠãªããšãã¹ãŠãèªã£ãããã§ãã ã質åãããå Žåã¯ãã³ã¡ã³ãã§ãå°ããã ãããç§ã¯çããããšããŸãã
ãœãŒã¹ã³ãŒã