Pemain sepak bola Robo dari pemula. Kompetisi di MIPT. Android & Arduino & Bluetooth

Artikel ini adalah semi-sekuel karya Love, Death and Robots, "Mesin berbasis Arduino yang dikendalikan oleh perangkat Android melalui Bluetooth adalah siklus penuh" yang terdiri dari dua bagian ( satu , dua ). Hal-hal yang dijelaskan di sana sedikit dimodifikasi, redone, dan robot itu sendiri dari mesin bepergian berubah menjadi pemain sepak bola. Secara umum, ada materi yang menarik tentang cara melakukannya.

Instruksi sebelumnya dibagi menjadi dua bagian: perangkat lunak dan fisik. Tidak ada banyak perubahan di kedua arah, jadi kali ini semuanya dalam satu salinan. Saya akan mengingatkan Anda secara singkat mengapa bagian yang dijelaskan itu diperlukan, tetapi untuk pemahaman yang lengkap lebih baik membahas dua bagian pertama.

Bagian fisik


Berdasarkan semua prinsip yang sama yang dijelaskan dalam artikel pertama:

  • sandwich dari Arduino Uno dan Motor Shield.
  • dua motor yang terhubung ke pelindung motor.

Dan inilah perubahannya:

  • bagian kejutan muncul, anehnya, bertanggung jawab untuk memukul bola.
  • kasingnya sekarang sepenuhnya milik saya, dicetak pada printer 3D.

Perumahan


Bentuk adalah lingkaran di mana papan dan dua roda pas. Perpanjangan untuk bagian di mana gaya benturan akan berdiri.



Saat mendesain ini, perhatikan:

  • Sisi tinggi. Robot bertabrakan selama pertandingan, sisi tidak hanya melindungi kabel Anda, tetapi juga lawan Anda dari kabel Anda.
  • Pusat gravitasi dan stabilitas. Pusat gravitasi tentu saja di mana papan itu berada. Roda terletak di dekatnya, sehingga tidak akan terpeleset. Plus, baterai diletakkan di atas papan.
  • Untuk mencegah robot mematuk hidung atau punggungnya, kami menempatkan bola di kit dari ampere di sana-sini (jika tidak ada, Anda dapat menggantinya dengan desain geser lainnya).
  • Kekakuan suatu desain. Platform tidak boleh melorot di bawah beban papan sirkuit dan motor. Jangan menjalankan tugas, baik menggunakan bahan keras (kayu lapis), atau memperkuat struktur plastik dengan rak



Dan sekarang omong kosong utama


Bola ditambahkan karena kurangnya "mematuk" mengangkat platform sehingga roda tidak mencapai lantai. Untuk menghindari hal ini, kami menggunakan roda berdiameter lebih besar atau memperpendek struktur pendukung. Secara umum, kami menghitung ini sebelumnya!

Bagian kejutan. Dia tidak memukul. Ketukan, tetapi tidak cukup dingin. Dalam model pertama kami ada mesin servo yang terhubung dengan bagian yang mirip dengan bajak salju. Dengan mengubah posisi servo (dari 0 hingga 30 derajat), Anda dapat mensimulasikan pukulan. Tapi servos itu ternyata lambat, jadi pukulannya menuju ke deuce.

Ada dua jalan keluar: tambahkan brengsek pada dampak atau ganti servos dengan solenoida. Opsi pertama adalah meningkatkan momentum dengan memasok kecepatan ke roda selama satu pukulan. Dalam praktiknya, ini adalah sebagai berikut: pengguna menekan tombol tekan, robot mulai dari titik (sedikit) dan pada saat yang sama melakukan pemogokan.

Pilihan kedua - solenoida mendorong bagian kejut, dan di sini semuanya tergantung pada kekuatan (kecepatan) dari kejut, yang pada gilirannya tergantung pada karakteristik solenoid.



Bagian perangkat lunak


Dengan tradisi yang baik, yang sudah menjadi satu artikel, kami akan membagi bagian ini menjadi dua bagian. Pertama aplikasi Android, lalu sketsa Arduino.

Android


Biarkan saya mengingatkan Anda, aplikasi ini ditulis oleh saya dari awal. Selama enam bulan terakhir, saya sedikit lebih mengerti tentang masalah ini, jadi saya akan menjelaskan apa yang dipikirkan oleh doper .

Pertama, mari kita pergi ke penyederhanaan. Sekarang protokol komunikasi adalah sebagai berikut: "karakter pembuka" + "nilai" + "karakter penutup" (Untuk memahami bagaimana saya mendapatkan nilai-nilai ini dan tentang apa semua ini, lihat analisis lengkap aplikasi di sini ). Ini berfungsi untuk kecepatan dan sudut. Karena hanya ada satu jenis serangan, ia tidak memerlukan kebijaksanaan seperti itu, sehingga tim terdiri dari satu karakter "/" (tentang tim hit melalui paragraf).

