व्हिडिओ कॅमेरा असलेली कार. वायफाय द्वारे नियंत्रण. ब्लूटूथ द्वारे होम रोबोट नियंत्रित करण्यासाठी Android अनुप्रयोग तयार करणे

संगणकावर व्हायबर 10.07.2019
संगणकावर व्हायबर

या लेखात वेब कॅमेऱ्याने सुसज्ज आणि वायफाय राउटरद्वारे नियंत्रित तुमची स्वतःची टाकी कशी जमवायची याबद्दल माहिती आहे.

आवश्यक साहित्य:

  1. वेब कॅमेरा
  2. राउटर TP-लिंक TL-MR3020
  3. सर्वो ड्राइव्ह एसजी 90 - 2 पीसी.
  4. कॅमेरा प्लॅटफॉर्म अँटी-कंपन
  5. बॅटरी 7.2V 5000mah
  6. बॅटरी 5V 2000mah
  7. नॅनो 3.0 Atmel ATmega328
  8. L298N मोटर चालक
  9. वायर, थर्मल ट्यूब, यूएसबी हब, डायोड आणि बरेच काही.
  10. तुमच्या आवडीचे प्लॅटफॉर्म, मी DD1-1 निवडले

आमचा राक्षस एकत्र करणे
MR3020 राउटर सेट करत आहे.
सर्व प्रथम, चला राउटरसह प्रारंभ करूया. OR-WRT किंवा CyberWRT निवडायचे की नाही यावर मी बराच वेळ विचार केला. OR-WRT सेटिंग्जमध्ये लवचिक आहे, परंतु सर्व संपादन आणि तुमची स्वतःची सेटिंग्ज पुट्टी प्रोग्राम वापरून टर्मिनलद्वारे केली जातात. आणि त्या क्षणी मला टर्मिनलमधून काम करण्याची भीती वाटत असल्याने, मी ग्राफिकल इंटरफेस कोठे आहे ते निवडले - सायबरडब्ल्यूआरटी, तसेच यूएसबी पोर्टद्वारे कनेक्ट करणे शक्य आहे.
आमच्या राउटरचे फर्मवेअर बदलण्यासाठी, तुम्हाला CyberWrt MR3020 फर्मवेअर डाउनलोड करावे लागेल.

आम्ही डाउनलोड केल्याप्रमाणे, आम्ही पुढील गोष्टी करतो:

1) राउटर चालू करा आणि ते लोड होण्याची प्रतीक्षा करा.
2) जा आणि 192.168.0.254 वर लॉग इन करा (डिफॉल्ट प्रशासक\admin)
3) डावीकडील मेनूमध्ये सिस्टम टूल्स शोधा, तेथे सिस्टम अपग्रेड आयटम आहे आणि वेब फॉर्मद्वारे फर्मवेअर अपलोड करा
4) रीबूट होण्याची प्रतीक्षा करा (सुमारे 4 मिनिटे)
राउटर कॉन्फिगरेशनसाठी तयार आहे.

आपण मोडपैकी एक निवडू शकता:"ऍक्सेस पॉइंट" आणि "वाय-फाय नेटवर्क क्लायंट". क्लायंट मोड कॉन्फिगर करण्यासाठी:
- “वाय-फाय नेटवर्क क्लायंट” मोड निवडा
- तुमच्या डिव्हाइसचा IP पत्ता (तुमचे डिव्हाइस या पत्त्यावर ॲक्सेसेबल असेल. एक रिकामा IP निवडण्याचा प्रयत्न करा. उदाहरणार्थ: 192.168.1.100)
- सबनेट मास्क (255.255.255.0)
- गेटवे (उदाहरणार्थ, तुमच्या होम राउटरचा किंवा गेटवेचा IP 192.168.1.1 आहे)
- एन्क्रिप्शन प्रकार (तुमच्या होम नेटवर्कवर वापरल्या जाणाऱ्या एन्क्रिप्शनचा प्रकार)
- पासवर्ड (तुमच्या होम नेटवर्कमध्ये प्रवेश करण्यासाठी पासवर्ड)

आपण सर्वकाही योग्यरित्या केले असल्यास, आपल्याला स्क्रीनच्या तळाशी एक RSS ओळ दिसेल.

जेव्हा सर्वकाही कार्य करत असेल, तेव्हा तुमच्याकडे एक मॉड्यूल विभाग असेल, तेथे तुम्हाला "ROBOT" मॉड्यूल मिळेल. स्थापित करा. तयार.

L298N, Arduino Nano, MR3020, कॅमेरा आणि बरेच काही कनेक्ट करत आहे

चित्रात सर्व काही स्पष्टपणे दर्शविले आहे, परंतु मी ते फक्त बाबतीत लिहीन.

Arduino DIGITAL 4 आउटपुट - मॉड्यूलच्या IN1 पिन पर्यंत.
Arduino DIGITAL 5 आउटपुट - मॉड्यूलच्या IN2 पिन पर्यंत.
Arduino DIGITAL 6 आउटपुट - मॉड्यूलच्या IN3 पिन पर्यंत.
Arduino DIGITAL 7 आउटपुट - मॉड्यूलच्या IN4 पिन पर्यंत.
Arduino GND आउटपुट - मॉड्यूलच्या GND टर्मिनलवर.
GND मॉड्यूल टर्मिनल - बॅटरी नकारात्मक.
7.2V मॉड्यूल टर्मिनल - बॅटरी पॉझिटिव्ह.
आरएम मॉड्यूल टर्मिनल - उजवी मोटर.
एलएम मॉड्यूल टर्मिनल - डावी मोटर.
USB पोर्ट Arduino - USB हबशी कनेक्ट करा
वेब कॅमेरा - USB हबशी कनेक्ट करा
USB हब - USB राउटरशी कनेक्ट करा

पॉवर सप्लाय, म्हणजे लॉजिस्टिक्ससाठी, दुसऱ्या बॅटरीद्वारे प्रदान केला जातो. क्षमता 2000 mA/h 5v, जेणेकरून राउटर जळू नये. आणि दोन बॅटरीसह, रोबोट अधिक स्थिर कार्य करते. तर, आम्ही ते फक्त मायक्रो USB कनेक्टरशी कनेक्ट करतो. राउटरला जोडलेल्या USB हबद्वारे, कॅमेरा आणि आमचा Arduino या दोघांना आधीच पॉवर प्राप्त होते.

Arduino Nano साठी स्केच
तुम्हाला सायबरलिब लायब्ररी डाउनलोड करणे आवश्यक आहे, ते केवळ Atmega 328 साठी आहे.

/* आवृत्ती 1.5 DD1-1 वर WIFI टँका लागू: 1) X आणि Y मध्ये कॅमेराची हालचाल 2) हॉर्न 3) लाइट्स 4) चालू असताना आवाज */ # समावेश // लायब्ररी समाविष्ट करा #include // सर्वो ड्राइव्ह लायब्ररी सर्वो मायसर्व्हो 1 कनेक्ट करा; सर्वो myservo2; लांब पूर्वीचे मिलिस; // टायमर int LedStep = 0 साठी आवश्यक आहे; // LED int i साठी काउंटर; #robot_go परिभाषित करा (D4_High; D5_Low; D6_Low; D7_High;) #robot_back (D4_Low; D5_High; D6_High; D7_Low;) परिभाषित करा _उच्च; ;D7_कमी; ) #रोबोट_रोटेशन_लेफ्ट परिभाषित करा (D4_Low; D5_High; D6_Low; D7_High;) #LED_ON (D13_High;) परिभाषित करा #LED_OFF (D13_Low;) परिभाषित करा 11, 494, 500);) #define init (D4_Out; D5_Out; D6_Out; D7_Out; D8_Out; D13_Out;) uint8_t inByte; void सेटअप() ( myservo1.attach(9); // सर्व्होला पोर्ट myservo2.attach(10); // सर्व्होस पोर्ट D11_Out ला कनेक्ट करा; D11_Low; // स्पीकर हेडलॅम्प_OFF; // हेडलाइट्स (uint8_t) साठी डीफॉल्टनुसार बंद आहेत i = 0;<12; i++) beep(80, random(100, 2000)); //звуковое оповещение готовности робота init; // Инициализация портов //Buzzer; // Инициализация портов динамика UART_Init(57600);// Инициализация порта для связи с роутером wdt_enable (WDTO_500MS); } void loop() { unsigned long currentMillis = millis(); // Обновление таймера if (LedStep == 0 && currentMillis - previousMillis >५००)(// विलंब ०.५ सेकंद. मागील मिलिस = करंटमिलिस; // अपडेट टाइमर LED_ON; // LedStep = 1; // स्टेप काउंटर सक्षम करा) जर (LedStep == 1 && currentMillis - previousMillis > 500)( // विलंब 0.5 सेकंद previousMillis = currentMillis; // अपडेट टाइमर LED_OFF; // स्टेप काउंटर बंद करा (LedStep == 2 && currentMillis > 500) if (UART_ReadByte(inByte)) //काहीतरी आले असल्यास ( स्विच (इनबाइट) // कोणती कमांड आली ते पाहूया ( केस "x": // रोबोट थांबवणे robot_stop; ब्रेक; केस "W" : // पुढे जा robot_go; ब्रेक केस "डी": // मागे हलवा robot_rotation_left; += 20); खंड "H": // सर्वो डावीकडे वळते myservo2.write(i += 20);

खंडित;
केस "K": // सर्वो उजवीकडे वळते myservo2.write(i -= 20);

खंडित;

केस "Y": // सर्वो 85 myservo1.write(85);

myservo2.write(85);

खंडित;

केस "एफ": // हेडलाइट्स चालू करा हेडलॅम्प_ऑन; खंडित;, म्हणजे, चाके आणि मोटर्स असलेले शरीर, जे आपल्या आणि आपल्या सभोवतालच्या लोकांच्या आनंदासाठी चालवेल. माझ्या बाबतीत, मी रेडिओ-नियंत्रित खेळण्यातील एक केस वापरला ज्यामध्ये पॉवर पार्ट जळून गेला. नूतनीकरणाची आशा मला धूसर वाटली आणि मला माझ्या मुलांसाठी काहीतरी नवीन हवे होते. अशातच या प्रकल्पाचा जन्म झाला. शरीरात दोन इंजिन असतात जे एका टाकीप्रमाणे मशीनच्या बाजूने चाके चालवतात. सर्व इलेक्ट्रॉनिक घटक सुटे भागांसाठी पाठवण्यात आले.

आपल्या भविष्यातील निर्मितीच्या इलेक्ट्रिक मोटर्स नियंत्रित करण्यासाठी आपल्याला आवश्यक असेल L298N चिप वर H-ब्रिजअलीशी लिंक, मी हे घेतले. चित्र क्लिक करण्यायोग्य आहे.

arduino साठी H-ब्रिज

