Tugas Pendahuluan 1

[menuju akhir]

1. Prosedur [kembali]

1. Susun rangkaian di situs Wokwi sesuai dengan kondisi percobaan yang dipilih.
2. Tulis program pada situs Wokwi.
3. Setelah program selesai dibuat, jalankan simulasi rangkaian di Wokwi sesuai dengan skenario yang telah ditentukan.
4. Proses selesai.

2. Hardware dan Diagram Blok [kembali]

Hardware :

1. Raspberry Pi Pico

2. Motor Servo


3. Buzzer


4. Potensiometer


Diagram Blok:


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]


Prinsip Kerja
from machine import Pin, PWM, ADC
from time import sleep
  • Import library:

    • Pin: Untuk mengakses dan mengontrol pin GPIO.

    • PWM: Untuk membuat sinyal PWM (Pulse Width Modulation) pada pin.

    • ADC: Untuk membaca sinyal analog dari pin (seperti potensiometer).

    • sleep: Untuk membuat jeda (delay) dalam program.

# Inisialisasi
pot = ADC(26)  # GP26 = ADC0
servo = PWM(Pin(16))
buzzer = PWM(Pin(14))
  • Deklarasi perangkat:

    • pot: Membaca potensiometer yang dihubungkan ke pin GP26 (ADC channel 0).

    • servo: Membuat objek PWM di pin GP16, untuk mengendalikan servo motor.

    • buzzer: Membuat objek PWM di pin GP14, untuk mengendalikan buzzer.

# Konfigurasi PWM
servo.freq(50)  # 50 Hz untuk servo
buzzer.freq(1000)  # Frekuensi buzzer
  • Mengatur frekuensi PWM:

    • Servo motor biasanya dikendalikan dengan sinyal PWM frekuensi 50 Hz.

    • Buzzer disetting dengan frekuensi 1000 Hz supaya menghasilkan bunyi.

# Fungsi mapping
def map_value(value, in_min, in_max, out_min, out_max):
    return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
  • Fungsi map_value:

    • Untuk mengubah rentang nilai.

    • Misalnya: dari sudut 0-180 derajat menjadi duty cycle 1638-8192 (sesuai kebutuhan servo).

# Inisialisasi
previous_pot_value = pot.read_u16()
angle = 90  # Awal servo di tengah
  • Membaca nilai awal potensiometer dan mengatur posisi servo di tengah (90°).

while True:
  • Memulai loop utama (program berjalan terus-menerus).

    pot_value = pot.read_u16()
  • Membaca nilai potensiometer terbaru (0–65535).

    # Cek perubahan potensiometer
    if pot_value < previous_pot_value:
        angle -= 1  # Diperkecil → berlawanan jarum jam
    elif pot_value > previous_pot_value:
        angle += 1  # Diperbesar → searah jarum jam
  • Membandingkan nilai potensiometer saat ini dengan sebelumnya:

    • Kalau turun → sudut servo dikurangi 1 derajat.

    • Kalau naik → sudut servo ditambah 1 derajat.

  • (Catatan: perubahan kecil → supaya gerakan lebih halus.)

    # === Buzzer ===
    if angle < 0 or angle > 180:
        buzzer.duty_u16(30000)  # Buzzer ON
    else:
        buzzer.duty_u16(0)       # Buzzer OFF
  • Mengontrol buzzer:

    • Jika sudut di luar batas (kurang dari 0 atau lebih dari 180 derajat), buzzer menyala.

    • Kalau sudut valid (0–180 derajat), buzzer mati.

    # Batas sudut supaya servo tetap bergerak normal
    if angle < 0:
        angle = 0
    elif angle > 180:
        angle = 180
  • Menjaga sudut dalam batas aman (0–180 derajat).

  • Jika keluar batas, dikembalikan ke nilai maksimal atau minimal.

    # Konversi sudut ke duty cycle (1638 - 8192)
    duty = map_value(angle, 0, 180, 1638, 8192)
    servo.duty_u16(duty)
  • Mengubah sudut menjadi sinyal PWM:

    • Servo butuh duty cycle tertentu untuk tiap sudut.

    • Mapping dari 0-180 derajat menjadi nilai duty cycle PWM (1638–8192).

    # Debugging
    print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}")
  • Menampilkan nilai di terminal untuk debugging:

    • Nilai ADC potensiometer, sudut servo, dan duty cycle.

    previous_pot_value = pot_value  # Simpan nilai potensiometer sebelumnya
    sleep(1)
  • Menyimpan nilai potensiometer saat ini untuk dibandingkan di loop berikutnya.

  • Delay 1 detik sebelum mengulangi loop.

Program ini menggerakkan servo berdasarkan perubahan potensiometer secara halus, menghidupkan buzzer jika sudut keluar batas, dan memetakan sudut ke PWM untuk mengontrol servo.

4. Flowchart dan Listing Program [kembali]

Flowchart

 Listing Program 

from machine import Pin, PWM, ADC from time import sleep # Inisialisasi pot = ADC(26) # GP26 = ADC0 servo = PWM(Pin(16)) buzzer = PWM(Pin(14)) # Konfigurasi PWM servo.freq(50) # 50 Hz untuk servo buzzer.freq(1000) # Frekuensi buzzer # Fungsi mapping def map_value(value, in_min, in_max, out_min, out_max): return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) # Inisialisasi previous_pot_value = pot.read_u16() angle = 90 # Awal servo di tengah while True: pot_value = pot.read_u16() # Cek perubahan potensiometer if pot_value < previous_pot_value: angle -= 1 # Diperkecil → berlawanan jarum jam elif pot_value > previous_pot_value: angle += 1 # Diperbesar → searah jarum jam # === Buzzer === if angle < 0 or angle > 180: buzzer.duty_u16(30000) # Buzzer ON else: buzzer.duty_u16(0) # Buzzer OFF # Batas sudut supaya servo tetap bergerak normal if angle < 0: angle = 0 elif angle > 180: angle = 180 # Konversi sudut ke duty cycle (1638 - 8192) duty = map_value(angle, 0, 180, 1638, 8192) servo.duty_u16(duty) # Debugging print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}") previous_pot_value = pot_value # Simpan nilai potensiometer sebelumnya sleep(1)

5. Kondisi [kembali]

    Percobaan 4 Kondisi 4

Buatlah rangkaian seperti gambar pada percobaan 4, jika nilai pada potensiometer diperkecil maka servo bergerak berlawanan jarum jam dan jika jika sudut servo <0 ° dan >180 ° buzzer berbunyi

6. Video Simulasi [kembali]

7. Download File [kembali]

Rangkaian [klik disini]
Video Simulasi [klik disini]
Listing Program [klik disini]



Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

Modul 1 Gerbang Logika Dasar & Monostable Multivibrator

Modul 3 Counter