DIY: घर पर एक लड़ाकू रोबोट बनाएं। भाग 2 "महाकाव्य विफल"

यह बुद्धिमत्ता के बिना एक लड़ाकू रोबोट के विकास के बारे में एक छोटी कहानी का एक सिलसिला है , जलने वाले नियंत्रकों और Arduino 2560 के लिए एक संक्षिप्त मार्गदर्शिका। "आर्मर्ड बोट: ऑटम वार्म अप" शो में हमारी भागीदारी के बारे में। और मेरा अनुभव Arduino और दो RC रिसीवर को स्टेपर और कम्यूटेटर मोटर्स से जोड़ने का भी है।

ब्रांड नाम GeekTimes के तहत


हटाने योग्य पैनल में एक हब्रहाब स्टिकर था। वजन कम करने के लिए इस पैनल को खोने के बाद, मैंने रोबोट को मैन्युअल रूप से ब्रांड किया। जीटी आगे बढ़ें!




सभी सिस्टम तत्वों का सटीक कनेक्शन



1-अरुडिनो 2560
2-आरसी रिसीवर
3.4-कलेक्टर मोटर ड्राइवर
5-ब्लॉक रिले
6-बैटरी

व्यवस्था का तर्क


रोबोट (रोवर) को दो ट्रान्सीवर उपकरणों के रेडियो नियंत्रण साधनों द्वारा नियंत्रित किया जाता है। मुख्य ऑपरेटर का पहला कंसोल रोबोट और बंदूकों की गति को नियंत्रित करने के लिए उपयोग किया जाता है, दूसरा ऑपरेटर बंदूकों के नियंत्रण को दोहराता है। रोवर पर, दोनों रिसीवर Arduino से जुड़े होते हैं, जिसमें हम प्रोग्रामर को रिसीवर से PWM पढ़ते हैं, रिले को वायवीय प्रणाली के वाल्वों को नियंत्रित करने के लिए चालू / बंद किया जाता है, और PWM को मोटर चालकों के लिए जारी किया जाता है।
स्केच अरुडिनो
#include <math.h>

#define STEP_PIN1  12
#define STEP_PIN2  10

#define RELEPIN0 2
#define RELEPIN1 3
#define RELEPIN2 4
#define RELEPIN3 5
#define RELEPIN4 6
#define RELEPIN5 7
#define RELEPIN6 8
#define RELEPIN7 9
     
#define a0 = A0;
#define a1 = A1;
#define a2 = A2;
#define a3 = A3;
#define a4 = A4;
#define a5 = A5;
// 
//   
//#define a6 = A8;
//#define a7 = A9;
int ch0,ch1,ch2,ch3,ch4,ch5,ch6,ch7;
//        
const int min0=1094;
const int  min1=1094;
const int  max0=813;
const int  max1=813;
int speed1,speed2,speedmot1,speedmot2,sd1,sd2;
byte ch2st,ch3st,ch4st,ch5st,ch6st,ch7st;
byte tormozcount1=0;
byte tormozcount2=0;
byte wasdir1=2;
byte wasdir2=2;
byte skolkotormozit = 7;
int skolkotormozim=0;

void setup() {
  Serial.begin(9600); 
  Serial.println("start");  
 
  pinMode(a0, INPUT);
  pinMode(a1, INPUT);
  pinMode(a2, INPUT);
  pinMode(a3, INPUT);
  pinMode(a4, INPUT);
  pinMode(a5, INPUT);  
  //   
  //pinMode(a6, INPUT);
  //pinMode(a7, INPUT);
  
  pinMode(STEP_PIN1, OUTPUT);
  pinMode(STEP_PIN2, OUTPUT);
  pinMode(RELEPIN0,  OUTPUT);
  pinMode(RELEPIN1,  OUTPUT);
  pinMode(RELEPIN2,  OUTPUT);
  pinMode(RELEPIN3,  OUTPUT);
  pinMode(RELEPIN4,  OUTPUT);
  pinMode(RELEPIN5,  OUTPUT);
  pinMode(RELEPIN6,  OUTPUT);
  pinMode(RELEPIN7,  OUTPUT);
}

