فهرست مطالب:

ژیروسکوپ سرگرم کننده با حلقه نئوپیکسل: 4 مرحله (همراه با تصاویر)
ژیروسکوپ سرگرم کننده با حلقه نئوپیکسل: 4 مرحله (همراه با تصاویر)

تصویری: ژیروسکوپ سرگرم کننده با حلقه نئوپیکسل: 4 مرحله (همراه با تصاویر)

تصویری: ژیروسکوپ سرگرم کننده با حلقه نئوپیکسل: 4 مرحله (همراه با تصاویر)
تصویری: سه کاری که زنان آرزو می کنند مردان در رختخواب انجام دهند | حقیقت روانشناسی درروابط زن و مرد 2024, نوامبر
Anonim
Image
Image

در این آموزش ما از ژیروسکوپ MPU6050 ، یک حلقه نئوپیکسلی و یک آردوینو برای ساخت دستگاهی استفاده می کنیم که چراغ های رهبری را مطابق با زاویه تمایل نشان می دهد.

این یک پروژه ساده و سرگرم کننده است و قرار است روی یک تخته نان جمع شود. اگر مراحل را دنبال کنید ، آنچه را که در ویدیو مشاهده کردید بسازید. این یک آموزش خوب برای یادگیری ژیروسکوپ و حلقه نئوپیکسل است.

من این آموزش را به دلیل علاقه ای که در اولین آموزش خود در اینجا (Gyroscope Led Control With Arduino) دیدم ، ایجاد می کنم. در این دستورالعمل ، led های ساده را با یک حلقه نئوپیکسل جایگزین کرده ام. استفاده از انگشتر در کتابخانه Adafruit ساده تر است و قطعاً دیدنی تر است.

بنابراین اگر این اجزا را در اطراف خود دارید ، این یک راه عالی برای استفاده از آنها است ، من سعی می کنم گام به گام شما را در ساخت دستگاه راهنمایی کرده و همچنین نحوه عملکرد آن را در آخرین مرحله توضیح دهم.

مرحله 1: موارد مورد نیاز

مونتاژ
مونتاژ

قطعات

1. Arduino pro mini 328p (eBay) 2 دلار

2. تخته نان

3. ژیروسکوپ MPU6050 (eBay) 1.2 دلار

4. حلقه led 24 نئوپیکسلی (Adafruit) 17 دلار

5. بسته 4 عددی باتری AA با 4 باتری

6. کابل های بلوز شکل U (اختیاری). من از این کابل های جامپر استفاده کرده ام زیرا روی تخته نان بهتر به نظر می رسند و led ها به این ترتیب بیشتر قابل مشاهده هستند. شما می توانید یک جعبه 140 در ebay با قیمت حدود 4 دلار پیدا کنید. اگر این کابل ها را ندارید ، می توانید آنها را با سیم های dupont جایگزین کنید.

ابزارها:

1. USB به سریال FTDI آداپتور FT232RL برای برنامه نویسی arduino pro mini

2. Arduino IDE

مهارت: 1. لحیم کاری ، این آموزش را بررسی کنید

3. برنامه نویسی اولیه arduino ، این آموزش ممکن است مفید باشد

مرحله 2: مونتاژ

مونتاژ
مونتاژ

من طرح کلی را در قالب fzz و تصویری از آن برای تجسم آسان اتصالات پیوست کرده ام

1. شما باید 3 پین نر را در پشت حلقه نئوپیکسلی مانند تصویر بچسبانید

- پین مثبت را لحیم کنید

- زمین را لحیم کنید

- پین ورودی داده را لحیم کنید

2. سپس نگهدارنده 4 برابر باتری باید راهی برای اتصال به نان برد داشته باشد ، راه حل آسان این است که دو سیم نر dupont را به پایانه های خود بچسبانید.

3. تخته نان را آماده کنید.

- حلقه نئوپیکسل ، میکروکنترلر و ژیروسکوپ را مانند تصویر روی تخته نان قرار دهید

- همه سیمهای منفی را قرار دهید: به میکروکنترلر ، حلقه نئوپیکسل ، ژیروسکوپ

- همه سیمهای مثبت را قرار دهید: به میکروکنترلر ، حلقه نئوپیکسل ، ژیروسکوپ

- قرار دادن تمام سیم های داده:

* SDA و SCL از میکروکنترلر تا ژیروسکوپ

* پین D6 را از میکروکنترلر به حلقه نئوپیکسل متصل کنید

- قبل از تغذیه ، همه اتصالات را دوباره بررسی کنید

- به صورت اختیاری با استفاده از نوار چسب ، بسته باتری را در پشت تخته چسب بزنید تا در جای خود نگه داشته شود و قابل حمل تر شود

مرحله 3: کد و کالیبراسیون

ابتدا باید دو کتابخانه را بارگیری و نصب کنید:

1. کتابخانه کتابخانه نئوپیکسل آدافروت کنترل کننده نئوپیکسل

2. کتابخانه MPU6050 برای ژیروسکوپ

3. منبع کتابخانه I2CDev

آنها دو کتابخانه بزرگ هستند که کارهای سنگین را انجام خواهند داد!

