Laporan Akhir M2 Percobaan 6

 




 1. Prosedur  [kembali]


  1. 1. Persiapan Alat dan Bahan

  • Raspberry Pi Pico

  • 1 buah servo

  • 1 buah potentiometer

  • 1 buah LED RGB

  • 3 buah resistor

  • Kabel jumper

  • Aplikasi Wokwi

            

  1. 2. Perakitan Rangkaian

  1. Potensiometer:

    • Pin tengah ke GP28 (ADC).

    • Pin kiri ke 3.3V, pin kanan ke GND.

  2. Servo motor:

    • Kabel merah ke 5V.

    • Kabel coklat/ hitam ke GND.

    • Kabel oranye/kuning ke GP16 (PWM).

  3. LED RGB:

    • Kaki R → GPIO (misalnya GP1) dengan resistor.

    • Kaki G → GPIO (misalnya GP2) dengan resistor.

    • Kaki B → GPIO (misalnya GP3) dengan resistor.

    • Katoda ke GND.

  4. Pemrograman

    Buat program MicroPython dengan aturan logika berikut:

    • Sudut 0°–60° → LED Merah & Biru menyala (kedip 2 detik), Hijau mati.

    • Sudut 60°–90° → LED Merah menyala (kedip 2 detik), Hijau & Biru mati.

    • Sudut 90°–120° → Semua LED mati.

    • Sudut 120°–180° → LED Biru menyala (kedip 2 detik), Merah & Hijau mati.


2. Hardware dan Diagram Blok [kembali]


  2.1 Daftar Komponen

  • 1 × Raspberry Pi Pico (atau kompatibel RP2040)

Gambar Raspberry Pi Pico 
Spesifikasi Raspberry Pi Pico

  • 1 ×Servo

Gambar Servo


  • 1 × Potentiometer

Gambar Potentiometer

  • 1 x LED RGB

Gambar LED RGB

  • 3 x Resistor 220 Ohm 

Gambar Resistor

  • Kabel Jumper

Gambar Kabel Jumper

2.2 Diagram Blok




       

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

3.1 Rangkaian Simulasi

Gambar Rangkaian Percobaan 5

3.2 Prinsip Kerja

Rangkaian ini bekerja dengan memanfaatkan potensiometer sebagai masukan analog untuk mengatur sudut servo motor melalui Raspberry Pi Pico. Pin ADC pada Pico membaca nilai tegangan dari potensiometer, kemudian nilai tersebut diolah dan dikonversi menjadi sudut servo antara 0° sampai 180°.

Berdasarkan sudut yang terbentuk, Raspberry Pi Pico akan mengontrol LED RGB dengan logika tertentu:

  • Saat servo berada di 0°–60°, LED merah menyala (berkedip dengan interval 1 detik), sedangkan LED hijau dan mati.

  • Saat servo berada di 61°–120°, hanya LED hijau yang menyala berkedip setiap 1 detik, sedangkan LED merah dan biru mati.

  • Saat servo berada di 121°–180°, hanya LED biru yang menyala berkedip setiap 1 detik, sedangkan LED merah dan hijau mati.

Dengan demikian, potensiometer berfungsi sebagai pengendali posisi servo, servo menjadi aktuator yang bergerak sesuai input, dan LED RGB sebagai indikator visual untuk menunjukkan rentang sudut servo.



4. Flowchart dan Listing Program [kembali]
    





Listing Program

from machine import Pin, PWM, ADC
import utime
 
# Definisi pin
servo = PWM(Pin(16)) # Servo pada GP16
pot = ADC(Pin(28)) # Potensiometer pada GP28
led_red = Pin(1, Pin.OUT) # LED Merah pada GP1
led_green = Pin(2, Pin.OUT) # LED Hijau pada GP2
led_blue = Pin(3, Pin.OUT) # LED Biru pada GP3
 
# Konfigurasi servo (frekuensi 50Hz)
servo.freq(50)
 
# Fungsi map seperti di Arduino
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)
 
# Variabel untuk kontrol kedipan LED
last_blink = utime.ticks_ms()
led_state = True # Mulai dalam keadaan menyala

while True:
    # Waktu sekarang
    now = utime.ticks_ms()
    # 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 PWM
    duty = map_value(angle, 0, 180, 1500, 7500)
    servo.duty_u16(duty)
    # Print untuk debugging
    print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}")
    # Jika sudah lewat 2000 ms (2 detik), ubah status LED RGB
    if utime.ticks_diff(now, last_blink) >= 1000:
        led_state = not led_state
        last_blink = now # reset waktu blink
    # Nyalakan salah satu warna LED berdasarkan sudut
    if 0 <= angle <= 60:
        led_red.value(led_state)
        led_green.value(0)
        led_blue.value(0)
    elif 60 < angle <= 120:
        led_red.value(0)
        led_green.value(led state)
        led_blue.value(0)
    else:
        led_red.value(0)
        led_green.value(0)
        led_blue.value(led_state)
    utime.sleep_ms(50) # Delay pendek untuk kestabilan pembacaan

Penjelasan listing program:

from machine import Pin, PWM, ADC 
import utime 
  • machine.Pin → untuk mengontrol pin input/output.

  • PWM → untuk mengatur sinyal PWM (digunakan pada servo).

  • ADC → untuk membaca nilai analog (digunakan pada potensiometer).

  • utime → menyediakan fungsi waktu seperti delay (sleep_ms) dan timer (ticks_ms).

servo = PWM(Pin(16))      # Servo pada pin GP16
pot = ADC(Pin(28))        # Potensiometer pada pin GP28
led_red = Pin(1, Pin.OUT) # LED Merah pada GP1
led_green = Pin(2, Pin.OUT) # LED Hijau pada GP2
led_blue = Pin(3, Pin.OUT) # LED Biru pada GP3
  • Servo dikontrol lewat PWM di GP16.

  • Potensiometer dibaca lewat pin ADC GP28.

  • LED RGB dihubungkan ke pin GP1 (merah), GP2 (hijau), GP3 (biru).

servo.freq(50)
  • Servo standar dikontrol dengan PWM 50 Hz (periode 20 ms).
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)
  • Mengubah skala nilai.

  • Contoh: nilai ADC (0–65535) diubah jadi sudut servo (0–180).

last_blink = utime.ticks_ms()
led_state = True
  • last_blink menyimpan waktu terakhir LED berubah status.

  • led_state digunakan untuk membuat LED berkedip (ON/OFF setiap 1 detik).

while True:
  • Program berjalan terus-menerus.
a. Membaca potensiometer dan menghitung sudut servo
pot_value = pot.read_u16()                      # Baca ADC (0–65535)
angle = map_value(pot_value, 0, 65535, 0, 180)  # Ubah ke 0–180 derajat
duty = map_value(angle, 0, 180, 1500, 7500)     # Ubah ke nilai PWM
servo.duty_u16(duty)                            # Atur servo
  • Potensiometer menentukan posisi servo.

  • Nilai ADC → Sudut (0–180°).

  • Sudut → Duty cycle (sekitar 1–2 ms pulsa).

b. Debugging (opsional)
print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}")
  • Menampilkan nilai ke serial monitor.

c. Kontrol kedipan LED

now = utime.ticks_ms()
if utime.ticks_diff(now, last_blink) >= 1000:
    led_state = not led_state   # Balik kondisi LED
    last_blink = now
  • Setiap 1 detik, led_state berubah (True/False).

  • Efeknya: LED kedip bergantian.

d. Atur LED berdasarkan posisi servo
if 0 <= angle <= 60:
    led_red.value(led_state) 
    led_green.value(0) 
    led_blue.value(0) 
elif 60 < angle <= 120:
    led_red.value(0) 
    led_green.value(led_state) 
    led_blue.value(0) 
else:
    led_red.value(0) 
    led_green.value(0)
    led_blue.value(led_state)
  • Jika sudut 0°–60° → LED Merah berkedip.

  • Jika sudut 60°–120° → LED Hijau berkedip

  • Jika sudut >120° → LED Biru berkedip.

e. Delay
utime.sleep_ms(50)
  • Delay kecil agar pembacaan potensiometer stabil.



5. Video Demo [kembali]





6. Kondisi [kembali]
    
Buatlah rangkaian seperti gambar pada percobaan 6. Buatlah ketika servo 0° - 60° (Merah menyala, Hijau dan biru mati), 60° - 120° (Merah menyala, Hijau & Biru mati), dan 120° - 180° (Biru menyala, Merah & Hijau mati). Masing-masing LED berkedip 1 detik.
    
7. Video Simulasi [kembali]   






8. Download File  [kembali]
   
   Download rangkaian simulasi [link]
    Download Video simulasi [link]
    Download Video Demo [link]
    Download datasheet Raspberry pi pico [link]
    Download datasheet Servo [link]
    Download datasheet Potentiometer [link]
    Download datasheet Resistor [link]
    Download datasheet LED RGB [link]

Comments

Popular posts from this blog