void loop() {
 
ch0 =pulseIn(a0, HIGH,30000);
if(ch0<900){
//    
Serial.println("first no signal"); 
digitalWrite(STEP_PIN1,LOW);
digitalWrite(STEP_PIN2,LOW);
digitalWrite(RELEPIN0,LOW);  
digitalWrite(RELEPIN1,LOW);  
digitalWrite(RELEPIN2,LOW);  
digitalWrite(RELEPIN3,LOW);  
digitalWrite(RELEPIN4,LOW);  
digitalWrite(RELEPIN5,LOW);  
digitalWrite(RELEPIN6,LOW);  
digitalWrite(RELEPIN7,LOW);  

}
//      
ch1 =pulseIn(a1, HIGH);
ch2 =pulseIn(a2, HIGH);
ch3 =pulseIn(a3, HIGH);
ch4 =pulseIn(a4, HIGH);
ch5 =pulseIn(a5, HIGH);
//   
ch6 =1250; //pulseIn(a6, HIGH,2020);
ch7 =1250; //pulseIn(a7, HIGH,2020);

         if(ch2>1500){
          ch2st=1;
             }else{
                  ch2st=0;
                 }
         if(ch3>1500){
          ch3st=0;
             }else if(ch3>0){
                  ch3st=1;
                 }
         if(ch4>1500){
          ch4st=1;
             }else{
                  ch4st=0;
                 }
         if(ch5>1500){
          ch5st=1;
             }else{
                  ch5st=0;
                 }
         //      
         if(ch6>1800){
          ch6st=2;
             }else if(ch6<1200){
              ch6st=1;
                 }else{
                  ch6st=0;
                 }
         if(ch7>1800){
          ch7st=2;
             }else if(ch7<1200){
              ch7st=1;
                 }else{
                  ch7st=0;
                 }
                 


  // ----------------------------------------------
if(ch2st==1 or ch6st==1){
     digitalWrite(RELEPIN0,HIGH); 
  }else{
     digitalWrite(RELEPIN0,LOW); 
}

 
 // ----------------------------------------------
 if(ch3st==1 or ch6st==2){
     digitalWrite(RELEPIN1,HIGH); 
  }else {
    digitalWrite(RELEPIN1,LOW); 
}

// ----------------------------------------------
 if(ch4st==1 or ch7st==1){
     digitalWrite(RELEPIN2,HIGH); 
  }else {
    digitalWrite(RELEPIN2,LOW); 
}

//     
    if(ch0>0){  
    ch0=(ch0<55 && ch0>45)?50:ch0; 
    ch1=(ch1<55 && ch1>45)?50:ch1; 
           
    ch0 =ch0-min0;
    ch1 =ch1-min1;
    //       0  100
    ch0 =map(ch0,0,max0,0,100);
    ch1 =100-map(ch1,0,max1,0,100);  

        //          
        speed1=round((ch0-50)*(abs(ch1-50)+50)/50);
        speed2=round((ch1-50)*(abs(ch0-50)+50)/50);
        
        //     
        speedmot1=speed1+speed2;
        speedmot2=speed1-speed2;        
            //  
        speedmot1=(speedmot1>100)?100:speedmot1;
        speedmot2=(speedmot2>100)?100:speedmot2;
        speedmot1=(speedmot1<-100)?-100:speedmot1;
        speedmot2=(speedmot2<-100)?-100:speedmot2;
        speedmot1=(speedmot1<20 && speedmot1>-20)?0:speedmot1;
        speedmot2=(speedmot2<20 && speedmot2>-20)?0:speedmot2;

              sd1=map(abs(speedmot1),0,100,0,255);
              sd2=map(abs(speedmot2),0,100,0,255);

              //   
              Serial.print(ch0);
              Serial.print(";");
              Serial.print(ch1);              
              Serial.print(";");              
              Serial.print(";");
              Serial.print(speed1);
              Serial.print(";");
              Serial.print(speed2);
              Serial.print(";");
              Serial.print(speedmot1);
              Serial.print(";");
              Serial.print(speedmot2);
              Serial.print(";");
              Serial.print(sd1);
              Serial.print(";");
              Serial.print(sd2);
              Serial.print(";wasdir");
              Serial.print(wasdir1);
              Serial.print(";");
              Serial.print(wasdir2);
              Serial.println(";");

              //   ,      
              if(tormozcount1==0 and tormozcount2==0){
                 if(sd1<220){
              analogWrite(STEP_PIN1,sd1);
                 }else{
              digitalWrite(STEP_PIN1,HIGH);
                 }

              if(sd2<220){   
              analogWrite(STEP_PIN2,sd2);
              }else{
              digitalWrite(STEP_PIN2,HIGH);
                 }
              
              }else{
              digitalWrite(STEP_PIN1,LOW);
              digitalWrite(STEP_PIN2,LOW);
              }

//,  
        if(speedmot1<40 and speedmot1>-40){
          Serial.println("Tormoz menshe 40 1 dvig;");
          digitalWrite(RELEPIN3,HIGH); 
          digitalWrite(STEP_PIN1,LOW); 
          tormozcount1=0;
        }else{
          digitalWrite(RELEPIN3,LOW);
          
        }
        if(speedmot2<40 and speedmot2>-40 ){ 
          Serial.println("Tormoz menshe 40 2 dvig;");
        digitalWrite(RELEPIN4,HIGH);  
        digitalWrite(STEP_PIN2,LOW);
        tormozcount2=0;
        }else{
          digitalWrite(RELEPIN4,LOW);
        }

//    ,     ,   
if(speedmot1<40 and speedmot1>-40 and speedmot2<40 and speedmot2>-40){
skolkotormozim++;
}else{
 skolkotormozim=0; 
}

if( skolkotormozim>skolkotormozit){
  wasdir1=2;
  wasdir2=2;
  digitalWrite( RELEPIN5, LOW);
  digitalWrite( RELEPIN6, LOW);
  Serial.println("Stop for 10 cicles");
}

//  
        if((speedmot1 < -10 and wasdir1==1) || (speedmot1 >=5 and wasdir1==0)){
          //     
              if(tormozcount1<=0){
                //  0 
                Serial.println("Tormoz vibeg rotora 1 dvig;");
                digitalWrite(STEP_PIN1,LOW);
                digitalWrite(RELEPIN3,HIGH); 
                 tormozcount1=skolkotormozit;
              }
              if(tormozcount1>0){
                //  
                digitalWrite(STEP_PIN1,LOW);
                tormozcount1--;
              }   
              if(tormozcount1==1){
                // 
                tormozcount1--;
                digitalWrite(RELEPIN3,LOW); 
                Serial.println("Change 1dvig ");
                
                if(speedmot1 < 0){
                    wasdir1=0;
                    digitalWrite( RELEPIN5, HIGH);
                    Serial.println("vzad");
                  }else{
                    wasdir1=1;
                    digitalWrite( RELEPIN5, LOW);                    
                    Serial.println("vpered");
                 }
              }
        }

        if((speedmot2 < -10 and wasdir2==1) || (speedmot2 >=5 and wasdir2==0)){
          //     
              if(tormozcount2<=0){
                //  0 
                Serial.println("Tormoz vibeg rotora 2 dvig;");
                digitalWrite(STEP_PIN2,LOW);
                digitalWrite(RELEPIN4,HIGH); 
                 tormozcount2=skolkotormozit;
              }
              if(tormozcount2>0){
                //  
                digitalWrite(STEP_PIN2,LOW);
                tormozcount2--;
              }   
              if(tormozcount2==1){
                // 
                tormozcount2--;
                digitalWrite(RELEPIN4,LOW); 
                 Serial.print("Change 2dvig ");
                
                  if(speedmot2 < 0){
                    wasdir2=0;
                    digitalWrite( RELEPIN6, HIGH);
                    Serial.println("vzad");
                  }else{
                    wasdir2=1;
                    digitalWrite( RELEPIN6, LOW);
                    Serial.println("vpered");
                    }
              }
        }

//        
if(speedmot1 < -40 and wasdir1==2){
wasdir1=0;
digitalWrite( RELEPIN5, HIGH); 
  Serial.println("Reverse 1 motor");
}

if(speedmot1 > 40 and wasdir1==2){
wasdir1=1;
digitalWrite( RELEPIN5, LOW); 
Serial.println("Forward 1 motor");
}

if(speedmot2 < -40 and wasdir2==2){
wasdir2=0;
digitalWrite( RELEPIN6, HIGH); 
Serial.println("Reverse 2 motor");
}

if(speedmot2 > 40 and wasdir2==2){
wasdir2=1;
digitalWrite( RELEPIN6, LOW); 
Serial.println("Forward 2 motor");
}
        
   /*   
//
Serial.print(tormozcount1);
Serial.print(";");
Serial.print(tormozcount2); 
Serial.print(";");
Serial.print(wasdir1);
Serial.print(";");
Serial.print(wasdir2); 
Serial.print(";");
*/
//delay(1000);        
    }else{
//    
    }
}



