در این مقاله آموزشی، قصد داریم در یکی دیگر از پروژه های آردوینو، صفحه مانیتور دسکتاپ را به کمک یک سنسور ژیروسکوپ (Gyroscope) و شتاب سنج (Accelerometer) به نام LSM6DS3 بچرخانیم. از برد آردوینو با میکروکنترلر AVR برای قسمت سخت افزاری استفاده شده و برنامه چرخش صفحه سمت دسکتاپ نیز، به زبان پایتون نوشته شده و در ویندوز تست شده است. از آن جایی که پایتون مالتی پلت فرم است، با تغییرات بسیار کوچکی، میتوان آن را در لینوکس و مک نیز اجرا کرد!
پس با سیسوگ همراه باشید!
پس بزن بریم!
شاید برای شما مفید باشد: پروژه الکترونیک با میکروکنترلر های مختلف و آموزش 0 تا 100 راه اندازی پروژه
ایده اولیه
پایههای نگهدارنده بعضی از مانیتورها، قابلیت چرخش 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 نیز صدق میکند.
شاید برای شما مفید باشد: آموزش AVR از 0 تا 100 به همراه جزوه PDF و ویدئو آموزشی
برای اندازه گیری زاویه مانیتور، ما به محور Z نیازی نداریم و محور X و Y برای ما کافی میباشد.
در حالتی که محور X رو به بالا است، سنسور بیشترین مقدار را برای محور X (حدود 10) اندازه گیری میکند و محور Y ها تقریباً مقدار صفر دارد. (زاویه 0 درجه)
در حالتی که محور Y رو به پایین است، سنسور کمترین مقدار را برای محور Y (حدود 10-) اندازه گیری میکند و محور X ها تقریباً مقدار صفر دارد. (زاویه 90 درجه)
در حالتی که محور X رو به پایین است، سنسور کمترین مقدار را برای محور X (حدود 10-) اندازه گیری میکند و محور Y ها تقریباً مقدار صفر دارد. (زاویه 180 درجه)
در حالتی که محور Y رو به بالا است، سنسور بیشترین مقدار را برای محور Y (حدود 10) اندازه گیری میکند و محور X ها تقریباً مقدار صفر دارد. (زاویه 270 درجه)
بنابراین، اگر سنسور را بهصورت عمودی روبروی خود بگیرید، به گونهای که محور X ها رو به بالا باشد، میتوانید آن را به همین صورت پشت مانیتور خود متصل کنید.
محاسبات بالا را میتوان بهصورت یک تابع به شکل زیر در آردوینو نوشت:
1 2 3 4 5 6 | 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 راه اندازی کنید، برای این کار میتوانید کد مربوطه را از حالت کامنت خارج و دیگری را کامنت کنید:
1 2 3 | if (!lsm6ds33.begin_I2C()) { // if (!lsm6ds33.begin_SPI(LSM_CS)) { // if (!lsm6ds33.begin_SPI(LSM_CS, LSM_SCK, LSM_MISO, LSM_MOSI)) { |
ما از رابط SPI استفاده کردهایم. کد کامل برنامه چرخش صفحه ما در آردوینو بهصورت زیر میباشد:
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 56 57 58 59 60 61 62 63 64 65 | #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 را نصب میکنیم.
1 | pip install rotate-screen pyserial |
سپس کد زیر را در فایل rotate.py ذخیره میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 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) مربوط به آردوینو از شما درخواست میشود، سپس برنامه بهطور مداوم منتظر دریافت زاویه از طریق این پورت میماند. در صورتی که زاویه جدیدی توسط آردوینو ارسال شد، آن را تنظیم میکند. دقت داشته باشید که در لینوکس و مک که بر پایه یونیکس هستند، پورت سریال بجای عدد، بهصورت آدرس فایل است و باید این قسمت را تغییر کوچکی بدهید.
راهش انداختم خیلی باحاله، حتما یه PCB براش می کشم و پشت مانیتورم وصل میکنم ? دیجی بوی عاشقتم ?
قابل شما رو نداره ?
با سلام
من می خواستم سنسور LSM6DS3 روی بورد آردوینو از طریق پروتکل I2C راه اندازی کنم. فقط می خواستم مقادیر x-y-z را در خروجی نمایش بدهد. امکانش هست کد اصلاح شده را داشته باشم. با تشکر
درود بر شما.
ضمن تغییر پینها در مدار، خط هفدهم (راه اندازی با SPI) را با کد I2C زیر جابجا کنید:
if (!lsm6ds33.begin_I2C()) {
مقدار x و y هم در خطوط 42 و 43 وجود دارند. برای به دست آوردن مقدار Z کد زیر را بهش اضافه کنید:
signed char z = floor(accel.acceleration.z);
حالا می تونید بقیه خود رو طبق سلیقه خودتون تغییر بدید و برای مثال با تابع Serial.print مقادیر را با فرمت دلخواهتون نمایش بدید.
رو ویندوز ۱۰ اجرا کردم صفحه رو هی تند تند میچرخوندم حاجی خیلی باحال بود آخرش از بس کرم ریختم دیفندر هشدار رفتار غیر عادی داد و اسکریپتو پاک کرد منم دوباره کپیش کردم. در کل حرکت جالبی بود خسه نباشید
ممنون.
انقدر الکی می چرخونید صفحه رو سیستمتون رو به فنا ندید! ?
ایول چه باحال!!!!!!! من گیمرم و مانیتورم هم پایه آسانسوریه اما الکترونیک خیلی بلد نیستم ولی این قطعات رو سفارش دادم امیدوارم بتونم یکیشو بسازم ? دمتون گرم فدایی دارین
آفرین، تو میتونی… ?
دمتون گرم، خسته نباشید! مدارش رو ساختم خیلی جالبه. ممنون.
?