질문게시판 > atmega128 장애물회피자동차 스텝모터

TODAY50 TOTAL124,253
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


BASIC4MCU | 질문게시판 | atmega128 장애물회피자동차 스텝모터

페이지 정보

작성자 alsdn6431 작성일2018-05-14 11:54 조회75회 댓글1건

본문

	

atmega128을 이용해서 장애물 회피 자동차를 만들고있습니다.

https://www.youtube.com/watch?v=F9s5NOJfJ1s   

 

동영상에서 보이는거와 같이 구현하고있는데

 

장애물 앞에서 직각회전으로 저렇게 구현하려면 자동차에 DC모터가 아닌 스텝모터를 달아야 한다더군요.

그러면 스텝모터를 달면 소스코드가 달라지나요?

현재 제가 짠 소스 코드입니다.

어떻게 수정이 필요한가요?ㅠ

 

 

 

#include <avr/io.h>

#include <stdlib.h>

#define F_CPU 16000000UL

#define__DELAY_BACKWARD_COMPATIBLE__  

#include <util/delay.h>

 

#define  TRIG  6  

#define  ECHO  7  

unsunsigned char digit[10] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};

unsunsigned char fnd_sel[4]= {0x01, 0x02, 0x04, 0x08};

unsunsigned char fnd[4];

void display_fnd(unsignedintvalue);

 

#define SPEED_100  255  //PWM 100% 값

#defineSPEED_50  128  // PWM 50% 값

#defineSPEED_0  0  //PWM 0% 값

 

intmotor_a_in1 = 4;  // motor A IN : PD4 +PD5

intmotor_a_in2 = 5;

intmotor_b_in1 = 6;   // motor B IN : PD6 +PD7

intmotor_b_in2 = 7;

intmotor_a_pwm= 6;  // motor A PWM : PB6

intmotor_b_pwm= 7;   // motor B PWM : PB7

voidforw()

 

{

    PORTD = (PORTD & 0b00001111) 0b10100000;OCR1B = SPEED_100;OCR1C = SPEED_100;

    PORTA = PORTD;

}

voidback()

{

    PORTD = (PORTD & 0b00001111) 0b01010000;OCR1B = SPEED_100;OCR1C = SPEED_100;

    PORTA = PORTD;

}

voidclockwise()

{

    PORTD = (PORTD & 0b00001111) 0b01100000;OCR1B = SPEED_100;OCR1C = SPEED_100;

    PORTA = PORTD;

}

voidcclockwise()

{

    PORTD = (PORTD & 0b00001111) 0b10010000;OCR1B = SPEED_100;OCR1C = SPEED_100;

    PORTA = PORTD;

}

voidsstop()

{

    PORTD = (PORTD & 0b00001111) 0b00000000;OCR1B = SPEED_0;OCR1C = SPEED_0;

    PORTA = PORTD;

 

}

void init_uart1() // UART1 초기화 함수

{

    UCSR1B = 0x18; // 송신 Transmit(TX), Receive(RX) Enable

    UCSR1C = 0x06; // UART Mode, 8 Bit Data, No Parity, 1 Stop Bit

    UBRR1H = 0; // Baudrate 세팅

    UBRR1L = 8; // 16Mhz, 115200 baud

}

void putchar1(char c) // 1 문자를 송신(Transmit)하는 함수

{

     while(!(UCSR1A & (1<<UDRE1))) ; // TX 통신 가능 확인, UDRE : bit 5

     UDR1 = c; // 1문자 송신

}

char getchar1() // 1 character를 수신(receive)하는 함수

{

while (!(UCSR1A & (1<<RXC1))); // UCSR1A 7번 비트= RXC1(Receiver Complete)

return(UDR1); // 1 character 수신

}

unsigned int cal_distance() // 장애물까지의 거리 계산

{

unsigned distance;

TCCR3B = 0x02; // Counter/Timer 1 클록 0.5us 

PORTE &= ~(1<<TRIG); // Trig = LOW

_delay_us(10);

PORTE |= (1<<TRIG); // Trig = HIGH

_delay_us(10);

PORTE &= ~(1<<TRIG); // Trig = LOW

while(!(PINE & (1<<ECHO))) ; // wait until Echo = HIGH

TCNT3 = 0x0000; // Counter/Timer 1 값 초기화(=0)

while (PINE & (1<<ECHO));

TCCR3B = 0x00; // Counter/Timer 1 클록 정지

distance = (unsigned int)(TCNT3 / 2 / 5.8); // 시간에 비례하는 거리보정 함수 적용

return(distance);

}

void display_fnd(unsigned int value)

{   int i;

    fnd[3] = (value/1000)%10;

    fnd[2] = (value/100)%10;

    fnd[1] = (value/10)%10;

    fnd[0] = (value/1)%10;;

    for (i=0; i<4; i++)

    {

PORTC = digit[fnd[i]] | (i==1 ? 0x80 : 0x00);

PORTG = fnd_sel[i];

_delay_ms(2);

if (i%2)

    _delay_ms(1);

    }

}

int main(void)

{

unsigned int distance;

DDRC = 0xff;

DDRG = 0x0f;

DDRD |= 0xf0; // 모터 출력, PD4-7, PB6, PB7

  DDRE = ((DDRE | (1<<TRIG)) & ~(1<<ECHO));

DDRA = DDRD; // Test LED, DDRD=DDRA

DDRB |= 0xc0; 

TCCR1A = 0xaa; // Fast PWM, 8bit, 매치시 OC1A/B/C 모두 LOW

TCCR1B = 0x0c; // 256분주, 16us

while(1)

{

distance = cal_distance();

 

if (distance < 100) // 위험 거리이면

{

switch (rand()%4) { // 랜덤으로 방향 설정

case 0: clockwise();_delay_ms(500+rand()%500);PORTA = 0x01;break;

case 1: cclockwise();_delay_ms(500+rand()%500);PORTA = 0x02;break;

case2: back();_delay_ms(500+rand()%500);clockwise();_delay_ms(500+rand()%500);PORTA = 0x04;break;

case 3: back();_delay_ms(500+rand()%500);cclockwise();_delay_ms(300+rand()%500);PORTA = 0x08;break;

default:sstop();_delay_ms(100+rand()%100);break;

}

}

else

{

forw(); _delay_ms(10);  PORTA = 0x80;  // 그렇지 않으면 전진

}

}

}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 75

master님의 댓글

master 작성일

스텝모터를 구입하시고
1상여자 방식으로 구동하세요
1상여자 방식으로 토크가 부족하면 2상여자 방식으로 구동하여야하는데
전류가 2배 흐르므로 드라이버 전류 능력이 부족하지 않은지 체크해야합니다.

동영상에 사용된 스텝모터의 스펙부터 알아보세요
모터를 결정하면 구입 전에 드라이버도 같이 검토해야합니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.

게시물 검색

Privacy Policy
                   MCU BASIC ⓒ 2017 모바일버전으로보기