Senin, 19 Mei 2025

Laporan Akhir M3

M3 - Laporan Akhir M3



1. Prosedur[Kembali]

Prosedur Percobaan 2 Kondisi 3

1. Buka software proteus

2. Cari Komponen yang akan digunakan sesuai dengan modul

3. Hubungka komponen sesuai dengan arahan yang ada pada modul dan untuk pin yang di pakai sesuaikan juga


4. Konfigurasi STM32 di STM32CubeIDE dan perbaiki code yang ada pada modul agar bisa  digunakan sesuai dengan kondisi yang di minta


5. build program yang telah di perbaiki tadi di software stm32cube

6. masukan file yang telah di ubah tadi pada stm32 yang telah di rangkai pada proteus

7. simulasikan dan lihat apa yang terjadi pada program

2. Hardware dan Diagram Blok[Kembali]

1.STM32F103C8

    sebagai mikrokontroler utama




2.LED 

    sebagai ouput atau keluaran nanti nya




3.Push Button
    
    sebagai Input




5.Resistor

    sebagai pengaman led agar tidak rusak karena arus lebih





3. Rangkaian Simulasi Dan Prinsip Kerja[Kembali]







Prinsip Kerja

    Pada rangkaian ini, dua buah board STM32 (kemungkinan STM32F103 "Blue Pill") saling berkomunikasi melalui UART. Mikrokontroler pertama (bagian atas) berperan sebagai pengirim (transmitter) yang membaca input dari tombol-tombol push button. Ketika salah satu tombol ditekan, mikrokontroler ini mengirimkan sinyal berupa data serial melalui pin TX ke mikrokontroler kedua (bagian bawah) yang berfungsi sebagai penerima (receiver). Mikrokontroler penerima akan membaca data yang masuk melalui pin RX dan kemudian mengaktifkan LED yang sesuai dengan tombol yang ditekan pada mikrokontroler pengirim. Setiap tombol mewakili LED tertentu sehingga komunikasi UART antar mikrokontroler ini memungkinkan kendali LED secara remote. Kedua mikrokontroler harus dikonfigurasi dengan baud rate dan pengaturan UART yang sama agar data dapat ditransmisikan dan diterima dengan benar. Rangkaian ini menunjukkan implementasi komunikasi UART antar STM32 dalam sistem kontrol digital sederhana dengan input (push button) dan output (LED) yang terpisah secara fisik.


4. Flowchart dan Listing[Kembali]




Listing Program

#include "main.h"

UART_HandleTypeDef huart1;

uint8_t buttonStates[4] = {'0', '0', '0', '0'};

uint8_t charToTransmit[5];

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_USART1_UART_Init();

 while (1)

 {

 buttonStates[0] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET)

? '1' : '0';

 buttonStates[1] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET)

? '1' : '0';

 buttonStates[2] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET)

? '1' : '0';

 buttonStates[3] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET)

? '1' : '0';

 HAL_UART_Transmit(&huart1, buttonStates, 4, 100);

 HAL_Delay(100);

 }

}

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

 Error_Handler();

 }

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |

RCC_CLOCKTYPE_SYSCLK

 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

 {

 Error_Handler();

 }

}

static void MX_USART1_UART_Init(void)

{

 huart1.Instance = USART1;

 huart1.Init.BaudRate = 9600;

 huart1.Init.WordLength = UART_WORDLENGTH_8B;

 huart1.Init.StopBits = UART_STOPBITS_1;

 huart1.Init.Parity = UART_PARITY_NONE;

 huart1.Init.Mode = UART_MODE_TX_RX;

 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

 huart1.Init.OverSampling = UART_OVERSAMPLING_16;

 if (HAL_UART_Init(&huart1) != HAL_OK)

 {

 Error_Handler();

 }

}

static void MX_GPIO_Init(void)

{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 __HAL_RCC_GPIOA_CLK_ENABLE();

 GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4;

 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

 GPIO_InitStruct.Pull = GPIO_PULLUP;

 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void Error_Handler(void)

{

 __disable_irq();

 while (1)

 {

 }

}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)

{

}

#endif



RX

#include "main.h"

UART_HandleTypeDef huart1;

