विषयसूची:

Neopixel Ring के साथ Gyroscope Fun: 4 कदम (चित्रों के साथ)
Neopixel Ring के साथ Gyroscope Fun: 4 कदम (चित्रों के साथ)

वीडियो: Neopixel Ring के साथ Gyroscope Fun: 4 कदम (चित्रों के साथ)

वीडियो: Neopixel Ring के साथ Gyroscope Fun: 4 कदम (चित्रों के साथ)
वीडियो: How to Easily Control Addressable LEDs with an ESP32 or ESP8266 | WLED Project 2024, नवंबर
Anonim
Image
Image

इस ट्यूटोरियल में हम MPU6050 जाइरोस्कोप, एक नियोपिक्सल रिंग और एक आर्डिनो का उपयोग करने जा रहे हैं ताकि एक उपकरण बनाया जा सके जो झुकाव के कोण के अनुरूप रोशनी करता है।

यह एक सरल और मजेदार प्रोजेक्ट है और इसे एक ब्रेडबोर्ड पर इकट्ठा किया जा रहा है। अगर आप उन चरणों का पालन करेंगे जो आपने वीडियो में देखे थे तो आप उसका निर्माण करेंगे। जाइरोस्कोप और नियोपिक्सल रिंग के बारे में सीखने के लिए यह एक अच्छा ट्यूटोरियल है।

मैं इस ट्यूटोरियल का निर्माण इसलिए कर रहा हूँ क्योंकि मैंने यहाँ अपने पहले इंस्ट्रक्शनल (अरुडिनो के साथ गायरोस्कोप एलईडी कंट्रोल) में रुचि दिखाई है। इस निर्देशयोग्य में मैंने साधारण एलईडी को एक नियोपिक्सल रिंग से बदल दिया है। एडफ्रूट लाइब्रेरी के माध्यम से रिंग का उपयोग करना आसान है और यह निश्चित रूप से अधिक शानदार है।

इसलिए यदि आपके पास ये घटक पड़े हैं, तो उनका उपयोग करने का एक शानदार तरीका है, मैं आपको डिवाइस के निर्माण के माध्यम से कदम से कदम उठाने की कोशिश करूंगा और यह भी बताऊंगा कि यह अंतिम चरण में कैसे काम करता है।

चरण 1: आवश्यक चीज़ें

सभा
सभा

पार्ट्स

1. Arduino प्रो मिनी 328p (ईबे) 2 $

2. ब्रेडबोर्ड

3. MPU6050 जाइरोस्कोप (ईबे) 1.2$

4. 24 नियोपिक्सल एलईडी रिंग (एडफ्रूट) 17 $

5. 4 बैटरी के साथ 4 x AA बैटरी पैक

6. यू-आकार के जम्पर केबल (वैकल्पिक)। मैंने इन जम्पर केबल्स का उपयोग किया है क्योंकि वे ब्रेडबोर्ड पर बेहतर दिखते हैं, और इस तरह से एल ई डी अधिक दिखाई देते हैं। आप eBay पर लगभग 4$ में 140 का एक बॉक्स पा सकते हैं। यदि आपके पास ये केबल नहीं हैं तो आप इन्हें डुपोंट तारों से बदल सकते हैं।

उपकरण:

1. USB से सीरियल FTDI अडैप्टर FT232RL Arduino प्रो मिनी को प्रोग्राम करने के लिए

2. अरुडिनो आईडीई

कौशल: १। सोल्डरिंग, इस ट्यूटोरियल की जाँच करें

3. बेसिक आर्डिनो प्रोग्रामिंग, यह ट्यूटोरियल उपयोगी हो सकता है

चरण 2: विधानसभा

सभा
सभा

मैंने कनेक्शन के आसान विज़ुअलाइज़ेशन के लिए fzz प्रारूप में फ्रिट्ज़िंग योजनाबद्ध और इसकी एक तस्वीर संलग्न की है

1. आपको नियोपिक्सल रिंग के पीछे 3 पुरुष पिनों को मिलाप करने की आवश्यकता है जैसा कि चित्र में दिखाया गया है

- सकारात्मक पिन मिलाप

- जमीन मिलाप

- डेटा इनपुट पिन मिलाप

2. फिर 4x बैटरी धारक के पास ब्रेडबोर्ड से जुड़ने का एक तरीका होना चाहिए, एक आसान उपाय यह है कि दो पुरुष ड्यूपॉन्ट तारों को इसके टर्मिनलों से मिलाया जाए।

