DIY: membuat robot tempur di rumah. Bagian 2 "Kegagalan Epik"

Ini adalah kelanjutan dari cerita pendek tentang pengembangan robot tempur tanpa kecerdasan, panduan singkat untuk membakar controller dan Arduino 2560. Tentang partisipasi kami dalam pertunjukan "Perahu Lapis Baja: Pemanasan Musim Gugur". Dan juga pengalaman saya menghubungkan Arduino dan dua penerima RC dengan motor stepper dan komutator.

Di bawah nama merek GeekTimes


Panel yang dapat dilepas memiliki stiker Habrahabr. Setelah kehilangan panel ini untuk mengurangi berat, saya merek robot secara manual. GT silakan!




Koneksi yang akurat dari semua elemen sistem



1-Arduino 2560
Receiver 2-RC
3,4-Kolektor Driver Motor
5-Block Relay
6-Baterai

Logika sistem


Robot (bajak) dikendalikan oleh alat kontrol radio dari dua perangkat transceiver. Konsol pertama dari operator utama digunakan untuk mengontrol pergerakan robot dan senjata, operator kedua menduplikasi kontrol senjata. Pada bajak, kedua penerima terhubung ke Arduino, di mana kita secara program membaca PWM dari penerima, relay dinyalakan / dimatikan untuk mengontrol katup sistem pneumatik, dan PWM dikeluarkan untuk driver motor.
Sketsa Arduino
#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{
//    
    }
}



Di versi pertama robot, kami menggunakan NEMA 43 motor stepper, bagi mereka itu sedikit lebih sulit untuk membuat sketsa, karena Saya harus menghitung PWM dari penerima di fungsi timer, atau mengendalikan motor stepper. Untuk tujuan ini, saya menggunakan perpustakaan TimerOne.

Sketsa Arduino RC Stepper Kontrol Motor

#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();


Desain dan Pembakaran Arduino


Desain dipikirkan dan diuji untuk membuat struktur yang kaku.

Sepertinya saya dalam bingkai di bawah saat itu direkam ketika, ketika menggunakan pengelasan, kabel dari Arduino 2560 membentur kasing. Sebagai akibatnya, UART kami terbakar dan kami tidak dapat lagi melakukan flashing melalui USB. Solusi tercepat adalah beralih ke Arduino Uno, yang sudah dekat. Mereka meninggalkan konsol operator kedua, ada cukup banyak port yang tepat.




Tes sistem pneumatik


Dari semua senjata yang direncanakan, hanya lift yang harus ditinggalkan, karena mereka menganggap itu yang paling efektif. Sistem pneumatik diuji dari kompresor 6 atm. Dalam pertempuran, kami sudah menggunakan silinder dengan CO2 dan tekanan setelah peredam tekanan 10 atm, kami juga mengganti tabung dengan diameter yang lebih besar.


Tes senjata


Belajar naik robot
Pada salah satu tes ini, kami membakar pekerja lapangan pada pengontrol. Di sisi lain, relay macet membalikkan mundur. Lalu aku memasuki rotor-out di kode Arduino, waktu tunggu tertentu sebelum mengubah arah mesin. Robot menjadi semakin buruk dalam kontrol, tetapi pengontrolnya utuh.


Tes jalan robot


Gagal total


Harus segera dicatat bahwa kita tidak memiliki bobot. Kami hanya mengangkat robot bersama-sama, tidak ada yang mau mengatakan bahwa itu sulit baginya, dan kami semua mengangguk dan setuju bahwa robot itu ringan.

Penyelenggara, terutama penjaga arena, menanggapi masalah keamanan dengan sangat serius, banyak robot yang tidak memenuhi syarat sebelum pertarungan. Ketika ditimbang, ternyata robot kami memiliki berat 161,5 kg., Dengan berat maksimum yang diizinkan 105. Peter Redmond menolak untuk membiarkan kami naik ke panggung untuk dipotong. Kami harus menghapus seluruh sistem pneumatik, senjata, melepas rok yang melindungi kami dari lemparan, melepas dinding pelindung dan menggantinya dengan plexiglass dari mana dinding arena dibuat. Dari 6 baterai, 3 harus ditinggalkan.

Kami memenuhi syarat, tetapi di arena kami hanya bisa ram. Kami dijuluki hood jangkauan, dan musuh kami disebut kulkas. Mungkin, ketika mereka mengatakan "Panekuk pertama adalah kental," mereka berarti skenario seperti itu, tetapi kami menikmatinya.

Video dari Kapal Lapis Baja


Nikmati menonton video dari pertempuran.


PS: Organisasi kinerja agak kesal, karena tidak ada perhatian pada tim yang merakit robot dan operator yang mengendalikannya. Kami sedang menyiapkan kostum, kami ingin menjadi Mason dengan piramida Masonik, tetapi kami hanya punya tudung yang melaju di atas panggung ...


PPS: Kami sudah berpikir tentang benar-benar mengubah tubuh dan konsep robot untuk kompetisi berikutnya, tetapi "Mereka memberikan dua tak terkalahkan untuk satu ketukan." Dengan bekas luka pembuka kami, kasing ini berharga sebagai sebuah cerita. Di tubuh tanda tangan Peter Redmond dan tamu-tamu lain dari Liga Irlandia, para penyelenggara dan peserta lainnya.


PPPS: Ikuti tim vk kami . Bersiaplah untuk kontes mesin pemotong rumput robot. Kompetisi ini mengumumkan lebih dari 10 tim dari seluruh Rusia. Kami ditawari untuk mengadakan kompetisi di Skolkovo.

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


All Articles