uint8_t receivedData[4];

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_USART1_UART_Init();

 while (1)

 {

 if(HAL_UART_Receive(&huart1, receivedData, 4, 100) == HAL_OK)

 {

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, (receivedData[0] == '0') ?

GPIO_PIN_SET : GPIO_PIN_RESET);

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, (receivedData[1] == '0') ?

GPIO_PIN_SET : GPIO_PIN_RESET);

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, (receivedData[2] == '0') ?

GPIO_PIN_SET : GPIO_PIN_RESET);

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, (receivedData[3] == '0') ?

GPIO_PIN_SET : GPIO_PIN_RESET);

 HAL_UART_Transmit(&huart1, receivedData, 4, 100);

 }

 HAL_Delay(50);

 }

}

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0


 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

 Error_Handler();

 }

 RCC_ClkInitStruct.ClockType =

RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

 {

 Error_Handler();

 }

}

static void MX_USART1_UART_Init(void)

{

 huart1.Instance = USART1;

 huart1.Init.BaudRate = 9600;

 huart1.Init.WordLength = UART_WORDLENGTH_8B;

 huart1.Init.StopBits = UART_STOPBITS_1;

 huart1.Init.Parity = UART_PARITY_NONE;

 huart1.Init.Mode = UART_MODE_TX_RX;

 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

 huart1.Init.OverSampling = UART_OVERSAMPLING_16;

 if (HAL_UART_Init(&huart1) != HAL_OK)

 {

 Error_Handler();


 }

}

static void MX_GPIO_Init(void)

{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 __HAL_RCC_GPIOA_CLK_ENABLE();

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,

GPIO_PIN_RESET);

 GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;

 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

 GPIO_InitStruct.Pull = GPIO_NOPULL;

 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void Error_Handler(void)

{

 __disable_irq();

 while (1)

 {

 }

}


5. Video Demo[Kembali]




6. Analisa[Kembali]








7. Download File[Kembali]





Download Rangkaian Klik Disini

Download Vidio Demo Klik Disini

Download Datasheet Mikrokontroler STM32F103C8 Klik Disini

Download Datasheet Push Button Klik Disini

Download Datasheet Buzzer Klik Disini

Download Vidio Simulasi Klik Disini


Jumat, 16 Mei 2025

Tugas Pendahuluan M3

 SOAl TUGAS PENDAHULUAN

1. Jelaskan apa itu protokol komunikasi UART, SPI, dan I2C     

    

1. UART (Universal Asynchronous Receiver Transmitter)

Definisi:
UART adalah protokol komunikasi serial asinkron yang digunakan untuk pertukaran data antar dua perangkat elektronik. Asinkron berarti tidak menggunakan sinyal clock terpisah; kedua perangkat harus menyepakati kecepatan (baud rate) sebelumnya.

Cara kerja:

  • Data dikirim dalam bentuk bit serial (satu per satu).

  • Umumnya menggunakan 2 pin: TX (transmit) dan RX (receive).

  • Protokol ini mengatur sendiri pengiriman dan penerimaan data melalui bit awal (start bit), data bit, dan bit akhir (stop bit).

2. I2C (Inter-Integrated Circuit)

Definisi:
I2C adalah protokol komunikasi serial sinkron yang memungkinkan banyak perangkat (multi-master/multi-slave) berkomunikasi melalui hanya dua kabel. Diciptakan oleh Philips untuk komunikasi antar chip pada papan sirkuit.

Cara kerja:

  • Menggunakan dua jalur: SDA (Serial Data Line) dan SCL (Serial Clock Line).

  • Master mengontrol clock (SCL) dan mengatur komunikasi ke perangkat slave berdasarkan alamat unik.

  • Bisa menghubungkan banyak perangkat hanya dengan dua kabel.

3. SPI (Serial Peripheral Interface)

Definisi:
SPI adalah protokol komunikasi serial sinkron yang dirancang untuk komunikasi cepat antar mikrokontroler dan perangkat periferal seperti sensor, memori, dan display. Dikembangkan oleh Motorola.

Cara kerja:

  • Menggunakan empat sinyal utama: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK (Serial Clock), dan SS/CS (Slave Select/Chip Select).

  • Master mengontrol clock dan memilih slave yang ingin diajak komunikasi.

  • Data ditransmisikan secara full-duplex (kirim dan terima bersamaan).


2. Bagaimana konfigurasi komunikasi UART pada STM32 dan Raspberry Pipico secara hardware (rangkaian) maupun software (program)

