BASIC4MCU | 질문게시판 | 아두이노 모터제어 관련해서 질문드립니다!
페이지 정보
작성자 아두이노어렵잖아 작성일2023-06-03 14:56 조회1,763회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22795
본문
안녕하세요 현재 아두이노로 x축과 y축을 움직이기 위해서 코드를 만들었습니다.
1. 파이참에서 중점좌표 3개를 문자열로 변환 후 아두이노로 전달한다.
2.아두이노에서 변환 된 문자열을 숫자열로 변환한다.
3.숫자열로 변환 된 중점좌표와 각 모터의 스텝수를 계산해서 원하는 위치에 모터를 이동시킨다.
모터드라이브 : AM_CS2
X축 모터 : 103H5210-0457 (스텝모터)
Y축 모터 : SE-SM9K(스텝모터)
다음은 아두이노 코드입니다.
#include <Stepper.h>const int stepsPerRevolution = 200;const float stepToCoordRatio = 8.0;const float stepToCoordRatio1 = 5.5;// Define pins for the X-axis stepper motorconst int X_motorPin1 = 22;const int X_motorPin2 = 23;const int X_motorPin3 = 24;const int X_motorPin4 = 25;// Define pins for the Y-axis stepper motorconst int Y_motorPin1 = 44;const int Y_motorPin2 = 45;const int Y_motorPin3 = 46;const int Y_motorPin4 = 47;// Initialize the X-axis stepper motorStepper X_stepper(stepsPerRevolution, X_motorPin1, X_motorPin2, X_motorPin3, X_motorPin4);// Initialize the Y-axis stepper motorStepper Y_stepper(stepsPerRevolution, Y_motorPin1, Y_motorPin2, Y_motorPin3, Y_motorPin4);int center_points_received = 0;int points_to_move[3][2];bool moved_once = false;void setup() {X_stepper.setSpeed(260);Y_stepper.setSpeed(270);Serial.begin(9600);}void loop() {if (!moved_once) {while (Serial.available() > 0 && center_points_received < 3) {String received_data = Serial.readStringUntil(';');int colonIndex = received_data.indexOf(':');int commaIndex = received_data.indexOf(',');int X_coordinate = received_data.substring(colonIndex + 1, commaIndex).toInt();int Y_coordinate = received_data.substring(commaIndex + 1).toInt();points_to_move[center_points_received][0] = X_coordinate;points_to_move[center_points_received][1] = Y_coordinate;center_points_received++;}if (center_points_received == 3) { // 중점 좌표를 세 개 모두 받았을 경우delay(3000); // 좌표를 받은 후 약 3초 후에 모터 움직임 시작// 첫 번째 좌표로 이동int X_steps = (points_to_move[0][0] - 90) * stepToCoordRatio;int Y_steps = -(points_to_move[0][1] - 170) * stepToCoordRatio1;X_stepper.step(X_steps);Y_stepper.step(Y_steps);delay(5000);// 두 번째 좌표로 이동int X_steps1 = (points_to_move[1][0] - points_to_move[0][0]) * stepToCoordRatio;int Y_steps1 = -(points_to_move[1][1] - points_to_move[0][1]) * stepToCoordRatio1;X_stepper.step(X_steps1);Y_stepper.step(Y_steps1);delay(5000);// 세 번째 좌표로 이동int X_steps2 = (points_to_move[2][0] - points_to_move[1][0]) * stepToCoordRatio;int Y_steps2 = -(points_to_move[2][1] - points_to_move[1][1]) * stepToCoordRatio1;X_stepper.step(X_steps2);Y_stepper.step(Y_steps2);delay(5000);moved_once = true;}}}하지만 예를들어 X_stepper.step(X_steps,1,2); Y_stepper.step(Y_steps,1,2);의 값들이 모두 양수로 정의 되어도 모터가 한번은 시계방향 한번은 반시계 방향 마지막 한번은 시계방향이런식으로 움직이거나 모터의 이동부가 끝점에 부딪히면 다시 반대로 모터가 회전된다.이러한 이유가 기계적인 문제에 있는지 아두이노 코드에 있는지 궁금하여 질문 올립니다.이미지 첨부하겠습니다.
댓글 1
조회수 1,763master님의 댓글
master 작성일
X_stepper.setSpeed(260);
Y_stepper.setSpeed(270);
260rpm이나 270rpm은 초당 4.41회전인데 너무 빠른 것 같은데요?
30rpm이나 60rpm 으로 낮춰서 돌려보고
문제가 없으면 조금씩 속도를 올려보세요