جزئیات بیشتر در مورد نئوپیکسلها در اینجا

سپس کتابخانه من را از اینجا بارگیری و نصب کنید یا از زیر کپی کنید:

#شامل "I2Cdev.h"

#شامل #شامل #MPU6050_6Axis_MotionApps20.h " #شامل" Wire.h " #تعریف NEOPIXED_CONTROL_PIN 6 #تعریف NUM_LEDS 24 const int MAX_ANGLE = 45 ؛ const int LED_OFFSET = 12؛ MPU6050 mpu ؛ نوار Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS ، NEOPIXED_CONTROL_PIN ، NEO_RBG + NEO_KHZ800) ؛ unsigned long lastPrintTime = 0؛ bool initialization = false؛ // اگر DMP init موفق بود uint8_t mpuIntStatus موفقیت آمیز بود ؛ // دارای بایت وضعیت وقفه واقعی از MPU uint8_t devStatus است. // بازگشت وضعیت پس از هر عملیات دستگاه (0 = موفقیت ، 0 = خطا) uint16_t packetSize؛ // اندازه بسته DMP مورد انتظار (پیش فرض 42 بایت است) uint16_t fifoCount؛ // تعداد کل بایت های موجود در FIFO uint8_t fifoBuffer [64] ؛ // بافر ذخیره سازی FIFO Quaternion q؛ // [w، x، y، z] quaternion container VectorFlo gravity؛ // [x، y، z] بردار گرانش شناور ypr [3]؛ // [yaw، pitch، roll] yaw/pitch/roll ظرف و بردار گرانش bool volatile bool mpuInterrupt = false؛ // نشان می دهد که آیا پین وقفه MPU بالا رفته است یا خیر

void setup ()

{Serial.begin (9600) ؛ Serial.println ("برنامه شروع شد") ؛ مقداردهی = initializeGyroscope ()؛ strip.begin ()؛ } void loop () {if (! مقداردهی اولیه) {return؛ } mpuInterrupt = false؛ mpuIntStatus = mpu.getIntStatus ()؛ fifoCount = mpu.getFIFOCount ()؛ if (hasFifoOverflown (mpuIntStatus، fifoCount)) {mpu.resetFIFO ()؛ برگشت؛ } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount ()؛ } mpu.getFIFOBytes (fifoBuffer ، packetSize) ؛ fifoCount -= packetSize؛ mpu.dmpGetQuaternion (& q، fifoBuffer) ؛ mpu.dmpGetGravity (& جاذبه ، & q) ؛ mpu.dmpGetYawPitchRoll (ypr ، & q ، & جاذبه) ؛ redrawLeds (ypr [0] * 180/M_PI ، ypr [1] * 180/M_PI ، ypr [2] * 180/M_PI) ؛ }} boolean hasFifoOverflown (int mpuIntStatus، int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024؛ } void redrawLeds (int x، int y، int z) {x = constrain (x، -1 * MAX_ANGLE، MAX_ANGLE)؛ y = محدودیت (y ، -1 * MAX_ANGLE ، MAX_ANGLE) ؛ if (y 0) {lightLeds (y ، z ، 0 ، 5 ، 0 ، 89) ؛ } else if (y <0 و z 0 و z 0 و z> 0) {lightLeds (y، z، 20، 24، 89، 0)؛ }} void lightLeds (int x، int y، int fromLedPosition ، int toLedPosition ، int fromAngle ، int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71؛ int ledNr = map (angle، fromAngle، toAngle، fromLedPosition، toLedPosition)؛ printDebug (x ، y ، ledNr ، زاویه) ؛ رنگ uint32_t ؛ برای (int i = 0 ؛ موقعیت i + LED_OFFSET) {موقعیت بازگشت + LED_OFFSET ؛ } موقعیت بازگشت + LED_OFFSET - NUM_LEDS ؛ } void printDebug (int y، int z، int lightLed، int angle) {if (millis () - lastPrintTime <500) {return؛ } Serial.print ("a =")؛ Serial.print (angle)؛ Serial.print ("؛")؛ Serial.print ("ll =") ؛ Serial.print (lightLed) ؛ Serial.print ("؛") ؛ Serial.print ("y =")؛ Serial.print (y)؛ Serial.print ("؛")؛ Serial.print ("z =")؛ Serial.print (z)؛ Serial.println ("؛")؛ lastPrintTime = millis ()؛ } bool initializeGyroscope () {Wire.begin ()؛ TWBR = 24 ؛ mpu.initialize ()؛ Serial.println (mpu.testConnection ()؟ F ("اتصال MPU6050 موفق شد"): F ("اتصال MPU6050 ناموفق بود")) ؛ Serial.println (F ("راه اندازی DMP …")) ؛ devStatus = mpu.dmpInitialize ()؛ mpu.setXGyroOffset (220) ؛ mpu.setYGyroOffset (76) ؛ mpu.setZGyroOffset (-85) ؛ mpu.setZAccelOffset (1788) ؛ if (devStatus! = 0) {Serial.print (F ("DMP Initialization failed (code"))؛ Serial.println (devStatus)؛ return false؛} mpu.setDMPEnabled (true)؛ Serial.println (F ("Enableing تشخیص وقفه (وقفه خارجی آردوینو 0) … "))؛ attachInterrupt (0 ، dmpDataReady ، RISING) ؛ mpuIntStatus = mpu.getIntStatus () ؛ Serial.println (F (" DMP آماده! در انتظار اولین وقفه … ")) ؛ بسته بندی = mpu.dmpGetFIFOPacketSize () ؛ true true؛} void dmpDataReady () {mpuInterrupt = true؛}