jawab :

STM32 – Konfigurasi UART

a. Hardware (Rangkaian):

  • STM32 memiliki beberapa pin USART/UART (misal: PA9 (TX) dan PA10 (RX) untuk USART1).

  • Hubungkan:

    • PA9 (TX STM32)RX perangkat lain

    • PA10 (RX STM32)TX perangkat lain

  • Tambahkan resistor pull-up jika diperlukan (tergantung board).

  • Level logika umumnya 3.3V.

Contoh koneksi STM32 ke USB-TTL converter:

  • STM32 TX (PA9) → RX USB-TTL

  • STM32 RX (PA10) ← TX USB-TTL

  • GND STM32 ↔ GND USB-TTL

b. Software (Program):

Menggunakan STM32CubeIDE:

// Inisialisasi UART (USART1 contoh)

void MX_USART1_UART_Init(void)

{

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 9600;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  HAL_UART_Init(&huart1);

}


// Contoh mengirim data

HAL_UART_Transmit(&huart1, (uint8_t *)"Halo STM32\r\n", strlen("Halo STM32\r\n"), HAL_MAX_DELAY);

Raspberry Pi Pico – Konfigurasi UART

a. Hardware (Rangkaian):

  • Pico punya 2 UART: UART0 dan UART1.

  • Default pin UART0:

    • GPIO0 (TX)

    • GPIO1 (RX)

  • Hubungkan Pico TX ke RX perangkat lain, dan sebaliknya. Gunakan level logika 3.3V juga.

Contoh koneksi ke USB-TTL:

  • GPIO0 (TX) → RX USB-TTL

  • GPIO1 (RX) ← TX USB-TTL

  • GND Pico ↔ GND USB-TTL

b. Software (Program):

Dengan C/C++ SDK:

#include "pico/stdlib.h"
#include "hardware/uart.h"

int main() {
    uart_init(uart0, 9600);
    gpio_set_function(0, GPIO_FUNC_UART); // TX
    gpio_set_function(1, GPIO_FUNC_UART); // RX

    uart_puts(uart0, "Halo dari Raspberry Pi Pico!\r\n");

    while (true) {
        if (uart_is_readable(uart0)) {
            char ch = uart_getc(uart0);
            uart_putc(uart0, ch); // echo
        }
    }
}


3. Bagaimana konfigurasi komunikasi SPI pada STM32 dan Raspberry Pipico secara hardware (rangkaian) maupun software (program)

jawab :

STM32 – Konfigurasi SPI

a. Hardware (Rangkaian):

SPI pada STM32 (misal: SPI1) umumnya memakai pin:

FungsiPin STM32 (SPI1, contoh)
SCKPA5
MISOPA6
MOSIPA7
NSS/SSPA4 (opsional, bisa software)

Koneksi ke perangkat SPI lainnya (misal sensor/memori):

  • SCK (PA5) → SCK slave

  • MOSI (PA7) → MOSI slave

  • MISO (PA6) ← MISO slave

  • SS (PA4) → CS slave

  • GND → GND slave

  • Semua level logika umumnya 3.3V

b. Software (Program) – STM32CubeIDE (HAL)

Inisialisasi SPI:

void MX_SPI1_Init(void)

{

  hspi1.Instance = SPI1;

  hspi1.Init.Mode = SPI_MODE_MASTER;

  hspi1.Init.Direction = SPI_DIRECTION_2LINES;

  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

  hspi1.Init.NSS = SPI_NSS_SOFT;

  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;

  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

  HAL_SPI_Init(&hspi1);

}

Raspberry Pi Pico – Konfigurasi SPI

a. Hardware (Rangkaian):

Default pin untuk SPI0:

FungsiPin GPIO
SCKGPIO2
MOSIGPIO3
MISOGPIO4
CS/SSGPIO5 (bebas ditentukan manual)

Koneksi ke perangkat SPI slave:

  • SCK (GPIO2) → SCK slave

  • MOSI (GPIO3) → MOSI slave

  • MISO (GPIO4) ← MISO slave

  • CS (GPIO5) → CS slave

  • GND → GND slave

b. Software (Program)

Dengan C SDK:

#include "pico/stdlib.h"
#include "hardware/spi.h"

