【 아두이노Proj#6】 조이스틱 미니카 만들기~!
조이스틱을 이용하여 아두이노 미니카(mini car)를 만들어 보려 한다.
물론 무선으로 제어가 가능한 방법들도 많이 있지만, 구성이 간단하고 쉽게 조립해서 바로 실행시켜 볼 수 있어 유선으로 제어를 해보려 한다. 아두이노를 배우는 단계에 있다면, 쉬운것 부터 차근 차근 만들어 보는 경험을 쌓는 것이 매우 도움이 되기 때문이다. 또한 조이스틱과 소형의 L9110s 모터 드라이버를 활용해보는 공부도 될 것이다.
▶ 선수 학습 :
1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)
2. [아두이노 모듈#15] L9110S 모듈 사용하기 #1 (모터 드라이버 참조) ☜ (클릭)
▶ 미니카 제작 재료
▶ 실습 목표 :
1. [ L9110S 모터 모듈을 활용하는 방법에 대해 이해 할 수 있다. ]
2. [ 조이스틱으로 유선 제어를 응용해 볼 수 있다. ]
3. [ Step up 컨버터를 이용해 낮은 입력 전압을 5V전압으로 승압해 주는 컨버터를 다룰 수 있다. ]
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
※ 위 회로 연결에서 모터의 회전 방향이 반대가 될 경우 연결선을 서로 바꾸어 주면 된다.
(예를 들어, Motor A 가 반대 방향으로 회전 할 경우 A1-A 와 A1-B 에 연결한 선을 서로 바꾸어 연결한다)
※ 속도제어를 위해서는 디지털 포트 중에서 PWM신호 출력이 가능한 아두이노 포트(숫자앞 '~'표시) 를 연결해야 한다.
▶ 실습 절차 :
1. 부품을 준비하여 위와 같은 회로를 구성한다.
- 미니카의 베이스 판은 아크릴 판 혹은 MDF 등 주변에서 쉽게 구할 수 있는 것으로 한다.
- 조이스틱과 연결 되는 케이블은 유연성이 있는 연선(4선 혹은 3선)으로 연결한다.
2. 아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)
3. 코딩1은 조이스틱으로 상하좌우 제어만 가능한 기본 코드로 먼저 적용해 본다.
4. 코딩2는 조이스틱의 대각선 방향을 제어 해볼 수 있는 코드로, 필요한 경우 시리얼모니터링을 통해 데이터 값을 참고하여 코드 속 수치 값을 변경해주거나 자신만의 알고리즘으로 변경해본다.
※ 선수학습 1(조이스틱 편) 을 참고하여, 조이스틱을 상하좌우, 대각선방향 등 작동시켰을 때 나오는 값을 참고 하여, 아래 코딩에서 사용 되는 Jox, Joy의 좌표값을 적당한 값으로 수정할 필요가 있을 수 있다.
(예를 들어, " if (Joy >= 90 && Jox < 20) ..." 에서 '90' 이나 '20'과 같은 수치 값 조정)
▶ 프로그램 코드 및 설명 (코드1) :
/* 조이스틱 미니카 제어 (방향 : 상하좌우) */
/* L9110s 모터드라이버
오른쪽모터
L9110s A_1A 9
L9110s A_1B 10
왼쪽모터
L9110s B_1A 5
L9110s B_1B 6
*/
int A_1A = 9;
int A_1B = 10;
int B_1A = 5;
int B_1B = 6;
int speed = 250; // speed: 0~ 255
void setup ( ) {
//핀을 초기화 하고, 출력설정
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);
Serial.begin(9600);
}
void loop ( ) {
int Jox = map(analogRead(A0), 0, 1023, -100, 100);
int Joy = map(analogRead(A1), 0, 1023, -100, 100);
Serial.print(" JoX : ");
Serial.print(Jox);
Serial.print(" JoY : ");
Serial.println(Joy);
if (Jox >= 90 && Joy <= 20 && Joy >= -20) {
// 모터 전진
//모터A
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
//모터B
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
}
else if (Jox <= -90 && Joy <= 20 && Joy >= -20) {
// 모터 후진
//모터A
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
//모터B
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
}
else if (Joy >= 90 && Jox < 20) {
//모터 우회전
// 모터A
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
// 모터B
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
}
else if (Joy <= -90 && Jox < 20) {
// 모터 좌회전
// 모터A
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
// 모터B
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
}
// 모터 정지
else {
analogWrite(A_1A, 0);
analogWrite(A_1B, 0);
analogWrite(B_1A, 0);
analogWrite(B_1B, 0);
}
}
▶ 프로그램 코드 및 설명 (코드2):
/* 조이스틱 미니카 제어 (방향 : 상하좌우 & 대각선 제어) */
/* L9110s 모터드라이버
오른쪽모터
L9110s A_1A 9
L9110s A_1B 10
왼쪽모터
L9110s B_1A 5
L9110s B_1B 6
*/
int A_1A = 9;
int A_1B = 10;
int B_1A = 5;
int B_1B = 6;
int speed = 250; // speed: 0~ 255
void setup ( ) {
//핀을 초기화 하고, 출력설정
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);
Serial.begin(9600);
}
void loop ( ) {
int Jox = map(analogRead(A0), 0, 1023, -100, 100);
int Joy = map(analogRead(A1), 0, 1023, -100, 100);
Serial.print(" JoX : ");
Serial.print(Jox);
Serial.print(" JoY : ");
Serial.println(Joy);
if (Jox >= 90 && Joy <= 20 && Joy >= -20) {
// 모터 전진
//모터A
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
//모터B
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
}
else if (Jox <= -90 && Joy <= 20 && Joy >= -20) {
// 모터 후진
//모터A
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
//모터B
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
}
else if (Joy>=90 && Jox<20 Jox<=20 && Jox>=-20 && Joy>=90) {
//모터 우회전
// 모터A
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
// 모터B
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
}
else if (Joy<=-90 && Jox<20 Jox<=20 && Jox>=-20 && Joy<=-90) {
// 모터 좌회전
// 모터A
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
// 모터B
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
}
// 동북방향
else if ( Jox >= 90 && Joy >= 90 ) {
analogWrite(A_1A, 120);
analogWrite(A_1B, 0);
analogWrite(B_1A, speed);
analogWrite(B_1B, 0);
}
// 서북방향
else if ( Jox >= 80 && Joy <= -80) {
analogWrite(A_1A, speed);
analogWrite(A_1B, 0);
analogWrite(B_1A, 140);
analogWrite(B_1B, 0);
}
// 동남방향
else if ( Jox <= -90 && Joy >= 80) {
analogWrite(A_1A, 0);
analogWrite(A_1B, 120);
analogWrite(B_1A, 0);
analogWrite(B_1B, speed);
}
// 서남방향
else if ( Jox <= -80 && Joy <= -80) {
analogWrite(A_1A, 0);
analogWrite(A_1B, speed);
analogWrite(B_1A, 0);
analogWrite(B_1B, 140);
}
// 모터 정지
else {
analogWrite(A_1A, 0);
analogWrite(A_1B, 0);
analogWrite(B_1A, 0);
analogWrite(B_1B, 0);
}
}
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)
# 1. <코딩 1>
# 2. <코딩 2>
▶ 조립 과정 및 동작 영상 :
[ ▶ 유튜브에서 보기 ]
'아두이노 > 4. 프로젝트 LAB' 카테고리의 다른 글
【 아두이노Proj#8】 사륜구동 4WD 블루투스 RC카 만들기~! (with 모터쉴드) (33) | 2019.07.31 |
---|---|
【 아두이노Proj#6】 선없는 조이스틱 블루투스 무선 미니카 만들기~! (HC-05) (7) | 2019.06.25 |
【 아두이노Proj#5】 아두이노 스마트 화분 만들기 Ver 3 with LCD (85) | 2019.04.05 |
【 아두이노Proj#4】 아두이노 스마트 화분 만들기 Ver2 with FND (7) | 2019.04.03 |
【 아두이노Proj#3】 아두이노 스마트 화분 만들기 Ver 1 (10) | 2019.03.29 |