BASIC4MCU | 질문게시판 | 아두이노 스텝모터 제어
페이지 정보
작성자 지방대 작성일2021-11-26 14:31 조회4,555회 댓글0건본문
안녕하세요 아두이노 디지털핀을 이용해서 스텝모터를 제어 할려고 합니다.
1) 1번 RFID가 읽혀 a == 1, b == 0 이 된다
2) a = 1 && b == 0 일 때 StepReset(); 함수로 모터를 원점 위치로 이동
3) 바로 정해진 위치로 모터 이동
4) 2번 RFID가 읽혀 a == 0, b == 1이 될 때 까지 2)의 마지막 최종 위치에서 유지
5) a == 0 && b == 1이 되면 StepReset(); 함수로 모터를 원점 위치로 이동 후 다시 정해진 위치로 모터를 이동
이렇게 동작을 할려고 합니다 1), 2) 까지는 동작을 정상적으로 하지만 바로 3)을 동작을 하지 않고 원점에 머물러 있습니다.
어떻게 수정을 해야 할지 조언 부탁드립니다!
//
const int stepX = 2;
const int dirX = 5; // X축 방향 설정 pin
const int stepY = 3;
const int dirY = 6; // Y축 방향 설정 pin
const int enPin = 8; // 모터 전력공급 pin
const int limitPin1 = 12; // 1번 Limit Switch pin
const int limitPin2 = 13; // 2번 Limit Switch pin
const int RfidPin1 = 11;
const int RfidPin2 = 10;
//
int mode = 0;
//
void setup() {
Serial.begin(9600);
pinMode(RfidPin1, INPUT_PULLUP);
pinMode(RfidPin2, INPUT_PULLUP);
//
pinMode(limitPin1, INPUT_PULLUP);
pinMode(limitPin2, INPUT_PULLUP);
//
pinMode(stepX, OUTPUT);
pinMode(dirX, OUTPUT);
pinMode(stepY, OUTPUT);
pinMode(dirY, OUTPUT);
pinMode(enPin, OUTPUT);
digitalWrite(enPin, HIGH); // LOW여야 전력공급
}
/*
main loop
*/
void loop() {
int a = digitalRead(RfidPin1); // 1빈 Reader
int b = digitalRead(RfidPin2); // 2빈 Reader
if (a == 0 && b == 1) { // 1번 Reader가 읽혔을 때 동작
digitalWrite(enPin, LOW);
while (digitalRead (limitPin2 == HIGH)) { //리미트 2번 핀이 눌려질 때 까지 while문 실
StepReset(); // 충전패드 원점으로 이동
}
StepUp(500);
StepLeft(1300);
}
if ( a == 1 && b == 0) { // 2번 Reader가 읽혔을 때 동작
digitalWrite(enPin, LOW);
while (digitalRead (limitPin2 == HIGH)) {
StepReset(); // 충전패드 원점으로 이동
}
StepUp(800);
StepLeft(1330);
}
}
// 함수
//-------------- -StepUp----------------
void StepUp(int u) {
Serial.println("stepup....");
digitalWrite(dirX, HIGH); // 모터 회전 방향 설정
digitalWrite(dirY, LOW); // 모터 회전 방향 설정
for (int x = 0; x < u; x++) { // 1.8 앵글각 200 = 1바퀴
digitalWrite(stepX, HIGH);
digitalWrite(stepY, HIGH);
delayMicroseconds(1000); // 스텝모터 스피드
digitalWrite(stepX, LOW);
digitalWrite(stepY, LOW);
delayMicroseconds(1000);
}
}
//--------------------------------------
//-------------- -StepDown----------------
void StepDown(int d) {
for (int x = 0; x < d; x++) { // 1.8 앵글각 200 = 1바퀴
digitalWrite(stepX, HIGH);
digitalWrite(stepY, HIGH);
delayMicroseconds(1000); // 스텝모터 스피드
digitalWrite(stepX, LOW);
digitalWrite(stepY, LOW);
delayMicroseconds(1000);
}
}
//----------------------------------------
//——————— -StepLeft————————
void StepLeft(int l) {
Serial.println("stepleft....");
digitalWrite(dirX, HIGH); // 모터 회전 방향 설정
digitalWrite(dirY, HIGH); // 모터 회전 방향 설정
for (int x = 0; x < l; x++) { // 1.8 앵글각 200 = 1바퀴
digitalWrite(stepX, HIGH);
digitalWrite(stepY, HIGH);
delayMicroseconds(1000); // 스텝모터 스피드
digitalWrite(stepX, LOW);
digitalWrite(stepY, LOW);
delayMicroseconds(1000);
}
}
//—————————————————————
//——————— -StepRight—————————
void StepRight(int r) {
for (int x = 0; x < r; x++) { // 1.8 앵글각 200 = 1바퀴
digitalWrite(stepX, HIGH);
digitalWrite(stepY, HIGH);
delayMicroseconds(1000); // 스텝모터 스피드
digitalWrite(stepX, LOW);
digitalWrite(stepY, LOW);
delayMicroseconds(1000);
}
}
//-----------StepReset-----------------//
void StepReset() {
if (mode == 0) { // 프로그램이 첫 구동 시 mode=0
if (digitalRead(limitPin1)) { // 1번 리미트 스위치가 눌려질 때까지
Serial.println(limitPin1);
digitalWrite(dirX, LOW); // 모터 회전 방향 설정
digitalWrite(dirY, LOW); // 모터 회전 방향 설정
StepRight(1);
}
else {
Serial.println("limitSw1");
mode = 1; // 다음 모드는 1 역회전
}
}
if (mode == 1) { // 1번 리미트에 도달하고나면
if (digitalRead(limitPin2)) { // 2번 리미트 스위치가 눌려질 때까지
digitalWrite(dirX, LOW); // 모터 회전 방향 설정
digitalWrite(dirY, HIGH); // 모터 회전 방향 설정
StepDown(1);
}
else {
Serial.println("limitSw2");
digitalWrite(enPin, HIGH);
mode = 2; // 다음 모드는 2 정지(종료)
}
}
}
//--------------ArduinoReset-----------------//
// 강제로 실행 위치를 0위치로 변경
void resetFunc()
{
asm volatile ("jmp 0");
}
댓글 0
조회수 4,555등록된 댓글이 없습니다.