Robotika · pelajaran 14
Sensor inframerah dan ADC
Robot tanpa ROS
TurtleBot3 dan OP3 menjalankan banyak program yang saling berkirim pesan ROS. Robot pengikut garis jauh lebih sederhana: satu mikrokontroler (di sini Raspberry Pi Pico, RP2040) menjalankan satu program yang langsung membaca pin dan menyetel motor. Program itu bernama main.py dan ditulis dalam MicroPython.
from machine import Pin, ADC
import board
Pin(board.EMITTER, Pin.OUT, value=1) # nyalakan LED inframerah
s = ADC(board.SENSOR[0]) # sensor paling kiri
print(s.read_u16()) # 0 … 65535
Buka tab board.py untuk melihat peta pin papan ini. Setiap papan sungguhan punya peta seperti ini.
Cara sensor melihat garis
Setiap sensor terdiri dari LED inframerah dan fototransistor yang menghadap lantai, ±5 mm di atasnya. LED menyinari lantai, lalu fototransistor mengukur berapa banyak cahaya yang memantul kembali:
- lantai putih memantulkan banyak cahaya, jadi nilai ADC-nya besar (±50.000);
- pita hitam menyerap cahaya, jadi nilainya kecil (±5.000).
ADC (analog-to-digital converter) mengubah tegangan fototransistor menjadi angka. read_u16() selalu memberi angka 16 bit, 0 sampai 65535.
Coba
- Buka tab Sensor. Tanpa program apa pun, semua batang rendah, karena LED inframerahnya mati. Sensor hanya melihat cahaya ruangan.
- Pilih preset Kerangka di
main.py, lalu Unggah & jalankan. LED menyala dan nilai putih langsung melonjak. - Setir dengan W A S D saat program berhenti, lalu lewati garis. Perhatikan:
- sensor yang sama-sama di atas putih tidak memberi angka yang persis sama: setiap komponen sedikit berbeda;
- di tepi garis, sensor hanya separuh menutupi pita, jadi nilainya di tengah-tengah.
- Geser Cahaya ruangan. Semua nilai naik sedikit dan bergetar (lampu berkedip 100 kali per detik). Inilah alasan robot sungguhan membandingkan bacaan saat LED menyala dan mati.
- Buka tab Serial, mode Plotter: setiap baris angka dari
print(..., sep=",")menjadi satu titik grafik.
Ambang
Cara paling sederhana memutuskan “hitam atau putih” adalah satu ambang:
BATAS = 30000
if s.read_u16() < BATAS:
print("hitam")
Robot tidak berhenti seketika. Ia masih meluncur karena momentum, dan gearbox-nya ikut berputar. Preset Berhenti di garis mengatasinya dengan mundur pelan sampai sensor tengah melihat hitam lagi.
Misi
Dengan main.py, majukan robot lalu hentikan dengan batang sensor tepat di atas garis (meleset paling banyak 12 mm). Coba ubah kecepatan motor(0.2, 0.2) menjadi lebih cepat: seberapa jauh robot kebablasan?
Selanjutnya: Motor, PWM dan bang-bang · Semua pelajaran