안녕하세요~~

오늘은 KG_KAIROS 통합프로젝트에서 진행하는 사항들 중
제가 맡은 부분에 대해 포스팅하려 합니다.
팀 내에서 저의 역할은
팀장 + 장치 간 통신 + 회로 설계 + 리프트 제어 + SubRobotArm S/W설계
오늘 저의 역할은 SubRobotArm에서 F/W설계를 했습니다.

업무: mg996r 서보 모터 6개를 이용한 6축 로봇암 만들기
1단계 : 회로설계 (완)
- VCC, GND, pin으로 되어있으니까 어렵진 않아요
2단계 : CUBE IDE Setup
- 제어용 통신 전공에서 3학년 2학기에 했었어서 할만했어요
- clock설정이랑 hz 세팅은 조금 어려웠는데.. 하다 보니...
3단계 : ISR이랑 메인문 작성 정도?
- 이것도 기억 더듬어가면 할만했습니다.

기능 : 로봇암 구동 및 그릇 파지
주 기능은 컨베이어의 그릇을 AGV에 옮겨주는 작업입니다.
AGV(라즈베리파이) 위에 리프트를 올리는데
리프트 위에 서브 로봇암을 올릴 예정

서브 로봇암의 역할??
컨베이어벨트에 놓인 그릇을 집어서 AGV로 옮기고
AGV가 메인 로봇암이 있는 환자에게 전달
이렇게 나열하는 건 쉬운데
막상 구현하고 WebSocket 만들고 서버 만들고
데이터 주고받고 이벤트 처리하고
하는 게... 어렵.. 읍읍
이슈: AGV와 STM32 EXTI제어 시 모터 안 움직임...

AGV에 꽂아서 테스트하기엔 SC도 맵핑해야 해서...
간단하게 아두이노!!!
아두이노가 진짜 테스트하기엔 너무 편해요..ㅎㅎ
내가 생각한 원인 3가지
1. Rising edge => Pull_down에서 High신호가 제대로 안 먹나?
2. 외부전원 배터리 6V가 부족할 수 있다.
3. interrupt가 제대로 안 먹었다.
가보자.
1. High신호 안 먹나?

EXTI3,4 핀에 점퍼선을 하나 더 빼서 프로브에 집어봤습니다
근데 ch1, ch2다 Rising 펄스 잘만 들어오고 HIGH신호 잘 받는데...
근데 ch2는 왜 이리 폭이 크지...?
1번은 원인 아님 밝혀짐.
200mV랑 5V로 보니까 그나마 나아졌습니다.
자, 다음!!!
2. 배터리 부족한가??

서보모터가 지글지글 소리를 냈습니다!! 1
그러면 위글위글~~ ㅈㅅ//
서보모터 6개가 전류를 좀 많이 먹는 게 아니니까...
6V배터리를 병렬로 꽂아서 쫌 줘봤습니다.
마찬가지로 LED도 전압 뺏어가니까 다 빼버리기!!!
그리고 회로를 아래처럼 바꿨어요
2번으로 바꿔도 결국 인터럽트 제대로 안 도는 건 똑같...
인터럽트 없이 메인문 제어로 확인해봤어요.
2번도 패스...
자 대망의 3번!!
그냥 코드 문제...ㅎ
과연???
.
.
.
네.... 맞아요...

인터럽트 서비스 루틴(ISR)에는 딜레이 주면 안 되는데 주었더라고요??
뭐 되긴 할 텐데 탈출해야 하는데..ㅎ
전체 시스템이 멈춰있는 상태가 되는거죸ㅋㅍㅋㅋㅍㅋㅍ
하.. 학교 마이크로 컴퓨터 수업에서 배운 거 스멀스멀 기억나네...
메인문 안에다가 exti 트리거를 박아주고
while (1)
{
if (exti3_triggered) {
exti3_triggered = 0;
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 120);
HAL_Delay(100);
}
if (exti4_triggered) {
exti4_triggered = 0;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 90);
HAL_Delay(100);
}
}
EXTI 인터럽트 콜백 쪽에 조건을 걸어줬습니다!!!
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_3) {
exti3_triggered = 1;
} else if (GPIO_Pin == GPIO_PIN_4) {
exti4_triggered = 1;
}
}
정리하자면
HAL_GPIO_EXTI_Callback()에서는 인터럽트 발생을 나타내는 플래그만 설정해줬습니다!!
그리고 ISR의 간결성과 시스템 응답성 요걸 해냈다고 할 수 있죠!!
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 120);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 120);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 120);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 120);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 120);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 120);
그럼 요골로 추가해 주고
아두이노에서 GPIO_3 => HIGH, GPIO_4 => HIGH 주면 돌아갑니다~~

이 맛에 코딩한다...
디버그 과정이 너무너무 싫지만, 해결되면 히히 헤헤하는 기분 좋음.
그리고 뭔가... 미숙하지만 할 줄은 알고, 그렇다고 미숙하지만은 않은 듯한 나 자신?
자아도취.ㅋㅋㅍㅋㅍㅋㅍㅋㅍ

문제해결 자체가 행복합니다~~ 오늘도 많이 배운 하루였습니다.
그럼 다음에 뵙겠습니다.
'프로젝트 > 스마트 요양 지원 시스템 (RoboCare) : 노약자와 장애인 돌봄' 카테고리의 다른 글
⚠️AGV SERIAL TEST (0) | 2024.11.22 |
---|---|
⚠️sub RobotArm_CUBEIDE 셋업 과정 (끄적끄적) (0) | 2024.11.13 |
🔄Raspberry Pi 와 Arduino UART 통신하기 (0) | 2024.10.18 |
⚠️AGV SERIAL TEST(고민과정 끄적끄적) (0) | 2024.10.18 |
스마트 요양 지원 시스템 RoboCare : 프로젝트 기획2 (주제 선정) (2) | 2024.09.30 |