व्होल्टेज श्रेणी 5 - 35 व्होल्टमध्ये दोन मोटर्स नियंत्रित करू शकतात. PWM चे समर्थन करते, म्हणजेच आपण इंजिनची गती समायोजित करू शकता. Arduino ला उर्जा देण्यासाठी बोर्डमध्ये 5 व्होल्टचे स्थिर व्होल्टेज आउटपुट आहे.

कनेक्शन आकृती सोपी आणि नम्र आहे:

आमच्या प्रकल्पाच्या इलेक्ट्रॉनिक फिलिंगचा पुढील अविभाज्य भाग आहे ब्लूटूथ मॉड्यूल HC-06. Arduino साठी सर्वात सामान्य मॉड्यूल, ते इतके लोकप्रिय आहे की त्याला कोणत्याही अतिरिक्त वर्णनाची आवश्यकता नाही.

arduino साठी HC-06 ब्लूटूथ

माझ्या बाबतीत मुख्य घटक आणि मेंदू आहे arduino नॅनो, मी येथे फोटो देखील पोस्ट करणार नाही कारण प्रत्येकाला याबद्दल माहिती आहे आणि त्यासह कसे कार्य करावे हे माहित आहे. तसे, कोणताही Arduino बोर्ड हे करेल, जोपर्यंत ते केसमध्ये बसेल 😀

बॅटरी आणि सोल्डरिंग वायर्सना स्पेसिफिकेशनची आवश्यकता नसते. बॅटरीची निवड इलेक्ट्रिक मोटर्सच्या ऑपरेटिंग व्होल्टेजवर अवलंबून असते.

arduino आणि Bluetooth वर मशीन - स्केच काढणे.

मी पुन्हा सांगतो - येथे कोडमध्ये खोदकाम होणार नाही. आम्ही लोकप्रिय FLProg प्रोग्राम वापरू. आपण अधिकृत वेबसाइटवर त्याची नवीनतम आवृत्ती डाउनलोड करू शकता. प्रोग्रामचा इंटरफेस सोपा आणि नम्र आहे, परंतु त्यात जवळजवळ सर्व लोकप्रिय मॉड्यूल्ससाठी प्रचंड कार्यक्षमता आणि समर्थन आहे. मी ते कसे वापरायचे ते लिहिणार नाही कारण यास दोन लेख लागतील. मी फक्त असे म्हणू इच्छितो की मला arduino आणि त्याच्या क्लोनसाठी स्केचेस तयार करण्यासाठी अधिक सोयीस्कर आणि प्रवेशयोग्य प्रोग्राम भेटला नाही. इंटरफेस स्क्रीन:

FLProg इंटरफेस

साइट मजकूर आणि व्हिडिओ मॅन्युअलने भरलेली आहे, मला वाटते की तुम्ही ते शोधून काढाल.

रिमोट-नियंत्रित कारसाठी माझा प्रकल्प Yandex डिस्कवरून लिंक शॉर्टनिंग सेवेद्वारे डाउनलोड केला जाऊ शकतो.

arduino आणि Bluetooth वरील मशीन - Android टॅबलेटवर नियंत्रण इंटरफेस.

असंख्य विनंत्यांमुळे, मी लेखात HmiKaskada android वर आधारित कंट्रोल इंटरफेस विकसित करण्यासाठी तपशीलवार सूचना लिहिल्या आहेत. लिंक क्लिक करण्यायोग्य आहे.

Android वर चालणाऱ्या उपकरणांसाठी HmiKaskada (YandexDisk चा दुवा) प्रोग्राम आहे. हे सुरुवातीला महागड्या औद्योगिक HMI पॅनल्सला पर्याय म्हणून विकसित करण्यात आले होते. पण जिज्ञासू मनांना पटकन समजले की ती काहीही नियंत्रित करू शकते. आमच्या बाबतीत, एक टाइपराइटर. हे वाय-फाय आणि ब्लूटूथ वायरलेस इंटरफेसला समर्थन देते आणि तुम्ही USB द्वारे थेट डिव्हाइस कनेक्ट करू शकता.

प्रोग्रामच्या सशुल्क आणि विनामूल्य आवृत्त्या आहेत. माझ्याकडे दोन्ही आहेत, परंतु मी तुम्हाला दाखवण्यासाठी आणि विनामूल्य आवृत्ती पूर्णपणे कार्यक्षम आहे याची पुन्हा एकदा खात्री करण्यासाठी मी प्रकल्प विनामूल्य आवृत्तीमध्ये तयार केला आहे. विनामूल्य आणि प्रो आवृत्त्यांमधील मुख्य फरक म्हणजे ते केवळ ब्लूटूथद्वारे कार्य करते.

KaScada सह सुसंगततेबद्दल FLProg फोरमवर एक मोठा धागा आहे आणि विकासक सक्रिय आणि मिलनसार आहे. मला कंट्रोल पॅनलचा स्क्रीनशॉट पोस्ट करण्यात काही अर्थ दिसत नाही - तो व्हिडिओमध्ये आहे.

इतर अनेक DIYers प्रमाणे, मी नियमितपणे AVR मायक्रोकंट्रोलरचा वापर सर्व प्रकारच्या विविध छंद प्रकल्पांसाठी करतो. आणि Arduino संकल्पनेबद्दल धन्यवाद, या हस्तकला देखील आता एक मोहक स्वरूप धारण करतात. खरंच, सुमारे 300-400 रूबलसाठी आम्हाला मास्क, सिल्क-स्क्रीन प्रिंटिंग आणि मायक्रोकंट्रोलरसाठी (आणि SMD आवृत्तीमध्ये!) पूर्णपणे वितरित पेरिफेरल्ससह लघु मल्टीलेयर बोर्ड मिळतो. मी त्याच “Arduino” मालिकेतील सर्व प्रकारच्या प्लग-इन मॉड्यूल्सबद्दल देखील बोलत नाही: सेन्सर्स, कंट्रोलर्स, डिस्प्ले आणि अतिरिक्त पेरिफेरल्सचे संपूर्ण संच ज्याची आम्हाला खूप गरज आहे. आणि पुन्हा, सर्वकाही स्वस्त आणि उत्कृष्ट कार्यप्रदर्शन देखील आहे. व्यावहारिकदृष्ट्या यापुढे गुडघ्यावर काहीही पातळ करण्याची आणि पिण्याची गरज नाही.

परंतु या सर्व विविध हौशी हस्तकला नैसर्गिकरित्या आवश्यक आहेत प्री-प्रोग्रामिंग.आणि त्यानंतर, विविध सुधारणांसह, या हस्तकला सतत आवश्यक आहेत रिफ्लेश. हे स्पष्ट आहे की त्यांना नियमित प्रोग्रामरकडे सतत घेऊन जाण्यापेक्षा हे दूरस्थपणे करणे अधिक सोयीचे आहे. सर्वसाधारणपणे, त्याच Arduino प्लॅटफॉर्मबद्दल धन्यवाद, येथे बरेच पर्याय आहेत: ब्लूटूथ, ZigBee, तुमच्या वैयक्तिक प्रोटोकॉलसह एक रेडिओ चॅनेल, IR आणि अगदी वाय-फाय. ते सर्व तुम्हाला तुमच्या मायक्रोकंट्रोलरशी वायरलेस संपर्क स्थापित करण्याची परवानगी देतात. परंतु आम्ही शेवटच्या पर्यायावर लक्ष केंद्रित करू. चार मुख्य कारणे आहेत:

1: आधुनिक, गोष्टींचे इंटरनेट!

2: प्रत्येक अपार्टमेंटमध्ये एक वायरलेस राउटर आहे, तुमच्या होम नेटवर्कवर तुमच्या डिव्हाइसची नोंदणी करा आणि व्होइला!

3: तुमची हस्तकला त्यांच्या विकासात क्रांतिकारक झेप घेत आहे; त्यांना केवळ दुरूनच प्रोग्राम केले जाऊ शकत नाही, तर ते आता त्यांच्या सभोवतालच्या जगाशी संवाद साधू शकतात: इलेक्ट्रॉनिक घड्याळे स्वतंत्रपणे एनटीपी क्लॉक सर्व्हरवरून अचूक वेळ घेतात, ॲक्ट्युएटर शहराच्या किंवा देशाच्या दुसऱ्या टोकापासून नियंत्रित केले जातात, रेकॉर्डिंग उपकरणे जमा केलेली बचत करतात. क्लाउडमधील डेटा इ. इ.

4: ESP8266 चिप्सची एक अद्भुत मालिका आहे ज्यावर हे सर्व अंमलात आणणे फार सोपे नाही.

पुढे, या लेखात, AVR मायक्रोकंट्रोलरवर आधारित उपकरणांसह सर्वोस, रिमोट प्रोग्रामिंग आणि पीसी (किंवा काहीही) वरून डेटा एक्सचेंज, मेकॅनिकल आर्मचे उदाहरण वापरून वेगळे केले जाईल आणि प्रात्यक्षिक केले जाईल. मी लगेच लक्षात घेऊ इच्छितो की खाली दिलेले सर्व कार्यक्रम निव्वळ प्रात्यक्षिकासाठी आहेत आणि त्यांचे कोणतेही व्यावसायिक मूल्य नाही. त्यामुळे, प्रोग्रामर इतका कास्ट्रेटेड आणि कमी कार्यशील का आहे किंवा सर्वत्र उपलब्ध असलेल्या अतिरिक्त सेवा का नाहीत यासारख्या तक्रारी स्वीकारल्या जात नाहीत. कोड उघडे असल्याने, कोणीही ते त्यांच्या स्वत: च्या विवेकबुद्धीनुसार जोडू शकतो, परंतु माझ्यासाठी, माझ्या कामासाठी माझ्याकडे हे पुरेसे आहेत.

असे गृहीत धरले जाते की वाचक आधीपासूनच "Arduino" मॉड्यूल (ढाल) आणि ESP8266 च्या कनेक्शन आणि फर्मवेअरशी परिचित आहे. खरं तर, या उपकरणांसह कार्य करण्याच्या मूलभूत गोष्टींचे स्पष्टीकरण देणारी बरीच सामग्री इंटरनेटवर पोस्ट केली गेली आहे आणि मी येथे स्वतःची पुनरावृत्ती करू इच्छित नाही. नवशिक्यांसाठी, लेखाच्या शेवटी या समस्यांवरील उपयुक्त दुव्यांची सूची आहे, जिथे हे सर्व आपल्यासाठी कार्य करत नाही याविषयी माहितीचा एक समूह शोधू शकता. माजी इलेक्ट्रॉनिक्स अभियंता म्हणून माझ्या अनुभवावरून, मी जबाबदारीने सांगू शकतो की 99% समस्या पुढील गोष्टींवर उगवतात:

1. खराब संपर्क. "Arduino" शील्ड्सचा अर्थ "पुरुष-मादी" वायर्सद्वारे एकमेकांशी कम्युटेशन दर्शवितात, सोल्डरिंगद्वारे नाही, बरेचदा काहीतरी, कुठेतरी, बंद होते. तपासा. आणि सर्वसाधारणपणे, जसे ते म्हणतात, इलेक्ट्रॉनिक्स हे संपर्कांचे विज्ञान आहे.