int main() {
    spi_init(spi0, 1000 * 1000); // 1 MHz
    gpio_set_function(2, GPIO_FUNC_SPI); // SCK
    gpio_set_function(3, GPIO_FUNC_SPI); // MOSI
    gpio_set_function(4, GPIO_FUNC_SPI); // MISO

    gpio_init(5); // CS pin
    gpio_set_dir(5, GPIO_OUT);
    gpio_put(5, 1);

    uint8_t tx[] = {0xAA};
    uint8_t rx[1];
    gpio_put(5, 0); // CS active
    spi_write_read_blocking(spi0, tx, rx, 1);
    gpio_put(5, 1); // CS inactive

    while (1);
}

4. Bagaimana konfigurasi komunikasi I2C pada STM32 dan Raspberry Pipico secara hardware (rangkaian) maupun software (program)

jawab :

STM32 – Konfigurasi I2C

a. Hardware (Rangkaian):

  • STM32 (misalnya I2C1) memiliki pin default seperti:

    • SCL: PB6

    • SDA: PB7

  • Komponen I2C dihubungkan secara paralel pada bus SCL dan SDA.

  • Butuh resistor pull-up (biasanya 4.7kΩ) ke 3.3V di kedua jalur:

    • SCL → resistor → 3.3V

    • SDA → resistor → 3.3V

  • Semua perangkat harus level logika sama (umumnya 3.3V pada STM32)

Contoh koneksi ke OLED I2C:

  • STM32 PB6 (SCL) → SCL OLED

  • STM32 PB7 (SDA) → SDA OLED

  • GND STM32 ↔ GND OLED

  • VCC OLED ↔ 3.3V STM32

b. Software (Program) – STM32CubeIDE (HAL)

Inisialisasi I2C:

void MX_I2C1_Init(void)

{

  hi2c1.Instance = I2C1;

  hi2c1.Init.ClockSpeed = 100000;

  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

  hi2c1.Init.OwnAddress1 = 0;

  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

  hi2c1.Init.OwnAddress2 = 0;

  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

  HAL_I2C_Init(&hi2c1);

}

Raspberry Pi Pico – Konfigurasi I2C

a. Hardware (Rangkaian):

Default I2C0 menggunakan pin:

FungsiGPIO
SDAGPIO0
SCLGPIO1
  • Sama seperti STM32, gunakan resistor pull-up 4.7kΩ ke 3.3V.

  • Bisa menggunakan banyak device I2C asalkan alamatnya berbeda.

Contoh koneksi ke sensor I2C atau OLED:

  • GPIO0 (SDA) → SDA device

  • GPIO1 (SCL) → SCL device

  • GND ↔ GND

  • VCC device ↔ 3.3V

b. Software (Program)

Dengan C SDK:

#include "pico/stdlib.h"
#include "hardware/i2c.h"

int main() {
    i2c_init(i2c0, 100 * 1000); // 100kHz
    gpio_set_function(0, GPIO_FUNC_I2C); // SDA
    gpio_set_function(1, GPIO_FUNC_I2C); // SCL
    gpio_pull_up(0);
    gpio_pull_up(1);

    uint8_t data = 0xAA;
    i2c_write_blocking(i2c0, 0x3C, &data, 1, false); // alamat 0x3C
    while (1);
}

Modul 3 Mikro




MODUL III
COMMUNICATION

1. Pendahuluan[Kembali]

a) Asistensi dilakukan 1x
b) Praktikum dilakukan 1x

2. Tujuan[Kembali]

a) Memahami cara penggunaan protokol komunikasi UART, SPI, dan I2C pada Development Board yang digunakan
b) Memahami cara penggunaan komponen input dan output yang berkomunikasi secara UART, SPI, dan I2C pada Development Board yang digunakan

3. Alat dan Bahan[Kembali]

a) Raspberry Pi Pico 

   
     b) STM32F103C8 

    
    c) LED 



    d) Push Button 




    e) LED RGB 

    

    f) Touch Sensor 



    g) LCD I2C 16 x 2

    h) Potensiometer


    i) Mq-2



    j) Motor Servo



    k) LCD OLED

  

4. Dasar Teori[Kembali]

1.4.1 UART (Universal Asynchronous Receiver Transmitter) 
 UART (Universal Asynchronous Receiver-Transmitter) adalah bagian perangkat keras komputer yang menerjemahkan antara bit-bit paralel data dan bit-bit serial. UART biasanya berupa sirkuit terintegrasi yang digunakan untuk komunikasi serial pada komputer atau port serial perangkat periperal.

 


 

