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("반복동작 끝");
}