فهرست مطالب:
تصویری: ژیروسکوپ سرگرم کننده با حلقه نئوپیکسل: 4 مرحله (همراه با تصاویر)
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:53
در این آموزش ما از ژیروسکوپ 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 و عملکرد مثلثاتی که برای تعیین زاویه استفاده می شود ضمیمه کرده ام.
توصیه شده:
ساعت زنگ دار حبابی بیدار شدن را سرگرم کننده می کند (7): 7 مرحله (همراه با تصاویر)
ساعت زنگ دار حبابی بیدار شدن را سرگرم کننده می کند (بیدار شدن): بیدار شدن از خواب با صدای زنگ ساعت مضحک است. من از جمله افرادی هستم که دوست ندارند قبل از غروب آفتاب (یا ساعت های زیادی بیرون از خانه) بیدار شوند. بنابراین چه راهی بهتر از بیدار شدن سرگرم کننده تر از داشتن یک مهمانی حبابی در رختخواب است! استفاده از آردوینو و
سرگرم کننده با صفحه نمایش OLED و آردوینو: 12 مرحله (همراه با تصاویر)
سرگرمی با صفحه نمایش OLED و آردوینو: من مطمئن هستم که قطعا در مورد فناوری صفحه نمایش OLED شنیده اید. نسبتاً جدید است و کیفیت بهتری نسبت به فناوری LCD قدیمی ارائه می دهد. در این آموزش ما می خواهیم مراحل مورد نیاز برای نمایش داده ها در یکی از رایج ترین شرکت های مجرد را مرور کنیم
ساعت نئوپیکسل با سه حلقه نئوپیکسل: 7 مرحله
ساعت Neopixel با سه حلقه نئوپیکسل: ایجاد درخشان ساعت Neo Pixel توسط استیو مانلی من را مجبور کرد تا این دستورالعمل را در مورد نحوه ایجاد یک ساعت مشابه با کمترین هزینه ایجاد کنم. (یک عادت مهم هلندی همیشه تلاش برای پس انداز کردن پول است ؛-)) من متوجه شدم که
کنترل حلقه LED نئوپیکسل با حسگر اشاره: 3 مرحله (همراه با تصاویر)
کنترل یک حلقه هدایت Neopixel با یک سنسور اشاره: در این آموزش ما قصد داریم با یک سنسور حرکت (APDS-9960) و یک حلقه نئوپیکسلی بازی کنیم تا نحوه ترکیب هر دوی آنها با استفاده از Arduino UNO را یاد بگیریم. محصول نهایی به حرکت چپ - راست با متحرک کردن حرکت led به راست یا چپ ، و به شما
چگونه می توان یک تیرکمان بچه گانه جیغ کننده ThinkGeek را به یک تست کننده تداوم سرگرم کننده تبدیل کرد: 6 مرحله
چگونه می توان یک تیرکمان بچه گانه جیغ کننده ThinkGeek را به یک تست کننده تداوم مفرح تبدیل کرد: آیا تا به حال شده است که از صدای بوق استاندارد تسترهای پیوستگی خسته شده باشید؟ من دارم ، بنابراین از بقایای تیرکمان بچه میمون جیغی استفاده کردم که به یک هدست بلوتوث در https://www.instructables.com/id/How_to_turn_a_ThinkGeek_Screamin