Kamis, 18 Juni 2020

Laporan Akhir Tugas Besar

 Sistem Parkir Mobil Pintar



1. Prosedur
[Kembali]

Sistem Parkir Mobil Pintar terdiri dari dua unit Raspberry Pi Pico:

    1. Raspberry Pi Pico 1 (Pintu Masuk & Keluar):

  • Mendeteksi kendaraan di gerbang masuk dan keluar menggunakan sensor ultrasonik HC-SR04 dan sensor logam LJ18A3-8-Z/BX.
  • Membaca intensitas cahaya sekitar area parkir menggunakan LDR dan menyalakan LED indikator jika kondisi gelap. 

    2. Raspberry Pi Pico 2

  • Menambah atau mengurangi variabel counter slot_terpakai sesuai perintah.
  • Menampilkan jumlah slot tersedia (slot_total - slot_terpakai) pada modul LCD 16×2 via I2C.
  • Menggerakkan motor servo untuk membuka dan menutup palang parkir.

2. Hardware dan Diagram Blok [Kembali]

- Raspberry Pi Pico, sebagai “otak” sistem: membaca data sensor (ultrasonik, logam, LDR), mengendalikan aktuator (servo, LED), dan berkomunikasi antar‑Pico serta ke LCD.



- Sensor Ultrasonik HC-SR04, untuk mendeteksi jarak kendaraan di gerbang masuk/keluar dengan memancarkan dan mengukur waktu pantulan gelombang ultrasonik; memicu logika buka‑tutup palang.



- Sensor LJ18A3-8-Z/BX, untuk memverifikasi keberadaan logam (bodi mobil) di area palang, meningkatkan akurasi deteksi kendaraan dan menghindari false‑trigger.


- Motor Servo, mekanisme pembuka‑tutup palang parkir: menerima sinyal PWM dari Pico untuk mengatur sudut 0–90° secara presisi.


-LCD 16x2 I2C, untuk menampilkan real‑time jumlah slot parkir tersisa; menerima data counter via I²C dari Pico “Display” untuk antarmuka pengguna.



- Jumper, menghubungkan pin‑pin Pico, sensor, dan modul secara fleksibel pada PCB 


- LED mengukur intensitas cahaya lingkungan; saat gelap, memberi sinyal untuk menyalakan LED indikator penerangan area parkir. 



Resistor pembatas arus digunakan untuk melindungi LED dan memastikan operasi yang stabil.

- LDR sebagai sensor intensitas cahaya ambient. Nilai resistansinya dibaca oleh ADC pada unit pertama; ketika cahaya di sekitar parkir kurang (gelap), LDR memicu logika untuk menyalakan LED indikator penerangan, dan mematikan LED kembali saat kondisi cukup terang.


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

- Rangkaian





- Prinsip kerja

    Pada skema sistem parkir mobil pintar, akan terdapat 2 buah portal yaitu portal masuk dan portal keluar, yang mana setiap portal ini akan dihubungkan dengan masing-masing sebuah motor. Pada masing-masing portal, didekatnya akan dipasang sensor ultrasonic dan sensor logam untuk mendeteksi keberadaan mobil di titik yang disediakan sebagai titik pemberhentian mobil.

    Ketika sebuah mobil berhenti di titik pemberhentian, logika sensor ultrasonic dan sensor logam ini akan bernilai 1, maka portal akan dibuka(motor bergerak). Syarat terbukanya portal yaitu kedua sensor harus berlogika 1, tidak hanya salah satu (logika AND). Lalu selanjutnya mobil akan masuk dan melewati portal masuk. Setelahnya,  kedua sensor tadi tidak lagi mendeteksi keberadaan mobil sehingga logika kedua sensor kembali berlogika 0 yang menandakan mobil telah melalui portal. Sehingga, motor kembali bergerak ke keadaan sebelumnya yang membuat portal kembali menutup. Hal ini juga berlaku di portal keluar saat mobil ingin menuju keluar. Seluruh proses mulai dari portal membuka, lalu mobil melewati portal, hingga portal menutup kembali ini dianggap sebagai satu siklus perhitungan, yang mana ini akan mempengaruhi jumlah slot parkir tersedia yang ditampilkan oleh LCD

    Seluruh skema ini akan masuk ke perhitungan jumlah slot parkir yang tersedia. Sehingga, saat terjadi satu siklus perhitungan di portal masuk, total slot parkir akan -1 dan saat terjadi satu siklus di portal keluar, total slot parkir akan +1.


4. Flowchart dan Listing Program [Kembali]

Flowchart :

Listing program :

# Pico 1 khusus untuk input sensor

import machine
import utime

# Inisialisasi perangkat keras (sensor) dan komunikasi 
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1))
trig1_pin = machine.Pin(3, machine.Pin.OUT)
echo1_pin = machine.Pin(5, machine.Pin.IN)
inductive1_pin = machine.Pin(6, machine.Pin.IN, machine.Pin.PULL_UP)
trig2_pin = machine.Pin(9, machine.Pin.OUT)
echo2_pin = machine.Pin(10, machine.Pin.IN)
inductive2_pin = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_UP)
ldr_pin = machine.ADC(26)
GELAP_THRESHOLD = 55000 

# Variabel dan Fungsi 
JARAK_MAKSIMUM_CM = 5

def ukur_jarak(trigger, echo):
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep_us(10)
    trigger.low()
    try:
        durasi = machine.time_pulse_us(echo, 1, 30000)
        return durasi / 58
    except OSError:
        return 999

# Program utama dimulai 
print("Pico 1: Sistem Sensor dengan Anti-Double Reading Siap.")

# Variabel untuk menyimpan status dari siklus loop sebelumnya
status_s1_sebelumnya = False
status_s2_sebelumnya = False

while True:
    # Membaca status sensor saat ini 
    jarak1 = ukur_jarak(trig1_pin, echo1_pin)
    logam1_terdeteksi = inductive1_pin.value() == 0
    status_s1_saat_ini = logam1_terdeteksi and jarak1 <= JARAK_MAKSIMUM_CM

    jarak2 = ukur_jarak(trig2_pin, echo2_pin)
    logam2_terdeteksi = inductive2_pin.value() == 0
    status_s2_saat_ini = logam2_terdeteksi and jarak2 <= JARAK_MAKSIMUM_CM

    nilai_ldr = ldr_pin.read_u16()
    suasana_gelap = nilai_ldr > GELAP_THRESHOLD

    # Logika untuk deteksi perubahan status 
    pesan_s1 = '0' # Default adalah '0'
    # Kirim '1' HANYA JIKA status berubah dari TIDAK ADA menjadi ADA
    if status_s1_saat_ini and not status_s1_sebelumnya:
        pesan_s1 = '1'
        print(">>> EVENT: Objek baru terdeteksi di Sistem 1!")

    pesan_s2 = '0' # Default adalah '0'
    # Kirim '1' HANYA JIKA status berubah dari TIDAK ADA menjadi ADA
    if status_s2_saat_ini and not status_s2_sebelumnya:
        pesan_s2 = '1'
        print(">>> EVENT: Objek baru terdeteksi di Sistem 2!")

    # Pesan LDR tetap berdasarkan kondisi saat ini (level-triggered)
    pesan_ldr = 'D' if suasana_gelap else 'L'
    
    # Gabungkan dan kirim pesan
    pesan_untuk_dikirim = pesan_s1 + pesan_s2 + pesan_ldr
    uart.write(pesan_untuk_dikirim)
    
    # Perbarui status untuk siklus berikutnya
    status_s1_sebelumnya = status_s1_saat_ini
    status_s2_sebelumnya = status_s2_saat_ini
    
    # Cetak status lokal untuk debugging
    print("Status S1: {}, Status S2: {}, LDR: {} | Mengirim: '{}'".format(
        "ADA" if status_s1_saat_ini else "...",
        "ADA" if status_s2_saat_ini else "...",
        "GELAP" if suasana_gelap else "CERAH",
        pesan_untuk_dikirim
    ))

    utime.sleep(0.5)



# Pico 2 khusus untuk output

from machine import I2C, Pin
from time import sleep
import utime
from pico_i2c_lcd import I2cLcd 

# jumlah slot parkir
JUMLAH_SLOT_MAKSIMAL = 3
jumlah_slot = JUMLAH_SLOT_MAKSIMAL

# Inisialisasi perangkat komponen
# LCD dan I2C
I2C_ADDR = 0x27 
i2c = machine.I2C(0, sda=machine.Pin(4), scl=machine.Pin(5), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)

# UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1))

# Servos
servo1_pwm = machine.PWM(machine.Pin(6)) # Palang Masuk
servo1_pwm.freq(50)
servo2_pwm = machine.PWM(machine.Pin(28)) # Palang Keluar
servo2_pwm.freq(50)

# Inisialisasi LED
led_pin = machine.Pin(20, machine.Pin.OUT)

# Fungsi-fungsi 
def atur_sudut_servo(servo_obj, sudut):
    duty_u16 = int(1638 + (sudut / 180) * (6553.5))
    servo_obj.duty_u16(duty_u16)

def update_lcd():
    lcd.clear()
    lcd.putstr("Slot Tersedia:")
    lcd.move_to(0, 1)
    lcd.putstr(str(jumlah_slot) + " / " + str(JUMLAH_SLOT_MAKSIMAL))

# Program Utama
print("Pico 2: Sistem Parkir + Kontrol Lampu Siap.")
update_lcd()
atur_sudut_servo(servo1_pwm, 0)
atur_sudut_servo(servo2_pwm, 0)
led_pin.off() # Pastikan LED mati di awal

while True:
    if uart.any():
        # Baca 3 byte data (sesuai panjang pesan baru)
        data_diterima = uart.read(3)
        
        if data_diterima and len(data_diterima) == 3:
            print("Sinyal: {}, Slot: {}".format(data_diterima, jumlah_slot))

            # Logika Parkir (Sistem 1 & 2) 
            if data_diterima[0:1] == b'1': # Gerbang Masuk
                if jumlah_slot > 0:
                    atur_sudut_servo(servo1_pwm, 90)
                    utime.sleep(2.5)
                    atur_sudut_servo(servo1_pwm, 0)
                    jumlah_slot -= 1
                    update_lcd()
                else:
                    # Logika saat slot penuh
                    lcd.clear()
                    lcd.putstr("!! SLOT PENUH !!")
                    utime.sleep(1.5)
                    update_lcd()

            if data_diterima[1:2] == b'1': # Gerbang Keluar
                atur_sudut_servo(servo2_pwm, 90)
                utime.sleep(2.5)
                atur_sudut_servo(servo2_pwm, 0)
                if jumlah_slot < JUMLAH_SLOT_MAKSIMAL:
                    jumlah_slot += 1
                update_lcd()

            # Logika Kontrol LED
            # Cek karakter ketiga dari pesan
            if data_diterima[2:3] == b'D': # Jika 'D' (Dark)
                led_pin.on()
                print("-> Suasana GELAP, LED hidup.")
            else: # Jika 'L' (Light) atau lainnya
                led_pin.off()
                print("-> Suasana CERAH, LED mati.")

    utime.sleep_ms(100)


5. Video Demo [Kembali]




6. Kondisi [Kembali]

7. Video Simulasi [Kembali]





8. Download File[Kembali]

File HTML [disini]
Rangkaian [disini]
Listing Program [disini]
Video [disini]
Datasheet Raspberry Pi Pico [disini]

Datasheet HCSR-04 [disini]

Datasheet LJ18A3-8-Z/BX [disini]

Datasheet LCD 16x2 I2C [disini]

Datasheet Motor Servo SG90[disini]

Library LCD [disini]

Library Pi Pico [disini]

Link simulasi [disini]

0 comments:

Posting Komentar