آردوینو arduino, پروژه, پروژه آردوینو, توصیه شده

چرخش خودکار صفحه مانیتور دسکتاپ با آردوینو و سنسور LSM6DS3

در این مقاله آموزشی، قصد داریم تا صفحه مانیتور دسکتاپ را به کمک یک سنسور ژیروسکوپ (Gyroscope) و شتاب سنج (Accelerometer) به نام LSM6DS3 بچرخانیم. از برد آردوینو با میکروکنترلر AVR برای قسمت سخت افزاری استفاده شده و برنامه چرخش صفحه سمت دسکتاپ نیز، به زبان پایتون نوشته شده و در ویندوز تست شده است. از آن جایی که پایتون مالتی پلت فرم است، با تغییرات بسیار کوچکی، می‌توان آن را در لینوکس و مک نیز اجرا کرد!

پس با سیسوگ همراه باشید!

پس بزن بریم!

 

ایده اولیه

پایه‌های نگه‌دارنده بعضی از مانیتورها، قابلیت چرخش 360 درجه‌ای را به شما می‌دهند. همچنین به کمک پایه‌هایی معروف به “پایه آسانسوری”، می‌توانید مانیتور خود را به زاویه‌های مختلفی بچرخانید. اما برای چرخش تصویر خروجی سیستم عامل، شما باید به‌صورت دستی وارد تنظیمات نمایشگر (Display setting) شده و زاویه مانیتور را مجدداً در آن جا تنظیم کنید. حال فرض کنید بخواهید مدام و در حین کار با کامپیوتر، صفحه را به چرخش درآورید، هر بار باید مجدداً وارد تنظیمات شوید و این روند را تکرار کنید. چقدر خوب می‌شد، اگر همانند گوشی‌های هوشمندی مثل اندروید، مانیتور ما نیز به G-Sensor مجهز می‌شد و با چرخش آن، به‌صورت خودکار ویندوز، لینوکس یا مک ما نیز می‌چرخید! در این صورت می‌توانستیم به راحتی بازی‌ها و برنامه‌های مختلف را در حالت عمودی (Portrait) یا افقی (Landscape) در آوریم.

 

پایه آسانسوری

مانیتور با پایه آسانسوری

 

نکته:

در ویندوز 10، شما می‌توانید با دکمه‌های ترکیبی Ctrl + Alt + (right/left/up/down)

و در لینوکس با دستوراتی مثل

xrandr -o left
xrandr -o right
xrandr -o inverted
xrandr -o normal

نیز صفحه را به چرخش در آورید، در این مقاله می‌خواهیم به کمک یک سنسور خارجی، این کار را به‌صورت خودکار انجام دهیم.

 

سنسور LSM6DS3

دیتاشیت LSM6DS3 را می‌توانید از اینجا دانلود کنید. این سنسور قابلیت راه اندازی با دو رابط SPI یا I2C را دارا بوده و علاوه بر ژیروسکوپ، شتاب سنج هم می‌باشد.

سنسور LSM6DS3

سنسور ژیروسکوپ (Gyroscope) و شتاب سنج (Accelerometer) LSM6DS3

این سنسور شتاب را بر پایه‌ی سیستم‌های میکرو الکترومکانیک (MEMS) اندازه گیری می‌کند. بنابراین اگر محور X آن به سمت بالا باشد، به دلیل وجود نیروی جاذبه‌ی زمین، سنسور بیشترین مقدار را برای X در خروجی می‌دهد. همچنین، اگر این محور رو به زمین باشد، بزرگ‌ترین مقدار منفی را برای X اندازه گیری می‌کند. این موضوع برای محورهای Y و Z نیز صدق می‌کند.

برای اندازه گیری زاویه مانیتور، ما به محور Z نیازی نداریم و محور X و Y برای ما کافی می‌باشد.

 

در حالتی که محور X رو به بالا است، سنسور بیشترین مقدار را برای محور X (حدود 10) اندازه گیری می‌کند و محور Y ها تقریباً مقدار صفر دارد. (زاویه 0 درجه)

در حالتی که محور Y رو به پایین است، سنسور کمترین مقدار را برای محور Y (حدود 10-) اندازه گیری می‌کند و محور X ها تقریباً مقدار صفر دارد. (زاویه 90 درجه)

در حالتی که محور X رو به پایین است، سنسور کمترین مقدار را برای محور X (حدود 10-) اندازه گیری می‌کند و محور Y ها تقریباً مقدار صفر دارد. (زاویه 180 درجه)

در حالتی که محور Y رو به بالا است، سنسور بیشترین مقدار را برای محور Y (حدود 10) اندازه گیری می‌کند و محور X ها تقریباً مقدار صفر دارد. (زاویه 270 درجه)

 

بنابراین، اگر سنسور را به‌صورت عمودی روبروی خود بگیرید، به گونه‌ای که محور X ها رو به بالا باشد، می‌توانید آن را به همین صورت پشت مانیتور خود متصل کنید.

محاسبات بالا را می‌توان به‌صورت یک تابع به شکل زیر در آردوینو نوشت:

 

 

راه اندازی سنسور LSM6DS3 با آردوینو

برای افزودن کتابخانه سنسور LSM6DS3 به آردوینو، وارد منوی زیر شوید:

Sketch -> include Libary -> Manage Libaries …

مدیریت کتابخانه ها در آردوینو

 

سپس یکی یکی کتابخانه‌های Adafruit LSM6DS، Adafruit BusIO و Adafruit Unified Sensor را جستجو کرده و نصب کنید.

