विषयसूची:

MPU 6050 Gyro, एक्सेलेरोमीटर संचार Arduino के साथ (Atmega328p): 5 कदम
MPU 6050 Gyro, एक्सेलेरोमीटर संचार Arduino के साथ (Atmega328p): 5 कदम

वीडियो: MPU 6050 Gyro, एक्सेलेरोमीटर संचार Arduino के साथ (Atmega328p): 5 कदम

वीडियो: MPU 6050 Gyro, एक्सेलेरोमीटर संचार Arduino के साथ (Atmega328p): 5 कदम
वीडियो: How to Arduino and MPU6050 accelerometer and gyro 2024, जुलाई
Anonim
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)
MPU 6050 Gyro, Arduino के साथ एक्सेलेरोमीटर संचार (Atmega328p)

MPU6050 IMU में 3-एक्सिस एक्सेलेरोमीटर और 3-एक्सिस गायरोस्कोप दोनों एक ही चिप पर एकीकृत हैं।

जाइरोस्कोप एक्स, वाई और जेड अक्ष के साथ समय के साथ घूर्णी वेग या कोणीय स्थिति के परिवर्तन की दर को मापता है।

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

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

3-अक्ष गायरोस्कोप एमपीयू -6050 में एक 3 अक्ष गायरोस्कोप होता है जो माइक्रो इलेक्ट्रो मैकेनिकल सिस्टम टेक्नोलॉजी (एमईएमएस) के साथ एक्स, वाई, जेड अक्ष के साथ घूर्णन वेग का पता लगा सकता है। जब सेंसर को किसी अक्ष के साथ घुमाया जाता है तो कोरिओलिस प्रभाव के कारण कंपन उत्पन्न होता है जिसे एमईएमएस द्वारा पता लगाया जाता है। 16-बिट एडीसी का उपयोग प्रत्येक अक्ष के नमूने के लिए वोल्टेज को डिजिटाइज़ करने के लिए किया जाता है। +/- 250, +/- 500, +/- 1000, +/- 2000 आउटपुट के पूर्ण पैमाने पर हैं। कोणीय वेग को प्रत्येक अक्ष के साथ डिग्री प्रति सेकंड इकाई में मापा जाता है।

उपयोगी लिंक: ……………।

अरुडिनो बोर्ड:……….

MPU6050 IMU ……………https://compoindia.com/product/mpu6050-3-axis-accelerometer-and-gyroscope-sensor/

चरण 1: एमपीयू -6050 मॉड्यूल

एमपीयू-6050 मॉड्यूल
एमपीयू-6050 मॉड्यूल

MPU-6050 मॉड्यूल में 8 पिन हैं,

INT डिजिटल आउटपुट पिन को बाधित करें।

AD0: I2C स्लेव एड्रेस LSB पिन। यह डिवाइस के 7-बिट स्लेव एड्रेस में 0वां बिट है। अगर वीसीसी से जुड़ा है तो इसे लॉजिक वन के रूप में पढ़ा जाता है और गुलाम का पता बदल जाता है।

एक्ससीएल: सहायक सीरियल क्लॉक पिन। इस पिन का उपयोग अन्य I2C इंटरफ़ेस सक्षम सेंसर SCL पिन को MPU-6050 से जोड़ने के लिए किया जाता है।

XDA: सहायक सीरियल डेटा पिन। इस पिन का उपयोग अन्य I2C इंटरफ़ेस सक्षम सेंसर SDA पिन को MPU-6050 से जोड़ने के लिए किया जाता है।

एससीएल: सीरियल क्लॉक पिन। इस पिन को माइक्रोकंट्रोलर SCL पिन से कनेक्ट करें। एसडीए: सीरियल डेटा पिन। इस पिन को माइक्रोकंट्रोलर एसडीए पिन से कनेक्ट करें।

जीएनडी: ग्राउंड पिन। इस पिन को ग्राउंड कनेक्शन से कनेक्ट करें।

