coding robot lengan
coding robot lengan
Page 1
main.c Tuesday, December 10, 2024, 9:13 AM
Page 2
main.c Tuesday, December 10, 2024, 9:13 AM
119 I2C_LCD_Display(MyI2C_LCD);
120 /* USER CODE END 2 */
121
122 /* Infinite loop */
123 /* USER CODE BEGIN WHILE */
124 while (1)
125 {
126 // Sensor pertama mendeteksi objek (mendeteksi objek)
127 readSensor1 = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);
128
129 // Sensor kedua mendeteksi objek (untuk reset hitungan)
130 readSensor2 = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
131
132 if (readSensor1 == 0) // Jika sensor pertama mendeteksi objek
133 {
134 jumlah++; // Kenaikan hitungan
135 I2C_LCD_Clear(MyI2C_LCD);
136 I2C_LCD_SetCursor(MyI2C_LCD, 1, 0);
137 I2C_LCD_WriteString(MyI2C_LCD, " Jumlah Botol: ");
138 I2C_LCD_SetCursor(MyI2C_LCD, 7, 7);
139
140 char buffer[16]; // Membuat array untuk menampung 16 karakter
141 sprintf (buffer, "%d", jumlah); // Konversi nilai integer
jumlah ke string
142 I2C_LCD_WriteString(MyI2C_LCD, buffer); // Menampilkan
hitungan
143
144 // Menggerakkan motor servo pada robot lengan
145 for(int i =45; i<120;i+=2){ // Menggerakkan servo ketiga dari
45 ke 120
146 PCA9685_SetServoAngle(2, i);
147 HAL_Delay(50);
148 }
149 HAL_Delay(1000);
150 for(int i =180; i>90;i-=2){ // Menggerakkan servo keempat
dari 180 ke 90
151 PCA9685_SetServoAngle(3, i);
152 HAL_Delay(50);
153 }
154 HAL_Delay(1000);
155 for(int i =90; i>45;i-=2){ // Menggerakkan servo ketiga dari
90 ke 45
156 PCA9685_SetServoAngle(2, i);
157 HAL_Delay(50);
158 }
159 HAL_Delay(1000);
160 for(int i =80; i>45;i-=2){ // Menggerakkan servo kedua dari 80
ke 45
161 PCA9685_SetServoAngle(1, i);
162 HAL_Delay(75);
163 }
164 HAL_Delay(1000);
165 PCA9685_SetServoAngle(4, 30); // Menggerakkan servo
kelima dari 0 ke 30
166 HAL_Delay(3000);
167 for(int i =45; i>90;i-=2){ // Menggerakkan servo kedua dari 45
ke 90
168 PCA9685_SetServoAngle(1, i);
169 HAL_Delay(75);
Page 3
main.c Tuesday, December 10, 2024, 9:13 AM
170 }
171 HAL_Delay(1000);
172 for(int i =45; i<140;i+=2){ // Menggerakkan servo servo ketiga
dari 45 ke 140
173 PCA9685_SetServoAngle(2, i);
174 HAL_Delay(50);
175 }
176 HAL_Delay(1000);
177 for(int i =90; i<180;i+=2){ // Menggerakkan servo keempat dari
90 ke 180
178 PCA9685_SetServoAngle(3, i);
179 HAL_Delay(25);
180 }
181 HAL_Delay(1000);
182 for(int i =0; i<120;i+=2){ // Menggerakkan servo pertama dari
0 ke 120
183 PCA9685_SetServoAngle(0, i);
184 HAL_Delay(50);
185 }
186 HAL_Delay(3000);
187 PCA9685_SetServoAngle(4, 0); // Menggerakkan servo kelima
dari 30 ke 0
188 HAL_Delay(3000);
189 for(int i =120; i>0;i-=2){ // Menggerakkan servo pertama dari
120 ke 0
190 PCA9685_SetServoAngle(0, i);
191 HAL_Delay(50);
192 }
193 HAL_Delay(3000);
194 for(int i =140; i>45;i-=2){ // Menggerakkan servo ketiga dari
140 ke 45
195 PCA9685_SetServoAngle(2, i);
196 HAL_Delay(25);
197 }
198 HAL_Delay(1000);
199 }
200 else if (readSensor2 == 0) // Jika sensor kedua mendeteksi objek
(untuk reset hitungan)
201 {
202 jumlah = 0; // Reset hitungan
203 I2C_LCD_Clear(MyI2C_LCD);
204 I2C_LCD_SetCursor(MyI2C_LCD, 5, 0);
205 I2C_LCD_WriteString(MyI2C_LCD, "Wadah"); // Menampilkan pesan
wadah sudah penuh
206 I2C_LCD_SetCursor(MyI2C_LCD, 2, 1);
207 I2C_LCD_WriteString(MyI2C_LCD, "Sudah Penuh");
208 HAL_Delay(2000); // Delay untuk memperlihatkan pesan reset
209 I2C_LCD_Clear(MyI2C_LCD); // Kosongkan layar LCD setelah reset
210 I2C_LCD_SetCursor(MyI2C_LCD, 1, 0);
211 I2C_LCD_WriteString(MyI2C_LCD, " Jumlah Botol: ");
212 I2C_LCD_SetCursor(MyI2C_LCD, 7, 7);
213 I2C_LCD_WriteString(MyI2C_LCD, "0 ");
214
215 }
216 else{
217 // Kembali ke posisi awal
218 PCA9685_SetServoAngle(0, 0);
219 PCA9685_SetServoAngle(1, 80);
220 PCA9685_SetServoAngle(2, 30);
Page 4
main.c Tuesday, December 10, 2024, 9:13 AM
Page 5
main.c Tuesday, December 10, 2024, 9:13 AM
Page 6
main.c Tuesday, December 10, 2024, 9:13 AM
339 }
340 /* USER CODE BEGIN I2C2_Init 2 */
341
342 /* USER CODE END I2C2_Init 2 */
343
344 }
345
346 /**
347 * @brief GPIO Initialization Function
348 * @param None
349 * @retval None
350 */
351 static void MX_GPIO_Init(void)
352 {
353 GPIO_InitTypeDef GPIO_InitStruct = {0};
354 /* USER CODE BEGIN MX_GPIO_Init_1 */
355 /* USER CODE END MX_GPIO_Init_1 */
356
357 /* GPIO Ports Clock Enable */
358 __HAL_RCC_GPIOC_CLK_ENABLE();
359 __HAL_RCC_GPIOH_CLK_ENABLE();
360 __HAL_RCC_GPIOB_CLK_ENABLE();
361
362 /*Configure GPIO pin Output Level */
363 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
364
365 /*Configure GPIO pin : PC13 */
366 GPIO_InitStruct.Pin = GPIO_PIN_13;
367 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
368 GPIO_InitStruct.Pull = GPIO_NOPULL;
369 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
370 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
371
372 /*Configure GPIO pins : PB4 PB5 */
373 GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
374 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
375 GPIO_InitStruct.Pull = GPIO_NOPULL;
376 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
377
378 /* USER CODE BEGIN MX_GPIO_Init_2 */
379 /* USER CODE END MX_GPIO_Init_2 */
380 }
381
382 /* USER CODE BEGIN 4 */
383
384 /* USER CODE END 4 */
385
386 /**
387 * @brief This function is executed in case of error occurrence.
388 * @retval None
389 */
390 void Error_Handler(void)
391 {
392 /* USER CODE BEGIN Error_Handler_Debug */
393 /* User can add his own implementation to report the HAL error return state */
394 __disable_irq();
395 while (1)
396 {
397 }
Page 7
main.c Tuesday, December 10, 2024, 9:13 AM
Page 8