रोबोट के पहले संस्करण में, हमने NEMA 43 स्टेपर मोटर्स का उपयोग किया, उनके लिए यह स्केच करना थोड़ा अधिक कठिन था, क्योंकि मुझे टाइमर फ़ंक्शन में रिसीवर से पीडब्लूएम की गणना करना था, या स्टेपर मोटर को नियंत्रित करना था। इन उद्देश्यों के लिए, मैंने टिमरने पुस्तकालय का उपयोग किया।

स्केच Arduino RC Stepper मोटर नियंत्रण

#include <TimerOne.h>  

setup .
  Timer1.initialize(500000);         // initialize timer1, and set a 1/2 second period
  Timer1.pwm(9, 512,300);                // setup pwm on pin 9, 50% duty cycle
  Timer1.attachInterrupt(callback); 


void callback()
{
digitalWrite(STEP_PIN1, digitalRead(STEP_PIN1) ^ 1);
delayMicroseconds(10);
digitalWrite(STEP_PIN1, digitalRead(STEP_PIN1) ^ 1);
}

.
Timer1.pwm(9, 512,speedmot1); 


 Timer1.detachInterrupt();


डिजाइन और जलन Arduino


कठोर संरचना बनाने के लिए डिजाइन पर विचार किया गया और परीक्षण किया गया।