2. पोषण समस्या. जेथे 3.3 आवश्यक असेल तेथे 5 व्होल्ट वीज पुरवठा करू नका. कधीकधी यामुळे ESP8266 मधून धूर निघतो. जरी, दुसरीकडे, ते समस्यांशिवाय पाच-व्होल्ट उपकरणांमधून तार्किक सिग्नलवर प्रक्रिया करते.

3. पुरेशा वीज पुरवठ्यामध्ये समस्या. ESP8266 चा स्वभाव गुपचूप आहे आणि काहीवेळा तो जवळजवळ तीनशे मिलीअँप वापरू शकतो, जरी त्यापूर्वी ते तीसवर समाधानी असू शकते. त्यानुसार, Arduino बोर्डचा 3.3 व्होल्ट स्टेबलायझर, ज्याला तुम्ही संकोच न करता जोडला होता, तो लगेच सूक्ष्म मूल्यांवर येतो. आणि ते कधी कधी काम करते, कधी का होत नाही हे समजू शकत नाही.

4. निष्कर्षांसह गोंधळ. कोणते सिग्नल कुठे जातात ते नेहमी तपासा. RXD रिसीव्हरला TXD ट्रान्समीटर, तसेच TXD ला RXD शी कनेक्ट करणे आवश्यक आहे, परंतु MOSI MOSI शी, आणि MISO ते MISO, आणि याप्रमाणे.

5. ESP8266 मधील इन-सर्किट पुल-अप रेझिस्टरवर अवलंबून राहू नका, पिन नेहमी शून्य किंवा पॉवरवर खेचून घ्या, 5-10 किलो ओम बाह्य रेझिस्टरद्वारे, आणि फक्त एक जंपर नाही. अन्यथा, उत्कृष्टपणे, आपण अभूतपूर्व वर्तमान वापर मिळवू शकता आणि नंतर जळलेल्या प्लास्टिकचा अप्रिय वास घेऊ शकता.

6. सॉफ्टवेअर समस्या. वैयक्तिक वापरकर्त्यांसाठी सॉफ्टवेअर समान उत्साही लोकांद्वारे लिहिलेले असल्याने, त्याच फर्मवेअरच्या आवृत्त्या अद्यतनित करताना फर्मवेअरमधील त्रुटी आणि बग वेळोवेळी दिसून येतात. हे संबंधित मंचांमधून क्रॉल करून हाताळले जाते, काहीवेळा इंग्रजी भाषेतील देखील. काही कॉम्रेड्सनी असा युक्तिवाद केला की ईएसपी चिप स्वतः सेंट पीटर्सबर्गमधील हवामानाप्रमाणे ओलसर आहे, परंतु दुसरीकडे, असे देखील मत आहे की 2014 पासून (त्याच्या पहिल्या प्रकाशनाचे वर्ष) यासह परिस्थिती नाटकीयरित्या सुधारली आहे ( हवामानाच्या विपरीत).

7. अनाकलनीय glitches. ही एक दुर्मिळ पण चिंताग्रस्त घटना आहे. उदाहरणार्थ, मी दूरस्थपणे एक "Arduino" डिव्हाइस शिवू शकलो नाही. किंवा त्याऐवजी, ते कार्य केले, परंतु त्रुटींसह. परंतु प्रोग्रामरची केबल त्यावर टांगलेली असल्यास (परंतु प्रोग्रामरशिवाय) त्रुटींशिवाय कार्य केले. “अहा,” मी स्वतःला म्हणालो आणि डेटा पिन आणि घड्याळ पिन दरम्यान 15 pF कॅपेसिटर सोल्डर केला. सर्व काही काम केले. पण दिवस मारला.

तर चला सर्वात सोप्या गोष्टीपासून सुरुवात करूया. आमच्याकडे मेकआर्म मेकॅनिकल लिंब (परंतु हॉवर्ड वोलोविट्झने बनवलेले नाही) चीनमध्ये बनवले आहे आणि विंडोज वैयक्तिक संगणक आहे. प्रोग्रामला दूरस्थपणे फ्लॅश करणे आणि संगणकावरून नियंत्रित करणे हे कार्य आहे.


कंट्रोल कंट्रोलरसाठी, ATmega328P स्टोनसह एक सुंदर लघु Arduino नॅनो बोर्ड घेऊ. हा बोर्ड यांत्रिक हाताच्या आत छान बसतो.


आता ते कसे प्रोग्राम करायचे ते ठरवू. रिमोट फर्मवेअरसाठी सर्वात योग्य असलेल्या तीन मुख्य पद्धती आहेत: SPI इंटरफेसद्वारे, अंगभूत बूटलोडरद्वारे, JTAG पोर्टद्वारे.

सर्वात सोपा पर्याय अर्थातच अंगभूत बूटलोडर आहे. ही FLASH मध्ये पूर्व-नोंदणीकृत मेमरी आहे, एक प्रोग्राम जो विशिष्ट प्रोटोकॉल वापरून कोड प्राप्त करतो (उदाहरणार्थ, सर्वात सोपा UART वापरून) आणि लोड केलेल्या प्रोग्रामच्या स्थानावर लिहिण्यासाठी विशेष कमांड वापरतो. अशा प्रकारे, उदाहरणार्थ, ARDUINO IDE बूटलोडर स्वतः कार्य करते. रीसेट केल्यानंतर किंवा प्रारंभ केल्यानंतर, बूटलोडर डेटा प्राप्त करण्यासाठी काही काळ प्रतीक्षा करतो आणि जर तो प्रतीक्षा करत नसेल, तर तो ॲड्रेस झिरो वरून प्रोग्राम कार्यान्वित करण्यास प्रारंभ करतो. डेटा आल्यास, तो प्रोग्राम विभागात लिहितो. पुढील रीसेट केल्यानंतर, लोड केलेला प्रोग्राम कार्यान्वित करणे सुरू होते. मी कदाचित त्याचे तपशीलवार वर्णन केले असेल, परंतु त्याचा सारांश हाच आहे. परिणामी, आम्हाला प्रोग्रामिंगसाठी फक्त तीन पिन आवश्यक आहेत: RTD रिसीव्हर, RESET आणि GND. सर्वसाधारणपणे, रेकॉर्ड केलेला प्रोग्राम सत्यापित करण्यासाठी TRD ट्रान्समीटर देखील वापरला जातो, परंतु साध्या प्रात्यक्षिक अनुप्रयोगांसाठी (अणुऊर्जा प्रकल्पासाठी नाही), सत्यापन वगळले जाऊ शकते.

बूटलोडर स्वतः असेंबली भाषेत लिहिलेले आहे; AVR डेटाशीटमध्ये साध्या बूटलोडरची उदाहरणे आहेत. तुम्ही विद्यमान बूटलोडर शोधून काढू शकता, जर ते सार्वजनिकरित्या उपलब्ध असेल आणि ते ज्या प्रोटोकॉलद्वारे कार्य करते ते तुम्हाला माहीत असल्यास, फक्त त्याच्या तयार स्वरूपात वापरा. फक्त एक इशारा आहे की यासाठी तुम्हाला विशेष फ्यूज बिट्स फ्लॅश करून एव्हीआरला विशेष मोडमध्ये कॉन्फिगर करणे आवश्यक आहे, जे नियमित प्रोग्रामरसह केले जाते आणि नंतर बूटलोडरला मायक्रोकंट्रोलरच्या मेमरीमध्ये फ्लॅश करण्यासाठी त्याचा वापर करा (म्हणजे, आपण अद्याप एकदा प्रोग्रामरशिवाय करू शकत नाही).

दुसरा पर्याय SPI सीरियल इंटरफेसद्वारे प्रोग्रामिंग आहे. येथे कोणतेही अंतर्गत बूटलोडर नाही आणि आम्ही विशेष कमांड आणि नंतर वर नमूद केलेल्या इंटरफेसद्वारे डेटा पाठवून प्रोग्राम करतो. येथे आमच्याकडे आधीच बाह्य बूटलोडर आहे, परंतु आम्हाला ते लिहिण्याची आवश्यकता आहे. ट्रान्समिशन दरम्यान, RESET आणि GND व्यतिरिक्त, चार अतिरिक्त पिन वापरल्या जातात: MOSI, MISO - डेटा, SLK सिंक्रोनाइझेशन, CS - क्रिस्टल निवड. परंतु सर्वसाधारणपणे तुम्ही MISO आणि CS देखील काढू शकता. डेटा केवळ प्राप्त होईल (नंतर प्रोग्रामची कोणतीही पडताळणी होणार नाही), आणि आमच्याकडे आधीपासूनच फक्त एक क्रिस्टल आहे.

प्रत्येक दृष्टिकोनाचे त्याचे फायदे आणि तोटे असतात (मानवी आयुष्य लहान असल्याने मी JTAG अजिबात विचारात घेतले नाही). पण शेवटी, मी SPI कडे झुकलो कारण मी असेंबलरमध्ये लिहिण्यास खूप आळशी होतो आणि मला खुले, तयार बूटलोडर्स सापडले नाहीत (मला पुरेसे कठीण दिसत नव्हते).

वायरलेस चॅनेल तयार करण्यासाठी, आधीच नमूद केल्याप्रमाणे, मी सध्या अत्यंत व्यापकपणे ओळखली जाणारी ESP8266 चिप निवडली - एक मायक्रोकंट्रोलर किंवा त्याऐवजी वाय-फाय इंटरफेससह चीनी उत्पादक एस्प्रेसिफकडून संपूर्ण SoC (सिस्टम-ऑन-चिप). वाय-फाय व्यतिरिक्त, हे बाह्य फ्लॅश मेमरीमधून प्रोग्राम कार्यान्वित करण्याच्या क्षमतेद्वारे ओळखले जाते. विशेषतः माझ्या प्रोजेक्टसाठी, मी बोर्डवर 512 KB मेमरी असलेला ESP8266-07 घेतला.


सर्वसाधारणपणे, कोणतेही ESP8266 योग्य आहे, जेथे SPI लागू करण्यासाठी अतिरिक्त पाय आहेत. म्हणून, सर्वात सोपा ESP8266-01 आम्हाला अनुकूल होणार नाही, कारण त्यात I/O पोर्टसाठी खूप कमी पिन आहेत. परंतु दुसरीकडे, त्यांच्यातील किंमतीतील फरक शंभर रूबलपेक्षा कमी आहे आणि ते तितकेच उपलब्ध आहेत. बरं, ESP सह मोठे डीबगिंग बोर्ड, जेथे सोयीसाठी गौण घटक वेगळे केले जातात, ते देखील आमच्यासाठी योग्य नाहीत, कारण ते आमच्या यांत्रिक हातात बसत नाहीत.