Adafruit BusIO

 

Adafruit LSM6DS

 

Adafruit Unified Sensor

شما می‌توانید مثال‌های زیادی را برای این سنسور در منوی زیر ببینید:

File -> Examples -> Adafruit LSM6DS

در این مثال‌ها، این سنسور را می‌توانید هم با رابط‌های SPI و هم I2C راه اندازی کنید، برای این کار می‌توانید کد مربوطه را از حالت کامنت خارج و دیگری را کامنت کنید:

 

ما از رابط SPI استفاده کرده‌ایم. کد کامل برنامه چرخش صفحه ما در آردوینو به‌صورت زیر می‌باشد:

ابتدا در تابع setup ماژول LSM6DS3 را از طریق رابط SPI راه اندازی می‌کنیم، سپس در حلقه اصلی، به‌صورت مداوم زاویه ماژول را به طریقی که بالاتر گفته شد، حساب می‌کنیم، اگر این زاویه تغییر کرد، آن را از طریق پورت سریال برای کامپیوتر ارسال می‌کنیم.

 

سخت افزار

دقت داشته باشید که سنسور LSM6DS3 را به 3.3 ولت متصل کرده باشید. سیم کشی مدار زیر بر اساس SPI است. اگر می‌خواهید با I2C راه اندازی کنید، ضمن تغییر کد (به روشی که اشاره شد)، می‌بایست نحوه سیم کشی را نیز تغییر دهید.

آردوینو و LSM6DS3

مدار چرخش صفحه با آردوینو و LSM6DS3

 

نرم افزار سمت دسکتاپ چرخش صفحه

ما در محیط دسکتاپ، نیاز به یک نرم افزار داریم تا زاویه مورد نظر را در طریق پورت سریال خوانده و سپس بر روی تنظیمات نمایشگر اعمال کند. این برنامه را با زبان‌های مختلفی مثل #C، پایتون و… می‌توان توسعه داد. در این آموزش، از زبان پایتون به جهت سادگی و امکان اجرا بر روی سیستم عامل‌های مختلف استفاده می‌کنیم.

در پایتون، برای خواندن اطلاعات از پورت سریال و چرخش نمایشگر، به کتابخانه‌های آن‌ها نیاز داریم. به همین خاطر، ابتدا با دستور pip، کتابخانه‌های pySerial و rotate-screen را نصب می‌کنیم.

 

 

سپس کد زیر را در فایل rotate.py ذخیره می‌کنیم.

از آنجایی که زبان پایتون به فاصله‌ها حساس است، بهتر است این اسکریپت را به‌صورت فایل در انتهای مطلب دانلود کنید.

با اجرا کردن این اسکریپت پایتون، ابتدا شماره پورت سریال (COM) مربوط به آردوینو از شما درخواست می‌شود، سپس برنامه به‌طور مداوم منتظر دریافت زاویه از طریق این پورت می‌ماند. در صورتی که زاویه جدیدی توسط آردوینو ارسال شد، آن را تنظیم می‌کند. دقت داشته باشید که در لینوکس و مک که بر پایه یونیکس هستند، پورت سریال بجای عدد، به‌صورت آدرس فایل است و باید این قسمت را تغییر کوچکی بدهید.

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

8 دیدگاه در “چرخش خودکار صفحه مانیتور دسکتاپ با آردوینو و سنسور LSM6DS3

  1. آراد گفت:

    با سلام
    من می خواستم سنسور LSM6DS3 روی بورد آردوینو از طریق پروتکل I2C راه اندازی کنم. فقط می خواستم مقادیر x-y-z را در خروجی نمایش بدهد. امکانش هست کد اصلاح شده را داشته باشم. با تشکر

    1. Digi Boy گفت:

      درود بر شما.
      ضمن تغییر پین‌ها در مدار، خط هفدهم (راه اندازی با SPI) را با کد I2C زیر جابجا کنید:
      if (!lsm6ds33.begin_I2C()) {
      مقدار x و y هم در خطوط 42 و 43 وجود دارند. برای به دست آوردن مقدار Z کد زیر را بهش اضافه کنید:
      signed char z = floor(accel.acceleration.z);
      حالا می تونید بقیه خود رو طبق سلیقه خودتون تغییر بدید و برای مثال با تابع Serial.print مقادیر را با فرمت دلخواهتون نمایش بدید.

  2. H.M گفت:

    رو ویندوز ۱۰ اجرا کردم صفحه رو هی تند تند میچرخوندم حاجی خیلی باحال بود آخرش از بس کرم ریختم دیفندر هشدار رفتار غیر عادی داد و اسکریپتو پاک کرد منم دوباره کپیش کردم. در کل حرکت جالبی بود خسه نباشید

    1. Digi Boy گفت:

      ممنون.
      انقدر الکی می چرخونید صفحه رو سیستمتون رو به فنا ندید! 😃

  3. آریا گفت:

    ایول چه باحال!!!!!!! من گیمرم و مانیتورم هم پایه آسانسوریه اما الکترونیک خیلی بلد نیستم ولی این قطعات رو سفارش دادم امیدوارم بتونم یکیشو بسازم 😊 دمتون گرم فدایی دارین

    1. Digi Boy گفت:

      آفرین، تو میتونی… 👍

  4. مهرداد گفت:

    دمتون گرم، خسته نباشید! مدارش رو ساختم خیلی جالبه. ممنون.