ऐसा लगता है कि उस क्षण के नीचे के फ्रेम में मुझे रिकॉर्ड किया गया था, जब वेल्डिंग का उपयोग करते समय, Arduino 2560 से केबल ने मामले को मारा। इसके परिणामस्वरूप, हमारा UART जल गया और हम USB के माध्यम से चमकता प्रदर्शन नहीं कर सके। सबसे तेज समाधान Arduino Uno पर स्विच करना था, जो हाथ में था। उन्होंने दूसरे ऑपरेटर के कंसोल को छोड़ दिया, बस सही तरीके से पर्याप्त पोर्ट थे।




वायवीय प्रणाली का परीक्षण


सभी नियोजित बंदूकों में से, केवल लिफ्ट को छोड़ना पड़ा, क्योंकि वे इसे सबसे प्रभावी मानते थे। वायवीय प्रणाली का परीक्षण 6 एटीएम कंप्रेसर से किया गया था। मुकाबले में, हमने पहले से ही CO2 के साथ एक सिलेंडर का इस्तेमाल किया और 10 atm के प्रेशर रिड्यूसर के बाद एक दबाव डाला, हमने ट्यूब को एक बड़े व्यास के साथ भी बदल दिया।


गन टेस्ट


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


रोबोट के स्ट्रीट टेस्ट


असफल महाकाव्य


यह तुरंत ध्यान दिया जाना चाहिए कि हमारे पास वजन नहीं था। हमने बस रोबोट को एक साथ उठाया, कोई भी यह नहीं कहना चाहता था कि यह उसके लिए कठिन था, और हम सभी ने सिर हिलाया और सहमत हुए कि रोबोट हल्का था।

आयोजक, विशेष रूप से अखाड़े के रखवाले, सुरक्षा के मुद्दे को बहुत गंभीरता से लेते हैं, कई रोबोट लड़ाई से पहले अर्हता प्राप्त नहीं करते थे। जब वजन किया गया, तो यह पता चला कि हमारे रोबोट का वजन 161.5 किलोग्राम है। 105 के अधिकतम अनुमत वजन के साथ। पीटर रेडमंड ने हमें कटौती के लिए मंच पर जाने से मना कर दिया। हमें पूरे वायवीय प्रणाली को, बंदूकें को हटाना था, उस स्कर्ट को हटाना था जिसने हमें टॉसिंग से बचाया था, सुरक्षात्मक दीवार को हटा दिया और इसे plexiglass से बदल दिया जिसमें से अखाड़ा की दीवारें बनाई गई हैं। 6 बैटरियों में से 3 को छोड़ना पड़ा।

हम योग्य थे, लेकिन अखाड़े में हम केवल राम थे। हम रेंज हुड का उपनाम दिया गया था, और हमारे विरोधी को रेफ्रिजरेटर कहा जाता था। शायद, जब वे कहते हैं, "पहला पैनकेक ढेलेदार है," उनका मतलब सिर्फ ऐसे परिदृश्य से है, लेकिन हमने इसका आनंद लिया।

बख्तरबंद नाव से वीडियो


लड़ाई से वीडियो देखने का आनंद लें।


पुनश्च: प्रदर्शन का संगठन थोड़ा परेशान था, क्योंकि रोबोट को असेम्बल करने वाली टीम और इसे नियंत्रित करने वाले ऑपरेटरों का कोई ध्यान नहीं था। हमने वेशभूषा तैयार की, हम एक मेसोनिक पिरामिड के साथ फ्रीमेसन बनना चाहते थे, लेकिन हमें बस एक हुड मिला जो मंच के चारों ओर चला।


पीपीएस: हमने पहले ही पूरी तरह से रोबोट के शरीर और अवधारणा को बदलने के बारे में सोचा था, लेकिन वे एक हरा के लिए दो नाबाद देते हैं। " हमारे सलामी बल्लेबाज के निशान के साथ, मामला एक कहानी के रूप में मूल्यवान है। आयरिश लीग के आयोजकों और अन्य प्रतिभागियों से पीटर रेडमंड और अन्य मेहमानों के हस्ताक्षर के शरीर पर।


PPPS: हमारी vk टीम का अनुसरण करें रोबोट Lawnmower प्रतियोगिता के लिए तैयार हो जाओप्रतियोगिता ने पूरे रूस से 10 से अधिक टीमों की घोषणा की। हमें स्कोल्कोवो में एक प्रतियोगिता आयोजित करने की पेशकश की गई थी।

Source: https://habr.com/ru/post/hi386047/


All Articles