सर्वसाधारणपणे कल्पनेचे जागतिक सार खालीलप्रमाणे होते. मायक्रोकंट्रोलरमध्ये लोड केलेल्या प्रोग्रामचा मुख्य भाग WI-FI (तुमच्या होम नेटवर्कमध्ये) द्वारे संगणकावरून ESP वर वायरलेसपणे हस्तांतरित केला जातो. आणि ESP आधीच मायक्रोकंट्रोलरच्या FLASH मेमरीमध्ये SPI इंटरफेस वापरून हा प्रोग्राम वायरवर लिहितो. मग ते नैसर्गिकरित्या ते रीसेट करते आणि लोड केलेल्या प्रोग्रामला कार्यान्वित करण्यास अनुमती देते. याव्यतिरिक्त, ESP मध्ये एक स्वतंत्र ब्लॉक असणे आवश्यक आहे जो मायक्रोकंट्रोलरसह डेटा एक्सचेंज देखील व्यवस्थापित करतो, कारण आम्हाला केवळ प्रोग्रामच नाही तर त्यासह डेटाची देवाणघेवाण देखील करायची आहे. विशेषतः मेकआर्म प्रोजेक्टसाठी, प्रोग्राम रेकॉर्ड केल्यानंतर, आम्ही हा हात गतीमध्ये सेट करण्यासाठी सर्व्होसवर नियंत्रण सिग्नल देखील प्रसारित करतो. म्हणून, ईएसपीवरच, आम्हाला प्रोग्राम हस्तांतरित करण्यासाठी TCP सर्व्हर आणि MechArm नियंत्रित करण्यासाठी UDP सर्व्हर स्थापित करण्याचा सल्ला दिला जातो. त्यानुसार, हे सर्व्हर होम नेटवर्कमध्ये सामील होतात आणि मेकाआर्मवर नवीन कोड अपलोड करू इच्छिणारे किंवा एखाद्याला तो वेव्ह करू इच्छिणारे लोक तेथे आहेत का ते काळजीपूर्वक ऐका.

तर, मला इंटरनेटवर आढळले की फर्मवेअर आधीच एव्हीआरला हवेवर प्रोग्रामिंग करण्यास अनुमती देते, परंतु मुख्य समस्या अशी आहे की हे फर्मवेअर यापुढे कशासाठीही वापरले जाऊ शकत नाही. आणि आम्ही प्रोग्रामिंगनंतर AVR शी दूरस्थपणे संवाद साधू इच्छितो.

आम्ही कोणते सॉफ्टवेअर वापरू:

PC साठी, मी JAVA, IntelliJ IDEA वातावरणात सर्वकाही लिहिले. परंतु तत्त्वानुसार, आपण काहीही वापरू शकता, आमच्यासाठी मुख्य गोष्ट म्हणजे क्लायंट लिहिणे जे ESP8266 वर AVR फ्लॅश करण्यासाठी प्रोग्राम पाठवेल.

मी AVR साठी ATMEL STUDIO मध्ये, C मध्ये, क्वचितच असेंबलरमध्ये लिहितो. मी तत्त्वानुसार Arduino स्केचेस वापरत नाही; जवळजवळ कोणतीही आवश्यक लायब्ररी एका तासात आणि त्याच्या ऑपरेशनची पूर्ण माहिती घेऊन लिहिली जाऊ शकते. मी स्केचेस करण्याचा प्रयत्न केला, परंतु जोपर्यंत तुमच्याकडे AVR वर ऑपरेटिंग सिस्टीम नाही तोपर्यंत स्केचेस तुमच्या मित्राचे परिधीय काढून घेतील आणि नियमितपणे खराब होतील. होय, Arduino IDE स्वतः, ATMEL स्टुडिओच्या तुलनेत, अर्थातच एक अतिशय आदिम गोष्ट आहे. परंतु येथे प्रश्न, अर्थातच, विवादास्पद आहे;

ESP8266 प्रोग्राम करण्यासाठी, मी NodeMCU फर्मवेअर वापरला आणि Lua मध्ये प्रोग्राम लिहिले. नाही, मला Java आणि C मध्ये लिहायला आवडेल, पण ते ESP वर उपलब्ध नाहीत. लुआ ही आपल्या कार्याला लागू करणे कठीण नाही; आणि प्रत्यक्षात प्रोग्राम डाउनलोड करण्यासाठी आणि त्यांना ESP वर डीबग करण्यासाठी, मी IDE ESPlorer घेतला. घरगुती मोफत उत्पादन (परंतु तुम्ही लेखकाला देणगी देऊ शकता), ज्याची वर उल्लेख केलेल्या वातावरणाशी तुलना करता येत नाही, परंतु ते म्हटल्याप्रमाणे गिफ्ट हॉर्सशी... पण ESPlorer वापरण्यासाठी आणि LUA मध्ये लिहिण्यासाठी, आम्हाला प्रथम ESP8266 चिप (निर्मात्याकडून पुरवलेले) मधील मूलभूत फर्मवेअर नवीनमध्ये बदलण्याची आवश्यकता आहे. NODE MCU PyFlasher प्रोग्राम आम्हाला या प्रयत्नात मदत करेल. म्हणजे, ते रिफ्लेश करण्यास मदत करेल. आणि आम्ही स्वतः फर्मवेअर तयार करू आणि निर्मात्यांच्या वेबसाइटवर ते तुमच्या हातात मिळवू: NodeMCU आणि तुम्ही या प्रक्रियेबद्दल अधिक वाचू शकता

सर्व काही अतिशय सुलभ आणि समजण्यायोग्य आहे. आम्ही मूलभूत लायब्ररींमध्ये SPI आणि बिट ऑपरेशन्ससाठी समर्थन जोडतो (LUA मध्ये, आमच्या बाबतीत, बिट ऑपरेशन्स ओव्हरलोड आहेत आणि त्यांचा फारसा उपयोग होत नाही). तुम्ही फर्मवेअरमध्ये भरपूर लायब्ररी भरू नयेत, कारण ESP8266 वर सर्व प्रकारच्या वेगवेगळ्या सॉफ्टवेअरच्या उपस्थितीमुळे खूप कमी मेमरी शिल्लक आहे, काही 20 kB.

नक्कीच, आपण फक्त तयार फर्मवेअर घेऊ शकता, ज्यापैकी बरेच आधीच इंटरनेटवर फिरत आहेत, परंतु मी याची शिफारस करत नाही. जर काही बिट ऑपरेशन्सला समर्थन देत नाहीत (आणि आम्हाला त्यांची आवश्यकता आहे) आणि SPI द्वारे डेटा ट्रान्सफर रेट नियंत्रित करत नाहीत.
त्यानुसार, ते 40 मेगाहर्ट्झच्या वेगाने काही लहान गुणांकाने भागून डीफॉल्टनुसार प्रसारित केले जातात आणि म्हणून AVR ला ते पचवायला वेळ नाही.

फर्मवेअर तयार करण्यात तुम्ही खूप आळशी असल्यास, तुम्ही क्लाउडवरून माझे डाउनलोड करू शकता.

आता आमच्याकडे फर्मवेअर आहे आणि आम्हाला ते बेस ऐवजी ESP8266 मध्ये लोड करावे लागेल. यासाठी आपल्याला एक साधा USB - UART अडॅप्टर लागेल.


आम्ही पाय TXD ते RXD आणि RXD ते TXD जोडतो, ग्राउंड सामान्य बनवतो, परंतु ॲडॉप्टरवरील सोयीस्कर 3.3 V पॉवर आउटपुट जसे दिसते तसे वापरू नका. बर्याच बाबतीत, ESP8266 ते पूर्णपणे काढून टाकेल. म्हणून, आम्ही ते स्वतंत्रपणे पॉवर करतो. मग आम्ही ESP ला प्रोग्रामिंग मोडवर (GP0 वरून ग्राउंडवर, कोणीही विसरले असल्यास) स्विच करतो आणि NODE MCU PyFlasher लाँच करतो.

मुख्य गोष्ट म्हणजे फ्लॅश मेमरी मिटवणे विसरू नका (होय, सर्व डेटा पुसून टाका), अन्यथा, फर्मवेअर आवृत्तीवर अवलंबून, प्रोग्रामिंगनंतर, अनावश्यक कचरा मेमरीमध्ये राहू शकतो, ज्यामुळे पुढे कन्सोलमध्ये कचरा ओतला जाईल. काम त्याआधी, मी सॉफ्टवेअर वापरले ज्यात प्रथम मेमरी मिटवण्याचा पर्याय नव्हता आणि काहीही काम न केल्यामुळे मला खूप त्रास सहन करावा लागला. आणि बॉक्स सहजपणे उघडला, फक्त सत्य NODE MCU च्या निर्मात्यांच्या इंग्रजी भाषेच्या मंचावर होते.

आवश्यक फर्मवेअर प्राप्त केल्यावर, आम्ही आता NODE MCU मधील अतिशय सोयीस्कर API वापरून LUA भाषेत प्रोग्राम लिहू आणि डीबग करू शकतो (मायक्रोपायथॉन देखील आहे, परंतु मी ते वापरले नाही). आम्ही पूर्वी नमूद केलेले ESPlorer लाँच करतो.

आम्ही ते ESP8266 सह कार्य करण्यासाठी कॉन्फिगर करतो आणि सीरियल कनेक्शन पॅरामीटर्स सेट करतो. सर्व काही अगदी सोपे आहे आणि इंटरनेटवर अनेक वेळा वर्णन केले आहे.

आता आम्ही LUA मध्ये एक प्रोग्राम लिहितो, जो आम्ही नंतर ESP8266 मध्ये लोड करू:

AVR साठी लुआ बूटलोडर ESP8266 वर लिहिले आहे

फंक्शन InstrProgrammingEnable () -- MC साठी सूचना "प्रोग्रामिंग सक्षम करा" p=0 तर p<31 do p=p+1 pin=8 gpio.write(pin, gpio.LOW) spi.send(1, 0xAC,0x53) read = spi.recv(1, 8) spi.send(1,0,0) gpio.write(pin, gpio.HIGH) if (string.byte(read)== 83) then print("connection established") p=33 if(p==31) then print("no connection") end end end end फंक्शन प्रोग्रामिंग अक्षम () pin=2--MK gpio.mode(pin, gpio.INPUT) साठी ESET चा शेवट (पिन, gpio.INPUT) पिन=8 gpio.mode(पिन, gpio.INPUT) पिन=5--SPI gpio.mode साठी CLK मास्टर(पिन, gpio. INPUT) पिन=6--SPI gpio.mode(पिन, gpio.INPUT) पिन साठी MISO मास्टर = 7--SPI gpio.mode(पिन, gpio.INPUT) समाप्तीसाठी MOSI मास्टर फंक्शन प्रोग्रामिंग सक्षम() pin=2-- MK gpio.mode(pin, gpio.OUTPUT) gpio.write(पिन, gpio.LOW) पिन = 2-- POZITIV साठी रीसेट करा MK gpio.mode(पिन, gpio.OUTPUT) gpio साठी 4MSEC रीसेट करा .write(पिन, gpio.HIGH) tmr.delay(4) gpio.mode(पिन, gpio.OUTPUT) gpio.write(पिन, gpio.LOW) tmr.delay(25000) समाप्त फंक्शन InstrFlashErase() pin=8 gpio.write(पिन, gpio.LOW) spi.send(1,0xAC,0x80,0,0) gpio.write(पिन, gpio.HIGH) tmr.delay(15000) पिन=2--साठी रीसेट करा MK gpio.mode(पिन, gpio.OUTPUT) gpio.write(पिन, gpio.HIGH) tmr.delay(20000) gpio.write(पिन, gpio.LOW) प्रिंट ("फ्लॅश मिटवला आहे") इंस्ट्रप्रोग्रामिंग सक्षम करा () समाप्त फंक्शन InstrStorePAGE(H, पत्ता, डेटा) pin=8 gpio.write(pin, gpio.LOW) spi.send(1,H,0,address,data) gpio.write(पिन, gpio.HIGH) tmr.delay(500) end फंक्शन InstrWriteFLASH(page_address_low,page_address_high) pin=8 gpio.write(pin, gpio.LOW) spi.send(1.0x4C,page_address_high,page_address_low,0) gpio.write(पिन, gpio.HIGH) tmr.delay(5000)-- कधी कधी फ्लॅश नोंदणीकृत होत नाही कमी विलंब समाप्ती फंक्शन प्रोग्रामिंग (पेलोड) pin=8--SPI gpio.mode(pin, gpio.OUTPUT, gpio.PULLUP) पिन साठी CS मास्टर = 4-- LED लाइट्स ऑन लो gpio.mode(pin, gpio.OUTPUT) gpio.write(पिन, gpio. LOW) print(string.len(payload)) page_count = 7 -- k =0 ,page_count ,1 do-- i=0 , 127, 2 do-- -1 पत्ता = i/ साठी 1 किलोबाइट लिहा 2 data=payload:byte(i+1+128*k) जर डेटा == शून्य असेल तर डेटा = 0xff end InstrStorePAGE(0x40,address,data) -- tmr.delay(100)-- अन्यथा वेळेत डेटा लिहू नका = payload:byte(i+1+1+128*k) जर डेटा == शून्य असेल तर डेटा = 0xff end InstrStorePAGE(0x48,address,data) -- tmr.delay(100) end page_address_low=bit.band(k ,3 )*64 -- 3 बायनरी आहे 11 page_address_high=k/4+frame1024*2 tmr.delay(1000) InstrWriteFLASH(page_address_low,page_address_high) tmr.wdclr() end pin=4--LED gpio.mode, gpio.mode(. OUTPUT) gpio.write(पिन, gpio.HIGH) शेवट --मुख्य ब्लॉक wifi.setmode(wifi.STATION) --wifi.sta.config("नेटवर्कचे नाव","पासवर्ड") -- तुमच्या ऍक्सेस पॉईंटचा SSID आणि पासवर्ड सेट करा station_cfg=() tmr.delay(30000) station_cfg.ssid=" नेटवर्क नाव" tmr.delay(30000) station_cfg.pwd="पासवर्ड" tmr.delay(30000) wifi.sta.config(station_cfg) tmr.delay(30000) wifi.sta.connect() tmr.delay(1000000) प्रिंट (wifi.sta.status()) प्रिंट(wifi.sta.getip()) तर (wifi.sta.status()~=1) if(wifi.sta.status()==5) करा नंतर शेवटचे टोक खंडित करा sv=net.createServer(net.TCP,30) tmr.delay(100) प्रिंट("सर्व्हर रेडी") sv:listen(4000,function(c) c:on("receive", function(c, payload) प्रिंट (पेलोड) जर (पेलोड =="प्रोग्राम\r\n") तर c:send("रेडी\r\n") प्रिंट ("प्रोग्रामसाठी तयार\r\n") spi.setup(1, spi.MASTER) , spi.CPOL_LOW, spi.CPHA_LOW, spi.DATABITS_8,320,spi.FULLDUPLEX) ProgrammingEnable () tmr.delay(100) InstrProgrammingEnable () tmr.delay(100) InstrFlashErase() फ्रेम () 102004 फ्रेम प्रसारित फ्रेम्सची संख्या st=net.createServer(net.TCP,30) st:listen(4001,function(c) c:on("receive", function(c, payload) tmr.wdclr() प्रोग्रामिंग (पेलोड) ) frame1024=frame1024+1 end) end) end if (payload =="data\r\n") नंतर c:send("ready\r\n") print("डेटा साठी तयार\r\n") srv = net.createServer(net.UDP) tmr.delay(1000) pin=10 gpio.write(पिन, gpio.HIGH) uart.setup(0,9600,8,0,1,0) srv:listen(5000) srv :on("receive", function(srv, pl) pl=pl*1 --print(pl) uart.write(0,pl) tmr.wdclr() end) end if (payload =="stop\r) \n") नंतर if(st~=nil) नंतर st:close() frame1024=0 ProgrammingDisable () print("program stop") end if(srv~=nil) नंतर srv:close() print("data stop) " ) शेवटचा शेवट) शेवट) शेवट)


जेथे संबंधित फंक्शन्स खालील गोष्टी करतात:

फंक्शन InstrProgrammingEnable()- SPI द्वारे पाठवलेल्या विशेष कमांडसह मायक्रोकंट्रोलरला प्रोग्रामिंग मोडमध्ये ठेवते.

फंक्शन प्रोग्रामिंग सक्षम()- प्रोग्रामिंग सुरू करण्यापूर्वी फक्त AVR 25 ms साठी रीसेट करा

फंक्शन प्रोग्रामिंग अक्षम ()- प्रोग्रामिंग पूर्ण केल्यानंतर, आम्ही ESP8266 मधील SPI पिन निष्क्रिय स्थितीत हस्तांतरित करतो जेणेकरुन मायक्रोकंट्रोलरवर कोड कार्यान्वित करताना ते आमच्यामध्ये व्यत्यय आणू नयेत (तेथे वापरले असल्यास)

फंक्शन InstrFlashErase()- प्रोग्रामिंग सुरू करण्यापूर्वी मायक्रोकंट्रोलरवरील फ्लॅश मेमरी पुसून टाका. हे का आवश्यक आहे हे सांगण्याची गरज नाही.

फंक्शन InstrStorePAGE(H, पत्ता, डेटा)- ही कमांड मायक्रोकंट्रोलरच्या अंतर्गत बफरवर प्रोग्राम बाइट लिहिते. परंतु हा फ्लॅश रेकॉर्ड नाही, कारण फ्लॅश येथे प्रत्येक पृष्ठावर 128 बाइट्स लिहिलेला आहे.

फंक्शन InstrWriteFLASH(page_address_low,page_address_high)- परंतु हे फ्लॅश रेकॉर्डिंग आहे आणि यास वेळ लागतो, 5,000 μs च्या वेळेच्या विलंबाकडे लक्ष द्या.

फंक्शन प्रोग्रामिंग (पेलोड)– वरील फंक्शन्स वापरणारे सर्वात मोठे आणि महत्त्वाचे फंक्शन. तो प्रसारित केलेला प्रोग्राम 1024 बाइट्सच्या तुकड्यांमध्ये घेतो, त्यांना बाइट्समध्ये विभाजित करतो आणि त्यांच्यासाठी पत्ते तयार करतो, आणि नंतर ते अंतर्गत बफरमधील मायक्रोकंट्रोलरकडे पाठवतो आणि प्रत्येक 128 बाइट्सनंतर तो फ्लॅश राइट सुरू करतो. मग ते पुढील किलोबाइट कोड घेते आणि ऑपरेशनची पुनरावृत्ती करते, नैसर्गिकरित्या पत्त्यांमध्ये ऑफसेटसह, जेणेकरून ते पुढे लिहिले जाऊ शकते आणि ओव्हरराईट होणार नाही. सुरुवातीला, मी संपूर्ण प्रोग्राम हस्तांतरित करण्याचा प्रयत्न केला, परंतु जेव्हा ESP8266 6 किलोबाइट्सपेक्षा जास्त होते, तेव्हा उपलब्ध मेमरी फक्त संपते आणि ती क्रॅश होते. एक किलोबाइट सर्वात सोयीस्कर युनिट ठरले, कारण ते भागांमध्ये सुबकपणे विभागले गेले आहे आणि TCP द्वारे सोयीस्करपणे प्रसारित केले गेले आहे (आम्हाला ते अद्याप संगणकावरून घेणे आवश्यक आहे). मोठ्या आकाराची देखील आवश्यकता नाही, TCP, जसे की तुम्हाला माहिती आहे, वर्तमान आवृत्तीमध्ये प्रसारित पॅकेट 1500 किंवा अधिक बाइट्सपर्यंत मर्यादित करते (परंतु काही कारणास्तव मला 1440 प्रसारित केले गेले आहे, असे दिसते).

यात काहीही क्लिष्ट वाटले नाही, परंतु अनेक अडचणींवर मात करावी लागली.

आम्ही वायरलेस नेटवर्कमध्ये नोंदणी करतो.

प्रथम आम्ही एक TCP सर्व्हर तयार करतो जो तीन आज्ञा ऐकतो:

1. "कार्यक्रम" (आम्ही प्रोग्राम करू),

2. "डेटा" (आम्ही डेटाची देवाणघेवाण करू),

3. "थांबा" (आम्ही सर्वकाही थांबवतो).

आम्ही प्रोग्रामिंग करत असल्यास, आम्ही प्रथम SPI सुरू करतो आणि दुसरा TCP सर्व्हर तयार करतो जो प्रति किलोबाइट डेटा (फर्मवेअर असलेला प्रोग्रामचा कोड) घेतो आणि त्यासाठी मायक्रोकंट्रोलर प्रोग्रामिंग फंक्शन्स कॉल करतो. मला समजले आहे की दुसरा सर्व्हर तयार करणे मूर्खपणाचे दिसते, परंतु ही एक गरज आहे, कारण स्थानिक API फक्त एक सॉकेट तयार करण्यास समर्थन देते आणि आम्हाला "प्रोग्राम" आणि "डेटा" कमांड्स वास्तविक प्रसारित डेटासह वेगळे करणे आवश्यक आहे, कारण ते डोळ्यांनी ओळखता येत नाहीत, तेथे बाइट्स आहेत आणि येथे बाइट्स आहेत.

जर आम्हाला प्रोग्राम करायचा नसेल, परंतु डेटाची देवाणघेवाण करा, आमच्या बाबतीत ते मायक्रोकंट्रोलरकडे पाठवा, तर आम्ही प्रथम "डेटा" स्ट्रिंग TCP द्वारे पाठवतो. याला प्रतिसाद म्हणून, एक UDP सर्व्हर तयार केला जाईल (मी तुम्हाला आठवण करून देतो की आम्ही यांत्रिक हाताने गतिमानपणे नियंत्रित करत आहोत आणि आम्हाला TCP पॅकेट्सच्या निर्मितीमध्ये विलंब करण्याची आवश्यकता नाही आणि सर्वसाधारणपणे एक बाइट पाठवणे वाईट शिष्टाचार आहे. संपूर्ण TCP फ्रेम). आणि आमचे UDP डेटाग्राम लहान असतील आणि पटकन जनरेट होतील.

त्यानंतर, UART आरंभ केला जातो, आणि वायरलेसरित्या प्राप्त झालेला प्रत्येक बाइट TXD वायरद्वारे मायक्रोकंट्रोलरकडे पाठविला जातो, जर संबंधित प्रोग्राम तेथे फ्लॅश झाला असेल तर तो स्वीकारणे बंधनकारक आहे. इतर दिशेने डेटा एक्सचेंज आयोजित करणे देखील कठीण नाही, परंतु मी अद्याप ते लागू केलेले नाही.

बरं, “स्टॉप” कमांडवर, वर नमूद केलेले सर्व्हर (पहिल्यांदा वगळता) कनेक्शन बंद करतात आणि मुख्य सर्व्हर पुन्हा “प्रोग्राम” आणि “डेटा” कमांड्सची वाट पाहण्याच्या स्थितीत जातो.

SPI इंटरफेस ESP8266 मधील सॉफ्टवेअरमध्ये अनुकरण केलेले असल्याने, तुम्ही CS, CLK, MISO, MOSI, RESET (AVR साठी) सिग्नलसाठी कोणतेही उपलब्ध इनपुट/आउटपुट पोर्ट वापरू शकता आणि माझ्या बूटलोडरमध्ये निर्दिष्ट केलेले नाही. याव्यतिरिक्त, हे दिसून आले की या प्रकरणात सीएस आणि एमआयएसओ देखील कापले जाऊ शकतात ते त्यांच्याशिवाय कार्य करेल; बरं, ESP8266 बोर्डमध्ये तयार केलेल्या LED साठी एक पिन वापरला जातो ज्यामुळे तो कधीकधी ब्लिंक होतो आणि प्रोग्राम अजूनही जिवंत असल्याचे दाखवतो.

रेकॉर्डिंग त्रुटींसाठी कोणतीही तपासणी नाही (एव्हीआरला पहिल्या विनंतीचा अपवाद वगळता, परंतु ही माहिती फक्त कन्सोलवर प्रदर्शित केली जाते), EEPROM प्रोग्राम केलेले नाही, 32 KB पेक्षा जास्त लिहिलेले नाही - थोडक्यात, अजूनही आहे काम करण्यासाठी काहीतरी. SPI एक्सचेंज स्पीड अंदाजे 115 Kbit आहे, काही सेकंदात सर्वकाही फ्लॅश होते, अंदाजे ISP500 सारख्या नियमित सीरियल प्रोग्रामरसारखे).

कोड घ्या, तुमचे नेटवर्क आणि पासवर्ड एंटर करा, ते ESplorer वर संकलित करा, त्याला “init” म्हणा (जेणेकरून ते रीस्टार्ट झाल्यावर सुरू होईल) आणि ESP8266 वर पाठवा. ते चालले पाहिजे. वायरलेस प्रोग्रामर म्हणून काम करण्याच्या अर्थाने, कमीतकमी.

आम्ही आता नियंत्रण बाजू हाताळू - वैयक्तिक संगणक.

मूलत:, आम्हाला HEX फॉरमॅट फाइल घ्यावी लागेल ज्यामध्ये तुमचे ATMEL स्टुडिओ वातावरणात लिहिलेले प्रोग्राम रूपांतरित केले जातील आणि WI-FI द्वारे आम्हाला ज्ञात असलेल्या सॉकेट पोर्टवर पाठवावे (या प्रकरणात, 4000). लहान कॅच म्हणजे आम्हाला ट्रान्सफरसाठी बायनरी बिन फाईलची आवश्यकता आहे आणि ATMEL स्टुडिओ आम्हाला फक्त HEX पुरवतो. येथे दोन मार्ग आहेत; किंवा WinHex सारख्या विशेष कन्व्हर्टर प्रोग्रामसह BIN फॉरमॅटमध्ये रूपांतरित करा किंवा ते स्वतः तुमच्या प्रोग्राममध्ये करा. मी अद्याप ते केले नाही, परंतु ते कठीण वाटत नाही, तुम्हाला शीर्षक कापून दुसरे काहीतरी करावे लागेल.

परिणामी, मी JAVA मध्ये लोडर प्रोग्राम लिहिला (मुख्यतः कारण मला इतर काहीही माहित नाही), फक्त आश्चर्यकारक आणि विनामूल्य IntelliJ IDEA वातावरणात काम केले. हे TCP क्लायंट तयार करते जे ESP8266 वर चालणारे सर्व्हर शोधते. जर त्याला ते सापडले, तर तो त्याच्याशी संपर्क साधतो आणि त्याला अशा आणि अशा पत्त्यावर असलेली फाइल पाठवतो. कोड खाली आहे.

JAVA फाईल डाउनलोडर PC च्या बाजूला चालू आहे

