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

TODAY339 TOTAL270,855
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


▼ BASIC4MCU 후원업체 최신 정보 ▼

▲ BASIC4MCU 후원업체 최신 정보 ▲

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

페이지 정보

작성자 alsdn6431 작성일2018-05-14 11:54 조회1,132회 댓글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

조회수 1,132

master님의 댓글

master 작성일

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

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

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

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

ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 아두이노를 이용한 RGB LED 전등 제어 새글 위우위우 00:17 1
질문 SoftwareSerial을 이용한 버튼 및 LED 작동 댓글[1] 새글 깅깅 18-10-19 6
답변 답변글 답변 : SoftwareSerial을 이용한 버튼 및 LED 작동 새글 master 18-10-19 3
질문 PIR 센서 감도조절 질문 새글 master 18-10-19 2
질문 저번에 초음파와 dc모터 관련 질문했던 사람입니다. 아직 문제가 잘 해결되지 않아서 올립니다. 새글 재갈이 18-10-19 6
답변 답변글 답변 : 저번에 초음파와 dc모터 관련 질문했던 사람입니다. 아직 문제가 잘 해결되지 않아서 올립니다. 댓글[3] 새글 master 18-10-19 8
질문 Nrf24 양방향 송수신 진동모터 작동관련 질문입니다! 댓글[1] 새글 A반장 18-10-19 9
질문 아두이노 조도센서 반응을 반대로 하고 싶어요! 댓글[2] 새글 코코포도 18-10-19 12
질문 아두이노 LED랑 스피커 동시에 작동하는 법 질문 새글 master 18-10-19 11
질문 원래 나와야하는 시리얼 모니터 사진 올립니다. 새글 찰스백작 18-10-19 9
질문 GPS추적기 소스주신거 안되서 문의드립니다. 소스첨부합니다. 댓글[3] 이미지새글첨부파일 찰스백작 18-10-19 16
질문 STM32 공부방법 댓글[2] 새글 DrVoid 18-10-19 15
질문 gps 소스1으로는 안될까해서 문의드립니다.. 댓글[1] 새글 찰스백작 18-10-19 12
질문 아두이노에서 서보모터와 dc모터 두가지를 함께 이용하고 싶습ㄴ다. 댓글[2] 새글 김주리 18-10-19 19
질문 gps 추적기 다시문의드립니다. 다시 소스좀 부탁드립니다..ㅠㅠ 댓글[2] 새글 찰스백작 18-10-18 23
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017