[자율주행] 액츄에이터 작동

­윤다빈·2022년 7월 28일
0

[Devlog] - 자율주행

목록 보기
2/6

https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=4858&device=mobile

액추에이터 구동 코드

참고자료
https://youtu.be/qJwsCpDa0M4

int em_sw = 2;
int motioin_sw = 4;
int right_sw = 6;
int left_sw = 8;

int flag;

int common_GND1 = 3; //풀업저항하단의 GND 역할 / I/O핀을 GND핀 대신 사용하는 목적
int common_GND2 = 5;
int common_GND3= 7;
int common_GND4 = 9;

void setup() {
  Serial.begin(19200); // 모터 드라이버와 19200bps로 통신하는 코드
  Serial1.begin(19200);

  pinMode(em_sw, INPUT_PULLUP); //각 스위치에 해당하는 디지털핀을 아두이노 내부 풀업 저항을 이용해서 입력모드로 설정
  pinMode(motion_sw, INPUT_PULLUP);
  pinMode(righ_sw, INPUT_PULLUP);
  pinMode(left_sw, INPUT_PULLUP);

  pinMode(common_GND1, OUTPUT);
  pinMode(common_GND2, OUTPUT);
  pinMode(common_GND3, OUTPUT);
  pinMode(common_GND4, OUTPUT);

  digitalWrite(common_GND1, LOW); //평상시 GND, Low 신호를 출력함으로써 GND 역할을 하게 됨
  digitalWrite(common_GND2, LOW);
  digitalWrite(common_GND3, LOW);
  digitalWrite(common_GND4, LOW);

  attachInterrupt(2, swInterrupt, Low); //비상 스위치에 연결된 디지털 핀 2번은 우선적으로 작동해야함 -> 인터럽트를 사용해서 제어 (**오디세이 보드의 내장된 아두이노는 Uno가 아님, Zero기반이기 때문에 인터럽트 사용법에서 Uno와 조금 차이가 있음 => 핀번호와 인터럽트 번호가 같아야함)

  Serial.println("통신 시작");
}

void loop() {
	Serial1.println("control=1"); //enable
    Serial1.println("target_velocity=0); // 속도 0
    flag=0;
    
    if(digitalRead(right_sw) == 0)
    right_move();
    
    if(digitalRead(left_sw) == 0)
    left_move();
    
    if(digitalRead(right_sw) == 0 && digitalRead(left_sw) == 0)
    set_home();
    
    if(digitalRead(motion_sw) == 0)
    motion_move();
}

void swInterrupt() {
	flag=1;
    Serial1.println("control=0"); //disable
    Serial.println("인터럽트");
}

void right_move() {
	Serial1.println("target_velocity=150");
    Serial.println("Right");
}

void left_move() {
	Serial1.println("target_velocity=-150");
    Serial.println("Left");
}

void set_home() { // current position is home
	Serial1.println("homing_method=0");
    Serial.println("홈 설정");
}

void motion_move() {
	int repeat=0;
    Serial.println("반복동작 시작");
    while(repeat<10){
    	if(flag==1) { //interrupt
        	break; // interrupt가 끝나면 interrupt 전 동작을 이어서 작동하기 때문에 명령어 리셋을 위해 flag 변수를 사용
        }
        
        Serial1.println("target_position=(액추에이터의 최소값)"); //속도 제어가 아닌 위치 제어 오브젝트 사용
        delay(500);
        Serial1.println("target_position=(액추에이터의 최대값)");
        delay(500);
        Serial.print("반복동작 : ");
        Serial.print(repeat+1);
        Serial.println("번");
        
        repeat++;
	}

	Serial.println("반복동작 끝");
}
profile
Web-Front / SW-AI 개발자

0개의 댓글