Data dikirimkan secara paralel dari data bus ke UART1. Pada UART1 ditambahkan start bit, parity bit, dan stop bit kemudian dimuat dalam satu paket data. Paket data ditransmisikan secara serial dari Tx UART1 ke Rx UART2. UART2 mengkonversikan data dan menghapus bit tambahan, kemudia di transfer secara parallel ke data bus penerima. 


1.4.2 I2C (Inter-Integrated Circuit)        

Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya.




        Pada I2C, data ditransfer dalam bentuk message yang terdiri dari kondisi start, Address Frame, R/W bit, ACK/NACK bit, Data Frame 1, Data Frame 2, dan kondisi Stop. Kondisi start dimana saat pada SDA beralih dari logika high ke low sebelum SCL. Kondisi stop dimana saat pada SDA beralih dari logika low ke high sebelum SCL. 

 R/W bit berfungsi untuk menentukan apakah master mengirim data ke slave atau meminta data dari slave. (logika 0 = mengirim data ke slave, logika 1 = meminta data dari slave) ACK/NACK bit berfungsi sebagai pemberi kabar jika data frame ataupun address frame telah diterima receiver.


1.4.3 SPI (Series Peripheral Interface) 
       Serial Peripheral Interface (SPI) merupakan salah satu mode komunikasi serial synchronous berkecepatan tinggi yang dimiliki oleh STM32F407VGT6 dan Raspberry Pi Pico. Komunikasi SPI membutuhkan 3 jalur utama yaitu MOSI, MISO, dan SCK, serta jalur tambahan SS/CS. Melalui komunikasi ini, data dapat saling dikirimkan baik antara mikrokontroler maupun antara mikrokontroler dengan perangkat periferal lainnya. 
 • MOSI (Master Output Slave Input) Jika dikonfigurasi sebagai master, maka pin MOSI berfungsi sebagai output. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin MOSI berfungsi sebagai input. 
 • MISO (Master Input Slave Output) Jika dikonfigurasi sebagai master, maka pin MISO berfungsi sebagai input. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin MISO berfungsi sebagai output. 
 • SCLK (Serial Clock) Jika dikonfigurasi sebagai master, maka pin SCLK bertindak sebagai output untuk memberikan sinyal clock ke slave. Sebaliknya, jika dikonfigurasi sebagai slave, maka pin SCLK berfungsi sebagai input untuk menerima sinyal clock dari master. 
 • SS/CS (Slave Select/Chip Select) Jalur ini digunakan oleh master untuk memilih slave yang akan dikomunikasikan. Pin SS/CS harus dalam keadaan aktif (umumnya logika rendah) agar komunikasi dengan slave dapat berlangsung.



1.4.4 Raspberry Pi Pico 
 Raspberry Pi Pico adalah papan rangkaian elektronik yang di dalamnya terdapat komponen utama chip mikrokontroler RP2040, yang dirancang dan diproduksi oleh Raspberry Pi Foundatio. Tidak seperti komputer mini raspberry Pi lainnya yang menjalankan sistem operasi seperti Linux, Pico dirancang untuk tugas-tugas yang lebih sederhana dan langsung (embedded system), seperti membaca sensor, mengontrol perangkat, atau melakukan pengolahan data pada tingkat hardware. Adapun spesifikasi dari Raspberry Pi Pico adalah sebagai berikut:


1.4.5 STM32F103C8 
 STM32F103C8 adalah mikrokontroler berbasis ARM Cortex-M3 yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini sering digunakan dalam pengembangan sistem tertanam karena kinerjanya yang baik, konsumsi daya yang rendah, dan kompatibilitas dengan berbagai protokol komunikasi. Pada praktikum ini, kita menggunakan STM32F103C8 yang dapat diprogram menggunakan berbagai metode, termasuk komunikasi serial (USART), SWD (Serial Wire Debug), atau JTAG untuk berhubungan dengan komputer maupun perangkat lain. Adapun spesifikasi dari STM32F4 yang digunakan dalam praktikum ini adalah sebagai berikut:



Jumat, 09 Mei 2025

M2 - Laporan Akhir 2

M2 - Laporan Akhir 2



1. Prosedur[Kembali]

