به نام خدا : تو این مطلب میخوام پروژه راه اندازی کیبورد رو با هم ببینیم، که میکروکنترلر LPC1768 در نقش کیبورد به PC وصل میشه و … عکس زیر تزئینی هستش، تو این پروژه من از چند تا button استفاده کردم برا ساخت کیبورد، که در فیلم همه چیز واضح هستش ( توضیحات کامل در فیلم )
تبدیل میکروکنترلر LPC1768 به کیبورد
کلاس مورد استفاده : HID
هدف این پروژه : در راستای آموزش مبحث KEYBOARD/KEYPAD PAGE از کلاس HID
مطالب دیگه :
- کلاس CDC : تبدیل usb به سریال مجازی در میکروکنترلر lpc1768
- کلاس HID : تبدیل میکروکنترلر LPC1768 به موس
امکانات این پروژه : این پروژه محدود به کلید های زیر هستش :
- کلید RightShift
- کلید RightAlt
- کلید CapsLock
- کلید a / ش
- کلید b / ذ
- کلید c / ز / ژ
- کلید 2 / @
- کلید 2 / DownArrow
Descriptor یک کیبورد واقعی ( Real Keyboard ) و کیبورد این پروژه ( Fake Keyboard ) :
کد فایل main پروژه : این کد فایل main هستش، بقیه کدا رو میخواید ببینید به فایل ته مطلب برید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include "public_library.h" #include "clock.h" CLOCK clock; #include "usbHIDDevice.h" USB_HID_DEVICE USBhid; #include "gpio.h" int main() { clock.init(); gpio.pinFunction(P0_10,FUNCTION0); gpio.pinMode(P0_10,INPUT); // RightShift gpio.pinFunction(P0_11,FUNCTION0); gpio.pinMode(P0_11,INPUT); // RightAlt gpio.pinFunction(P0_15,FUNCTION0); gpio.pinMode(P0_15,INPUT); // CapsLock gpio.pinFunction(P0_16,FUNCTION0); gpio.pinMode(P0_16,INPUT); // a gpio.pinFunction(P0_17,FUNCTION0); gpio.pinMode(P0_17,INPUT); // b gpio.pinFunction(P0_18,FUNCTION0); gpio.pinMode(P0_18,INPUT); // c gpio.pinFunction(P0_19,FUNCTION0); gpio.pinMode(P0_19,INPUT); // 2/@ gpio.pinFunction(P0_20,FUNCTION0); gpio.pinMode(P0_20,INPUT); // 2/DownArrow USBhid.init(); while(1) { // Write if( gpio.digitalRead(P0_10) ) USBhid.RightShift = 1; // RightShift else USBhid.RightShift = 0; if( gpio.digitalRead(P0_11) ) USBhid.RightAlt = 1; // RightAlt else USBhid.RightAlt = 0; if( gpio.digitalRead(P0_15) ) USBhid.Key = 57; // CapsLock else if( gpio.digitalRead(P0_16) ) USBhid.Key = 4 ; // a else if( gpio.digitalRead(P0_17) ) USBhid.Key = 5 ; // b else if( gpio.digitalRead(P0_18) ) USBhid.Key = 6 ; // c else if( gpio.digitalRead(P0_19) ) USBhid.Key = 31; // 2@ else if( gpio.digitalRead(P0_20) ) USBhid.Key = 90; // 2/DownArrow else USBhid.Key = 0 ; // None ( no event indicated ) } } |
کد Report Descriptor :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
uint8_t ReportDescriptor[] = { 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x07, // Usage (Keypad) 0xA1, 0x01, // Collection (Application) // Byte0 ( shift/alt/ctrl/gui left/right ) 0x05, 0x07, // Usage Page (Keyboard/Keypad) 0x19, 0xE0, // Usage Minimum (Keyboard Left Control, 224) 0x29, 0xE7, // Usage Maximum (Keyboard Right GUI , 231) 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,NWrp,Lin,Pref,NNul,Bit) // Byte1 ( reserved ) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x81, 0x01, // Input (Constant) reserved byte(1) // Byte2:7 0x75, 0x08, // Report Size (8) 0x95, 0x06, // Report Count (6) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x65, // Logical Maximum (101) 0x19, 0x00, // Usage Minimum (0) 0x29, 0x65, // Usage Maximum (101) 0x81, 0x00, // Input (Data, Array) Key array(6 bytes) 0xC0 // END COLLECTION }; |
فیلم پروژه :
توجه : حتما این دستگاه های RFID Reader که با صورت USB به PC وصل میشن رو دیدید ( عکس زیر )، اینا از کلاسی مثل کلاس کیبورد استفاده میکنند، که گفتی تگی رو سنس میکنند، میان دیتاشو به صورت یه عدد 10-12 رقمی ارسال میکنند به pc، در زیر کد Descriptor شو میزارم براتون ( اینم یک کاربرد از کلاس HID ) :
البته کد Descriptor فوق بعضی قسمتاش اضافس بنظرم، مثلا قسمت (Usage Page (LEDs یه مورد، اصلا کاربردی نداره، LED یی که استفاده شده تو برد فوق که در عکس بالا هم قابل مشاهده هستش، هیچ کدوم از 5 نوع LED مربوط به کیبورد نیست؛ قسمت Vendor-Defined اش هم اضافس بنظرم، دیتا رو به فرمت فشرده شدن کلید ها به صورت عادی داره ارسال میکنه، 10 تا عدد پشت سر هم میفرسته، مثلا داده زیر رو میفرسته :
1 |
0006714584 + '\r' + '\n' |
که ابتدا کد فشرده شدن کلید 0 رو میفرسته، بعد کد رها شدن کلید 0، به همین ترتیب تا…. کد فشرده شدن کلید 4، بعد کد رها شدن کلید 4 و در پایان کد فشرده و رها شدن کاراکتر های r/ و n/ ( همون Enter خودمون میشه ) و لذا در مجموع 12 کاراکتر رو میفرسته و انگار 12 کلید مختلف رو فشار داده و رها کرده، چرا اون قسمت Vendor-Defined رو تعریف کرده و کاربردش چیه، خودم هم نمیدونم حقیقتا، برام سواله وجود این دو مورد ( قسمت Vendor-Defined و (Usage Page (LEDs )
امیدوارم این پروژه مفید باشه براتون، این پروژه در راستای آموزش کلاس HID قرار داده شده؛ فعلا یا علی.
بروزرسانی در سه شنبه – ۲۳ بهمن ۱۳۹۷
هدف این پروژه : در راستای آموزش مبحث LED PAGE از کلاس HID
خب به پروژه فوق، 3 تا led های کیبورد ( NumLock – CapsLock – ScrollLock ) اضافه شد، این LED ها توسط خود PC کنترل میشه ( منظورم اینه که کی روشن بشن و کی خاموش بشن رو کاملا PC فرمانشو صادر میکنه، میکرو حق نداره خودسر وضعیت این LED ها رو تغییر بده )؛ بجای پروژه قبلی، اینو دانلود کنید ( برای دریافت داده از سمت PC از EP4_INTERRUPT_OUT استفاده کردم و نه EP0_CONTROL )
کد فایل main پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include "public_library.h" #include "clock.h" CLOCK clock; #include "usbHIDDevice.h" USB_HID_DEVICE USBhid; #include "gpio.h" int main() { clock.init(); gpio.pinFunction(P0_4,FUNCTION0); gpio.pinMode(P0_4,OUTPUT); // LED NumLock gpio.pinFunction(P0_5,FUNCTION0); gpio.pinMode(P0_5,OUTPUT); // LED CapsLock gpio.pinFunction(P0_6,FUNCTION0); gpio.pinMode(P0_6,OUTPUT); // LED ScrollLock gpio.pinFunction(P0_7,FUNCTION0); gpio.pinMode(P0_7,OUTPUT); // LED Compose gpio.pinFunction(P0_8,FUNCTION0); gpio.pinMode(P0_8,OUTPUT); // LED Kana gpio.pinFunction(P0_9,FUNCTION0); gpio.pinMode(P0_9,OUTPUT); // LED Shift gpio.pinFunction(P0_10,FUNCTION0); gpio.pinMode(P0_10,INPUT); // RightShift gpio.pinFunction(P0_11,FUNCTION0); gpio.pinMode(P0_11,INPUT); // RightAlt gpio.pinFunction(P0_15,FUNCTION0); gpio.pinMode(P0_15,INPUT); // CapsLock gpio.pinFunction(P0_16,FUNCTION0); gpio.pinMode(P0_16,INPUT); // a gpio.pinFunction(P0_17,FUNCTION0); gpio.pinMode(P0_17,INPUT); // b gpio.pinFunction(P0_18,FUNCTION0); gpio.pinMode(P0_18,INPUT); // c gpio.pinFunction(P0_19,FUNCTION0); gpio.pinMode(P0_19,INPUT); // 2/@ gpio.pinFunction(P0_20,FUNCTION0); gpio.pinMode(P0_20,INPUT); // 2/DownArrow USBhid.init(); while(1) { // Read gpio.digitalWrite( P0_4, (USBhid.EP4IntOut_DataRead[0]>>0)&1 ); // LED NumLock gpio.digitalWrite( P0_5, (USBhid.EP4IntOut_DataRead[0]>>1)&1 ); // LED CapsLock gpio.digitalWrite( P0_6, (USBhid.EP4IntOut_DataRead[0]>>2)&1 ); // LED ScrollLock // Write if( gpio.digitalRead(P0_10) ) USBhid.RightShift = 1; // RightShift else USBhid.RightShift = 0; if( gpio.digitalRead(P0_11) ) USBhid.RightAlt = 1; // RightAlt else USBhid.RightAlt = 0; if( gpio.digitalRead(P0_15) ) USBhid.Key = 57; // CapsLock else if( gpio.digitalRead(P0_16) ) USBhid.Key = 4 ; // a else if( gpio.digitalRead(P0_17) ) USBhid.Key = 5 ; // b else if( gpio.digitalRead(P0_18) ) USBhid.Key = 6 ; // c else if( gpio.digitalRead(P0_19) ) USBhid.Key = 31; // 2@ else if( gpio.digitalRead(P0_20) ) USBhid.Key = 90; // 2/DownArrow else USBhid.Key = 0 ; // None ( no event indicated ) } } |
کد Report Descriptor :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
uint8_t ReportDescriptor[] = { 0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x07, // Usage (Keypad) 0xA1, 0x01, // Collection (Application) // Output Byte0 0x05, 0x08, // Usage Page (LEDs) 0x19, 0x01, // Usage Minimum (NumLock) 0x29, 0x03, // Usage Maximum (ScrollLock) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x03, // Report Count (3) 0x91, 0x02, // Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) //--- 0x75, 0x05, // Report Size (5) 0x95, 0x01, // Report Count (1) 0x91, 0x01, // Output (Constant) // Input Byte0 ( shift/alt/ctrl/gui left/right ) 0x05, 0x07, // Usage Page (Keyboard/Keypad) 0x19, 0xE0, // Usage Minimum (Keyboard Left Control, 224) 0x29, 0xE7, // Usage Maximum (Keyboard Right GUI , 231) 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,NWrp,Lin,Pref,NNul,Bit) // Input Byte1 ( reserved ) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x81, 0x01, // Input (Constant) reserved byte(1) // Input Byte2:7 0x75, 0x08, // Report Size (8) 0x95, 0x06, // Report Count (6) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x65, // Logical Maximum (101) 0x19, 0x00, // Usage Minimum (0) 0x29, 0x65, // Usage Maximum (101) 0x81, 0x00, // Input (Data, Array) Key array(6 bytes) 0xC0 // END COLLECTION }; |
توجه : این پروژه رو در عمل تست کردم و جواب گرفتم، فیلمشو دیگه نمیزارم ( همون پروژه قبلی هستش فقط 3 تا led بهش اضافه شده که وضعیت CpasLock و اون دوتا دیگه رو نشون میده – همین )
مهمان
استاد من پروژه راه اندازي اثرانگشت با 1768 دارم واسه دانشگاه يه ماژول گرفتم AS608 تنها چيزيم كه پيدا كردم يه كتابخونه واسه اردوينوه ( امان از دست اين اردوينو بازار و داغون كرده
) شما كه خيلي چيزارو راه اندازي كردي و اموزش گزاشتي ، اينم يه اموزش ميزاري واسش؟

نویسنده این مطلب
سلام – معلومه که نه

– همون کتاب خونه آردونیو رو تست کن ببین اگه کار میکرد تبدیلش کن به 1768 – کاری نداره که کاکو – پروژه مفت استادتون! بهت داده 
حاجی این که با uart کار میکنه – برو دیتاشیتش رو دانلود کن – بشین بخون و یه کتابخونه براش بنویس
اه – کتابخونه آردوینو هم که براش هستش – بهتر – دیتاشیت رو نمیخواد بخونی