Embedded System/Project

[project] 캡스톤대회 - L298 모터드라이버

임베지수 2017. 4. 2. 14:48

으어... 캡스톤... 쿼드콥터를 넣는건 실수였다... 어쨌든 지상에서 돌아다닐 놈들을 만들었다. 기어드 DC모터를 사용했다. 기어비는 1:50이고 12V 먹는다. 이놈을 제어하기 위해서 모터드라이버가 필요한데 내가 옛날에 블로그에 올렸던 모터드라이버로는 무리다. 아마도,,, 어쩄든 L298 이라는 놈 하나면 DC모터 2개를 제어할 수 있다.

 

 

 

위에 사진이 L298이다. 아래는 데이터시트~

 

데이터시트를 보면 DC Operation이 2A다. 회로 구성하고 그냥 공중에 띄어서(거의 무부하) 돌려보니까 0.3A나온다. 잘 돌아가던놈 손으로 잡으니까 거의 2A까지 빨아당긴다. 구성 회로 역시 데이터시트 6쪽에 나와있다.

 

 

10번,12번은 모터 정/역회전 결정해주는 것이고 11번은 Enable핀이다. 10,11,12번 핀을 Atmega128 아무 남는 포트에 연결해준다. 난 PORTA를 사용했다. PA0에 Enable, PA1에 10번 핀, PA2에 12번 핀 이런식으로,, 글고 15번핀에 저항이 하나 있는데 바로 GND에 물려줘도 되고 0~1옴 1와트짜리 달아준다. 저항값이 클수록 모터에 흐르는 전류가 작아진다. 즉, 저항이 크면 돌아가는 속도가 느리고 토크도 약해진다. 난 그냥 GND에 물려줬다. 회로도 옆에 진리표가 있는데 대충 보고 코드짜면 된다.

 

 

프레임 만들었는데 아... 알루미늄 3T는... 정말... 다때리빠아뿔라 --; 줄톱으로 자르다가 톱이 끊어졌다 ㅜㅜ 선배가 자르는 법 갈켜줬는데 방법은 다음과 같다 ㅋㅋㅋ 두 명이 필요하다. Two people!

=====================================================

  1. 알루미늄 절단면에 맞춰서 두꺼운 책을 올려놓는다.

  2. 친구 한 명이 책위에 올라가서 밟고있는다.

  3. 나머지 한 명이 구부린다.

=====================================================

 

 

어쨌든 회로꾸미고 어째어째해서 아래사진처럼 완성했다.

 

기판보면 무슨 영화에 나올법한 달에 있는 미래도시같다... 나만 그렇게 느끼는건가..

 

옆모습

 

코드는 매우 간단하다. 속도제어하려면 PWM으로 신호주면 되고 그냥 전진 후진 하려면 enable에 1주고 input1,2에 0,1 또는 1,0을 주면 된다. 멈추려면 input1,2가 서로 같거나(급정지) enable에 0주면(서서히 정지) 된다.

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
 * landrobot.c
 *
 * Created: 2013-08-19 오전 4:40:49
 *  Author: 김지수
 */ 
 
 
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
 
#define EN_A    0
#define IN_A1    1
#define IN_A2    2
#define EN_B    3
#define IN_B1    4
#define IN_B2    5
 
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))                                                                                   
 
void init_port()
{
    DDRA = 0xff;
    PORTA = (1<<EN_A) | (1<<EN_B);
}
 
int main(void)
{
    init_port();
    
    _delay_ms(1000);
    
    while(1)
    {
        sbi(PORTA, IN_A1); // 전진
        sbi(PORTA, IN_B1); 
        _delay_ms(5000);
        
        cbi(PORTA, IN_A1); // 급정지
        cbi(PORTA, IN_B1); 
        _delay_ms(2000);
        
        sbi(PORTA, IN_A2); // 후진
        sbi(PORTA, IN_B2);
        _delay_ms(5000);
 
        cbi(PORTA, IN_A2); // 원래대로,,,
        cbi(PORTA, IN_B2);
                
        cbi(PORTA, EN_A); // 서서히 정지
        cbi(PORTA, EN_B);
        _delay_ms(2000);
        
        sbi(PORTA, EN_A); // 원래대로,,,
        sbi(PORTA, EN_B);
    }
}

 

아래는 동영상ㅋ

 

전진 → 급정지 → 후진 → 서서히정지 → 전진 → ..... 무한반복