Robotika · pelajaran 3
Bicara dengan servo: protokol Dynamixel
Satu kabel, dua puluh servo
OP3 punya 20 servo, tapi tidak ada 20 kabel dari komputer ke tiap servo. Semua servo tersambung berantai pada satu bus (RS-485, 2 Mbps). Bus ini half-duplex: hanya satu pihak boleh bicara pada satu waktu. Setiap servo punya ID (1–20 di OP3). Komputer mengirim paket instruksi berisi ID, servo yang ID-nya cocok menjalankan dan menjawab dengan paket status, dan servo lain diam.
Bentuk satu paket (Protocol 2.0)
FF FF FD 00 | 0E | 07 00 | 02 | 84 00 04 00 | 9D 36
header | ID | LEN |INST| parameter | CRC
| bagian | arti |
|---|---|
FF FF FD 00 | header: “paket baru dimulai di sini” |
| ID | servo tujuan (FE = semua servo, broadcast) |
| LEN | panjang sisanya (2 byte, little-endian: byte kecil dulu) |
| INST | instruksi: 01 PING, 02 READ, 03 WRITE, 82 SYNC_READ, 83 SYNC_WRITE |
| parameter | alamat control table, panjang data, nilai |
| CRC | checksum 16-bit: servo membuang paket yang rusak di jalan |
Kalau isi paket kebetulan berisi FF FF FD (mirip header), pengirim menyisipkan FD tambahan (byte stuffing) supaya tidak dikira awal paket baru.
Coba di terminal
dxl ping 14
dxl read 14 132 4
dxl write 20 65 1
dxl table
dxl read 14 132 4membaca Present Position lutut kiri (ID 14): 4 byte dari alamat 132.dxl write 20 65 1menyalakan LED servo leher (ID 20).- Terminal menampilkan setiap byte yang dikirim (→ TX) dan jawabannya (← RX), dengan arti tiap bagian. Hitung sendiri: 0x84 = 132.
Coba juga menulis ke alamat yang hanya boleh dibaca, misalnya dxl write 14 132 0. Servo menjawab dengan Access Error (kode 7).
Kenapa SyncWrite?
Driver op3_manager mengirim sudut ke 20 servo setiap 8 ms (125 kali per detik). Dengan WRITE biasa, itu 20 paket plus 20 jawaban. Dengan SYNC_WRITE, cukup satu paket berisi 20 nilai, dan tidak ada jawaban. Di tab Bus Dynamixel, centang “tampilkan paket rutin” untuk melihatnya.
Hitung bebannya: satu SyncWrite ±114 byte dan satu SyncRead dengan 20 jawaban ±420 byte. Pada 125 Hz dan 10 bit per byte, itu sekitar 0,5 Mbit per detik, kira-kira seperempat bus 2 Mbps. Itulah alasan robot dengan banyak servo memakai bus cepat, dan kenapa membaca terlalu banyak data per siklus bisa membuat bus penuh.
Rebutan bus
Coba dxl write 14 116 2600 (Goal Position lutut). Tidak ada yang berubah, karena 8 ms kemudian op3_manager menulis goal-nya sendiri. Centang Jeda driver di atas untuk mengambil alih bus, lalu ulangi. Hati-hati: robot yang kakinya ditekuk sembarangan bisa jatuh!
Misi
Nyalakan LED sebuah servo dengan paket WRITE dari terminal.
Selanjutnya: ROS 2: node, topik, dan pesan · Semua pelajaran