private void sendCommand(String speed, String angle) { String speedCommand = "#" + speed + "#"; //     String angleCommand = "@" + angle + "@"; try { outputStream.write(speedCommand.getBytes()); //   outputStream.write(angleCommand.getBytes()); } catch(Exception e) { e.printStackTrace(); } } 

Perintah khas akan terlihat seperti ini: # 125 # @ 180 @, di mana 125 adalah kecepatan dan 180 adalah sudut. Tentu saja, ini masih bisa disederhanakan, tetapi salah satu tugasnya adalah menjaga cahaya dan keterbacaan, sehingga nantinya bisa dengan mudah dijelaskan, termasuk kepada anak-anak.

Perintah sendHit () baru telah muncul, yang dipicu ketika tombol "Hit" ditekan. Dia mengirim satu "/". Karena bluetooth 2.0+ biasa tidak menderita dari data yang diterima pada saat yang sama, yaitu, ia tahu bagaimana menempatkan mereka dalam antrian dan tidak kehilangan, kita tidak perlu mengendalikan ini. Jika Anda akan bekerja dengan Bluetooth Low Energy 4.0+ (yah, tiba-tiba), sudah ada antrian yang perlu diatur secara manual, jika tidak data akan hilang.

 ... bHit = findViewById(R.id.b_high_hit); //   bHit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { threadCommand.sendHit(); //     "" } }); ... private void sendHit() { try { outputStream.write("/".getBytes()); //   }catch (Exception e) { e.printStackTrace(); } } } 

Arduino


Jadi protokol untuk mengirim perintah telah berubah, algoritma penerimaan juga telah berubah. Dia disederhanakan. Satu jika pelacakan tendangan juga ditambahkan. Analisis lengkap sketsa ada di sini .

bt.read () membaca satu karakter. Jika "#", maka simbol kecepatan dimulai. Kami membacanya sampai karakter penutup "#" muncul. Perulangan for tidak dapat digunakan di sini, karena panjang kecepatan tidak diketahui sebelumnya (dapat berupa angka tunggal, dua digit, atau tiga digit). Nilai yang dihasilkan ditulis ke variabel.

Hal yang sama terjadi dengan belokan. Setelah kecepatan dan sudut dibaca, kami meneruskan semuanya ke fungsi belok (kecepatan int, sudut int).

 void loop() { if(BTSerial.available() > 0) {//    char a = BTSerial.read(); //   if(a == '#') { //  sp=""; char b = BTSerial.read(); while( b != '#') { //   ,     sp+=b; b = BTSerial.read(); } } else if (a == '@') {//  val = ""; char b = BTSerial.read(); while(b != '@') { //    val+=b; //    b = BTSerial.read(); } turn(val.toInt(), sp.toInt()); //   ,   } else if (a == '/') { //,    Serial.println(a); servo.write(30); //  delay(150); servo.write(0); //    } lastTakeInformation = millis(); } else { if(millis() - lastTakeInformation > 150) { //     150 //  lastTakeInformation = 0; analogWrite(speedRight, 0); analogWrite(speedLeft, 0); } } delay(5); } 

Fungsi turn () menentukan arah mana yang harus digerakkan (maju, mundur) dan ke mana harus belok (kanan, kiri, lurus). Pembatasan jika (kecepatan> 0 && kecepatan <70) diperlukan agar robot tidak melambat jika byte hilang. Menghadapi ini ketika saya meningkatkan kecepatan transmisi (dimainkan dengan penundaan 100-300ms antara tim) - kadang-kadang nilai kecepatan tidak mencapai dan berubah menjadi 0, 40 (walaupun, misalnya, 240 sebenarnya dikirim). Kruk, tapi berhasil.
Ini bisa disebut "perlindungan terhadap faktor-faktor yang tidak terkendali."

 void turn(int angle, int speed) { if(speed >= 0 && speed < 70) return; if(speed > 0) { digitalWrite(dirLeft, HIGH); digitalWrite(dirRight, HIGH); } else if (sp < 0) { digitalWrite(dirLeft, LOW); digitalWrite(dirRight, LOW); } if(angle > 149) { analogWrite(speedLeft, speed); analogWrite(speedRight, speed - 65); //  } else if (angle < 31) { analogWrite(speedLeft, speed - 65); //  analogWrite(speedRight, speed); } else { analogWrite(speedLeft, speed); analogWrite(speedRight, speed); } } 

Kompetisi di MIPT bukan total


Dengan robot kami, kami pergi ke kompetisi sepakbola robot, yang diatur dan diadakan di Institut Fisika dan Teknologi Moskow, Dolgoprudny, 14/4/2019. Kami berhasil mencapai final 1 \ 4, tetapi tidak maju lebih jauh.



Prosesnya sendiri menarik bagi kami, tetapi di sini saya akan menggambarkan kesimpulan yang berhasil kami buat dengan melihat robot di lapangan:

  • perlu lebih kuat. Empat roda atau mesin yang lebih kuat dan roda lainnya diinginkan. Meski, tentu saja, model roda empat yang terlihat lebih menguntungkan
  • manajemen tidak tinggi. Diperlukan untuk memindahkan robot ke putaran tangki (belok di satu titik karena roda berputar ke arah yang berlawanan), jika tidak, radius belokan terlalu besar. Dan secara umum, opsi dengan empat panah, daripada lingkaran dengan kecepatan proporsional, lebih disukai untuk sepak bola . Opsi yang dijelaskan lebih cocok untuk balap di mana Anda mengemudi terus menerus, dan di sini Anda perlu kejelasan (saya berbalik 10 derajat di sekitar poros saya, mengarah ke bola dan menekan tombol ke depan. Tapi kemudian, ketika saya sudah meraih bola, saya ingin manuver fleksibel, tetapi di sini Anda perlu proporsional kecepatan ... Anda perlu menggabungkan hal ini entah bagaimana).

Komentar dan saran akan sangat bahagia. Di bawah artikel sebelumnya, komentar terkadang lebih menarik daripada artikel itu sendiri. Terima kasih, Sasha dan Dana atas pekerjaannya .

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


All Articles