Laporan Akhir M3




Percobaan 1
1. Prosedur
[Kembali]

  1. Persiapan Komponen:

    • Siapkan dua board STM32 (misalnya STM32F103C8T6 ).

    • Siapkan breadboard, push button (4 buah), LED (4 buah), resistor (untuk LED dan pull-down button), serta jumper wire.

  2. Perakitan Rangkaian:

    • Hubungkan keempat push button ke pin input digital pada STM32 pertama , dan sambungkan resistor pull-down ke GND.

    • Hubungkan empat LED ke pin output digital STM32 kedua melalui resistor sebagai pembatas arus, lalu hubungkan ke GND.

    • Hubungkan pin TX dari STM32 pertama ke pin RX STM32 kedua, dan pin RX STM32 pertama ke pin TX STM32 kedua (koneksi silang UART).

    • Pastikan kedua STM32 memiliki sambungan GND yang sama agar referensi tegangan sinkron.

  3. Pemrograman STM32:

    • STM32 pertama diprogram untuk membaca input dari push button, kemudian mengirimkan data (karakter/angka tertentu) melalui UART sesuai tombol yang ditekan.

    • STM32 kedua diprogram untuk membaca data UART yang masuk, lalu menyalakan LED yang sesuai berdasarkan data tersebut.

  4. Upload Program:

    • Upload kode ke masing-masing STM32 menggunakan USB to Serial (USB TTL) atau ST-Link.

  5. Pengujian:

    • Hubungkan catu daya (melalui USB atau eksternal) ke kedua STM32.

    • Tekan salah satu tombol pada STM32 pertama.

    • Perhatikan LED pada STM32 kedua — LED akan menyala sesuai tombol yang ditekan.

  6. Validasi Fungsi:

    • Ulangi langkah penekanan tombol dengan berbagai kombinasi untuk memastikan semua komunikasi UART berjalan dengan baik dan setiap tombol memicu LED yang benar.



2. Hardware dan Diagram Blok [Kembali]
  • STM32
STM32 adalah keluarga mikrokontroler berbasis arsitektur ARM Cortex yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini memiliki performa tinggi, konsumsi daya rendah, serta fitur periferal yang lengkap, seperti ADC (Analog to Digital Converter), komunikasi serial (UART, SPI, I2C), dan GPIO yang dapat dikonfigurasi sesuai kebutuhan. STM32 sering digunakan dalam sistem tertanam (embedded systems) untuk berbagai aplikasi, termasuk otomasi, robotika, dan perangkat IoT.
  • Breadboard


  • Breadboard adalah sebuah papan yang digunakan untuk merancang dan menguji rangkaian elektronik secara sementara tanpa perlu menyolder komponen. Breadboard memungkinkan perakitan rangkaian secara cepat dan mudah, sehingga sangat berguna dalam prototyping dan eksperimen elektronik.

  • Jumper 


  • Kabel jumper Male to Male adalah kabel yang memiliki konektor jantan (male) di kedua ujungnya. Kabel ini biasanya digunakan untuk menghubungkan pin pada board elektronik, seperti Raspberry Pi, Arduino, atau breadboard, dengan komponen lainnya. Kabel jumper male to male sering digunakan dalam rangkaian prototyping atau percobaan karena fleksibilitas dan kemudahannya untuk digunakan.

  • Push Button
Push button adalah saklar atau tombol yang digunakan untuk menghubungkan atau memutuskan sirkuit listrik. Tombol ini biasanya bersifat sementara (momentary), yang berarti ketika tombol ditekan, arus listrik akan mengalir, dan ketika tombol dilepaskan, arus listrik akan terputus. Fungsi utama push button adalah untuk memberikan input atau perintah ke sistem. Dalam rangkaian ini, push button dapat digunakan untuk mengaktifkan atau mengubah status sistem, seperti memulai pembacaan sensor kelembaban tanah atau mengubah mode kerja rangkaian.


  • Resistor

Resistor adalah komponen elektronik yang digunakan untuk membatasi atau mengatur aliran arus listrik dalam suatu rangkaian. Resistor bekerja dengan cara menambah hambatan pada rangkaian, yang bergantung pada nilai resistansi yang diberikan (dalam ohm). Resistor berfungsi untuk mengatur arus listrik yang mengalir pada komponen lain, seperti LED RGB atau sensor. Dalam rangkaian ini, resistor digunakan untuk melindungi LED RGB dari aliran arus yang berlebihan, serta untuk menyesuaikan sinyal yang diterima oleh sensor kelembaban tanah.

  • LED
    sebagai ouput atau keluaran nanti nya





3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]


Prinsip Kerja :
Prinsip kerja dari rangkaian ini adalah saat salah satu tombol pada STM32 pertama ditekan, sinyal digital akan dikirimkan melalui jalur UART ke STM32 kedua. STM32 penerima kemudian akan memproses data tersebut dan mengaktifkan LED tertentu sebagai respon terhadap tombol yang ditekan. Komunikasi UART ini memanfaatkan pin TX (transmit) dan RX (receive) pada kedua STM32 yang saling terhubung secara silang (TX ke RX dan RX ke TX).

Output dari rangkaian ini berupa LED yang menyala sebagai respon dari tombol yang ditekan pada STM32 pengirim. Ketika sebuah tombol ditekan, STM32 pertama akan mengirimkan data melalui komunikasi UART ke STM32 kedua. Data yang dikirim berisi informasi mengenai tombol mana yang ditekan. STM32 penerima kemudian akan membaca data tersebut, memprosesnya, dan mengaktifkan LED tertentu yang sesuai dengan tombol tersebut.

Sebagai contoh, jika tombol pertama ditekan, STM32 pengirim akan mengirimkan kode tertentu (misalnya karakter atau angka) melalui jalur TX. STM32 penerima yang terhubung ke jalur RX akan menerima data tersebut dan menyalakan LED pertama. Begitu pula untuk tombol kedua, ketiga, dan keempat yang masing-masing akan menyalakan LED kedua, ketiga, dan keempat.




4. Flowchart dan Listing Program [Kembali]
Flowchart :



Listing Program :
Pada Tx 
#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) 
UART_HandleTypeDef huart1; 
uint8_t receivedData[4]; 
#ifdef USE_FULL_ASSERT 
void assert_failed(uint8_t *file, uint32_t line) 
#endif 
Pada Rx 
#include "main.h"
 
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 Video Demo Disini


Tidak ada komentar:

Posting Komentar