Percobaan 6
I2C (Pico – LCD)
1. Rangkai semua komponen pada kedua development board yang terhubung ke mikrokontroler STM32F103C8 dan Raspberry Pi Pico.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE dan program untuk mikrokontroler Raspberry Pi Pico di software Thonny.
3. Build program yang telah dibuat pada software STM32 CubeIDE, lalu inputkan program ke dalam mikrokontroler STM32F103C8 melalui stlink. Kemudian inputkan juga program dari software Thonny ke dalam mikrokontroler Raspberry Pi Pico melalui USB.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
3. Build program yang telah dibuat pada software STM32 CubeIDE, lalu inputkan program ke dalam mikrokontroler STM32F103C8 melalui stlink. Kemudian inputkan juga program dari software Thonny ke dalam mikrokontroler Raspberry Pi Pico melalui USB.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
5. Selesai.
2. Hardware dan Diagram Blok[Kembali]
Hardware :
- Raspberry pi pico
- STM32F103C8
- Push Button
- Resistor
3. Rangkaian Simulasi[Kembali]
- Prinsip Kerja
Rangkaian yang ditampilkan merupakan sistem kendali sudut servo berbasis mikrokontroler Raspberry Pi Pico dengan input dari potensiometer dan output tampilan menggunakan LCD 16x2 berbasis I2C. Potensiometer yang terhubung ke pin ADC (GP26) berfungsi sebagai input analog yang menghasilkan variasi tegangan saat diputar. Tegangan ini kemudian dikonversi oleh Raspberry Pi Pico menjadi nilai digital dengan rentang 0 hingga 65535. Nilai tersebut selanjutnya diolah dan dipetakan ke dalam rentang sudut 0 hingga 180 derajat. Sudut ini kemudian dikonversi menjadi sinyal PWM (Pulse Width Modulation) dengan duty cycle tertentu yang dikirim ke pin GP16 untuk mengatur posisi sudut dari servo motor. Servo motor merespons sinyal PWM ini dengan mengubah sudutnya sesuai perintah.
Sementara itu, LCD 16x2 yang terhubung melalui komunikasi I2C (SDA pada GP0 dan SCL pada GP1) digunakan untuk menampilkan informasi sudut servo secara real-time. Setiap siklus program, LCD akan dibersihkan dan diperbarui dengan informasi sudut terkini, sehingga pengguna dapat memantau posisi servo dengan jelas. Dengan jeda waktu 200 milidetik di tiap perulangan, tampilan LCD tetap stabil tanpa berkedip berlebihan. Sistem ini mencerminkan prinsip kerja input-proses-output yang sederhana namun fungsional, dan dapat diterapkan pada proyek edukatif atau sistem kontrol otomatisasi skala kecil seperti pada robotika atau simulasi aktuator.
Selain mengendalikan servo, Raspberry Pi Pico juga mengirimkan informasi sudut tersebut ke LCD menggunakan protokol komunikasi I2C melalui dua jalur yaitu SDA dan SCL. Modul LCD berperan sebagai slave I2C yang menerima data karakter dari mikrokontroller untuk ditampilkan di layar. Dengan demikian, sistem ini bekerja secara terintegrasi di mana potensiometer sebagai input menghasilkan nilai tegangan, Raspberry Pi Pico memproses dan menerjemahkan nilai tersebut nilai tersebut menjadi sinyal kontrol untuk motor servo, sekaligus menampilkan nilai sudutnya secara real-time pada layar LCD
4. Flowchart dan Listing Program[Kembali]
- Flowchart
- Listing Program
from machine import Pin, ADC, PWM, I2C
from i2c_lcd import I2cLcd
import utime
# 1. Setup Potensiometer (GP26 = ADC0)
pot = ADC(Pin(26))
# 2. Setup Servo (GP15)
servo = PWM(Pin(16))
servo.freq(50) # Frekuensi PWM standar servo
# 3. Setup LCD I2C 16x2
I2C_ADDR = 0x27 # Alamat I2C LCD, bisa 0x3F tergantung modul
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000) # GP0=SDA, GP1=SCL
lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
# Fungsi untuk mapping nilai
def map_value(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
# Kalibrasi servo
SERVO_MIN_DUTY = 1500 # Duty cycle untuk 0°
SERVO_MAX_DUTY = 7500 # Duty cycle untuk 180°
while True:
# Baca nilai potensiometer
pot_value = pot.read_u16()
# Konversi ke sudut 0-180°
angle = map_value(pot_value, 0, 65535, 0, 180)
# Konversi sudut ke duty cycle
duty = map_value(angle, 0, 180, SERVO_MIN_DUTY, SERVO_MAX_DUTY)
servo.duty_u16(duty)
# Tampilkan di LCD
lcd.clear()
lcd.putstr("Sudut Servo:")
lcd.move_to(0, 1)
lcd.putstr(f"{angle} derajat")
utime.sleep_ms(200) # Delay untuk mengurangi flicker











Tidak ada komentar:
Posting Komentar