3. ब्रेडबोर्ड तैयार करें।

- ब्रेडबोर्ड पर नियोपिक्सल रिंग, माइक्रोकंट्रोलर और गायरोस्कोप को चित्र की तरह रखें

- सभी नकारात्मक तारों को रखें: माइक्रोकंट्रोलर, नियोपिक्सल रिंग, जाइरो. को

- सभी सकारात्मक तारों को रखें: माइक्रोकंट्रोलर, नियोपिक्सल रिंग, जाइरो. को

- सभी डेटा तार लगाएं:

* एसडीए और एससीएल माइक्रोकंट्रोलर से जाइरो तक

* माइक्रोकंट्रोलर से नियोपिक्सल रिंग में D6 पिन करें

- बिजली देने से पहले सभी कनेक्शनों की दोबारा जांच करें

- वैकल्पिक रूप से डक्ट टेप का उपयोग करके, बैटरी पैक को ब्रैडबोर्ड के पिछले हिस्से पर टेप करके उसे जगह पर रखें और इसे अधिक पोर्टेबल बनाएं

चरण 3: कोड और अंशांकन

सबसे पहले आपको दो पुस्तकालयों को डाउनलोड और इंस्टॉल करना होगा:

1. एडफ्रूट नियोपिक्सल लाइब्रेरी प्राथमिकी नियोपिक्सल को नियंत्रित करता है

2. जाइरोस्कोप के लिए MPU6050 पुस्तकालय

3. I2CDev पुस्तकालय स्रोत

वे दो महान पुस्तकालय हैं जो भारी भारोत्तोलन करेंगे!

नियोपिक्सल के बारे में अधिक जानकारी यहाँ

फिर मेरी लाइब्रेरी को यहां से डाउनलोड और इंस्टॉल करें या इसे नीचे से कॉपी करें:

#शामिल "I2Cdev.h"

#शामिल करें #शामिल करें "MPU6050_6Axis_MotionApps20.h" #शामिल "वायर.एच" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 const int MAX_ANGLE = 45; कॉन्स्ट इंट LED_OFFSET = 12; एमपीयू 6050 एमपीयू; Adafruit_NeoPixel स्ट्रिप = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); अहस्ताक्षरित लंबा लास्टप्रिंटटाइम = 0; बूल इनिशियलाइज़ेशन = असत्य; // सही सेट करें यदि DMP init सफल uint8_t mpuIntStatus था; // एमपीयू uint8_t devStatus से वास्तविक इंटरप्ट स्थिति बाइट रखता है; // प्रत्येक डिवाइस ऑपरेशन के बाद वापसी की स्थिति (0 = सफलता, !0 = त्रुटि) uint16_t packageSize; // अपेक्षित डीएमपी पैकेट आकार (डिफ़ॉल्ट 42 बाइट्स है) uint16_t फीफोकाउंट; // वर्तमान में फीफो uint8_t फीफोबफर [64] में सभी बाइट्स की गिनती; // फीफो स्टोरेज बफर क्वाटरनियन क्यू; // [w, x, y, z] क्वाटरनियन कंटेनर वेक्टरफ्लोट ग्रेविटी; // [x, y, z] ग्रेविटी वेक्टर फ्लोट ypr[3]; // [यॉ, पिच, रोल] यॉ/पिच/रोल कंटेनर और ग्रेविटी वेक्टर वोलेटाइल बूल एमपीयूइंटरप्ट = झूठा; // इंगित करता है कि क्या एमपीयू इंटरप्ट पिन उच्च हो गया है

व्यर्थ व्यवस्था()

