विषयसूची:

Arduino और MPU6050 आधारित डिजिटल स्पिरिट स्तर: 3 चरण
Arduino और MPU6050 आधारित डिजिटल स्पिरिट स्तर: 3 चरण

वीडियो: Arduino और MPU6050 आधारित डिजिटल स्पिरिट स्तर: 3 चरण

वीडियो: Arduino और MPU6050 आधारित डिजिटल स्पिरिट स्तर: 3 चरण
वीडियो: #59 Digital Spirit leveler || PR ROBOTICS || #arduino 2024, नवंबर
Anonim
Image
Image
सर्किट
सर्किट

मेरे पहले शिक्षाप्रद में आपका स्वागत है! मुझे आशा है कि आपको यह जानकारीपूर्ण लगी होगी। कृपया बेझिझक प्रतिक्रिया दें, चाहे वह सकारात्मक हो या नकारात्मक।

यह प्रोजेक्ट एक arduino और MPU6050 आधारित डिजिटल स्पिरिट लेवल बनाने के लिए है। जबकि तैयार डिज़ाइन और कोड मेरा है, मूल अवधारणा और जिस कोड से मैंने काम किया है, वह अधिकांश नहीं है। मैं साहित्यिक चोरी में नहीं हूं, इसलिए मुझे उन लोगों को श्रेय देने में खुशी हो रही है जिनके विचार मैंने बनाए हैं। YouTuber के पॉल मैकव्हॉर्टर और ड्रोनबॉट वर्कशॉप जिन 2 मुख्य लोगों के बारे में मैं बताना चाहता हूं, वे हैं। मैं अपने यूट्यूब उपयोगी लिंक पीडीएफ में उनके लिंक शामिल करता हूं। EEEnthusiast को MPU6050 का उपयोग करने के बारे में उनके सूचनात्मक वीडियो के लिए धन्यवाद, जिसमें बाहरी पुस्तकालय के बिना मॉड्यूल को स्थापित करना और पढ़ना शामिल है (उसका लिंक उसी पीडीएफ में है)।

मैंने जो परियोजना बनाई है, वह 'जैसी है' काम करती है और बिल्कुल सटीक है, निश्चित रूप से किसी भी दिशा में 45% तक। आप इसे ठीक वैसे ही उपयोग कर सकते हैं जैसे मैंने इसे डिज़ाइन किया है, या आप इसे अपने स्वाद के अनुरूप बना सकते हैं। आप में से जितने अधिक चतुर होंगे, आप देखेंगे कि मेरी परियोजना ड्रोनबॉट कार्यशाला द्वारा निर्मित लगभग समान दिखती है, लेकिन निश्चिंत रहें, महत्वपूर्ण अंतर हैं, खासकर जब कोणों की गणना के लिए कोड की बात आती है, साथ ही अंशांकन मूल्यों को संग्रहीत करने की सुविधा ईप्रोम!

आपकी भूख बढ़ाने के लिए कुछ विशेषताएं:

पिच और रोल कोण 0.1 डिग्री के भीतर उपलब्ध हैं।

जाइरो यूनिट (क्षैतिज या लंबवत) के उन्मुखीकरण का स्वत: पता लगाना

परिणामों के साथ पूर्ण अंशांकन स्वचालित रूप से eeprom में संग्रहीत होता है

एलईडी संकेत -2 से +2 डिग्री (कोड में परिवर्तनीय)

स्तर का अतिरिक्त श्रव्य संकेत (मक्खी पर चालू/बंद किया जा सकता है)

कम से कम घटकों की आवश्यकता वाले कॉम्पैक्ट करक्यूट

आएँ शुरू करें।

आपूर्ति

यह परियोजना (जैसा है) निम्नलिखित मदों का उपयोग करती है:

1 एक्स अरुडिनो नैनो (मेरा एक क्लोन है)

1 x MPU6050 gyro/accelerometer मॉड्यूल

1 x LCD - 16 x 2 + I2C कनेक्शन

स्विच करने के लिए 1 एक्स पुश

1 एक्स पीजो बजर

1 एक्स ग्रीन एलईडी

2 एक्स पीला एलईडी

2 एक्स लाल एलईडी के

5 x 220 ओम प्रतिरोधक

विभिन्न जम्पर केबल

ब्रेड बोर्ड

बिजली की आपूर्ति (मेरे पीसी से कनेक्ट नहीं होने पर मेरा 5v यूएसबी पावर बैंक का उपयोग किया जाता है, लेकिन आप उचित रूप से कनेक्ट की गई बैटरी का उपयोग कर सकते हैं)

चरण 1: सर्किट

सर्किट
सर्किट
सर्किट
सर्किट

यह मानते हुए कि आपके पास सभी घटक हैं, आपको अपना ब्रेडबोर्ड बनाने की आवश्यकता होगी।

मैं एक गाइड के रूप में अपना सेटअप दिखाता हूं, लेकिन कनेक्शन इस प्रकार हैं:

Arduino पिन D2 पुश स्विच के 1 तरफ से जुड़ता है। पुश स्विच का दूसरा किनारा जमीन से जुड़ता है

Arduino pin D3 220 ओम रेसिस्टर के 1 साइड से कनेक्ट होता है। रोकनेवाला का दूसरा पक्ष लाल एलईडी के एनोड से जुड़ता है। लाल एलईडी का कैथोड जमीन पर चला जाता है।

Arduino पिन D4 220 ओम रोकनेवाला के 1 तरफ से जुड़ता है। रोकनेवाला का दूसरा पक्ष येलो एलईडी के एनोड से जुड़ता है। पीली एलईडी का कैथोड जमीन पर चला जाता है।

Arduino पिन D5 220 ओम रोकनेवाला के 1 तरफ से जुड़ता है। रोकनेवाला का दूसरा पक्ष ग्रीन एलईडी के एनोड से जुड़ता है। ग्रीन एलईडी का कैथोड जमीन पर चला जाता है।

Arduino पिन D6 220 ओम रोकनेवाला के 1 तरफ से जुड़ता है। रोकनेवाला का दूसरा पक्ष येलो एलईडी के एनोड से जुड़ता है। पीली एलईडी का कैथोड जमीन पर चला जाता है।

Arduino पिन D7 220 ओम रोकनेवाला के 1 तरफ से जुड़ता है। रोकनेवाला का दूसरा पक्ष लाल एलईडी के एनोड से जुड़ता है। लाल एलईडी का कैथोड जमीन पर चला जाता है।

Arduino pin D8 पीजो बजर के एक तरफ से जुड़ता है। बजर का दूसरा किनारा जमीन से जुड़ता है।

Arduino पिन A4 MPU6050 और LCD पर SDA पिन से जुड़ता है।

Arduino पिन A5 MPU6050 और LCD पर SCL पिन से जुड़ता है

MPU6050 और LCD के लिए 5v पावर और Gnd क्रमशः Arduino Nano 5v और GND पिन से आते हैं।

एक बार पूरा हो जाने पर, यह मेरे दिखाए गए सेटअप के समान होना चाहिए। मैंने ब्लू टेक को MPU6050 के तहत इसे हिलने से रोकने के लिए और एलसीडी पर ब्रेडबोर्ड के किनारे पर रखने के लिए रखा।

चरण 2: कोड

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

जब मैंने पहली बार LCD के साथ काम करना शुरू किया था तब मैंने लिक्विड क्रिस्टल_I2C.h लाइब्रेरी को इंपोर्ट किया था। दुर्भाग्य से, कुछ पुस्तकालय हैं जो समान #include कथन का उपयोग करते हैं, लेकिन थोड़े अलग हैं। यदि आपको अपने साथ समस्या है, तो एक और एलसीडी कोड खोजें जो आपके लिए काम करता है और तदनुसार कोड को बदल देता है। यह केवल अलग होने वाला सेटअप होने की संभावना है। सभी 'प्रिंट' कमांड को समान काम करना चाहिए।

सभी कोड पर टिप्पणी की गई है और यह मानते हुए कि मैंने इसे सही किया है, सब कुछ समझाते हुए एक वीडियो भी होगा, लेकिन यहां कुछ बिंदु ध्यान देने योग्य हैं:

लिक्विड क्रिस्टल_आई2सी एलसीडी (0x27, 16, 2);

उपरोक्त कोड मेरे LCD के लिए सेटअप है। यदि आपकी लाइब्रेरी अलग है, तो आपको न केवल अपनी लाइब्रेरी, बल्कि इस लाइन को भी बदलना पड़ सकता है।