वीसीसी: बिजली की आपूर्ति पिन। इस पिन को +5V DC सप्लाई से कनेक्ट करें। MPU-6050 मॉड्यूल में स्लेव एड्रेस होता है (जब AD0 = 0, यानी यह Vcc से कनेक्ट नहीं होता है) जैसे, दास लिखें पता (एसएलए + डब्ल्यू): 0xD0

स्लेव रीड एड्रेस (SLA+R): 0xD1

चरण 2: गणना

गणना
गणना

MPU6050 मॉड्यूल के जाइरोस्कोप और एक्सेलेरोमीटर सेंसर डेटा में 2 के पूरक रूप में 16-बिट कच्चा डेटा होता है।

MPU6050 मॉड्यूल के तापमान सेंसर डेटा में 16-बिट डेटा होता है (2 के पूरक रूप में नहीं)।

अब मान लीजिए हमने चुना है,

  • - 16, 384 एलएसबी (गणना)/जी के संवेदनशीलता स्केल फैक्टर के साथ +/- 2 जी की एक्सेलेरोमीटर पूर्ण स्केल रेंज।
  • - जाइरोस्कोप १३१ एलएसबी (गणना)/डिग्री/सेकेंड की संवेदनशीलता स्केल फैक्टर के साथ +/- २५० डिग्री/सेकेंड की पूर्ण स्केल रेंज। फिर,

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

जी (जी बल) में एक्सेलेरोमीटर मान

  • एक्स अक्ष के साथ त्वरण = (एक्सेलेरोमीटर एक्स अक्ष कच्चा डेटा/16384) जी।
  • वाई अक्ष के साथ त्वरण = (एक्सेलेरोमीटर वाई अक्ष कच्चा डेटा/16384) जी।
  • Z अक्ष के साथ त्वरण = (एक्सेलेरोमीटर Z अक्ष अपरिष्कृत डेटा/16384) g.

Gyroscope मान °/s में (डिग्री प्रति सेकंड)

  • X अक्ष के साथ कोणीय वेग = (Gyroscope X अक्ष अपरिष्कृत डेटा/131) °/s।
  • Y अक्ष के साथ कोणीय वेग = (Gyroscope Y अक्ष अपरिष्कृत डेटा/131) °/s।
  • Z अक्ष के साथ कोणीय वेग = (Gyroscope Z अक्ष अपरिष्कृत डेटा/131) °/s।

°/c में तापमान मान (डिग्री प्रति सेल्सियस)