Prosedur Percobaan 2 Kondisi 3

1. Buka software proteus

2. Cari Komponen yang akan digunakan sesuai dengan modul

3. Hubungka komponen sesuai dengan arahan yang ada pada modul dan untuk pin yang di pakai sesuaikan juga


4. Konfigurasi STM32 di STM32CubeIDE dan perbaiki code yang ada pada modul agar bisa  digunakan sesuai dengan kondisi yang di minta


5. build program yang telah di perbaiki tadi di software stm32cube

6. masukan file yang telah di ubah tadi pada stm32 yang telah di rangkai pada proteus

7. simulasikan dan lihat apa yang terjadi pada program

2. Hardware dan Diagram Blok[Kembali]

1.STM32F103C8

    sebagai mikrokontroler utama


2.Sensor Soil Moisture
    
    sebagai pendeteksi kelembapan   





3.IC ULN2003A

    





4.LED RGB

    sebagai ouput atau keluaran nanti nya


5.Resistor

    sebagai pengaman led agar tidak rusak karena arus lebih


6.Motor Stepper






3. Rangkaian Simulasi Dan Prinsip Kerja[Kembali]












Prinsip Kerja

    Ketika sistem mulai bekerja, STM32F103C8 akan pertama-tama membaca status sensor Infrared (PB10), yang berfungsi untuk mendeteksi keberadaan gerakan di sekitar sensor. Jika sensor Infrared mendeteksi adanya gerakan, maka STM32 tidak akan melanjutkan proses ke tahap berikutnya, dan LED RGB tetap dalam kondisi mati. Namun, jika sensor Infrared tidak mendeteksi gerakan, STM32 akan melanjutkan untuk membaca status sensor Touch (PB7). Pada tahap ini, jika sensor Touch tidak disentuh, maka LED RGB tetap mati karena sistem belum mendapatkan sinyal input yang sesuai untuk menyalakan LED. Sebaliknya, jika sensor Touch disentuh, STM32 akan mengaktifkan LED RGB dengan warna Cyan. Warna Cyan dihasilkan dengan cara menyalakan pin output hijau (PA7) dan biru (PB0), sementara pin merah (PA6) dibiarkan mati. Sistem akan terus memantau perubahan pada sensor Infrared dan sensor Touch, sehingga ketika terjadi perubahan kondisi, STM32 akan segera memperbarui status LED sesuai dengan logika yang telah ditentukan.


4. Flowchart dan Listing[Kembali]





Listing Program

#include "main.h"


void SystemClock_Config(void);

static void MX_GPIO_Init(void);


int main(void)

{

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    

    while (1)

    {

        uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_10); // Membaca IR sensor (PB10)

        uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7); // Membaca Touch Sensor (PB7)

        

        // Kondisi: IR tidak mendeteksi gerakan dan Touch mendeteksi sentuhan

        if (ir_status == GPIO_PIN_RESET && touch_status == GPIO_PIN_SET) {

            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // Nyalakan LED Biru (PB0)

            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); // Nyalakan LED Hijau (PA7)

            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // Matikan LED Merah (PA6)

        } 

        else {

            // Matikan semua LED jika kondisi tidak terpenuhi

            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);

            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);

        }

        

        HAL_Delay(10); // Delay kecil untuk stabilisasi pembacaan sensor

    }

}


void SystemClock_Config(void)

{

    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

    RCC_OscInitStruct.HSIState = RCC_HSI_ON;

    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {

        Error_Handler();

    }

    

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|

                                  RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {

        Error_Handler();

    }

}


static void MX_GPIO_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};


    __HAL_RCC_GPIOD_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();

    

    /* Konfigurasi GPIO untuk LED */

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

    

    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    

    GPIO_InitStruct.Pin = GPIO_PIN_0;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    

    /* Konfigurasi GPIO untuk sensor */

    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}


void Error_Handler(void)

{

    __disable_irq();

    while (1) {}

}



5. Video Demo[Kembali]






6. Analisa[Kembali]

7. Download File[Kembali]

Download Rangkaian Klik Disini

Download Vidio Demo Klik Disini

Download Datasheet Mikrokontroler STM32F103C8 Klik Disini

Download Datasheet Push Button Klik Disini

Download Datasheet Buzzer Klik Disini

Download Vidio Simulasi Klik Disini