main.
c Tuesday, December 10, 2024, 9:11 AM
1 /* USER CODE BEGIN Header */
2 /**
3 ******************************************************************************
4 * @file : main.c
5 * @brief : Main program body
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2024 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 */
18 /* USER CODE END Header */
19 /* Includes ------------------------------------------------------------------*/
20 #include "main.h"
21
22 /* Private includes ----------------------------------------------------------*/
23 /* USER CODE BEGIN Includes */
24 #include "math.h"
25 #include "pca9685.h"
26 /* USER CODE END Includes */
27
28 /* Private typedef -----------------------------------------------------------*/
29 /* USER CODE BEGIN PTD */
30
31 /* USER CODE END PTD */
32
33 /* Private define ------------------------------------------------------------*/
34 /* USER CODE BEGIN PD */
35
36 /* USER CODE END PD */
37
38 /* Private macro -------------------------------------------------------------*/
39 /* USER CODE BEGIN PM */
40
41 /* USER CODE END PM */
42
43 /* Private variables ---------------------------------------------------------*/
44 I2C_HandleTypeDef hi2c1;
45
46 UART_HandleTypeDef huart2;
47 #define BUFFER_SIZE 50
48
49 uint8_t uartBuffer[BUFFER_SIZE];
50 int currentServoAngle1=0;
51 int currentServoAngle2=0;
52 int currentServoAngle3=0;
53 int currentServoAngle4=0;
54 int currentServoAngle5=0;
55
56 /* USER CODE BEGIN PV */
57
58 /* USER CODE END PV */
59
Page 1
main.c Tuesday, December 10, 2024, 9:11 AM
60 /* Private function prototypes -----------------------------------------------*/
61 void SystemClock_Config(void);
62 static void MX_GPIO_Init(void);
63 static void MX_I2C1_Init(void);
64 static void MX_USART2_UART_Init(void);
65 /* USER CODE BEGIN PFP */
66
67 /* USER CODE END PFP */
68
69 /* Private user code ---------------------------------------------------------*/
70 /* USER CODE BEGIN 0 */
71
72 /* USER CODE END 0 */
73
74 /**
75 * @brief The application entry point.
76 * @retval int
77 */
78 int main(void)
79 {
80
81 /* USER CODE BEGIN 1 */
82
83 /* USER CODE END 1 */
84
85 /* MCU Configuration--------------------------------------------------------*/
86
87 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
88 HAL_Init();
89
90 /* USER CODE BEGIN Init */
91
92 /* USER CODE END Init */
93
94 /* Configure the system clock */
95 SystemClock_Config();
96
97 /* USER CODE BEGIN SysInit */
98
99 /* USER CODE END SysInit */
100
101 /* Initialize all configured peripherals */
102 MX_GPIO_Init();
103 MX_I2C1_Init();
104 MX_USART2_UART_Init();
105 /* USER CODE BEGIN 2 */
106 PCA9685_Init(&hi2c1);
107 PCA9685_SetServoAngle(0, 0);
108 PCA9685_SetServoAngle(1, 80);
109 PCA9685_SetServoAngle(2, 30);
110 PCA9685_SetServoAngle(3, 180);
111 PCA9685_SetServoAngle(4, 0);
112 /* USER CODE END 2 */
113
114 /* Infinite loop */
115 /* USER CODE BEGIN WHILE */
116 while (1)
117 {
118 {
Page 2
main.c Tuesday, December 10, 2024, 9:11 AM
119 for(int i =45; i<120;i+=2){
120 PCA9685_SetServoAngle(2, i);
121 HAL_Delay(100);
122 }
123 HAL_Delay(1000);
124 for(int i =180; i>90;i-=2){ //menggerakkan servo 4 dari 180 ke 90
125 PCA9685_SetServoAngle(3, i);
126 currentServoAngle4 = i;
127 HAL_Delay(50);
128
129 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 4 %d\n"
,currentServoAngle4);
130 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
131 HAL_Delay(100);
132 }
133 HAL_Delay(1000);
134 for(int i =90; i>45;i-=2){ //menggerakkan servo 3 dari 90 ke 45
135 PCA9685_SetServoAngle(2, i);
136 currentServoAngle3 = i;
137 HAL_Delay(50);
138
139 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 3 %d\n"
,currentServoAngle3);
140 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
141 HAL_Delay(100);
142 }
143 HAL_Delay(1000);
144 for(int i =80; i>45;i-=2){ //menggerakkan servo 2 dari 80 ke 45
145 PCA9685_SetServoAngle(1, i);
146 currentServoAngle2 = i;
147 HAL_Delay(100);
148
149 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 2 %d\n"
,currentServoAngle2);
150 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
151 HAL_Delay(100);
152 }
153 HAL_Delay(1000);
154 PCA9685_SetServoAngle(4, 30);
155 HAL_Delay(2000);
156
157 for(int i =45; i<90;i+=2){ //menggerakkan servo 2 dari 45 ke 90
158 PCA9685_SetServoAngle(1, i);
159 currentServoAngle2 = i;
160 HAL_Delay(100);
161
162 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 2 %d\n"
,currentServoAngle2);
163 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
164 HAL_Delay(100);
165 }
166 HAL_Delay(1000);
167 for(int i =45; i<140;i+=2){ //menggerakkan servo 3 dari 45 ke 140
168 PCA9685_SetServoAngle(2, i);
169 currentServoAngle3 = i;
Page 3
main.c Tuesday, December 10, 2024, 9:11 AM
170 HAL_Delay(50);
171
172 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 3 %d\n"
,currentServoAngle3);
173 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
174 HAL_Delay(100);
175 }
176 HAL_Delay(1000);
177 for(int i =90; i<180;i+=2){ //menggerakkan servo 4 dari 90 ke 180
178 PCA9685_SetServoAngle(3, i);
179 currentServoAngle4 = i;
180 HAL_Delay(50);
181
182 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 4 %d\n"
,currentServoAngle4);
183 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
184 HAL_Delay(100);
185 }
186 HAL_Delay(1000);
187 for(int i =0; i<120;i+=2){ //menggerakkan servo 1 dari 0 ke 120
188 PCA9685_SetServoAngle(0, i);
189 currentServoAngle1 = i;
190 HAL_Delay(50);
191
192 sprintf((char *)uartBuffer, BUFFER_SIZE, "Servo 1 %d\n"
,currentServoAngle1);
193 HAL_UART_Transmit(&huart2, uartBuffer, strlen((char *)uartBuffer),
HAL_MAX_DELAY);
194 HAL_Delay(100);
195 }
196 HAL_Delay(3000);
197 PCA9685_SetServoAngle(4, 0);
198 HAL_Delay(3000);
199 for(int i =120; i>0;i-=2){
200 PCA9685_SetServoAngle(0, i);
201 HAL_Delay(50);
202 }
203 HAL_Delay(3000);
204 for(int i =140; i>45;i-=2){
205 PCA9685_SetServoAngle(2, i);
206 HAL_Delay(25);
207 }
208 HAL_Delay(1000);
209
210
211 }
212 }
213 /* USER CODE END WHILE */
214
215 /* USER CODE BEGIN 3 */
216
217 /* USER CODE END 3 */
218 }
219
220 /**
221 * @brief System Clock Configuration
222 * @retval None
Page 4
main.c Tuesday, December 10, 2024, 9:11 AM
223 */
224 void SystemClock_Config(void)
225 {
226 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
227 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
228
229 /** Configure the main internal regulator output voltage
230 */
231 __HAL_RCC_PWR_CLK_ENABLE();
232 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
233
234 /** Initializes the RCC Oscillators according to the specified parameters
235 * in the RCC_OscInitTypeDef structure.
236 */
237 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
238 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
239 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
240 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
241 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
242 RCC_OscInitStruct.PLL.PLLM = 8;
243 RCC_OscInitStruct.PLL.PLLN = 100;
244 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
245 RCC_OscInitStruct.PLL.PLLQ = 4;
246 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
247 {
248 Error_Handler();
249 }
250
251 /** Initializes the CPU, AHB and APB buses clocks
252 */
253 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
254 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
255 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
256 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
257 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
258 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
259
260 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
261 {
262 Error_Handler();
263 }
264 }
265
266 /**
267 * @brief I2C1 Initialization Function
268 * @param None
269 * @retval None
270 */
271 static void MX_I2C1_Init(void)
272 {
273
274 /* USER CODE BEGIN I2C1_Init 0 */
275
276 /* USER CODE END I2C1_Init 0 */
277
278 /* USER CODE BEGIN I2C1_Init 1 */
279
280 /* USER CODE END I2C1_Init 1 */
281 hi2c1.Instance = I2C1;
Page 5
main.c Tuesday, December 10, 2024, 9:11 AM
282 hi2c1.Init.ClockSpeed = 100000;
283 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
284 hi2c1.Init.OwnAddress1 = 0;
285 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
286 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
287 hi2c1.Init.OwnAddress2 = 0;
288 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
289 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
290 if (HAL_I2C_Init(&hi2c1) != HAL_OK)
291 {
292 Error_Handler();
293 }
294 /* USER CODE BEGIN I2C1_Init 2 */
295
296 /* USER CODE END I2C1_Init 2 */
297
298 }
299
300 /**
301 * @brief USART2 Initialization Function
302 * @param None
303 * @retval None
304 */
305 static void MX_USART2_UART_Init(void)
306 {
307
308 /* USER CODE BEGIN USART2_Init 0 */
309
310 /* USER CODE END USART2_Init 0 */
311
312 /* USER CODE BEGIN USART2_Init 1 */
313
314 /* USER CODE END USART2_Init 1 */
315 huart2.Instance = USART2;
316 huart2.Init.BaudRate = 115200;
317 huart2.Init.WordLength = UART_WORDLENGTH_8B;
318 huart2.Init.StopBits = UART_STOPBITS_1;
319 huart2.Init.Parity = UART_PARITY_NONE;
320 huart2.Init.Mode = UART_MODE_TX_RX;
321 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
322 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
323 if (HAL_UART_Init(&huart2) != HAL_OK)
324 {
325 Error_Handler();
326 }
327 /* USER CODE BEGIN USART2_Init 2 */
328
329 /* USER CODE END USART2_Init 2 */
330
331 }
332
333 /**
334 * @brief GPIO Initialization Function
335 * @param None
336 * @retval None
337 */
338 static void MX_GPIO_Init(void)
339 {
340 /* USER CODE BEGIN MX_GPIO_Init_1 */
Page 6
main.c Tuesday, December 10, 2024, 9:11 AM
341 /* USER CODE END MX_GPIO_Init_1 */
342
343 /* GPIO Ports Clock Enable */
344 __HAL_RCC_GPIOH_CLK_ENABLE();
345 __HAL_RCC_GPIOA_CLK_ENABLE();
346 __HAL_RCC_GPIOB_CLK_ENABLE();
347
348 /* USER CODE BEGIN MX_GPIO_Init_2 */
349 /* USER CODE END MX_GPIO_Init_2 */
350 }
351
352 /* USER CODE BEGIN 4 */
353
354 /* USER CODE END 4 */
355
356 /**
357 * @brief This function is executed in case of error occurrence.
358 * @retval None
359 */
360 void Error_Handler(void)
361 {
362 /* USER CODE BEGIN Error_Handler_Debug */
363 /* User can add his own implementation to report the HAL error return state */
364 __disable_irq();
365 while (1)
366 {
367 }
368 /* USER CODE END Error_Handler_Debug */
369 }
370
371 #ifdef USE_FULL_ASSERT
372 /**
373 * @brief Reports the name of the source file and the source line number
374 * where the assert_param error has occurred.
375 * @param file: pointer to the source file name
376 * @param line: assert_param error line source number
377 * @retval None
378 */
379 void assert_failed(uint8_t *file, uint32_t line)
380 {
381 /* USER CODE BEGIN 6 */
382 /* User can add his own implementation to report the file name and line number,
383 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
384 /* USER CODE END 6 */
385 }
386 #endif /* USE_FULL_ASSERT */
387
Page 7