카테고리 없음
아두이노 탱크
IT1004
2021. 6. 29. 13:04
#무선탱크 #아두이노 #C
1. 개요
- 유선 탱크를 무선탱크로 변경하여 스마트폰 앱을 활용하여 제어해 보기
2. 준비
품명 | 수량 |
HC06 블루투스 모듈 | 1EA |
L9110모터드라이브 | 1EA |
배터리홀더(3xAAA)or(4xAAA) | 1EA 필요시(선택사항) |
배터리 스냅 케이블 (9V) | 1EA |
아두이노 나노 | 1EA |
미니브레드보드 | 1EA |
건전지9v | 1EA |
건전지AAA | 3EA |
CR2032 x 2 배터리홀더 | 1EA 필요시(선택사항) |
M1A1 탱크 (아카데미) 2CH | 1EA |
점퍼케이블 | - |
3-1. 하드웨어(탱크body)만들기
3-2. 아두이노 배선
DFROBOT L293 모터 쉴드를 이용
![]() |
최초 아두이노 UNO와 L293 모터 쉴드를 이용하여 제작 하였으나 공간을 많이 차지하여 확장성이 용이하지 않았고, 덥게를 닫는것도 쉽지 않아서 다른 방안을 모색하다 아두이노 Nano와 L9110모터 드라이브, 9V 2개 로 대체함. |
배치도(UNO)
![]() |
배치도(Nano)
![]() |
![]() |
![]() |
L9110 모터 드라이브 | 아두이노UNO 와 L9110 모터 드라이브 장착한 모습 |
![]() |
덥게를 덮었지만 그래도 뭔가 큰느낌.... |
![]() |
아두이노 Nano와 L9110 모터 드라이브 장착한 모습 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
AAA * 3 을 모터드라이브의 보조 전원으로 연결한 경우 |
![]() |
AA * 4 을 모터드라이브의 보조 전원으로 연결한 경우 |
4. 소프트웨어만들기
코드
/**
* 기존 버전 수정
* 1.5V * 3 사용시 앞으로 전진 양호 / 후진 양호 / 왼쪽(오른쪽모터동작)양호/ 오른쪽(왼쪽모터 동작) 불량: 기어나사가 헛돈다)
* atmega328d(old bootloader)
* 변경 : 20210629 : 왼쪽 오른쪽 변경
*
*/
#include <SoftwareSerial.h>
/* L9110s 모터드라이버
오른쪽모터
L9110s A_1A 6
L9110s A_1B 11
왼쪽모터
L9110s B_1A 3
L9110s B_1B 5
*/
int A_1A = 6;
int A_1B = 10;
int B_1A = 3;
int B_1B = 5;
/*
HC-06 블루투스 모듈
주의: 시리얼통신은 반드시 엇갈려 꽂혀야 합니다.
HC-06 RX - D13
HC-06 TX - D12
*/
int btRxPin = 11;
int btTxPin = 12;
/*
* 블루투스를 사용하기 위해 소프트웨어시리얼을 실행합니다.
* 주의 : 시리얼 통신은 반드시 엇갈려서 연결해야합니다.
* 블루투스 RX -> 아두이노 TX
* 블루투스 TX -> 아두이노 RX
*/
String myString=""; //받는 문자열
char cmd = "";
SoftwareSerial bluetoothSerial(btRxPin, btTxPin);
int speed = 170;
void setup() {
// 블루투스를 baud rate 9600으로 시작합니다.
bluetoothSerial.begin(9600);
Serial.begin(9600); //시리얼모니터
//핀을 초기화합니다.
//L298 모터드라이버의 핀들을 출력으로 변경합니다.
pinMode(A_1A, OUTPUT);
pinMode(A_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
digitalWrite(A_1A, LOW);
digitalWrite(A_1B, LOW);
digitalWrite(B_1A, LOW);
digitalWrite(B_1B, LOW);
}
/**
함수내 코드가 무한히 실행됩니다.
*/
void loop() {
/*
'f' - 전진명령(forward)
'b' - 후진명령(back)
'l' - 왼쪽명령(left)
'r' - 오른쪽명령(right)
's' - 정지명령(stop)
*/
while(bluetoothSerial.available()) //mySerial에 전송된 값이 있으면
{
cmd = (char)bluetoothSerial.read();
myString += cmd;
delay(5); //수신 문자열 끊김 방지
}
if(!myString.equals("")) //myString 값이 있다면
{
Serial.println("input value: " + myString); //시리얼모니터에 myString값 출력
myString = ""; //myString 변수값 초기화
}
switch (cmd) {
case 'f':
//Serial.println("F " );
//모터A 정회전
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
//모터B 정회전
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
break;
case 'b':
//모터A 역회전
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
//모터B 역회전
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
break;
case 'r':
//모터A 역회전
analogWrite(A_1A, 0);
//analogWrite(A_1B, 0);
analogWrite(A_1B, speed); //20210629
//모터B 정회전
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
break;
case 'l':
//모터A 정회전
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
//모터B 역회전
analogWrite(B_1A, 0);
//analogWrite(B_1B, 0);
analogWrite(B_1B, speed); //20210629
break;
case 's':
//모터A 정지
analogWrite(A_1A, 0);
analogWrite(A_1B, 0);
//모터B 정지
analogWrite(B_1A, 0);
analogWrite(B_1B, 0);
break;
}
}
5. 테스트
6. 문제점 발견하기
- 뱃터리 성능 : 아두이노용 9V, 모터용9V 각각사용
- 공간해결을 위한 아두이노 Nano로 변경
- 공간부족 해소를 위한 모터 드라이브 모델변경
- 탱크 휠(wheel) 재조립 :
휠과 체인이 맞물릴때 어긋나서 체인이탈
- 탱크 기어박스의 왼쪽모터관련 톱니가 헛돈다
- 왼쪽만돌리면 이런현상 발견됨
-
7. 문제점 스스로 해결해보기
- 오른쪽으로 움직이기 위해 왼쪽모터를 정회전 하고 오른쪽모터가 정지된 상태되어있는 프로그램을
- 오른쪽모터가 역회전 할수있게 프로그램 수정하여 테스트 해보았음. 그러나 역시 제대로 움직이지 않음.
- 공중에 뛰워놓고 있을때는 잘돌아가는데 궤도가 지면에 닿으면 마찰력때문에 기어박스의 톱니들이 헛도는
현상 발생
- 두개의 궤도가 한쪽방향으로 갈때는 서로 모터들이 힘을 분배해서 잘도는데
각각의 모터가 다른방향으로 돌거나 하나의 모터만 돌면 마찰력을 감당하지 못한다.
- 힘좋은 모터로 바꿀수 밖에 없나?? 아니면 볼트를 더 업그레이드?
8. 완성
9. 개선해 보고 싶은점
- 모터 성능 업그레이드
10. 이번 프로젝트에서 어려웠던 점
- 힘좋은 모터로 바꿀수 밖에 없나?? 아니면 볼트를 더 업그레이드?
11. 재미있던 점
- 직접 만들고 코딩해보는것.