코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2018-12-27 10:45:40
본 예제를 실습하기에 앞서 초음파 센서와
DC 모터 제어를 처음 해 보시는 분들은
다음의 예제를 먼저 학습해 주세요.
출처 : 로봇 청소기 www.archiexpo.com
본 예제에서는 이와 유사한 방식으로 초음파 센서와 2축 DC모터 기어 박스 로봇을 이용하여
장애물 감지 로봇을 만들어 보겠습니다.
실습에 사용될 DC 모터입니다.
일반적인 DC 모터와 달리 '기어박스'라는 것이 부착되어 있는습니다.
이 '기어박스'는 DC모터의 속도(RPM)를 감속하고, 토크(회전력)를 증가시켜 무거운 물체를 회전할수 있게 해줍니다.
48:1이라는 수치는 바로 '기어비' 인데요,
출처 : 기어박스의 내부모습 - fabacademy.org
이 '기어비'는 1:1일 경우 DC모터가 1회전 하면 기어박스 내의 기어도 1회전하여,
DC모터의 토크가 그대로 전달되지만,
48:1일 경우 DC모터가 48회전하면 기어박스의 톱니가 1회전하고,
따라서 더 큰 힘이 발생하게 되는것입니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지 보드 | 1 | 아두이노 호환보드 |
2 | 아두이노 모터 쉴드 | 1 | 모터 쉴드 |
3 | 2축 기어박스 키트 (DC모터 포함) | 1 | 48:1 DC 기어모터(Magician Chassis) |
4 | 9V 배터리 | 1 | 9V 배터리 |
5 | 초음파 센서 | 1 | HC-SR04 |
6 | 점퍼케이블 | 1 | 점퍼케이블(암-수) |
7 | 9V 배터리 연결 배럴 잭 | 1 | 배럴 잭 |
부품명 | 오렌지 보드 | 모터 쉴드 | 9V 배터리 배럴 잭 | 2축 기어박스 키트 | 9v 배터리 |
파트 | x1 | x1 | x1 | x1 | x1 |
부품명 | 초음파센서 | 점퍼케이블 |
파트 | x1 | x1 |
조립 메뉴얼이 동봉되어 있으므로 메뉴얼을 참조해 주세요.
본 예제에서는 magic chassis라는 2축 기어모터 키트를 사용하였습니다.
구성품은 아래와 같습니다.
1.먼저 해당 부품을 이용하여 하판에 모터를 고정해 줍니다.
이때 긴 나사를 사용합니다.
2.좌,우측 모두 고정해 주세요.
3.홈에 맞추어 바퀴를 끼워주세요.
8. 초음파 센서 HC-SR04를 전면에 고정합니다.
케이블타이나 철사를 이용하여 고정하거나,
글루건으로 고정해 주세요.
배선 연결을 Trig는D7에 , Echo는 D6핀에
나머지 VCC,Gnd는 각각 모터쉴드의 5V핀과 Gnd에 연결합니다.
10. 마지막으로 9V 배터리와 배럴잭을 연결하면 완성!
기존 키트에 동봉 되어있던 1.5V AA X 4 건전지 홀더는 사용하지 않습니다.
9V 건전지 1개를 모터쉴드의 외부전원단자와 연결하면 됩니다.
아래의 코드를 아두이노에 업로드 합니다.
#include <NewPing.h> // NewPing라이브러리를 불러옵니다. #define SONAR_NUM 1 // 초음파센서의 갯수럴 설정합니다. #define MAX_DISTANCE 500 // 최대거리는 500(cm)로 제한합니다. #define PING_INTERVAL 250 unsigned long pingTimer[SONAR_NUM]; unsigned int cm[SONAR_NUM]; uint8_t currentSensor = 0; NewPing sonar[SONAR_NUM] = { NewPing(7, 6, MAX_DISTANCE), // Trigger pin, echo pin, 그리고 최대거리 }; void setup() { Serial.begin(9600); pingTimer[0] = millis() + 75; for (uint8_t i = 1; i < SONAR_NUM; i++) // 센서의 초기값을 설정합니다. pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL; //모터쉴드의 A & B채널 설정 pinMode(12, OUTPUT); //Motor 채널 A pin을 출력으로 설정합니다. pinMode(9, OUTPUT); //Brake 채널 A pin을 출력으로 설정합니다. pinMode(13, OUTPUT); //Motor 채널 B pin을 출력으로 설정합니다. pinMode(8, OUTPUT); //Brake 채널 B pin을 출력으로 설정합니다. } void loop() { for (uint8_t i = 0; i < SONAR_NUM; i++) { // 둘 이상의 초음파 센서를 사용할경우 모든 센서를 체크합니다. if (millis() >= pingTimer[i]) { // 핑 타임 체크 pingTimer[i] += PING_INTERVAL * SONAR_NUM; // 다음 핑 타임을 위한 시간 체크 if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); sonar[currentSensor].timer_stop(); currentSensor = i; cm[currentSensor] = MAX_DISTANCE; sonar[currentSensor].ping_timer(echoCheck); } } if (cm[0] < 20) // 만약 20cm 안에 장애물이 감지되면, { turn_right(); // 오른쪽으로 회전합니다. } else; // 아닐경우, { forward(); // 계속 전진합니다. } } void echoCheck() { if (sonar[currentSensor].check_timer()) cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; } void oneSensorCycle() { for (uint8_t i = 0; i < SONAR_NUM; i++) { Serial.print(i); Serial.print("="); Serial.print(cm[i]); Serial.print("cm "); } Serial.println(); } void forward() { //전진모드에 대한 설정입니다. digitalWrite(12, LOW); //12번 핀과 연결된 채널 A 모터의 방향을 설정합니다. digitalWrite(9, LOW); //9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다. analogWrite(3, 255); //3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다. digitalWrite(13, HIGH); //13번 핀과 연결된 채널 B 모터의 방향을 설정합니다. digitalWrite(8, LOW); //8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다. analogWrite(11, 255); //11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. } void turn_right() { //우회전에 대한 설정입니다. digitalWrite(12, HIGH); //12번 핀과 연결된 채널 A 모터의 방향을 역방향으로 설정합니다. digitalWrite(9, LOW); //9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다. analogWrite(3, 255); //3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다. digitalWrite(13, HIGH); //13번 핀과 연결된 채널 B 모터의 방향을 설정합니다. digitalWrite(8, LOW); //8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다. analogWrite(11, 255); //11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. delay(500); //0.5초(500밀리초)동안 유지합니다. }
스케치 설명
외부라이브러리 NewPing.h(다운받기)를 다운받아 압축해제후
NewPing 폴더를 아래의 경로에 넣어주세요.
Document>Arduino>Libraries
*아두이노 IDE가 실행중 이라면, 라이브러리 설치후 다시 시작해 주세요.
-NewPing 라이브러리는 초음파 센서의 데이터 수신을 보다 빠르게 작동 시켜줍니다.
kocoafab