بارگذاری کد:

با استفاده از آداپتور FTDI کد را در آردوینو بارگذاری کنید.

منبع تغذیه (باتری) را وصل کنید

تنظیم:

مهمترین چیزی که در اینجا کالیبره می شود ثابت "LED_OFFSET" است. در مثال من عدد 12 است. شما باید این عدد را از 0 تا 23 تنظیم کنید تا پس از روشن شدن برد ، چراغ در جهت کج شدن برد روشن شود.

اگر می خواهید جزئیات بیشتری در مورد نحوه عملکرد آن پیدا کنید ، آخرین مرحله را بررسی کنید

مرحله 4: نحوه کار (اختیاری)

نحوه کار (اختیاری)
نحوه کار (اختیاری)

ابتدا کمی اطلاعات در مورد ژیروسکوپ MPU6050. این یک ژیروسکوپ MEMS است (MEMS مخفف Microelectromechanical systems) است.

هر نوع ژیروسکوپ MEM نوعی از جزء نوسانی دارد که از آنجا می توان تراکم و در نتیجه تغییر جهت را تشخیص داد. این به این دلیل است که طبق قانون حفظ حرکت ، یک جسم ارتعاشی دوست دارد در همان صفحه به ارتعاش خود ادامه دهد و از هرگونه انحراف ارتعاشی می توان برای ایجاد تغییر جهت استفاده کرد.

ژیروسکوپ همچنین دارای یک میکروکنترلر مخصوص خود برای محاسبه رول ، پیچ و خم شدن در برخی از ریاضیات فانتزی است.

اما داده های ژیروسکوپ از نویز و رانش رنج می برند ، بنابراین ما از یک کتابخانه خارجی برای هموارسازی و ارائه داده های قابل استفاده تمیز استفاده کردیم.

Neopixel رهبری RGB است که به صورت جداگانه قابل آدرس دهی است و در نوارها و حلقه ها زنجیر شده است. آنها روی 5 ولت کار می کنند و دارای مدارهای خود هستند ، بنابراین شما فقط باید نئو پیکسل ها را تغذیه کنید و با آنها با استفاده از خط داده ارتباط برقرار کنید. ارتباط با یک خط داده واحد شامل ساعت و داده انجام می شود (جزئیات بیشتر در اینجا). Adafruit یک کتابخانه تمیز برای تعامل با حلقه های نئوپیکسلی فراهم می کند.

کد

در داخل تابع l oop () ، کتابخانه MPU6050_6Axis_MotionApps20 نامیده می شود. هنگامی که کتابخانه داده های جدیدی از ژیروسکوپ دارد ، redrawLeds (x ، y ، z) را با 3 آرگومان نشان دهنده yaw ، pitch و roll فراخوانی می کند.

داخل redrawLeds ():

- ما بر دو محور تمرکز می کنیم: y ، z

- ما هر دو محور را از -MAX_ANGLE به +MAX_ANGLE محدود می کنیم ، حداکثر زاویه را به 45 تعریف کرده ایم و قابل تغییر است

- ما 360 درجه را به 4 قسمت تقسیم می کنیم و برای هر یک توابع lightLeds () را به شرح زیر فراخوانی می کنیم:

* y منفی ، z مثبت چهارم اول led ها را از 0 تا 5 کنترل می کند ، زاویه از 0 تا 89 خواهد بود

* y منفی ، z منفی کنترل ربع دوم led ها را از 6 تا 12 هدایت می کند ، زاویه آن 89 تا 0 خواهد بود

* …و غیره

- در داخل تابع lightLeds

* من زاویه ای را بر اساس دو محور با استفاده از دو ضلعی محاسبه می کنم (تصویر پیوست را بررسی کنید)

* من محاسبه می کنم که با استفاده از تابع نقشه آردوینو چه چیزی منجر به نمایش شد

* من نوار led را به جز دو عدد led تنظیم مجدد می کنم ، یکی مربوط به موقعیت led که قبلاً محاسبه کرده بودم و موقعیت led قبل (برای نشان دادن اثر محو شدن)

* من از تابع normalizeLedPosition () برای در نظر گرفتن کالیبراسیون نئوپیکسل استفاده می کنم. کالیبراسیون مفید است زیرا حلقه نئوپیکسلی را می توان به دلخواه چرخاند و باید با ژیروسکوپ تراز شود.

* من همچنین در حال چاپ محور یدک کش هستم ، چراغ دارای نور و زاویه است

ریاضیات

عکسی را با حلقه led و عملکرد مثلثاتی که برای تعیین زاویه استفاده می شود ضمیمه کرده ام.

توصیه شده: