در این مقاله آموزشی، قصد داریم تا صفحه مانیتور دسکتاپ را به کمک یک سنسور ژیروسکوپ (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 را دارا بوده و علاوه بر ژیروسکوپ، شتاب سنج هم میباشد.
این سنسور شتاب را بر پایهی سیستمهای میکرو الکترومکانیک (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 ها رو به بالا باشد، میتوانید آن را به همین صورت پشت مانیتور خود متصل کنید.
محاسبات بالا را میتوان بهصورت یک تابع به شکل زیر در آردوینو نوشت:
int calcScreenDegree(signed char x, signed char y){ if(x>5) return 0; if(y<-5) return 90; if(x<-5) return 180; return 270; }
راه اندازی سنسور LSM6DS3 با آردوینو
برای افزودن کتابخانه سنسور LSM6DS3 به آردوینو، وارد منوی زیر شوید:
Sketch -> include Libary -> Manage Libaries …
سپس یکی یکی کتابخانههای Adafruit LSM6DS، Adafruit BusIO و Adafruit Unified Sensor را جستجو کرده و نصب کنید.
شما میتوانید مثالهای زیادی را برای این سنسور در منوی زیر ببینید:
File -> Examples -> Adafruit LSM6DS
در این مثالها، این سنسور را میتوانید هم با رابطهای SPI و هم I2C راه اندازی کنید، برای این کار میتوانید کد مربوطه را از حالت کامنت خارج و دیگری را کامنت کنید:
if (!lsm6ds33.begin_I2C()) { // if (!lsm6ds33.begin_SPI(LSM_CS)) { // if (!lsm6ds33.begin_SPI(LSM_CS, LSM_SCK, LSM_MISO, LSM_MOSI)) {
ما از رابط SPI استفاده کردهایم. کد کامل برنامه چرخش صفحه ما در آردوینو بهصورت زیر میباشد:
#include <Adafruit_LSM6DS33.h> // For SPI mode, we need a CS pin #define LSM_CS 10 // For software-SPI mode we need SCK/MOSI/MISO pins #define LSM_SCK 13 #define LSM_MISO 12 #define LSM_MOSI 11 Adafruit_LSM6DS33 lsm6ds33; void setup(void) { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens if (!lsm6ds33.begin_SPI(LSM_CS)) { //Failed to find LSM6DS33 chip, start blink while (1) { digitalWrite(LED_BUILTIN, HIGH); delay(100); digitalWrite(LED_BUILTIN, LOW); delay(100); } } // LSM6DS33 Found! lsm6ds33.configInt1(false, false, true); // accelerometer DRDY on INT1 lsm6ds33.configInt2(false, true, false); // gyro DRDY on INT2 } int lastDegree = 0; void loop() { // /* Get a new normalized sensor event */ sensors_event_t accel; sensors_event_t gyro; sensors_event_t temp; lsm6ds33.getEvent(&accel, &gyro, &temp); signed char x = floor(accel.acceleration.x); signed char y = floor(accel.acceleration.y); int degree = calcScreenDegree(x, y); if(degree != lastDegree){ lastDegree = degree; Serial.print(degree); delay(300); } } int calcScreenDegree(signed char x, signed char y){ /* degree X Y 0 ~10(x>5) ~0 90 ~0 ~-10(y<-5) 180 ~-10(x<-5) ~0 270 ~0 ~10(y>5) */ if(x>5) return 0; if(y<-5) return 90; if(x<-5) return 180; return 270; }
ابتدا در تابع setup ماژول LSM6DS3 را از طریق رابط SPI راه اندازی میکنیم، سپس در حلقه اصلی، بهصورت مداوم زاویه ماژول را به طریقی که بالاتر گفته شد، حساب میکنیم، اگر این زاویه تغییر کرد، آن را از طریق پورت سریال برای کامپیوتر ارسال میکنیم.
سخت افزار
دقت داشته باشید که سنسور LSM6DS3 را به 3.3 ولت متصل کرده باشید. سیم کشی مدار زیر بر اساس SPI است. اگر میخواهید با I2C راه اندازی کنید، ضمن تغییر کد (به روشی که اشاره شد)، میبایست نحوه سیم کشی را نیز تغییر دهید.
نرم افزار سمت دسکتاپ چرخش صفحه
ما در محیط دسکتاپ، نیاز به یک نرم افزار داریم تا زاویه مورد نظر را در طریق پورت سریال خوانده و سپس بر روی تنظیمات نمایشگر اعمال کند. این برنامه را با زبانهای مختلفی مثل #C، پایتون و… میتوان توسعه داد. در این آموزش، از زبان پایتون به جهت سادگی و امکان اجرا بر روی سیستم عاملهای مختلف استفاده میکنیم.
در پایتون، برای خواندن اطلاعات از پورت سریال و چرخش نمایشگر، به کتابخانههای آنها نیاز داریم. به همین خاطر، ابتدا با دستور pip، کتابخانههای pySerial و rotate-screen را نصب میکنیم.
pip install rotate-screen pyserial
سپس کد زیر را در فایل rotate.py ذخیره میکنیم.
# Importing Libraries import serial import rotatescreen import time import sys #Open port comPort = input("Please Enter number of com port:"); try: arduino = serial.Serial(port='COM'+comPort, baudrate=115200, timeout=.1) except: sys.exit("Can not open port.") screen = rotatescreen.get_primary_display() print("Ready!"); #read serial data while True: degree = arduino.readline().decode("ascii") #degree = degree.lstrip("b'") if(not (degree) == ""): screen.rotate_to(int(degree)) print(degree)
از آنجایی که زبان پایتون به فاصلهها حساس است، بهتر است این اسکریپت را بهصورت فایل در انتهای مطلب دانلود کنید.
با اجرا کردن این اسکریپت پایتون، ابتدا شماره پورت سریال (COM) مربوط به آردوینو از شما درخواست میشود، سپس برنامه بهطور مداوم منتظر دریافت زاویه از طریق این پورت میماند. در صورتی که زاویه جدیدی توسط آردوینو ارسال شد، آن را تنظیم میکند. دقت داشته باشید که در لینوکس و مک که بر پایه یونیکس هستند، پورت سریال بجای عدد، بهصورت آدرس فایل است و باید این قسمت را تغییر کوچکی بدهید.
منبع:سیسوگ