یکی از راههای ارتباطی برای انتقال دیتا و کنترل مقادیر با استفاده از برد های Teensy را میتوان HID Controler نامید، که به ما کمک میکند اطلاعات را بصورت پکت هایی منظم ارسال کنیم. اگر می خواهید یک برنامه سفارشی ایجاد کنید، Raw HID راهی ساده برای ارسال ۶۴ بایت پکت بین کد شما در Teensy و برنامه شما در رایانه شخصی یا Mac است. HID به طور خودکار با درایورهای داخلی در Linux ، Mac OS X و Windows کار می کند، بنابراین کاربر نیازی به بارگیری درایورها نخواهد داشت. برنامه شما می تواند Teensy شما را در حال اجرا کردن Raw HID سفارشی شما تشخیص دهد، بنابراین برای کاربر همه چیز فقط به طور خودکار کار می کند. شما می توانید تا ۱۰۰۰ پکت در ثانیه در هر جهت ارسال کنید. کنترل کننده میزبان USB پهنای باند USB را ذخیره خواهد کرد همچنین نیازی به ارسال همه پکت ها نیست، اما در صورت ارسال، تضمین میشود که می توانید تعداد پکت هایی را که کد شما مشخص می کند در ثانیه منتقل کنید، حتی در صورت فعال بودن سایر دستگاه های USB. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
USB HID چیست
در محاسبات، USB human interface device class (USB HID class) بخشی از مشخصات USB برای وسایل جانبی رایانه است، این یک کلاس دستگاه در واقع نوعی سخت افزار رایانهای را برای دستگاه های رابط انسان مانند صفحه کیبرد، ماوس، کنترل کننده بازی و دستگاه های نمایش بوجود میآورد. کلاس USB HID دستگاه هایی را که تقریبا با همه رایانه های مدرن استفاده می شوند، توصیف می کند. بسیاری از توابع از پیش تعریف شده در کلاس USB HID وجود دارد. این توابع به تولیدکنندگان سخت افزار اجازه می دهد تا محصولی را با مشخصات کلاس USB HID طراحی کنند و انتظار دارند که با هر نرم افزاری که این مشخصات را داشته باشد نیز کار کند.
همچنین رابط USB در معرض سو استفاده های امنیتی مانند BadUSB است که از ترکیبی از توانایی USB در اتصال انواع مختلف دستگاه ها، عدم توانایی آن در تایید اینکه دستگاه ها در واقع همان چیزی هستند که ادعا می کنند، امکان تغییر نوع USB یا زیر دستگاه های اضافی را هنگام اتصال به اینترنت و رفتار پیش فرض آن در پذیرفتن هر دستگاهی که به آن متصل شود، اعلام میشود.
معرفی برد Teensy
تینسی Teensy برد توسعه با رابط کاربری آسان و دارای ویژگی های زیادی در یک بسته خوب ارائه شده است. هر برد Teensy همراه با یک بوت لودر از قبل فلش می شود بنابراین می توانید با استفاده از اتصال USB روی آن برنامه ریزی کنید، نیازی به برنامه نویس خارجی نیست و میتوانید با استفاده از C برای Teensy در ویرایشگر مورد علاقه خود برنامه نویسی کنید و یا میتوانید افزونه Teensyduino را برای Arduino IDE نصب کرده و با Arduino IDE را برای آن برنامه بنویسید.
پردازنده موجود در Teensy به USB نیز دسترسی دارد و میتواند هر نوع دستگاه USB مورد نیاز شما را تقلید کند و آن را برای USB-MIDI و سایر پروژه های HID آماده کار کند. پردازنده ۳۲ بیتی چند ویژگی دیگر نیز فراهم کرده است، از جمله چند کانال دسترسی مستقیم به حافظه، چند ADC با رزولوشن بالا و حتی یک رابط صوتی دیجیتال I2S. همچنین چهار تایمر جداگانه وجود دارد، به علاوه یک تایمر تأخیر. و همه پین های دیجیتال دارای قابلیت وقفه هستند و قابلیت ارائه ولتاژ سیستم ۳٫۳ ولت را تا حداکثر ۲۵۰ میلی آمپر را دارد.
نحوه کار پروژه HID
به عنوان یک مثال ساده، کد سمت Teensy هر ۲ ثانیه یک بسته ارسال می کند که شامل تمام ورودی های A/D است. وقتی یک بسته دریافت می کند، ۴ بیت اول به پایه های D0 تا D3 منتقل می شود. چهار LED را می توان به D0-D3 متصل کرد. کد مثال سمت PC یک برنامه خط فرمان است که تمام بسته های دریافتی را نمایش می کند، و هنگامی که هر کلید را که یک بایت در یک بسته ارسال می شود (با ۶۳ صفر پر شده) فشار می دهید، چاپ می کنید. Raw HID به شما امکان می دهد برنامه خود را تقریبا برای هر هدفی بسازید.
وسایل مورد نیاز
نصب Teensyduino
در موارد قبلی برای نصب افزونه مرجع برد هایی مانند ESP32 با استفاده از لینکی از منوی prefences اقدام به نصب افزونه برد مورد نظر برای شروع کار با برد و تشخیص توسط نرمافزار استفاده میکردیم، اما این فرآیند برای برد های Teency به لطف Teensyduino بسیار آسان تر و سریع شده. در ادامه آموزش مرحله به مرحله با هم اقدام به نصب Teensyduino خواهیم کرد. ابتدا فایل اجرایی مورد نیاز را از این لینک دانلود کنید و مراحل زیر را دنبال کنید.
- پس از اجرا کردن فایل exe. با این صفحه روبرو میشوید. بر روی Next کلیک کنید تا به مرحله بعد بروید.
- در آموزش مقدماتی مرحله به مرحله با هم اقدام به نصب Teensyduino کردهایم. برای مشاهده مراحل نصب به این آموزش مراجعه کنید.
شماتیک و کد های پروژه
در این آموزش با استفاده پین D0 اقدام به کنترل یک LED برای نمونه خواهیم کرد با استفاده از پکت های اسال شده از سمت کیبرد ما به برد تینسی. در واقع با استفاده از این آموزش در خروجی قادر به کنترل هر چیزی هستید، رله، LED و هرچه که نیاز به یک سطح منطقی برای تریگ شدن داشته باشد. در شماتیک زیر از پین D0 استفاده کردیم و با ارسال فرمان های مشخص اقدام به کنترل آن خواهیم کرد. اتصالات را مطابق شماتیک زیر برقرار کنید.
این پروژه دارای دو بخش است، هاست یا همان سیستم ما که نرمافزار برای خواندن و ارتباط گیری با برد تینسی استفاده میشود و بخش دیگر دستگاه با برد تینسی ما. در ادامه بخش هایی از کد های هر دوبخش را بررسی خواهیم کرد. همچنین برای دریافت ترمینال نمونه برای اجرای این پروژه از این لینک اقدام به دانلود آن کنید.
در این خط کد یک بسته از دستگاه “num” (مبتنی بر صفر) دریافت میکنیم. بافر داده ها را دریافت می کند، و “len” باید اندازه بسته باشد که بطور پیش فرض ۶۴ بایت است. Return تعداد بایت های دریافتی است، همچنین اگر هیچ بسته ای در مهلت زمانی دریافت نشود، صفر است یا اگر خطایی رخ دهد -۱ که به طور معمول نشان می دهد دستگاه از برق جدا نشده است.
int rawhid_recv(int num, void *buf, int len, int timeout);
در این خط کد بسته ای را به دستگاه “num” ارسال میکنیم. بافر “buf” حاوی داده های انتقال است و “len” باید اندازه بسته باشد که بطور پیش فرض ۶۴ بایت است. همچنین Return در این کد تعداد بایت های ارسالی است که اگر نتوانید قبل از مهلت داده را ارسال ارسال کنید، صفر است یا اگر خطایی وجود داشته باشد همچنین -۱ نشانگر این است که دستگاه از مدار خارج شده است.
int rawhid_send(int num, void *buf, int len, int timeout);
کد های کامل این پروژه ساخت USB MIDI با استفاده از برد Teency 3.2
void setup() { Serial.begin(9600); Serial.println(F("RawHID Example")); for (int i=0; i<7; i++) { pinMode(i, OUTPUT); } } // داده ها همواره ۶۴ بایت خواهند بود byte buffer[64]; elapsedMillis msUntilNextSend; unsigned int packetCount = 0; void loop() { int n; n = RawHID.recv(buffer, 0); // 0 timeout = do not wait if (n > 0) { // ارسال پیام توسط کامپیتور // یکی از پین های بین ۰ تا ۷ Serial.print(F("Received packet, first byte: ")); Serial.println((int)buffer[0]); for (int i=0; i<8; i++) { int b = buffer[0] & (1 << i); digitalWrite(i, b); } } // هر دوثانیه یک پکت ارسال میشود if (msUntilNextSend > 2000) { msUntilNextSend = msUntilNextSend - 2000; // first 2 bytes are a signature buffer[0] = 0xAB; buffer[1] = 0xCD; // ۲۴ بایت بعدی برای محاسبه هستند for (int i=0; i<12; i++) { int val = analogRead(i); buffer[i * 2 + 2] = highByte(val); buffer[i * 2 + 3] = lowByte(val); } for (int i=26; i<62; i++) { buffer[i] = 0; } buffer[62] = highByte(packetCount); buffer[63] = lowByte(packetCount); n = RawHID.send(buffer, 100); if (n > 0) { Serial.print(F("Transmit packet ")); Serial.println(packetCount); packetCount = packetCount + 1; } else { Serial.println(F("Unable to transmit packet")); } } }
- توجه داشته باشید که مطابق تصویر زیر باید از منوی Tools در نرمافزار Arduino IDE اقدام به تغییر UsbType کنید و مقدار را بر روی RAW HID تنظیم کنید تا ارتباط به درستی با سیستم و میکرو برقرار شود.
- سپس با اجرای سریال مانیتور و ترمینالی که از قبل دانلود کردید، پکت ها در هر ۲ثانیه ارسال خواهند شد. و در صورت فشردن کلید با پیام دریافت پکت مواجه میشویم که میزان حجم پکت را نیز در پیام ذکر میکند.
- در بخش دیگر پروژه یعنی ترمینال که همان شبیه سازی و نمونه ای کوچک از نرمافزار کدنویسی شده است، مقادیر ارسال شده و بایت ها نمایش داده میشوند همزمان با سریال مانیتور نرمافزار Arduino IDE.
کلام آخر با سایفر
در مجموع این پروژه بسیار مفیدی خواهد بود و تنها زمانی بهتر دیده میشود که بک نرم افزار بصورت جداگانه طراحی کنیم و ارتباط مورد نیاز به سخت افزار با استفاده از برد تینسی و برنامه این پروژه تامین شود. نکته قابل توجه در این پروژه قدرتمند بودن برد Tensy است که تا ۱۰۰۰ پکت را در ثانیه ارسال میکند و این مورد در پروژه های بزرگ تر میتواند بسیار مفید باشد.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.