{lcd.setCursor(0, 1); LCD.print ("क्षैतिज!"); अभिविन्यास = क्षैतिज; // MPU-6050 से रॉ acc और gyro डेटा को 1000 बार पढ़ें (int cal_int = 0; cal_int <1000; cal_int ++) { read_mpu_6050_data(); // gyro x ऑफ़सेट को gyro_x_cal वैरिएबल gyro_x_cal += gyro_x में जोड़ें; // gyro y ऑफसेट को gyro_y_cal चर gyro_y_cal += gyro_y में जोड़ें; // gyro_z_cal चर gyro_z_cal += gyro_z में gyro z ऑफ़सेट जोड़ें; // acc x ऑफ़सेट को acc_x_cal वैरिएबल acc_x_cal += acc_x में जोड़ें; // acc y ऑफसेट को acc_y_cal चर acc_y_cal += acc_y में जोड़ें; } // औसत ऑफ़सेट gyro_x_cal /= 1000.0 प्राप्त करने के लिए सभी परिणामों को 1000 से विभाजित करें; gyro_y_cal /= 1000.0; gyro_z_cal /= 1000.0; acc_x_cal /= 1000.0; acc_y_cal /= 1000.0; क्षैतिज अंशांकन = २५५; eeprom_address = 0; EEPROM.put (eeprom_address, क्षैतिज अंशांकन); eeprom_address += sizeof(int); EEPROM.put (eeprom_address, gyro_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(float); // ध्यान दें कि हम गुरुत्वाकर्षण के कारण acc_z के लिए ऑफ़सेट स्टोर नहीं कर रहे हैं! देरी (500); }

कोड का उपरोक्त ब्लॉक अंशांकन दिनचर्या के लिए निष्पादित होता है। यह कोड क्षैतिज अंशांकन के लिए है। लंबवत अंशांकन के लिए समान कोड है (ध्यान दें, कोड जानता है कि आपका एमपीयू 6050 क्षैतिज या लंबवत रूप से घुड़सवार है या नहीं!)। MPU6050, 1000 बार पढ़ा जाता है। उपयुक्त मानों को संचयी रूप से जोड़ा जाता है और फिर औसत 'ऑफ़सेट' मान देने के लिए 1000 से विभाजित किया जाता है। इन मानों को तब नैनो ईप्रोम में संग्रहीत किया जाता है। सभी क्षैतिज अंशांकन मान eeprom पते 0 से शुरू होते हैं। सभी लंबवत मान eeprom पते 24 पर संग्रहीत होते हैं। अंशांकन पूरी तरह से स्तर की सतह पर किया जाना चाहिए, अन्यथा उनका कोई मतलब नहीं है।

/* *अगली कुछ पंक्तियां कच्चे डेटा को ऐसे कोणों में बदलने के लिए संसाधित करती हैं जो एलसीडी और एलईडी के आउटपुट हो सकते हैं। * 4096 का मान, जिससे त्वरण डेटा विभाजित होता है, MPU6050 डेटाशीट से लिया जाता है और नमूना दर पर आधारित होता है। * ९.८ का मान गुरुत्व है २/३.१४१५९२६५६ * ३६०; // कच्चा डेटा phiM =-atan2((acc_y/4096.0)/9.8, (acc_z/4096.0)/9.8)/2/3.141592656 * 360; // कच्चा डेटा डीटी = (मिली () - मिलीओल्ड) / 1000.; मिलीओल्ड = मिली (); /* * यह खंड सिस्टम को अधिक प्रतिक्रियाशील बनाने के लिए gyro डेटा का उपयोग करता है * 65.5 का मान, जिसे gyro डेटा से विभाजित किया जाता है, MPU6050 डेटाशीट से लिया जाता है और नमूना दर पर आधारित होता है */ theta=(theta+(gyro_y/ 65.5)*dt)*.96 + थीटाएम*.04; // लो पास फिल्टर phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //लो पास फिल्टर

उपरोक्त कोड वह सामान है जो कोणों की गणना करता है। उम्मीद है कि टिप्पणियां इस बारे में थोड़ी जानकारी देती हैं कि यह कैसे काम करता है, लेकिन गहराई से स्पष्टीकरण के लिए, संलग्न पीडीएफ में जुड़े पॉल मैकहॉर्टर्स वीडियो देखें। हालांकि मैं यह कहूंगा कि आप जाइरो और एक्सेलेरोमीटर के लिए नमूना दर बदल सकते हैं (जो कि मेरे कोड के निचले भाग में सेटअप MPU6050 सबरूटीन में किया गया है)। यदि आप नमूना दर बदलते हैं, तो आपको यह भी बदलना होगा कि कच्चे डेटा को कितने से विभाजित किया जाता है। एक्सेलेरोमीटर डेटा के लिए, वर्तमान मान ४०९६ है। जाइरो के लिए, वर्तमान मूल्य ६५.५ है।

नमूनाकरण और ऑफसेट मान कैसे पाए जाते हैं, इसकी गहन जानकारी के लिए संलग्न डेटा शीट और EEEntusiast द्वारा वीडियो (संलग्न पीडीएफ में लिंक) देखें।

चरण 3: अगले चरण

इस बिंदु तक उम्मीद है कि इस परियोजना को बनाया होगा, लेकिन अब क्या?

सबसे पहले, क्यों न वास्तव में इसे एक स्पिरिट लेवल में बनाया जाए जिसका आप उपयोग कर सकें। आप एक सस्ता स्पिरिट लेवल खरीद सकते हैं (सुनिश्चित करें कि यह बॉक्स प्रकार है) जिसे आप अनुकूलित कर सकते हैं, या यदि आपके पास किट है, तो अपने स्तर/बॉक्स को प्रिंट करें।

शायद यह देखने के लिए कि क्या वे एक दर से दूसरे की तुलना में बेहतर काम करते हैं, यह देखने के लिए जाइरो और एक्सेलेरोमीटर नमूना दरों के साथ एक नाटक करें।

कोड को और परिष्कृत करने का प्रयास करें। उदाहरण के लिए, वर्तमान में, 45 डिग्री से अधिक, कहा गया कोण कम से कम कहने के लिए मोटा है। क्या इसके आसपास कोई रास्ता है?

यदि आपके कोई प्रश्न हैं, चाहे वे कितने भी सरल लगें, कृपया पूछें। अगर मैं मदद कर सकता हूं, तो मैं करूंगा।

अगर आपको यह निर्देश पसंद आया हो, तो कृपया इसे लाइक करें, ताकि मुझे पता चले।

यदि आप इसे बनाते हैं, तो कृपया मुझे दिखाएं (विशेषकर यदि यह एक कामकाजी मामले में है)।

धन्यवाद

सिफारिश की: