Robotika · pelajaran 15
Motor, PWM dan bang-bang
Dari pin ke roda
Pin mikrokontroler hanya bisa memberi arus beberapa miliampere, sedangkan motor N20 menarik sampai 1,6 A. Di antaranya ada H-bridge: empat saklar transistor yang menyambungkan baterai ke motor. Dari program kita hanya mengatur dua hal per motor:
| pin | arti |
|---|---|
MOTOR_L_DIR | arah: 0 atau 1 |
MOTOR_L_PWM | kecepatan: PWM |
PWM (pulse width modulation) menyalakan dan mematikan saklar ribuan kali per detik. Duty 25% berarti menyala seperempat waktu, jadi motor merasakan rata-rata 25% tegangan baterai.
pwm = PWM(Pin(board.MOTOR_L_PWM), freq=20000) # 20 kHz: di atas jangkauan telinga
pwm.duty_u16(16384) # 25 %
Buka tab Motor, lalu setir dengan W: duty → tegangan → arus → rpm.
- Saat mulai bergerak, arusnya besar. Motor yang sudah berputar cepat membangkitkan tegangan balik (back-EMF), sehingga arusnya mengecil.
- Baterai ikut turun sedikit saat arus besar.
- Duty di bawah ±10% tidak menggerakkan robot sama sekali: gesekan gearbox lebih besar dari torsi motor. Ini disebut deadband.
Motor yang terbalik
Kedua motor dipasang saling berhadapan, jadi motor kanan adalah cermin motor kiri. Untuk maju, DIR kiri = 0 tetapi DIR kanan = 1. Semua preset menyembunyikannya di fungsi motor(kiri, kanan). Hapus pembalikan itu dan lihat robot berputar di tempat. Kesalahan ini sangat umum di robot sungguhan.
Bang-bang
Pengendali paling sederhana hanya punya tiga pilihan:
- garis di kiri → roda kiri pelan, roda kanan cepat (belok kiri);
- garis di kanan → sebaliknya;
- garis di tengah → lurus.
Jalankan preset Bang-bang. Robot mengikuti garis, tetapi bergoyang terus dari kiri ke kanan: ia hanya tahu “terlalu kiri” atau “terlalu kanan”, tidak tahu seberapa jauh.
Coba
- Naikkan
CEPATke 0.8. Putarannya lebih cepat, tetapi goyangannya makin besar dan robot mulai terlempar keluar jalur di tikungan. - Ganti jumlah sensor di atas menjadi 8. Sekarang tidak ada sensor yang tepat di tengah, jadi program ini tidak pernah memilih “lurus”: robot terus berayun dan jauh lebih lambat. Rumus yang bagus untuk satu papan bisa gagal di papan lain.
- Ubah
time.sleep_ms(5)menjaditime.sleep_ms(60). Robot hanya “melihat” 16 kali per detik: ia selalu kebablasan sebelum sempat bereaksi, goyangannya melebar, dan satu putaran makan waktu hampir dua kali lipat. Kecepatan loop sama pentingnya dengan rumusnya.
Misi
Selesaikan satu putaran penuh lintasan oval dengan main.py. Waktunya ada di tab Putaran.
Selanjutnya: PID untuk mengikuti garis · Semua pelajaran