java.io.* आयात करा; java.net आयात करा.*; java.util.ArrayList आयात करा; java.util.List आयात करा; सार्वजनिक वर्ग नेट ( सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग आर्ग्स) ( नवीन Http_client(4000); )) क्लास Http_client ने थ्रेडचा विस्तार केला ( int port; String s; String Greetings_from_S; Http_client(int port)( this.port = port; start(); ) public void run() ( //192.168.1.113 हा ESP8266 चा पत्ता आहे. माझे नेटवर्क . परंतु सर्वसाधारणपणे, आपण राउटरशी संप्रेषण करण्यापासून शिकता // ते स्थिर करणे चांगले आहे, राउटर हे प्रयत्न करू शकतात (सॉकेट सॉकेट = नवीन सॉकेट("192.168.1.113", पोर्ट)) ( PrintWriter pw = new PrintWriter(नवीन OutputStreamWriter(socket.getOutputStream( )),true pw.println("program");// SERVER System.out.println("program" br = new BufferedReader(नवीन इनपुट); (socket.getInputStream())); System.out.println(Greetings_from_S.equals("रेडी")) ( फाइल फाइल = नवीन फाइल ("d:BlinkOUT.bin) "); // अपलोड केलेल्या फाइलचा पत्ता BufferedInputStream bis = नवीन BufferedInputStream(new FileInputStream(file)); byte data = new byte(data); byte data_buffer = new byte;< frames;i++) { for (int k = 0; k< (1024); k++) { data_buffer[k] = data; } sendingChunk(data_buffer); } byte data_buffer2= new byte; for (int i = 0; i < residy;i++) { data_buffer2[i] = data; } sendingChunk(data_buffer2); pw.println("stop");// System.out.println("stop program"); } catch (Exception e) { System.out.println(e); } } } catch (Exception e) { System.out.println(e); } } public void sendingChunk (byte data_buffer){ try (Socket socket = new Socket("192.168.1.113", 4001)){ BufferedOutputStream bos = new BufferedOutputStream((socket.getOutputStream())); bos.write(data_buffer); bos.flush(); System.out.println(data_buffer.length); } catch (Exception e) { System.out.println(e); } } }


int residy = data.length%1024;

साठी (int i = 0; i

फक्त एक गोष्ट आहे की ती चालवण्यासाठी तुम्हाला तुमच्या संगणकावर JAVA रनटाइम वातावरण स्थापित करणे आवश्यक आहे. पण मी सहसा IntelliJ IDEA वरून थेट लॉन्च करतो कारण तिथे तुम्ही नेहमी कन्सोलमध्ये काय घडत आहे ते पाहू शकता (परंतु येथे JAVA वातावरण देखील आवश्यक आहे). जरी, अर्थातच, GUI अधिक हुशार करणे आवश्यक आहे. म्हणजेच, एक विंडो जिथे फाईलचा मार्ग दिसतो, विंडोमधील पोर्ट क्रमांक बदलण्याची क्षमता आणि इतर आवश्यक गोष्टी. आणि हे सर्व एक्झिक्युटेबल फाईलच्या स्वरूपात गोळा करा.

आणि मग, कोरोव्हिएव्ह म्हटल्याप्रमाणे, नागरिकांनो, मेकआर्मच्या यांत्रिक अंगाकडे परत येऊ, ज्याचा अगदी सुरुवातीला उल्लेख केला गेला होता. आमच्याकडे आता ते दूरस्थपणे प्रोग्राम करण्याची आणि नंतर नियंत्रित करण्याची क्षमता आहे. चला मायक्रोकंट्रोलर बाजूला कंट्रोल प्रोग्रामकडे जाऊ.

या प्रकरणात आपल्याला चार सर्व्हो नियंत्रित करण्याची आवश्यकता आहे. हे आहेत.


अशी ड्राइव्ह 2 ते 4 टक्के कर्तव्य चक्रासह 20 ms (50 Hz) कालावधीच्या आयताकृती डाळींद्वारे नियंत्रित केली जाते. म्हणजेच, 2% हे एका दिशेने पूर्ण वळण आहे, तर दुसऱ्या दिशेने 4%. कार्य फक्त AVR मध्ये तयार केलेल्या PWM साठी आहे.

डाव्या-उजव्या हालचालीसाठी एक सर्वो वापरला जातो; दुसरा स्वतःवर - स्वतःपासून; तिसरा वर आणि खाली आहे; चौथा स्वतःच पंजा आहे, ज्याने संकुचित आणि अनक्लेंच केले पाहिजे. सर्व काही C मध्ये लिहिलेले आहे आणि ATMEL STUDIO मधील HEX फाईलमध्ये संकलित केले आहे. प्रोग्रामचा किंचित विचित्र देखावा या वस्तुस्थितीमुळे आहे की सुरुवातीला हात मायक्रोकंट्रोलरला वायरद्वारे जोडलेल्या कीबोर्डवरून नियंत्रित केला गेला होता. पण तार ही भूतकाळातील गोष्ट आहे;

तुम्ही अर्थातच, “ARDUINO” मधील सर्वोसाठी स्केचेस वापरू शकता, परंतु मला ते आवडले नाहीत. स्वतः लिहिणे अधिक मनोरंजक आहे. याव्यतिरिक्त, सर्व चार सर्वो एकाच वेळी ऑपरेट करणे आवश्यक आहे, आणि मल्टीप्लेक्स मोडमध्ये नाही, जेथे PWM प्रत्येक सर्वोवर बदलले जाते. कारण कोणीही गुरुत्वाकर्षण रद्द केले नाही, आणि संबंधित सर्वो ड्राइव्हने नियंत्रण आवेग प्राप्त करणे थांबवल्यास वरच्या दिशेने उंचावलेला अवयव त्वरित खाली पडेल. मला खात्री नाही की "ARDUINO" स्केच चार सर्वोसाठी एकाच वेळी ऑपरेशन प्रदान करते. परंतु आपण स्वतः आवश्यक आवश्यकता पूर्ण करणारा प्रोग्राम सहजपणे लिहू शकतो. आणि सर्वसाधारणपणे, मेंढ्यांना शेळ्यांपासून वेगळे करणाऱ्या कार्यप्रणालीच्या अनुपस्थितीत, मायक्रोकंट्रोलर पेरिफेरल्ससाठी स्पर्धा करणाऱ्या स्केचेसचा वापर (आणि आम्हाला आधीच माहित नाही की कोणते) हे खूप बग निर्माण करणारे आहे.

हा कोड आहे जो आपण ESP8266-07 वापरून Arduino Nano ला लिहितो.

AVRmega328P मायक्रोकंट्रोलरसाठी मेकआर्म कंट्रोल प्रोग्राम

# F_CPU 16000000 # समाविष्ट करा परिभाषित करा #समाविष्ट करा // मानक पूर्णांक # समावेश #समाविष्ट करा // गणित # समावेश // मानक I/O # समावेश #समाविष्ट करा #समाविष्ट करा //मानक क्षमता #define UART_BAUD_RATE 115200 // T1 काउंटर वेळ अंतराल 20ms वर सेट करते #define COUNTER1_OFF TCCR1B=0b00000000 // CS02 CS01 CS00 - 000 - अक्षम; विभाजक शिवाय 001; विभाजक 8 सह 010; 011 -64; 100 -256; 101 -1024 #define COUNTER1_ON TCCR1B=0b00000011 // काउंटर T0 सर्वोस PB0 आणि PB1 साठी कंट्रोल पल्सची रुंदी सेट करते #define COUNTER0_OFF TCCR0B=0b00000000 // disabled - CS002 CS02; विभाजक शिवाय 001; विभाजक 8 सह 010; 011 -64; 100 -256; 101 -1024 #define COUNTER0_ON TCCR0B=0b00000100 // काउंटर T2 सर्वो PB2 (PD6) आणि PB3 (PD7) साठी कंट्रोल पल्सची रुंदी सेट करते # COUNTER2_OFF TCCR2B=0b00CS /0001 disable ; विभाजक शिवाय 001; विभाजक 8 सह 010; 011 -64; 100 -256; 101 -1024 #define COUNTER2_ON TCCR2B=0b00000110 अस्थिर uint16_t period_20ms; अस्थिर uint8_t State_of_keyboard; अस्थिर uint8_t start_position ; अस्थिर int8_t number_servo; ISR(USART_RX_vect) // UART साठी व्यत्यय ( State_of_keyboard=UDR0; रिटर्न; ) ISR(TIMER0_COMPA_vect) // सर्वो РВ0 कंट्रोल पल्स रुंदी ( PORTB &=~(1<<0); TIMSK0&=~(1<
कार्यक्रमाचे सार मजकूर आणि टिप्पण्यांमधून स्पष्ट आहे. आम्ही 20 ms च्या नमुना कालावधीसाठी काउंटर T1 वापरतो आणि I/O पोर्टच्या चार ओळींना PWM सिग्नल जारी करण्यासाठी T0, T2 काउंटर वापरतो, कारण या दोन काउंटरपैकी प्रत्येक दोन उपकरणांवर कार्य करू शकतात.
प्रोग्राम ओसीआर0ए, ओसीआर0बी, ओसीआर2ए, ओसीआर2बी मोजणी रजिस्टर लोड करून सर्व्होची प्रारंभिक स्थिती सेट करतो. मर्यादित स्थिरांक देखील सादर केले जातात, कारण आम्हाला नेहमी 180 अंशांच्या अंतराची आवश्यकता नसते. बरं, मग, UART कडून व्यत्यय आणून, प्रोग्राम ESP8266 (1 ते 8 पर्यंत) द्वारे पाठवलेला नंबर पकडतो आणि संबंधित सर्वो ड्राइव्हसाठी कमांडमध्ये अनुवादित करतो. चार ड्राईव्ह आहेत, प्रत्येक दोन दिशेने काम करत आहे, म्हणून एक ते आठ पर्यंत पूर्णांक पुरेसे आहेत. एकदा नंबर निवडल्यानंतर, वरील काउंटर रजिस्टरमधील सामग्री एकतर वाढवली जाते किंवा कमी केली जाते, त्यानुसार कंट्रोल पल्सचे कर्तव्य चक्र आणि निवडलेल्या सर्वोचा रोटेशन अँगल बदलतो. आम्ही निवडलेले नसलेले ड्राईव्ह रोटेशन अँगलचे जुने मूल्य राखून ठेवतात (संबंधित रजिस्टरमधील मजकूर, अद्यतनित केला असला तरी, बदलला नाही) आणि त्याच स्थितीत यांत्रिक हात धरून ठेवणे सुरू ठेवतात.

आता आपल्याला फक्त WI-FI द्वारे संगणकावरून थेट यांत्रिक हात नियंत्रित करण्यासाठी नियंत्रण प्रोग्राम लिहायचा आहे, टाटॉलॉजीला माफ करायचं आहे.
कोड JAVA मध्ये देखील लिहिलेला आहे, परंतु थोडा सुधारला आहे. एक GUI आणि पोर्ट क्रमांक आणि ESP8266 चा नेटवर्क पत्ता संपादित करण्याची क्षमता आहे.

तिथे काय चालले आहे ते खिडकीतून स्पष्ट होते. मी कार्यक्रमाचा मजकूर येथे देत नाही (तो येथे उपलब्ध आहे

आरसी कार वायफाय कार असू शकते का...?

आरसी कार चांगली असते, परंतु स्वस्त आरसी कारची मर्यादा मर्यादित असते आणि ती फक्त किटमध्ये पुरवलेल्या विशिष्ट रिमोट कंट्रोलद्वारे नियंत्रित केली जाते.

मी फ्लेक्स सस्पेंशन आणि ऑफ-रोड टायर असलेली RC जीप 4x4 सुमारे $30 मध्ये खरेदी केली. मशीनशी खेळल्यानंतर, मी ठरवले की ते वाय-फाय आणि अँड्रॉइड वापरून सुधारले जाऊ शकते. थोडा वेळ घालवल्यानंतर, मी मशीनमधून बोर्ड पूर्णपणे काढून टाकला. मी या बोर्डवरील व्होल्टेज मोजले आणि Arduino वापरून मोटर नियंत्रण प्रणाली विकसित केली. मूळ नियंत्रण प्रणाली वेग नियंत्रित करण्यासाठी PWM वापरत नाही. कार अत्यंत कमी गियरमध्ये अडथळे पार करण्यासाठी आणि परिणामी, अतिशय हळू चालविण्यासाठी डिझाइन केलेली आहे. माझे सर्किट PWM वापरते.

मी अनेक महिन्यांपासून Arduino वापरत आहे. मी WiFi चा प्रयोग करण्यासाठी Dumilanoe Arduino साठी asynclabs WiFi शील्ड देखील खरेदी केले. हे Arduino IDE मध्ये स्थापित केलेल्या लायब्ररीसह येते. मी एक प्रोग्राम बनवू शकलो जो तुम्हाला वायफाय वापरून मोटर्स आणि हालचालीची दिशा नियंत्रित करण्यास अनुमती देतो.

व्हिज्युअल स्टुडिओ वापरून, मी एक प्रोग्राम विंडो विकसित केली जी कार सर्व्हरशी कनेक्ट होते आणि त्यास कमांड देते. नंतर, काही प्रयत्नांनंतर, मी एक Android ॲप लिहिला जो कार नियंत्रित करण्यासाठी एक्सीलरोमीटर वापरतो.

साधने आणि घटक

या प्रकल्पात वापरल्या जाणाऱ्या साधने आणि वस्तूंची ही सर्वसाधारण यादी आहे. ईगल दस्तऐवजीकरण वापरलेल्या घटकांसाठी अचूक तपशील प्रदान करते.

मल्टीमीटर
सोल्डरिंग लोह
सोल्डर
स्क्रूड्रिव्हर्स
बोर्ड एचिंग सोल्यूशन
फॉइल फायबरग्लास
पक्कड
अर्डिनो
AsyncLabs WiFi शील्ड
RJ45 कनेक्टर
एच-ब्रिज मोटार चालक
कॅपेसिटर

मोटार चालक

ईगल वापरून, मी हे सर्किट डिझाइन केले आणि त्यासाठी पीसीबी बनवले. हे Arduino साठी मोटर ड्रायव्हर आणि पॉवर रेग्युलेटर म्हणून कार्य करते.
हे मुख्य आणि स्टीयरिंग मोटर्स आणि Arduino ला उर्जा देण्यासाठी मानक 7.2V बॅटरी वापरण्याची परवानगी देते.

मोटर्स नियंत्रित करण्यासाठी हे सर्किट SN754410 ड्युअल इंटिग्रेटेड एच-ब्रिज ड्रायव्हर वापरते. ड्रायव्हर कंट्रोल पिन RJ45 केबलला जोडलेल्या असतात, जे AsyncLabs WiFi शील्डला जोडतात.

Arduino शील्ड

Eagle मधील SparkFun लायब्ररी वापरून मी Arduino Shield डिझाईन केले जे वायफाय शील्डमध्ये पिन पास करेल आणि RJ45 कनेक्टर आणि 2 स्क्रू टर्मिनल्सद्वारे मोटर ड्रायव्हरला जोडेल.

RJ45 पिन पिनआउट खूप महत्वाचे आहे. कनेक्शनमधील त्रुटीमुळे अप्रत्याशित परिणाम होऊ शकतात आणि आपल्याला बोर्ड पुन्हा करावे लागेल.

पीसीबी एचिंग

हा विषय बऱ्याच वेळा कव्हर केला गेला आहे आणि मी त्याबद्दल तपशीलात जाणार नाही.
मी ते वापरतो आणि ते माझ्यासाठी अनुकूल आहे आणि अनुभवाने ते उत्कृष्ट परिणाम देते.

केसला बोर्ड जोडण्यासाठी वेल्क्रोचा वापर करण्यात आला. मी भाग्यवान होतो कारण... माझ्या कारमध्ये ट्यूबलर फ्रेमच्या खाली इलेक्ट्रॉनिक्ससाठी भरपूर जागा होती.
मी मोटर ड्रायव्हर बोर्ड आणि उर्वरित बोर्ड यांच्यातील कनेक्शनचा फोटो घेण्यास विसरलो, परंतु ते चांगले बसले आणि केसमध्ये जास्त जागा घेतली नाही.

कार्यक्रम

माझा कोड पुरेसा कार्यक्षम नसू शकतो, परंतु तो कार्य करतो.

टंकलेखक

AsynLabs Wifi Sheild सह मला मिळालेल्या सॉकेटसर्व्हर उदाहरणावर आधारित मी CarServer तयार करू शकलो.
तुम्हाला तुमची वायरलेस नेटवर्क माहिती Arduino कोडमध्ये टाकावी लागेल. एकदा मशीन चालू झाल्यावर, राउटरशी कनेक्शन स्थापित करण्यासाठी 15-45 सेकंद द्या. WiFi शील्डवरील लाल एलईडी म्हणजे कनेक्शन स्थापित झाले आहे.

मी हा प्रोग्राम C# आणि MS Visual Studio 2008 वापरून बनवला आहे. मी एक छान खिडकी बनवली आणि कार बाणांनी नियंत्रित केली जाऊ शकते.

तुमच्या फोनवरून कार कंट्रोल का करत नाही?

हा विचार मला DroidX खरेदी केल्यानंतर एका आठवड्यानंतर आला. मी प्रयोग सुरू केले आणि Android SDK वापरून संपवले. मला अशीच ॲप्स सापडली जी नियंत्रणासाठी एक्सीलरोमीटर वापरतात. हे अर्ज बघून मी माझे स्वतःचे लिहिले.

Arduino कोडमध्ये निर्दिष्ट केलेले IP आणि पोर्ट पेस्ट करा. तुमचा फोन आडवा धरा. मग पुढे जाण्यासाठी ते तुमच्यापासून दूर आणि मागे जाण्यासाठी तुमच्याकडे वाकवा. तुमचा फोन स्टीयरिंग व्हील म्हणून वापरा.
हे माझे पहिले मोठे Android ॲप आहे. त्यात अजूनही काही बग आहेत, परंतु बहुतेक ते चांगले कार्य करते.

तुमच्या अंगणात वायफायसह तुमची ४x४ कार चालवा!

हा प्रकल्प तयार करताना मला खूप आनंद झाला. मला बरेच ज्ञान आणि नवीन कौशल्ये मिळाली आणि आता माझ्याकडे 4x4 कार आहे जी माझ्या फोनवरून नियंत्रित केली जाऊ शकते.

मला विंडशील्डच्या मागे स्थापित करण्यासाठी कॅमेरा आवश्यक आहे जेणेकरून मी कुठे गाडी चालवत आहे ते पाहू शकेन. हे कमी उर्जा वापरणारे असावे आणि स्वतः व्हिडिओ प्रसारित केले पाहिजे. (मला वाटते की Arduino हे हाताळू शकते).

रेडिओ घटकांची यादी

पदनाम प्रकार संप्रदाय प्रमाण नोंददुकानमाझे नोटपॅड
मोटार चालक
IC1 चिपSN7544101 नोटपॅडवर
रेखीय नियामक5 व्ही1 नोटपॅडवर
द्विध्रुवीय ट्रान्झिस्टर

2N3904

1 नोटपॅडवर
C1, C2 इलेक्ट्रोलाइटिक कॅपेसिटर 2 नोटपॅडवर
कनेक्टर2 आउटपुट7 नोटपॅडवर
कनेक्टर8 पिन1 नोटपॅडवर
Arduino शील्ड
U1 अर्डिनो बोर्ड 1 नोटपॅडवर
T1 द्विध्रुवीय ट्रान्झिस्टर

2N3904

1 नोटपॅडवर
R1 रेझिस्टर 1 नोटपॅडवर
U$3 ट्रिमर प्रतिरोधक 1 नोटपॅडवर
कनेक्टर2 आउटपुट2

आणि सायनोजेन 7.1.0 RC1 फर्मवेअर (Android 2.3.4) सह HTC इच्छा. फक्त काही बाबतीत, मी तुम्हाला आठवण करून देतो की खाली वर्णन केलेली प्रत्येक गोष्ट फक्त फोनसाठी Android 2.3.4 आणि टॅब्लेटसाठी Android 3.1 पासून सुरू होते.

येथे हे लक्षात घेण्यासारखे आहे की ही USB होस्ट शिल्ड पूर्णपणे यशस्वी नाही, विशेषत: Arduino Mega 2560 च्या संयोजनात. पहिली अडचण अशी होती की हे विस्तार बोर्ड Arduino UNO साठी बनवले गेले होते आणि ते मेगापेक्षा भिन्न आहे. SPI संपर्क, म्हणून मला जंपर्स जोडावे लागले (फोटो पहा). दुसरी समस्या, अगदी अपेक्षित असली तरी, हे विस्तार कार्ड चालवण्यासाठी बाह्य उर्जा स्त्रोताची आवश्यकता होती. Circuits@Home कडील USB होस्ट शील्ड 2.0 अधिक यशस्वी मानले जाते, परंतु ते अधिक महाग देखील आहे.

इंटरकनेक्टेड एसपीआय संपर्कांसह बोर्ड

Arduino सॉफ्टवेअर सेट करत आहे

1. जर आधीच इन्स्टॉल केलेले नसेल, तर Arduino साठी सॉफ्टवेअर डाउनलोड करून इन्स्टॉल करा.
2. ADK पॅकेज डाउनलोड आणि अनपॅक करा (डेमोकिट ऍप्लिकेशन आहे). ॲप, फर्मवेअर आणि हार्डवेअर फोल्डर दिसले पाहिजेत.
3. CapSense लायब्ररी डाउनलोड करा
4. फर्मवेयर/arduino_libs/AndroidAccessory आणि फर्मवेअर/arduino_libs/USB_Host_Shield येथे कॉपी करा /लायब्ररी/ .
5. मध्ये CapSense निर्देशिका तयार करा /libraries/ आणि CapSense संग्रहणातून CapSense.cpp आणि CapSense.h कॉपी करा.

फर्मवेअर डाउनलोड

Google कृपया Arduino साठी त्याचे DemoKit स्केच प्रदान करते. तुम्हाला फक्त ते फर्मवेअर/demokit/demokit.pde वरून उघडायचे आहे, ते संकलित करा आणि ते बोर्डवर अपलोड करा.

चाचणी Android अनुप्रयोग

DemoKit पॅकेजमध्ये क्षमता प्रदर्शित करण्यासाठी Android अनुप्रयोगाचे स्त्रोत देखील आहेत. Google आम्हाला स्वतः एक Android प्रकल्प तयार करण्यासाठी आणि हा अनुप्रयोग एकत्र करण्यासाठी आमंत्रित करते. प्रथम, आम्हाला API स्तर 10 स्थापित करणे आवश्यक आहे. मग सर्वकाही सोपे आहे - आम्ही एक Android प्रकल्प तयार करतो आणि ॲप फोल्डरचा मार्ग निर्दिष्ट करतो, बिल्ड टार्गेटमध्ये आम्ही Google API (प्लॅटफॉर्म) निर्दिष्ट करतो 2.3.3 , API स्तर 10). आम्ही अनुप्रयोग एकत्र करतो आणि फोनवर स्थापित करतो. ज्यांना असेंब्लीचा त्रास नको आहे ते रेडीमेड एपीके डाउनलोड करू शकतात.

लाँच करा

आम्ही आमचा फोन फक्त USB होस्ट शील्डशी जोडतो. आम्ही सर्वकाही योग्यरित्या केले असल्यास, DemoKit अनुप्रयोग लाँच करण्याची विनंती स्क्रीनवर दिसून येईल.

ऍप्लिकेशनमध्येच दोन टॅब आहेत - इन (बटणे, जॉयस्टिक आणि सेन्सर्स) आणि आउट (LEDs, रिले आणि सर्वोस).

मी ठरवले की प्रात्यक्षिकासाठी दोन एलईडी आणि एक बटण पुरेसे आहे. हा चमत्कार कसा होतो ते तुम्ही व्हिडिओमध्ये पाहू शकता.

काही कोड

या उदाहरणात, USB द्वारे प्रसारित केलेल्या संदेशांमध्ये तीन बाइट्स असतात:
1 ला बाइट कमांड किंवा डिव्हाइस गट परिभाषित करते, उदाहरणार्थ LEDs - 0x2
2रा बाइट विशिष्ट उपकरण दर्शवितो, उदाहरणार्थ हिरवा एलईडी - 0x1
3 रा बाइटमध्ये डिव्हाइसला दिलेले मूल्य असते, उदाहरणार्थ कमाल ब्राइटनेस - 0xff

अर्डिनो

... /* आरंभ */ AndroidAccessory acc("Google, Inc.", "DemoKit", "DemoKit Arduino Board", "1.0", "http://www.android.com", "0000000012345678"); void setup() ( .... acc.powerOn(); ) void loop() ( byte msg; /* कनेक्शन तपासा */ if (acc.isConnected()) ( /* Android डिव्हाइसवरून संदेश प्राप्त करा */ int len = acc.read(msg, sizeof(msg), 1); if (len > 0) ( LEDs */ if (msg == 0x2) ( if (msg == 0x0) analogWrite(LED3_RED, msg) ; अन्यथा (msg == 0x1) analogWrite(LED3_GREEN, msg); अन्यथा (msg == 0x2) analogWrite(LED3_BLUE, msg) ) msg ​​= 0; msg = ? 1 ; /* पाठवा बटण स्थिती */ acc.write(msg, 3);

Android

com.android.future.usb.UsbAccessory आयात करा; com.android.future.usb.UsbManager आयात करा; ... पब्लिक क्लास डेमोकिटॅक्टिव्हिटी एक्स्टीशन्स इम्प्लीमेंट्स रन करण्यायोग्य (खाजगी USBManager Musbmanager; USBACCESSORY MACCCESSORY; FileinPutstream MinPuSTREAM; Utputstream; ... Private Void Openaccessory (USBACCESSORY) ) ( mAccessory = mAccessory = mAccessory = mFdscripte (fDtscript; Filescriptor); mInputStream = नवीन FileInputStream (एफडी); byte; int i; while (ret >= 0) ( // येणारे संदेश ret = mInputStream.read(बफर); i = 0; असताना (i< ret) { int len = ret - i; switch (buffer[i]) { case 0x1: // сообщение от кнопки if (len >= 3) ( संदेश m = Message.obtain(mHandler, MESSAGE_SWITCH); m.obj = new SwitchMsg(buffer, buffer); mHandler.sendMessage(m); ) i += 3;

खंडित;

) ) ) ) // वापराचे उदाहरण - लाल एलईडी पूर्ण ब्राइटनेसवर चालू करा: // mActivity.sendCommand((byte)2, (byte)0, (byte)255) public void sendCommand(बाइट कमांड, बाइट लक्ष्य, इंट मूल्य) ( बाइट बफर = नवीन बाइट; जर (मूल्य > 255) मूल्य = 255; बफर = कमांड; बफर = लक्ष्य; बफर = (बाइट) मूल्य; जर (mOutputStream != null && buffer != -1) ( प्रयत्न करा ( mOutputStream. लिहा(बफर) कॅच (IOException e) ( ... ) ) )

निष्कर्ष



अशा संधी उघडून, Google, अर्थातच, सर्व प्रथम, मोठ्या संख्येने सक्रिय Android ॲक्सेसरीजच्या देखाव्यावर अवलंबून आहे, परंतु सर्वात महत्त्वाचे नाही हे तथ्य आहे की थोडक्यात आम्हाला विविध सेन्सर्स, सेन्सर्सशी संवाद साधण्यासाठी एक सोयीस्कर डिव्हाइस मिळते. आणि actuators. असे उपकरण सहजपणे एखाद्या रोबोटिकचा मेंदू बनू शकतो.

वर