0% found this document useful (0 votes)
16 views7 pages

coding motor servo UART

The document is a C source code file for a microcontroller application that controls servo motors using the PCA9685 driver and communicates via UART. It includes initialization functions for I2C and UART, sets up the system clock, and contains a main loop that continuously adjusts the angles of multiple servos while transmitting their positions over UART. The code is structured with user-defined sections for easy modification and includes error handling routines.

Uploaded by

Majid Mumtaz
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views7 pages

coding motor servo UART

The document is a C source code file for a microcontroller application that controls servo motors using the PCA9685 driver and communicates via UART. It includes initialization functions for I2C and UART, sets up the system clock, and contains a main loop that continuously adjusts the angles of multiple servos while transmitting their positions over UART. The code is structured with user-defined sections for easy modification and includes error handling routines.

Uploaded by

Majid Mumtaz
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

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

You might also like