{ सीरियल.बेगिन (९६००); Serial.println ("कार्यक्रम शुरू हुआ"); इनिशियलाइज़ेशन = इनिशियलाइज़ गायरोस्कोप (); पट्टी। शुरू (); } शून्य लूप () { अगर (! आरंभीकरण) {वापसी; } एमपीयूइंटरप्ट = झूठा; mpuIntStatus = mpu.getIntStatus (); फीफोकाउंट = mpu.getFIFOCount (); अगर (hasFifoOverflown (mpuIntStatus, फीफोकाउंट)) {mpu.resetFIFO (); वापसी; } अगर (mpuIntStatus और 0x02) { जबकि (फीफोकाउंट <पैकेटसाइज) {फीफोकाउंट = mpu.getFIFOCount (); } mpu.getFIFOBytes (फीफोबफर, पैकेटसाइज); फीफोकाउंट - = पैकेटसाइज; mpu.dmpGetQuaternion(&q, फीफोबफर); mpu.dmpGetGravity(&गुरुत्वाकर्षण, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); रेड्रालेड्स (ypr[0] * 180/M_PI, ypr[1] * 180/M_PI, ypr[2] * 180/M_PI); } } बूलियन hasFifoOverflown(int mpuIntStatus, int fifoCount) { वापसी mpuIntStatus & 0x10 || फीफोकाउंट == 1024; } शून्य पुनर्रचना (int x, int y, int z) { x = बाधा (x, -1 * MAX_ANGLE, MAX_ANGLE); वाई = बाधा (वाई, -1 * MAX_ANGLE, MAX_ANGLE); अगर (y 0) { लाइटलेड्स (y, z, 0, 5, 0, 89); } और अगर (y <0 और z 0 और z 0 और z> 0) { lightLeds(y, z, 20, 24, 89, 0); } } शून्य प्रकाश एलईडी (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {डबल एंगल = (एटन ((डबल) एब्स (एक्स) / (डबल) एब्स (वाई)) * 4068) / ७१; int एलईडीएनआर = नक्शा (कोण, कोण से, कोण से, लेडपोजिशन से, लेडपोजिशन से); प्रिंटडिबग (एक्स, वाई, एलईडीएनआर, कोण); uint32_t रंग; के लिए (int i = 0; i स्थिति + LED_OFFSET) {वापसी की स्थिति + LED_OFFSET; } वापसी की स्थिति + LED_OFFSET - NUM_LEDS; } शून्य प्रिंटडिबग (इंट वाई, इंट जेड, इंट लाइटलेड, इंट एंगल) {अगर (मिलिस () - लास्टप्रिंटटाइम <500) {रिटर्न; } 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("; "); लास्टप्रिंटटाइम = मिली (); } बूल इनिशियलाइज़ गायरोस्कोप () {वायर.बेगिन (); TWBR = 24; mpu.initialize (); Serial.println(mpu.testConnection() ? F("MPU6050 कनेक्शन सफल"): F("MPU6050 कनेक्शन विफल")); Serial.println (एफ ("डीएमपी प्रारंभ करना …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); if (devStatus != 0) { Serial.print(F("DMP इनिशियलाइज़ेशन फेल (कोड"));Serial.println(devStatus); रिटर्न झूठा; } mpu.setDMPEnabled(true); Serial.println(F("Enableing) इंटरप्ट डिटेक्शन (Arduino एक्सटर्नल इंटरप्ट 0)… "); अटैचइंटरप्ट (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); सीरियल.प्रिंट्लन (F ("डीएमपी तैयार! पहले इंटरप्ट की प्रतीक्षा कर रहा है …")); पैकेटसाइज़ = mpu.dmpGetFIFOPacketSize (); सही लौटें; } शून्य dmpDataReady () {mpuInterrupt = true; }

कोड अपलोड करें:

FTDI अडैप्टर का उपयोग करके कोड को arduino पर अपलोड करें।

बिजली की आपूर्ति (बैटरी) कनेक्ट करें

अंशांकन:

यहां कैलिब्रेट करने के लिए सबसे महत्वपूर्ण चीज "LED_OFFSET" स्थिरांक है। मेरे उदाहरण में 12 है। आपको इसे 0 से 23 तक समायोजित करने की आवश्यकता है ताकि बोर्ड को पावर देने के बाद एलईडी उस दिशा में प्रकाश करे जिस दिशा में आप बोर्ड को झुकाते हैं।

यदि आप इस बारे में अधिक जानकारी प्राप्त करना चाहते हैं कि यह कैसे काम करता है तो अंतिम चरण देखें

चरण 4: यह कैसे काम करता है (वैकल्पिक)

यह कैसे काम करता है (वैकल्पिक)
यह कैसे काम करता है (वैकल्पिक)

सबसे पहले MPU6050 जायरोस्कोप के बारे में थोड़ी जानकारी। यह एक एमईएमएस गायरोस्कोप है (एमईएमएस माइक्रोइलेक्ट्रोमैकेनिकल सिस्टम के लिए खड़ा है)।

प्रत्येक प्रकार के एमईएम जाइरोस्कोप में कुछ प्रकार के दोलन घटक होते हैं जहां से त्वरण, और इसलिए दिशा परिवर्तन का पता लगाया जा सकता है। ऐसा इसलिए है, क्योंकि गति के संरक्षण के नियम के अनुसार, एक कंपन वस्तु उसी तल में कंपन जारी रखना पसंद करती है, और किसी भी कंपन विचलन का उपयोग दिशा में परिवर्तन प्राप्त करने के लिए किया जा सकता है।

कुछ फैंसी गणित के माध्यम से रोल, पिच और यॉ की गणना करने के लिए जाइरो में स्वयं का एक माइक्रोकंट्रोलर भी होता है।

लेकिन जाइरो कच्चा डेटा शोर और बहाव से ग्रस्त है, इसलिए हमने चीजों को सुचारू करने और हमें स्वच्छ प्रयोग करने योग्य डेटा देने के लिए एक बाहरी पुस्तकालय का उपयोग किया।

नियोपिक्सल आरजीबी एलईडी हैं जिन्हें व्यक्तिगत रूप से संबोधित किया जा सकता है और बैंड और रिंगों में जंजीर से बांधा जाता है। वे 5V पर काम करते हैं और उनमें स्वयं की सर्किटरी होती है, इसलिए आपको केवल नियोपिक्सल को पावर देने और डेटा लाइन का उपयोग करके उनके साथ संवाद करने की आवश्यकता होती है। संचार एक एकल डेटा लाइन के साथ किया जाता है जिसमें घड़ी और डेटा होता है (अधिक विवरण यहां)। एडफ्रूट नियोपिक्सल के छल्ले के साथ बातचीत करने के लिए एक स्वच्छ पुस्तकालय प्रदान करता है।

कोड

l oop() फ़ंक्शन के अंदर MPU6050_6Axis_MotionApps20 लाइब्रेरी को कॉल किया जाता है। जब पुस्तकालय में gyroscpe से नया डेटा होता है, तो यह यॉ, पिच और रोल का प्रतिनिधित्व करने वाले 3 तर्कों के साथ redrawLeds(x, y, z) को कॉल करता है

RedrawLeds के अंदर ():

- हम दो अक्षों पर ध्यान केंद्रित कर रहे हैं: y, z

- हम दोनों अक्षों को -MAX_ANGLE से +MAX_ANGLE तक सीमित कर रहे हैं, हमने अधिकतम कोण को 45 तक परिभाषित किया है और यह परिवर्तनशील है

- हम ३६० डिग्री को ४ क्वाड्रंट में विभाजित कर रहे हैं और प्रत्येक के लिए लाइटलेड () फ़ंक्शन को इस प्रकार कहते हैं:

* y ऋणात्मक, z धनात्मक प्रथम चतुर्थांश 0 से 5 तक लेड को नियंत्रित करेगा, कोण 0 से 89 तक होगा

* y ऋणात्मक, z ऋणात्मक द्वितीय चतुर्थांश नियंत्रण एलईडी का 6 से 12 तक, कोण 89 से 0 तक होगा

* …आदि

- लाइटलेड फ़ंक्शन के अंदर

* मैं चाप स्पर्शरेखा का उपयोग करके दो अक्षों के आधार पर एक कोण की गणना कर रहा हूं (संलग्न चित्र की जांच करें)

* मैं गणना कर रहा हूं कि arduino map फ़ंक्शन का उपयोग करके क्या दिखाया गया है

* मैं एलईडी पट्टी को रीसेट कर रहा हूं, लेकिन दो एलईडी हैं, एक एलईडी स्थिति के अनुरूप है जिसकी मैंने पहले गणना की है और एक एलईडी स्थिति से पहले (फीका प्रभाव दिखाने के लिए)

* मैं neopixel अंशांकन को ध्यान में रखने के लिए normalizeLedPosition() नामक फ़ंक्शन का उपयोग कर रहा हूं। अंशांकन उपयोगी है क्योंकि नियोपिक्सल रिंग को इच्छानुसार घुमाया जा सकता है, और इसे जाइरोस्कोप के साथ संरेखित किया जाना चाहिए

* मैं टो अक्ष को भी प्रिंट कर रहा हूं, जिसके नेतृत्व में प्रकाश और कोण है

गणित

मैंने एलईडी रिंग और कोण को निर्धारित करने के लिए उपयोग किए जाने वाले त्रिकोणमितीय फ़ंक्शन के साथ एक चित्र संलग्न किया है।

सिफारिश की: