Membuat perahu aero RC sederhana

Kadang-kadang di Internet saya melihat pertanyaan dari pemula yang ingin membangun quadrocopter dari awal dan menulis firmware untuk itu. Saya sendiri begitu dan untuk berlatih membuat model RC saya memutuskan untuk memulai dengan sesuatu yang lebih sederhana.



Dalam artikelnya secara terperinci untuk yang terkecil ia menggambarkan algoritma perahu, panel kontrol dan pilihan komponen.

Mengapa kapal udara?


  1. Sederhana;
  2. Murah;
  3. ;
  4. , -.

Kendaraan terbang itu bagus, tetapi sulit. Anda tidak bisa mematikan sekrup di udara jika terjadi kesalahan. Ya, dan daya dorong spesifik diperlukan sangat baik, bahkan untuk pesawat terbang, belum lagi multicopter.

Platform seperti ini



( ada uraian lebih rinci di sini).

mereka hanya bisa bergerak bersama, dalam banyak kasus, permukaan halus buatan, dan kontrol mereka sangat berbeda.

Tetapi di atas air kita dapat berlayar di mana saja, yang di masa depan dapat memberi kita kesempatan untuk membuat autopilot menggunakan GPS. Desain klasik dengan baling-baling rumit bagi saya oleh unit keluar poros dari perumahan - Saya tidak bisa membayangkan bagaimana cara menyegelnya.

Lebih banyak keuntungan dari sistem propulsi udara:
  1. Itu dapat diletakkan di platform yang berbeda: perahu, kereta luncur, sepotong busa ...
  2. Itu tidak menangkap di bagian bawah atau ganggang.

Perangkat harus dapat diputar. Ada 3 opsi:
  1. Satu sekrup + setir untuk belokan ;
  2. Satu sekrup + sistem beloknya ;
  3. Dua sekrup tetap. Berbalik dengan mengubah keinginan mereka adalah cara termudah. Dia menggunakannya.


Remote control


Prinsip operasi


1 joystick + beberapa sakelar. Tugas kendali jarak jauh adalah mengirim data pada posisi pegangan joystick dan berganti beberapa kali per detik.

Apa yang harus dilakukan


Pertama, Anda membutuhkan pemancar radio. Opsi termurah adalah NRF24L01 +, biaya $ 0,85 .

Kedua, Anda membutuhkan joystick. Lebih $ 1 .

Beberapa switch - $ 0,12 .

Nah, semua ini diperbaiki pada selembar PCB seharga $ 0,13 .

Sudah dihitung $ 2,1, tetapi masih membutuhkan MK dan makanan. Semuanya tidak begitu jelas di sini.

Ke depan, saya akan mengatakan bahwa ATmega8 atau STM8S103F3P6 sudah cukup, tetapi karena saya memulai proyek ini untuk waktu yang lama dan ada sedikit pengalaman, saya membantingnya ke panel kontrol Mini Arduino Pro, dan ke perahu Arduino Nano (ATmega32P di mana-mana).

Di remote masih diperlukan:
  1. Konverter daya 0,9 - 5 V -> 5 V untuk memberi daya Arduino seharga $ 0,35 (konektor USB, bersama dengan sepotong papan, dapat diputus karena kekompakannya);
  2. Stabilizer 3.3V AMS1117-3.3 untuk memberi daya pada modul radio, harganya $ 0,03 per unit ;
  3. Kompartemen baterai untuk baterai satu jari seharga $ 0,15 ;

Total ditambah $ 0,53. Terlepas dari pengontrol, sepasang kapasitor dan kabel, biaya komponen konsol adalah $ 2,63.

Mengisi model RC


Komponen


Semuanya berasal dari mesin. Apa pun mesin yang Anda beli, elektronik harus dipasang dengan daya seperti itu, dan pangkalan (kapal seluncur) akan diperlukan untuk daya dukung yang sesuai. Dan secara ideologis, segala sesuatu yang lain hanya diperlukan untuk memutar sekrup dengan kecepatan yang tepat.

Saya membeli mesin ini dengan baling


- baling seharga $ 2,88 per pasang .

Dia mengambil L293D sebagai pengemudi motor - $ 0,35 .
Lalu ada masalah
L293D . , .

Makanan Kami akan membutuhkan sebanyak tiga tegangan suplai:
  1. 5 V untuk semua elektronik kecuali modul radio;
  2. 3.3 V untuk modul radio;
  3. untuk motor sebanyak yang mereka butuhkan (tambang 4.2 V).

1 dan 2 kita mendapatkan yang sama seperti pada panel kontrol, dan untuk motor kita menaruh MT3608 untuk $ 0,86 .

Sekarang untuk bagian yang menyenangkan: giroskop. Modul MPU-6050 berharga $ 1,53 . Ada keinginan untuk juga menggunakan accelerometer, sehingga ketika tongkat joystick bergerak ke samping, kapal terbuka di tempatnya. Tetapi pada akhirnya, ia meninggalkan ide ini: kemiringan nada sedikit, dan sistem mulai berpikir bahwa itu mempercepat maju atau mundur. Ternyata menjadi lebih mudah untuk mengubah kapal di tempatnya hanya dengan mengkompensasi gerakan maju / mundur dengan joystick.

Tambahkan $ 0,4 ini untuk kompartemen baterai untuk 2 sel AA dan dapatkan $ 6,4 komponen tanpa pengontrol dan kabel.

Programnya


Dan lagi, mari kita pergi dari mesin. Masing-masing dari dua mesin yang digerakkan oleh L293D mungkin atau mungkin tidak menggali :
  1. Putar ke depan;
  2. Putar kembali;
  3. Jangan dipelintir.

Untuk membuat kode lebih mudah dibaca, tulis
6 fungsi
inline void motLeftStop(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftForward(){    
  PORTD |= 1 << MOT_LEFT_PLUS;
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftBackward(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD |= 1 << MOT_LEFT_MINUS;
}

inline void motRightStop(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightForward(){
  PORTD |= 1 << MOT_RIGHT_PLUS;
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightBackward(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD |= 1 << MOT_RIGHT_MINUS;
}


Sekarang kami ingin mengontrol kecepatan rotasi sekrup. Tentu saja, kami akan melakukan ini menggunakan PWM. Saya tidak tahu apakah PWM seperti itu dapat dilakukan dalam perangkat keras ... Saya melakukannya secara terputus secara terprogram. Deklarasikan sepasang variabel global
int8_t motLeft = 0, motRight = 0; // -127..+127

Biarkan nilai-nilai dari variabel-variabel ini <0 berarti bahwa Anda perlu untuk mundur, nilai-nilai> 0 - maju, dan jika mereka 0, maka Anda tidak perlu memutar.
Kami akan menulis penangan interupsi timer
ISR(TIMER2_OVF_vect)
{
  if(motLeft > 0)
    motLeftForward();
  else if(motLeft < 0)
    motLeftBackward();
  if(motRight > 0)
    motRightForward();
  else if(motRight < 0)
    motRightBackward();
}

ISR(TIMER2_COMPA_vect)
{
  motLeftStop();
}

ISR(TIMER2_COMPB_vect)
{
  motRightStop();
}


Sekarang, untuk mengubah kecepatan rotasi baling-baling, kita perlu melakukan 2 tindakan:
  1. Tulis nilai positif, negatif atau nol pada motLeft / motRight (modul tidak penting);
  2. Rekam "kecepatan rotasi" dalam OCR2A / OCR2B.

Mari kita menulis beberapa fungsi lagi untuk ini
void setMotLeft(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motLeft = v;  
  OCR2A = abs(v) * 2;
}

void setMotRight(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motRight = v;
  OCR2B = abs(v) * 2;
}


if(abs(v) < 5) v = 0;

OCR2x 5 ( ).

Sekarang tinggal mengkonfigurasi pin MK dan timer
void motInit(){
  DDRD |= (1 << MOT_LEFT_PLUS) | (1 << MOT_LEFT_MINUS) | (1 << MOT_RIGHT_PLUS) | (1 << MOT_RIGHT_MINUS);
  //TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // set up timer with prescaler = 1024.   16 
  //TCCR2B |= (1 << CS22)|(0 << CS21)|(0 << CS20); // set up timer with prescaler = 64.   1 
  TCCR2B |= (0 << CS22)|(1 << CS21)|(0 << CS20); // set up timer with prescaler = 8.  128 
  //TCCR2B |= (0 << CS22)|(0 << CS21)|(1 << CS20); // set up timer with prescaler = 1.  16 
  TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A)|(1 << OCIE2B); // enable overflow interrupt
  TCCR2A &= ~(3); // set WGM20 = 0, WGM21 = 0
  TCCR2B &= ~(1 << 3); // set WGM22 = 0
  setMotLeft(0);
  setMotRight(0);
  sei();
}


Dan Anda dapat mengontrol motor hanya dengan memanggil fungsi setMotLeft (int8_t v) dan setMotRight (int8_t v).

Tapi kami ingin mengendalikan kapal dengan salah! Kami ingin memberikan perintah seperti "maju / mundur" dan "kanan / kiri"! Dan biarkan dia mencari tahu baling-baling apa yang harus dia putar untuk ini. Selain itu, saya ingin kapal itu sendiri untuk mengimbangi efek balik angin, arus, dan ... baling-baling bengkok!

Ayo pergi sekarang dari sisi lain. Dari kendali jarak jauh. Dalam kasus paling sederhana, algoritma operasinya adalah sebagai berikut:
  1. Saat menyalakan daya, ingat posisi awal joystick;
  2. Dalam siklus, baca posisi joystick, kurangi posisi nol darinya dan kirim data ke kapal.

Modul radio kami mendukung paket hingga 32 byte. Agar tidak mengingat perpindahan, kami akan menggunakan catatan
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

Sebagai berikut
    uint8_t packet[MAX_BUFF]; 
    memset(packet, 0, MAX_BUFF);    
    controlStatus.x = (int16_t)analogRead(1) - x0;
    controlStatus.y = (int16_t)analogRead(0) - y0;
    memcpy(packet, &controlStatus, sizeof(controlStatus));
    Mirf.send(packet);
    while(Mirf.isSending()){;};


Di sisi penerima, kami akan mendeklarasikan catatan yang sama persis dan
kami akan mengisinya
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


Dalam fungsi setMotRot dan setMotForward
tulis nilai ke variabel global motRot dan motForward
void setMotRot(int16_t v){
  if(abs(v)<10) v = 0;
  motRot = (int32_t)v;
}
void setMotForward(int16_t v){
  if(abs(v)<10) v = 0;
  motForward = (int32_t)v;
}


Dan mari kita beralih ke yang paling menarik. Untuk cara konversi "belok kiri dengan kecepatan 5 derajat per detik dan bergerak maju sedikit!" untuk "mesin kiri 10% kembali, kanan 20% ke depan!". Banyak yang telah ditulis

tentang apa itu pengendali PID . Saya hanya menggunakan dua komponen untuk rotasi:
  1. Proporsional;
  2. Integral.

Dan untuk bergerak bolak-balik, regulator tidak menggunakannya.

Mari kita ambil contoh:
int32_t iDeltaRot = 0;
void motTick(){
  int32_t rot = getRotAvg(); //     
  int32_t deltaRot = rot - motRot * rotMaxSpeed / 512;
  iDeltaRot += deltaRot;
  int32_t motRight = (int32_t)motForward * forwardMult - deltaRot * rotMult - iDeltaRot * iDeltaRotMult, 
          motLeft  = (int32_t)motForward * forwardMult + deltaRot * rotMult + iDeltaRot * iDeltaRotMult;  

  int32_t motMax = max(abs(motRight), abs(motLeft));
  if(motMax > 127){
    motRight = (int32_t)motRight * 127 / motMax;
    motLeft  = (int32_t)motLeft  * 127 / motMax;
  }
  
  setMotRight(motRight);
  setMotLeft(motLeft);
}

Kode telah disederhanakan untuk fokus pada bagian-bagian penting, arsip akan memiliki versi lengkap.

Apa yang kita lakukan disini
  1. Kami menghitung perbedaan antara kecepatan nyata rotasi kapal (busuk) dan yang diinginkan (motRot * rotMaxSpeed);
  2. Kami menghitung kecepatan rotasi yang diinginkan dari sekrup motRight dan motLeft;
  3. Jika kecepatan rotasi yang diinginkan melebihi batas maksimum yang dimungkinkan, kami menguranginya sambil mempertahankan rasio di antara mereka;
  4. Kami memanggil setMotRight / setMotLeft yang sudah tidak asing lagi bagi kami.

Itu saja!

Ini adalah algoritma kontrol seluruh kapal!

Apakah ini sulit? Saya kira tidak. Tetapi, bagaimanapun, dalam proses pengujian dan penyetelan sejumlah masalah muncul yang akan menyebabkan banyak kecelakaan jika itu adalah pesawat terbang.

Ada 4 koefisien dalam fungsi yang dijelaskan:
  1. forwardMult - kepekaan terhadap pergerakan joystick maju / mundur;
  2. rotMaxSpeed ​​- kecepatan rotasi yang diinginkan saat memiringkan joystick ke kanan / kiri;
  3. rotMult - koefisien komponen proporsional (seberapa besar penyimpangan kecepatan rotasi saat ini dari yang diinginkan mempengaruhi rotasi);
  4. iDeltaRotMult - koefisien komponen integral (berapa banyak penyimpangan dari sudut balik arus dari yang diinginkan mempengaruhi rotasi).

Koefisien ini disetel secara eksperimental, dan reaksi kapal terhadap joystick dan pengaruh eksternal yang terbuka akan bergantung padanya.

Indikasi status


Saat debugging / tuning, akan ada kebingungan dari seri "mengapa kapal bereaksi terhadap joystick bukan seperti yang saya inginkan?". Beberapa poin dapat di-debug dengan menampilkan informasi debug pada PC, tetapi akan lebih mudah untuk memahami apa yang terjadi saat itu juga. Pada awalnya, saya mempertimbangkan 2 opsi:
  1. Laptop;
  2. LCD Nokia 5110


Kerugian keduanya dapat dipahami: laptop besar dan tidak nyaman untuk dibawa bersama Anda, dan layar Nokia 5110 tidak akan memungkinkan Anda untuk secara bersamaan menampilkan sejumlah besar parameter status perahu.

Saya mengambil silang di antara mereka: Nextion Enhanced NX4827K043 - Generic 4.3 '' HMI Touch Display . Berkat layar sentuh, Anda dapat dengan cepat dan nyaman menyesuaikan parameter perahu saat dalam perjalanan. Ini adalah jenis komputer yang terdiri dari:
  1. Mikrokontroler GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 MB);
  3. Memori flash Winbond W25Q256FVFG (32 MB, 100.000 siklus penulisan ulang, yang sangat baik);
  4. FPGA Altera MAX II EPM570T144C5N.

Segala sesuatu dalam rakitan terlihat seperti ini (dapat diklik): Komputer / display ini adalah kotak hitam dan diarahkan untuk berinteraksi dengan seseorang. Bahkan GPIO yang ada dipertajam untuk menghubungkan tombol dan indikator. Dewan Ekspansi mereka mengkonfirmasi hal ini. Jadi menggunakan pengontrol bawaan sebagai kendali jarak jauh perahu (membaca joystick, bertukar data dengan modul radio NRF24L01 +) akan gagal. Untuk berinteraksi dengan mikrokontroler, ada UART dan ... itu saja. Tentang bagaimana dan apa yang dapat Anda lakukan dengan tampilan ini yang dapat Anda lakukan, ada banyak + video yang ditulis di Youtube. Lihat, misalnya, ini





- semuanya terlihat jelas di sana. Tetapi karena tampilan ini lebih mahal daripada semua komponen kapal dan konsol digabungkan, saya akan menjelaskan secara lebih rinci kesan saya bekerja dengannya. Mungkin ini akan membantu seseorang untuk memahami apakah opsi ini cocok untuknya atau apakah laptop / display Nokia 5110 akan lebih disukai. Keuntungan dari Nextion Enhanced NX4827K043:
  1. Sangat mudah digunakan. Ada dokumentasi sederhana, contoh, video di Youtube, ... Dalam beberapa jam Anda dapat menemukannya dari awal. Hampir semua yang perlu Anda ketahui tentang dia ada di dua halaman: halaman wiki dan Set Instruksi
  2. Perkembangannya sangat cepat. Editor visual seperti Visual Studio (hanya lebih mudah). Saya melemparkan komponen dan semuanya berfungsi.
  3. Komponen berkualitas tinggi. Memori flash yang sama untuk siklus penulisan ulang 100k.
  4. Seorang debugger yang dapat mensimulasikan tampilan menggunakan PC dan berkomunikasi dengan MK Anda melalui port COM. Memungkinkan Anda mengembangkan perangkat sepenuhnya, men-debug dan membeli tampilan, hanya jika semuanya berhasil.
    Meskipun ada masalah dengannya
    . . , , .
  5. Sensor resistif Anda dapat membuat kontrol yang cukup kecil dan menusuknya dengan kuku Anda atau stylus apa pun.

Kekurangan:
  1. Harga $ 50 masih banyak untuk tampilan 4.3 ''.
  2. Ada beberapa komponen yang ada, beberapa pengaturan komponen, cara membuat Anda sendiri tidak jelas. Ini sebagian diimbangi oleh fungsi menggambar primitif (garis, persegi panjang, lingkaran, ...).
  3. Komponen Gauge standar berkedip ketika ditingkatkan.
  4. Tidak ada (setidaknya saya tidak menemukan) transparansi.
  5. Persyaratan daya: 4,75-7 V dan rata-rata arus 250 mA. Ketika voltase turun, layar mulai berkedip.
  6. Hanya UART. Bisa melakukan komunikasi dengannya di SPI dan IΒ²C.
  7. Output GPIO hanya untuk kabel (tanpa sisir 2,54 mm), tanpa ADC.


Secara umum, tampilan memberikan kesan produk yang sangat berkualitas tinggi, yang mudah dan menyenangkan untuk dikerjakan.

Layar dapat melakukan dua tugas sekaligus:
  1. Indikasi status. Saya terutama tertarik pada:
    • "Kecepatan rotasi" sekrup;
    • Nilai variabel iDeltaRot adalah seberapa besar sudut belok yang diinginkan berbeda dari yang diinginkan;
    • Kecepatan putaran perahu;
    • Sudut rotasi kapal;
    • Frekuensi menerima paket dari remote control;
    • Frekuensi panggilan ke fungsi motTick.

  2. Parameter pengaturan, yaitu yang dijelaskan di atas forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.


Dibuat 2 halaman (dapat diklik untuk penilaian kualitas):
  1. Indikasi:


  2. Pengaturan parameter: 4 kolom pertama dari kiri ke kanan: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.






Video test boat di lantai:



Reaksi kapal terhadap efek unfolding eksternal di berbagai iDeltaRotMult (koefisien integral):



Demonstrasi pengaruh parameter pada air:



Video di perairan terbuka tidak dapat ditangkap. Anda bisa meyakini bahwa penanganannya baik, dan kecepatan maksimumnya tidak terlalu.

Karakteristik


  • Batang 9 g;
  • Berat 115 g, yang baterainya berat 52 g;
  • Akselerasi maksimum adalah 0,77 m / s ^ 2. Untuk manusia 5 km / jam, jika tidak ada hambatan air, kapal akan berakselerasi dalam 1,8 detik;
  • Biaya komponen adalah sekitar $ 15 jika Anda menggunakan Arduino Nano di kendali jarak jauh dan kapal (tanpa layar dan baterai).


Kesimpulan


Bagi mereka yang memiliki keinginan untuk mengumpulkan sesuatu yang dikendalikan radio, saya sarankan mulai dengan kapal dengan dua baling-baling tetap. Menurut pendapat saya, ini adalah hal paling sederhana yang dapat dilakukan di bidang ini.

Mengarsipkan dengan proyek

Dan akhirnya, sehingga ada sesuatu untuk diperjuangkan, berikut adalah video dari perangkat yang luar biasa:

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


All Articles