Saya mencari informasi tentang bagaimana menerapkan pencampuran yang tepat dari 2 sinyal joystick analog (sumbu X dan Y) untuk mengontrol drive motor diferensial ganda (drive "tank like") menggunakan uC (ATMega328p dalam kasus saya, tetapi hal yang sama berlaku untuk setiap UC dengan input ADC dan output PWM):
Saya memiliki stik analog, yang memberikan 2 nilai analog:
(arah) X: 0 hingga 1023
(throttle) Y: 0 hingga 1023
Posisi istirahat adalah (arah dan throttle netral) 512,512
Throttle maju / arah kiri adalah 0,0
Penuh ke depan-kanan penuh adalah 1023,0
dll.
Motor dikontrol oleh 2 driver H-bridge, 2 pin PWM untuk masing-masing (Maju, mundur), seperti:
Kiri Motor: -255 ke 255
Motor Kanan: -255 hingga 255
(nilai positif memungkinkan pin PWM maju, negatif memungkinkan mundur Pin PWM, 0 menonaktifkan keduanya)
Tujuannya adalah untuk mencampur sinyal analog joystick untuk mencapai respons berikut:
a) Throttle maju, arah netral = kendaraan bergerak maju
b) Throttle maju, arah kiri = kendaraan bergerak maju dan belok kiri
c) Throttle netral, arah kiri = kendaraan belok kiri DI TEMPAT yaitu motor kanan maju penuh, motor kiri mundur penuh
... dan juga untuk kombinasi lainnya. Tentu saja, outputnya harus "analog" yaitu, ia harus memungkinkan transisi bertahap dari misalnya dari opsi a) ke b) ke c).
Konsepnya adalah:
Jawaban:
Pencampuran "Proper" terbuka untuk diperdebatkan :-).
Masalahnya adalah Anda harus membuat keputusan tentang seberapa cepat trek bergerak di bawah sinyal murni dari pot tunggal dan apa yang harus dilakukan ketika sinyal dari pot lain dimasukkan. Misalnya, jika Anda mendorong pot FB (Maju-Mundur ke depan sepenuhnya ke depan, dan jika kedua motor kemudian berlari dengan kecepatan penuh di depan, bagaimana Anda menangani penambahan sejumlah kecil pot LR (Kiri-Kanan) yang ditambahkan. dapatkan rotasi, Anda harus memiliki satu trek lebih cepat dari yang lain. Jadi, jika Anda sudah berjalan pada kecepatan maju maksimum pada kedua motor Anda harus mengurangi satu atau kecepatan trek lain untuk berputar. Tapi, jika Anda telah berdiri diam Anda akan mempercepat satu atau trek lain untuk mencapai hasil yang sama.
Jadi, semua yang dikatakan, inilah solusi awal yang sederhana dari kepala saya yang sepertinya merupakan awal yang baik.
Jika pot independen secara mekanis maka keduanya dapat 100% secara bersamaan.
Jika keduanya pada pengaturan jenis joystick, jika Yaxis = 100% dan Xaxis = 0%, maka menambahkan beberapa B biasanya akan mengurangi A. Joystick dapat dibangun di mana hal di atas tidak benar, tetapi ini tidak biasa.
Asumsikan bahwa joystick adalah tipe yang meningkatkan Y% ketika X = 100% akan mengurangi X. Asumsi lain dapat dibuat.
FB = pot depan-belakang. Pusat nol, + Ve untuk gerakan maju pot
LR = Pot kanan kiri. Center nol. + Ve untuk pot di sebelah kanan.
K adalah faktor skala awalnya 1.
Jika ada hasil melebihi 100% maka sesuaikan K sehingga hasilnya = 100% dan menggunakan nilai K yang sama untuk motor lain juga.
Karena 125 x 0,8 = 100, atur K = 0,8. Kemudian.
Kiri = 125 x 0,8 = 100%. Kanan = 80 x 0,8 = 64%.
Kemudian:
Motor kiri = K x (Front_Back + Left_Right)
Motor kanan = K x (Front_Back - Kiri_Right)
Cek kesehatan:
LR = 0 (tengah), FB = fwd penuh -> Kedua motor berjalan penuh ke depan.
LR = kiri penuh, FB = 0 ->
Motor kiri berjalan penuh mundur,
Motor kanan berjalan penuh ke depan.
Kendaraan berputar berlawanan arah jarum jam.
FB adalah 100%, Lr = 0%. Tambahkan 10% LR ke kanan.
L = FB + LR = 100% - + 10% R = FB-LR = 100% - - 10%
Jika sumbu terbesar <100%, skala hingga = 100%.
Kemudian skala sumbu lainnya dengan jumlah yang sama.
sumber
Inilah solusi yang tidak memerlukan rumit jika / selain itu rantai, tidak mengurangi daya saat bergerak penuh ke depan atau berputar di tempat, dan memungkinkan kurva dan transisi yang mulus dari pindah ke berputar.
Idenya sederhana. Asumsikan nilai joystick (x, y) adalah koordinat kartesius pada bidang persegi. Sekarang bayangkan sebuah pesawat persegi yang lebih kecil diputar 45º di dalamnya.
Koordinat joystick memberi Anda titik di kotak yang lebih besar, dan titik yang sama ditumpangkan di kotak yang lebih kecil memberi Anda nilai motorik. Anda hanya perlu mengubah koordinat dari satu kotak ke kotak lainnya, membatasi nilai (x, y) yang baru ke sisi kotak yang lebih kecil.
Ada banyak cara untuk melakukan konversi. Metode favorit saya adalah:
Ini mengasumsikan koordinat awal (x, y) berada dalam kisaran -1.0 / + 1.0. Sisi dari kotak bagian dalam akan selalu sama dengan
l * sqrt(2)/2
, jadi langkah 4 hanya tentang mengalikan nilai dengansqrt(2)
.Berikut ini contoh implementasi Python.
Ide asli untuk metode ini - dengan metode transformasi yang jauh lebih rumit - berasal dari artikel ini .
sumber
Di bawah ini adalah contoh implementasi algoritma pencampuran seperti yang dijelaskan oleh Russel McMahon jawaban:
http://www.youtube.com/watch?v=sGpgWDIVsoE
sumber