डिग्री सेल्सियस में तापमान = ((तापमान सेंसर डेटा)/340 + 36.53 डिग्री सेल्सियस।

उदाहरण के लिए, मान लीजिए, 2' पूरक के बाद हमें एक्सेलेरोमीटर X अक्ष कच्चा मान = +15454. मिलता है

तब कुल्हाड़ी = +15454/16384 = 0.94 ग्राम।

अधिक,

तो हम जानते हैं कि हम +/- 2G और +/- 250deg/s की संवेदनशीलता पर चल रहे हैं लेकिन हमारे मान उन त्वरण/कोणों के अनुरूप कैसे हैं।

ये दोनों सीधी रेखा के रेखांकन हैं और हम उनसे काम कर सकते हैं कि 1G के लिए हम 16384 पढ़ेंगे और 1 डिग्री/सेकंड के लिए हम 131.07 पढ़ेंगे (हालाँकि.07 बाइनरी के कारण अनदेखा हो जाएगा) इन मानों को केवल आरेखित करके निकाला गया था सीधी रेखा ग्राफ 2G के साथ 32767 और -2G पर -32768 और 250/-250 समान मूल्यों पर।

तो अब हम अपने संवेदनशीलता मूल्यों (१६३८४ और १३१.०७) को जानते हैं, हमें बस अपने मूल्यों से ऑफसेट को घटाना है और फिर संवेदनशीलता से तय करना है।

ये X और Y मानों के लिए ठीक काम करेंगे लेकिन जैसा कि Z को 1G पर रिकॉर्ड किया गया था और 0 पर नहीं, हमें अपनी संवेदनशीलता से विभाजित करने से पहले 1G (16384) को घटाना होगा।

चरण 3: MPU6050-Atmega328p कनेक्शन

MPU6050-Atmega328p कनेक्शन
MPU6050-Atmega328p कनेक्शन
MPU6050-Atmega328p कनेक्शन
MPU6050-Atmega328p कनेक्शन
MPU6050-Atmega328p कनेक्शन
MPU6050-Atmega328p कनेक्शन

आरेख में दिए गए अनुसार बस सब कुछ कनेक्ट करें…।

कनेक्शन इस प्रकार दिए गए हैं:-

MPU6050 Arduino नैनो।

वीसीसी 5 वी आउट पिन

जीएनडी ग्राउंड पिन

एसडीए ए4 पिन // सीरियल डेटा

SCL A5 पिन // सीरियल क्लॉक

पिच और रोल गणना: रोल एक्स-अक्ष के चारों ओर घूर्णन है और पिच वाई-अक्ष के साथ घूर्णन है।

परिणाम रेडियन में है। (180 से गुणा करके और पाई से भाग देकर डिग्री में बदलें)

चरण 4: कोड और स्पष्टीकरण

कोड और स्पष्टीकरण
कोड और स्पष्टीकरण

/*

Arduino और MPU6050 एक्सेलेरोमीटर और जाइरोस्कोप सेंसर ट्यूटोरियल Dejan द्वारा, https://howtomechatronics.com */ #include const int MPU = 0x68; // MPU6050 I2C पता फ्लोट AccX, AccY, AccZ; फ्लोट GyroX, GyroY, GyroZ; फ्लोट accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; फ्लोट रोल, पिच, यॉ; फ्लोट AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; फ्लोट बीता हुआ समय, वर्तमान समय, पिछला समय; इंट सी = 0; शून्य सेटअप () {Serial.begin(१९२००); वायर.बेगिन (); // इनिशियलाइज़ कम्युनिकेशन वायर.बेगिनट्रांसमिशन (MPU); // MPU6050 के साथ संचार शुरू करें // MPU=0x68 Wire.write(0x6B); // रजिस्टर से बात करें 6B Wire.write(0x00); // रीसेट करें - 6B रजिस्टर में 0 रखें Wire.endTransmission(true); // ट्रांसमिशन समाप्त करें / * // एक्सेलेरोमीटर संवेदनशीलता कॉन्फ़िगर करें - पूर्ण स्केल रेंज (डिफ़ॉल्ट +/- 2 जी) वायर.बेगिनट्रांसमिशन (एमपीयू); वायर.राइट (0x1C); // ACCEL_CONFIG रजिस्टर (1C hex) Wire.write(0x10) से बात करें; // रजिस्टर बिट्स को 00010000 (+/- 8g फुल स्केल रेंज) के रूप में सेट करें Wire.endTransmission(true); // Gyro संवेदनशीलता को कॉन्फ़िगर करें - पूर्ण स्केल रेंज (डिफ़ॉल्ट +/- 250deg/s) Wire.beginTransmission (MPU); वायर.राइट (0x1B); // GYRO_CONFIG रजिस्टर (1B hex) Wire.write(0x10) से बात करें; // रजिस्टर बिट्स को 00010000 (1000deg/s पूर्ण पैमाने) के रूप में सेट करें Wire.endTransmission(true); देरी(20); *// इस फ़ंक्शन को कॉल करें यदि आपको अपने मॉड्यूल के लिए IMU त्रुटि मान प्राप्त करने की आवश्यकता है कैलकुलेट_IMU_error (); देरी(20); } शून्य लूप () {// === एक्सेलेरोमीटर डेटा पढ़ें === // Wire.beginTransmission (MPU); वायर.राइट (0x3B); // रजिस्टर 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false) से शुरू करें; Wire.requestFrom (एमपीयू, 6, सच); // कुल 6 रजिस्टर पढ़ें, प्रत्येक अक्ष मान 2 रजिस्टरों में संग्रहीत है // + -2g की एक सीमा के लिए, हमें डेटाशीट AccX = (Wire.read() << 8 के अनुसार कच्चे मूल्यों को 16384 से विभाजित करने की आवश्यकता है। |वायर.रीड ()) / १६३८४.०; // एक्स-अक्ष मान AccY = (वायर.रीड () << 8 | Wire.read ()) / १६३८४.०; // Y-अक्ष मान AccZ = (वायर.रीड () << 8 | Wire.read ()) / १६३८४.०; // Z-अक्ष मान // एक्सेलेरोमीटर डेटा से रोल और पिच की गणना accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) अधिक विवरण के लिए गणना_IMU_error () कस्टम फ़ंक्शन देखें accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + १.५८; // AccErrorY ~(-1.58) // === जाइरोस्कोप डेटा पढ़ें === // पिछला समय = वर्तमान समय; // पिछला समय वास्तविक समय से पहले संग्रहीत किया जाता है वर्तमान समय = मिली (); // वर्तमान समय वास्तविक समय पढ़ा बीता हुआ समय = (वर्तमान समय - पिछला समय) / 1000; // सेकंड प्राप्त करने के लिए 1000 से विभाजित करें Wire.beginTransmission (MPU); वायर.राइट (0x43); // Gyro डेटा पहले रजिस्टर पता 0x43 Wire.endTransmission(false); Wire.requestFrom (एमपीयू, 6, सच); // कुल 4 रजिस्टर पढ़ें, प्रत्येक अक्ष मान 2 रजिस्टरों GyroX = (Wire.read() << 8 | Wire.read ()) / 131.0; // 250deg/s रेंज के लिए हमें पहले कच्चे मान को 131.0 से विभाजित करना होगा, डेटाशीट GyroY = (Wire.read() << 8 | Wire.read ()) / 131.0 के अनुसार; GyroZ = (वायर.रीड () << 8 | वायर.रीड ()) / १३१.०; // परिकलित त्रुटि मानों के साथ आउटपुट को सही करें GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56) GyroY = GyroY - 2; // GyroErrorY ~(2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // वर्तमान में अपरिष्कृत मान डिग्री प्रति सेकंड, deg/s में हैं, इसलिए हमें कोण को डिग्री gyroAngleX = gyroAngleX + GyroX * elapsedTime में प्राप्त करने के लिए प्रेषकों द्वारा गुणा करने की आवश्यकता है; // deg/s * s = deg gyroAngleY = gyroAngleY + GyroY * बीता हुआ समय; यॉ = यॉ + GyroZ * बीता हुआ समय; // पूरक फ़िल्टर - एक्सेलेरोमीटर और जाइरो एंगल वैल्यू रोल = 0.96 * gyroAngleX + 0.04 * accAngleX को मिलाएं; पिच = 0.96 * gyroAngleY + 0.04 * accAngleY; // सीरियल मॉनिटर सीरियल.प्रिंट (रोल) पर मूल्यों को प्रिंट करें; सीरियल.प्रिंट ("/"); सीरियल.प्रिंट (पिच); सीरियल.प्रिंट ("/"); सीरियल.प्रिंट्लन (यॉ); } शून्य कैलकुलेट_आईएमयू_एरर () {// हम एक्सेलेरोमीटर और जाइरो डेटा एरर की गणना करने के लिए सेटअप सेक्शन में इस फ़नशन को कॉल कर सकते हैं। यहाँ से हमें उपरोक्त समीकरणों में प्रयुक्त त्रुटि मान सीरियल मॉनीटर पर मुद्रित होंगे। // ध्यान दें कि हमें उचित मान प्राप्त करने के लिए IMU फ्लैट रखना चाहिए, ताकि हम सही मान प्राप्त कर सकें // एक्सेलेरोमीटर मानों को 200 बार पढ़ें जबकि (c <200) { Wire.beginTransmission(MPU); वायर.राइट (0x3B); वायर.एंडट्रांसमिशन (झूठा); Wire.requestFrom (एमपीयू, 6, सच); एसीसीएक्स = (वायर.रीड () << 8 | वायर.रीड ()) / १६३८४.०; AccY = (वायर.रीड () << 8 | वायर.रीड ()) / १६३८४.०; AccZ = (वायर.रीड () << 8 | वायर.रीड ()) / १६३८४.०; // सभी रीडिंग का योग AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2)) + pow((AccZ), 2))) * 180 / PI)); AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2)) + pow((AccZ), 2))) * 180 / PI)); सी++; } // त्रुटि मान प्राप्त करने के लिए योग को 200 से विभाजित करें AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; सी = 0; // जाइरो वैल्यू को 200 बार पढ़ें जबकि (सी <200) {वायर.बेगिनट्रांसमिशन (एमपीयू); वायर.राइट (0x43); वायर.एंडट्रांसमिशन (झूठा); Wire.requestFrom (एमपीयू, 6, सच); GyroX = Wire.read () << 8 | वायर.रीड (); GyroY = Wire.read () << 8 | वायर.रीड (); GyroZ = Wire.read () << 8 | वायर.रीड (); // सभी रीडिंग का योग GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); सी++; } // त्रुटि मान प्राप्त करने के लिए योग को 200 से विभाजित करें GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // सीरियल मॉनिटर सीरियल पर त्रुटि मान प्रिंट करें।प्रिंट ("AccErrorX:"); Serial.println (AccErrorX); Serial.print ("AccErrorY:"); Serial.println (AccErrorY); Serial.print ("GyroErrorX:"); Serial.println (GyroErrorX); Serial.print("GyroErrorY:"); Serial.println (GyroErrorY); Serial.print ("GyroErrorZ:"); Serial.println (GyroErrorZ); } ------------------------------------------------- ------------------------------------------------ परिणाम:- X = वाई = जेड = ------------------------------------------- ----------------------------------------------- महत्वपूर्ण लेख: -----------------

लूप सेक्शन में हम एक्सेलेरोमीटर डेटा को पढ़कर शुरू करते हैं। प्रत्येक अक्ष के लिए डेटा 2 बाइट्स या रजिस्टरों में संग्रहीत किया जाता है और हम सेंसर के डेटाशीट से इन रजिस्टरों के पते देख सकते हैं।

उन सभी को पढ़ने के लिए, हम पहले रजिस्टर से शुरू करते हैं, और requiestFrom () फ़ंक्शन का उपयोग करके हम X, Y और Z अक्षों के लिए सभी 6 रजिस्टरों को पढ़ने का अनुरोध करते हैं। फिर हम प्रत्येक रजिस्टर से डेटा पढ़ते हैं, और क्योंकि आउटपुट दो पूरक हैं, हम सही मान प्राप्त करने के लिए उन्हें उचित रूप से जोड़ते हैं।

चरण 5: झुकाव कोण को समझना

accelerometer

पृथ्वी का गुरुत्वाकर्षण एक निरंतर त्वरण है जहाँ बल हमेशा पृथ्वी के केंद्र की ओर नीचे की ओर इशारा करता है।

जब एक्सेलेरोमीटर गुरुत्वाकर्षण के समानांतर होता है, तो मापा त्वरण 1G होगा, जब एक्सेलेरोमीटर गुरुत्वाकर्षण के साथ लंबवत होगा, तो यह 0G को मापेगा।

इस समीकरण का उपयोग करके मापा त्वरण से झुकाव कोण की गणना की जा सकती है:

θ = पाप-1 (मापा त्वरण/गुरुत्वाकर्षण त्वरण)

GyroGyro (a.k.a. दर सेंसर) का उपयोग कोणीय वेग (ω) को मापने के लिए किया जाता है।

रोबोट का टिल्ट एंगल प्राप्त करने के लिए, हमें जाइरो से डेटा को एकीकृत करने की आवश्यकता है जैसा कि नीचे दिए गए समीकरण में दिखाया गया है:

= डीθ / डीटी, = ∫ डीटी

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

बेहतर समझ के लिए लिंक: यहाँ क्लिक करें

सिफारिश की: