2022. 11. 4. 00:30ㆍIT
로봇 동작시키기
로봇의 동작은 전진, 후진, 좌회전, 우회전, 180도 회전 등으로 나눌 수 있을 것이다. L298N은 각도 조절을 할 수 없기 때문에 경험치에 의해서 각도를 조절해 보려고 한다. 우선 배터리의 전압에 따라서도 회전 속도가 달라지니 각자 테스트를 해 보는 수 밖에 없을 것이다. 모터의 회전 자체는 변경을 할 수 있는데 여기서는 속도는 기본으로 두고 진행을 할 예정이다. 100% 배터리가 충전이 되었을 때 테스트를 하는 것이 좋겠다. 배터리가 많이 닳아 있는 상태라면 100% 충전이 되었을 경우 예상보다 더 회전을 할 수 있을 것이다.
void loop() {
Robot_RightTurn();
Robot_LeftTurn();
Robot_180Turn();
}
/*
* 로봇을 180도 회전시킨다
*/
void Robot_180Turn(){
Serial.println("로봇 180도 회전");
digitalWrite(LeftWheel_D1, HIGH);
digitalWrite(LeftWheel_D2, LOW);
digitalWrite(RightWheel_D3, LOW);
digitalWrite(RightWheel_D4, HIGH);
delay(530);
Robot_Stop();
delay(250);
}
/*
* 로봇을 오른쪽으로 회전시킨다
*/
void Robot_RightTurn(){
Serial.println("로봇 우회전");
digitalWrite(LeftWheel_D1, LOW);
digitalWrite(LeftWheel_D2, HIGH);
digitalWrite(RightWheel_D3, HIGH);
digitalWrite(RightWheel_D4, LOW);
delay(300);
Robot_Stop();
elay(250);
}
/*
* 로봇을 왼쪽으로 회전시킨다
*/
void Robot_LeftTurn(){
Serial.println("로봇 좌회전");
digitalWrite(LeftWheel_D1, HIGH);
digitalWrite(LeftWheel_D2, LOW);
digitalWrite(RightWheel_D3, LOW);
digitalWrite(RightWheel_D4, HIGH);
delay(300);
Robot_Stop();
delay(250);
}
우회전을 할 때에는 우측 바퀴는 멈춘 상태에서 좌측바퀴만 정방향 회전을 시켜 우회전을 했다. 그런데 왼쪽 바퀴를 정방향으로 오른쪽 바퀴를 역방향으로 회전을 시키면 더욱 빠르게 회전을 할 수 있기 때문에 앞의 코드와 같이 좌회전 및 우회전시 정방향과 역방향 회전을 주도록 수정을 했다.
명령을 실행을 하고 일정 시간이 지난 후에 Robot_Stop으로 멈췄는데 좌,우 90도 회전에 약 300 미리가 적당하며 180도 회전시에는 530미리로 측정이 되어 위와 같이 함수를 180도 회전 함수를 하나 추가했다. 경험치로 작성을 했다.
Robot_Stop을 호출하고 다시 250미리의 delay를 둔 것은 모터가 멈추고 다시 반대 방향으로 회전을 할 때를 대비한 것이다. delay 없이 반대 방향으로 돌리게 되면 원하는 각도 만큼 회전이 되지 않는다.
서보 모터와 초음파 센서의 결합
지금까지 로봇을 움직이기 위한 모든 준비가 끝이 났다. 여기서 서보 모터와 초음파 센서를 어떻게 활용을 할 것인지 확인을 해 보자.
기본적으로 로봇은 움직이기 전에 전방에 장애물을 확인해야 한다. 장애물이 없으면 앞으로 전진 그리고 다시 장애물 확인을 하는 과정을 거친다. 만일 장애물을 만나면 좌, 우측에 장애물이 있는지 거리를 측정한다. 거리를 측정해서 전방 및 좌우에 장애물이 있다면 180도 회전해서 전진을 하면 된다. 그리고 좌, 우측 중에서 하나라도 장애물이 없는 방향이 있다면 두 방향 중에서 장애물이 먼 곳에 있는 쪽으로 회전을 하고 전진을 시키도록 프로그래밍을 하려고 한다.
여기서 서보 모터와 초음파 센서가 결합을 해서 서보 모터에 초음파 센서를 달고 원하는 방향으로 서보 모터를 돌린 후, 초음파 센서로 거리를 측정하도록 할 것이다. 앞에서 이미 서보 모터의 활용 방법과 초음파 센서의 활용 방법에 대해서는 테스트를 했다.
여기서는 Detect_Object라는 함수를 만들어 우측과 좌측의 장애물과의 거리를 측정하고자 한다. 서보 모터는 0에서 179도까지 입력을 할 수 있다. 그래서 0도로 설정을 하면 오른쪽이 되고 179로 설정을 하면 왼쪽이 된다. servo.write를 이용해서 회전을 시킨다. 회전 명령을 주고 모터가 회전을 충분한 시간을 주기 위해서 250미리의 delay를 준다. 그리고 sensor_distance라는 함수를 호출해서 로봇의 오른쪽 방향의 물체까지의 거리를 측정한다. 동일한 방법으로 서보 모터를 179도 회전하고 거리를 측정한다.
/*
* 좌, 우 거리를 각각 구한다
*/
void Detect_Object(){
servo.write(0);
delay(250);
distanceRight = sensor_distance();
servo.write(179);
delay(250);
distanceLeft = sensor_distance();
}
/*
* 정면의 거리를 구한다
*/
void Detect_Front(){
servo.write(90);
delay(250);
distanceFront = sensor_distance();
}
Detect_Object가 좌, 우의 거리를 측정했다. Detect_Front는 정면의 거리를 측정한다. 정면과 좌, 우를 구분한 이유는 정면으로 전진을 하는 경우가 많고 좌우를 측정할 경우는 전방에 장애물이 감지가 되었을 경우에 한하기 때문이다.
sensor_distance 함수는 이미 앞에서 살펴봤기 때문에 설명은 생략을 한다.
이상 동작
앞에서 아두이노를 USB로 연결을 하고 프로그램을 다운로드 받아 실행을 했을 때, 모터를 동작 시켰음에도 모터가 동작하지 않는 경우가 있었다. USB로 아두이노에 공급되는 전원이 부족해서 모터를 돌릴 수 없기 때문이다.
그런데 여기에 서보 모터까지 동작을 시키면 서보 모터가 이상 동작을 하는 경우가 있다. USB 케이블을 꽂은 상태에서는 물론이고 배터리 전원을 사용할 때에도 마찬가지로 이상 동작을 하는 경우가 있다. 설정한 값 만큼 회전을 하지 않거나 아니면 정해진 각도로 회전을 하는데 덜덜 떠는 듯 정방향 역방향으로 약간씩 움직이며 회전을 하는 경우다. 전원을 배터리에 바로 연결을 해도 문제가 발생할 경우는 네 개의 바퀴가 모두 돌아가고 서보 모터까지 같이 동작을 할 경우이다. 구글링을 해 보면 Capacitor(콘덴서)를 달아서 문제를 해결 했다는 경험을 찾을 수 있다. Capacitor는 전기를 저장하고 있다가 전원을 많이 쓸 때 안정적인 전원을 공급하는 역할을 한다.
다음과 같이 연결을 하면 서보 모터의 이상 동작을 해결 할 수 있다. 추천하는 Capacitor는 25v 470uF이다. 인터넷에서 검색을 하면 250원 정도면 살 수 있다.
그런데 마침 가지고 있는 Capacitor가 없어 220uF 두개를 다음의 사진과 같이 연결을 해서 사용했다.
다음은 초음파 센서의 측정 값이 가끔 이상하게 튀는 값들을 보내 준다는 것인데 전원 공급이 안정이 되고 나서는 크게 튀는 값이 보이지 않아 그냥 두기로 했다. 하지만 혹시라도 문제가 된다면 다음의 웹 사이트를 방문해 NewPing이라는 별도의 라이브러리를 사용해 보도록 하자.
'IT' 카테고리의 다른 글
#9/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
---|---|
#8/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
#6/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
#5/12 아두이노 로봇 HowTo (0) | 2022.11.04 |
#4/12 아두이노 로봇 HowTo (0) | 2022.11.04 |