#define H 1
#define L 0
#define trigpin 11
#define echopin 12
#define delay_time 10

int Motor[4] = {4,5,6,7};
int M_En[2] = {8,9};
int i, deg = 0;
int flag = 0;
float duration, distance;  

void setup() {
  for (i=0;i<4;i++){
    pinMode(Motor[i], OUTPUT);
  }
  for (i=0;i<2;i++){
    pinMode(M_En[i], OUTPUT);
  }  
  pinMode(trigpin, OUTPUT);   //Trig
  pinMode(echopin, INPUT);   //Echo 
  Serial.begin(115200); //보레이트 설정
}

void M_Enable(){
  for (i=0;i<2;i++){
    digitalWrite(M_En[i], H);
  }  
}

void M_Disable(){
  for (i=0;i<2;i++){
    digitalWrite(M_En[i], L);
  } 
}

void UltraSonic_command(){
/////////////////////////UltraSonic 동작 및 거리계산
////////////////////////////////////////////////// 대충 검색해서 퍼옴 - 구지... 이해할필요까지.. 없어보임.
  digitalWrite(trigpin, H);
  delay(10);
  digitalWrite(trigpin, L);
  duration = pulseIn(echopin, H);
  distance = ((float)(340*duration) / 10000) /2 ;
/////////////////////////시리얼로 프린트? TX 구문인지... 
  //Serial.print("distance : ");
  Serial.println(distance);
}

// 한스텝 동작 -> 거리측정 -> Serial Send
void M_move(int a, int b, int c, int d){
  M_Enable();
  digitalWrite(4, a);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(5, b);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(6, c);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(7, d);   // turn the LED on (HIGH is the voltage level) 
  UltraSonic_command();
  M_Disable();  
}

// 오른쪽 동작
void r_Stepping(){  
  M_move(H,L,L,H);  
  delay(delay_time);                       // wait for a second
  M_move(H,H,L,L);  
  delay(delay_time);                       // wait for a second
  M_move(L,H,H,L);  
  delay(delay_time);                       // wait for a second
  M_move(L,L,H,H);  
  delay(delay_time);                       // wait for a second
}

// 왼쪽 동작
void l_Stepping(){  
  M_move(L,L,H,H);  
  delay(delay_time);                       // wait for a second
  M_move(L,H,H,L);    
  delay(delay_time);                       // wait for a second
  M_move(H,H,L,L);  
  delay(delay_time);                       // wait for a second
  M_move(H,L,L,H);  
  delay(delay_time);                       // wait for a second
}

// 오른쪽 360도 -> 왼쪽 360도 
void loop() { 
  if(Serial.available()>0){
    flag = Serial.read();
  }  
  if(flag){
    l_Stepping();  
    if(deg < 52)    
      deg = deg + 1; 
    else {
      flag = 0;          
      deg = 0;
    }
  }
}


# 하드웨어 구성
아두이노 나노 [SZH-EK017]
초음파센서 [HC-SR04]
L298N V2/Dc Moter/Stepper 
스텝모터 [17HS4401]




 #소스코드

#define H 1

#define L 0


#define trigpin 11

#define echopin 12

#define delay_time 990

int Motor[4] = {4,5,6,7};

int M_En[2] = {8,9};

int i, deg = 0;

int flag = 0;

float duration, distance;

  

void setup() {

  //pinMode(4, OUTPUT);   //A

  //pinMode(5, OUTPUT);   //B

  //pinMode(6, OUTPUT);   //An

  //pinMode(7, OUTPUT);   //Bn

  //pinMode(8, OUTPUT);   //enable1

  //pinMode(9, OUTPUT);   //enable2

 

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

    pinMode(Motor[i], OUTPUT);

  }

  for (i=0;i<2;i++){

    pinMode(M_En[i], OUTPUT);

  }  

  

  pinMode(trigpin, OUTPUT);   //Trig

  pinMode(echopin, INPUT);   //Echo  


  Serial.begin(9600); //보레이트 설정

}

void M_Enable(){

  for (i=0;i<2;i++){

    digitalWrite(M_En[i], H);

  }  

}

void M_Disable(){

  for (i=0;i<2;i++){

    digitalWrite(M_En[i], L);

  } 

}


void UltraSonic_command(){

/////////////////////////UltraSonic 동작 및 거리계산

////////////////////////////////////////////////// 대충 검색해서 퍼옴 - 구지... 이해할필요까지.. 없어보임.

  digitalWrite(trigpin, H);

  delay(10);

  digitalWrite(trigpin, L);


  duration = pulseIn(echopin, H);

  distance = ((float)(340*duration) / 10000) /2 ;

/////////////////////////시리얼로 프린트? TX 구문인지... 

  Serial.print("distance : ");

  Serial.println(distance);


}

// 한스텝 동작 -> 거리측정 -> Serial Send

void M_move(int a, int b, int c, int d){

  M_Enable();

  digitalWrite(4, a);   // turn the LED on (HIGH is the voltage level)

  digitalWrite(5, b);   // turn the LED on (HIGH is the voltage level)

  digitalWrite(6, c);   // turn the LED on (HIGH is the voltage level)

  digitalWrite(7, d);   // turn the LED on (HIGH is the voltage level)  

  UltraSonic_command();

  M_Disable();  

}

// 오른쪽 동작

void r_Stepping(){  

  M_move(H,L,L,H);  

  delay(delay_time);                       // wait for a second

  M_move(H,H,L,L);  

  delay(delay_time);                       // wait for a second

  M_move(L,H,H,L);  

  delay(delay_time);                       // wait for a second

  M_move(L,L,H,H);  

  delay(delay_time);                       // wait for a second

}

// 왼쪽 동작

void l_Stepping(){  

  M_move(L,L,H,H);  

  delay(delay_time);                       // wait for a second

  M_move(L,H,H,L);    

  delay(delay_time);                       // wait for a second

  M_move(H,H,L,L);  

  delay(delay_time);                       // wait for a second

  M_move(H,L,L,H);  

  delay(delay_time);                       // wait for a second

}

// 오른쪽 360도 -> 왼쪽 360도 

void loop() { 

  if(!flag){

    r_Stepping();  

    if(deg < 52)

      deg = deg + 1; 

    else

      flag = 1;    

  }

  else {

    l_Stepping();  

    if(deg > 1)

      deg = deg - 1; 

    else 

      flag = 0;          

  }

}


# 이후 숙제

- 시리얼로 받은 데이터로 윈도우에 그리기 (Visual Basic ?)


아두이노 나노 이용하여 자동 워킹인식 만들기... (어플속이기 ㅎ)


#include <Stepper.h>

// 1스텝 0.17578125도

// 2048 = 360도  // 1024 = 180도  // 

#define STEPS 96   //128                //각도 16.87도

#define Speed (8192 / STEPS)*4       //안정적인 최고 스피드


// IN4 = 11 = 12

// IN3 = 10 = 11 

// IN2 = 9 = 10

// IN1 = 8 = 9

// IN4, IN2, IN3, IN1 

Stepper stepper(STEPS, 12, 10, 11, 9);


void setup() {

  stepper.setSpeed(Speed);

}


void loop() {

  stepper.step(STEPS);


  stepper.step(-STEPS);

}

+ Recent posts