Percobaan 4
Motor Servo, Buzzer, & Potensiomter
2. Setelah semua komponen (Potensiometer, motor servo, dan buzzer , dihubungkan ke Raspberry pi pico), hubungkan USB Raspberry pi pico ke laptop.
4. Setelah program selesai, simulasikan rangkaian.
2. Hardware dan Diagram Blok[Kembali]
Hardware :
- Raspberry pi pico
- Potensiometer
- Motor Servo
3. Rangkaian Simulasi[Kembali]
- Prinsip Kerja
Sistem ini menggunakan Raspberry Pi Pico untuk mengendalikan servo motor dan buzzer, dengan potensiometer sebagai input utama. Potensiometer terhubung ke pin ADC (GP26) pada Pico dan menghasilkan nilai analog yang dikonversi menjadi digital (0–65535). Nilai ini digunakan untuk dua fungsi. Pertama, nilai tersebut diubah menjadi sudut antara 0° hingga 180° guna mengatur posisi servo. Sudut ini kemudian dikonversi ke nilai duty cycle PWM dalam rentang 1500–7500, sesuai standar kontrol servo, dan dikirim melalui pin GP16 untuk menggerakkan motor.
Kedua, nilai ADC juga digunakan untuk menghasilkan frekuensi PWM bagi buzzer yang terhubung ke pin GP14. Nilai ADC diubah ke frekuensi antara 200 Hz hingga 2000 Hz, sehingga semakin tinggi nilai potensiometer, semakin tinggi pula nada buzzer. Duty cycle untuk buzzer ditetapkan tetap pada 30000 untuk menjaga kestabilan suara.
4. Flowchart dan Listing Program[Kembali]
- Flowchart
- Listing Program
from machine import Pin, PWM, ADC
from time import sleepimport utime
# Inisialisasi
pot = ADC(26) # GP26 = ADC0servo = PWM(Pin(16))buzzer = PWM(Pin(14))
# Konfigurasi PWMservo.freq(50) # 50 Hz untuk servobuzzer.freq(1000) # Awal frekuensi buzzerdef map_value(value, in_min, in_max, out_min, out_max):while True:return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)val = pot.read_u16() # Nilai ADC 16-bit (0 - 65535)
# === Servo Motor ===
# Membaca nilai potensiometer (0 - 65535)pot_value = pot.read_u16()# Konversi ke sudut servo (0° - 180°)angle = map_value(pot_value, 0, 65535, 0, 180)
# Konversi sudut ke duty cycle (1500 - 7500) → sesuai servo PWMduty = map_value(angle, 0, 180, 1500, 7500)servo.duty_u16(duty)
# Print untuk debuggingprint(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}")
# === Buzzer ===# Ubah val ke frekuensi (200 Hz - 2000 Hz)freq = int(200 + (val / 65535) * (2000 - 200))buzzer.freq(freq)buzzer.duty_u16(30000) # Volume/suaranya
sleep(0.05)
Tidak ada komentar:
Posting Komentar