BASIC4MCU | 질문게시판 | steppermulti5 질문
페이지 정보
작성자 응애 작성일2022-06-21 21:34 조회7,786회 댓글0건본문
#include <StepperMulti5.h>
const int stepsPerRevolution = 200;
StepperMulti5 stepper(stepsPerRevolution, 22,24,23,25);
StepperMulti5 stepper2(stepsPerRevolution, 34,36,35,37);
#define trig 2//초음파 센서의 송신부 핀번호 설정(Orange)
#define echo 3//초음파 센서의 수신부 핀번호 설정(Yellow)
#define motor_d 52//DIR(Green) --- 모터 제어 방향 설정
#define motor_v 53//PWM(Blue) --- 모터 제어 속도 설정
#define uno 40
float cycletime;//초음파가 물체를 맞고 돌아온 시간
float distance;//초음파 센서~물체 거리
float m_time;//모터 동작 시간
float sum_time; //모터 동작 시간 합
void sensor();//측정값 구하는 함수
void Linear();//z축 이동함수
void Lcomeback();//z축으로 움직였던 만큼 다시 돌아오는 함수
void cb(); // comeback 전체 함수
int atm = 42;
//회전 모터
#define dt 50
#define steps 200
#define sp 60
#define dtime 100 //딜레이시간
#define ON HIGH
#define OFF LOW
#define d 20
int stepN_X = 0 ; //X쪽 스텝
int stepN_Z = 0 ; //y쪽 스텝
int sumN_X = 0 ; //X쪽 스텝 합
int sumN_Z = 0 ; //Z쪽 스텝 합
String str;
String readSerial()
{
String ch = "nothing";
ch = Serial.readString();
delay(200);
return ch;
}
void StepNX(double a)
{
if (a > 0)
{
stepper.setStep(stepsPerRevolution);
}
if (a <0)
{
stepper.setStep(-stepsPerRevolution);
}
stepper.moveStep();
}
void StepNZ(double b)
{
if (b > 0)
{
stepper2.setStep(stepsPerRevolution);
}
if (b <0)
{
stepper2.setStep(-stepsPerRevolution);
}
stepper2.moveStep();
}
void setup()
{
Serial.begin(9600);
stepper.setSpeed(120);
stepper2.setSpeed(120);
pinMode(motor_d,OUTPUT);//리니어 모터 방향
pinMode(motor_v,OUTPUT);//리니어 모터 속도
pinMode(uno,OUTPUT);
pinMode(atm,INPUT);
}
int toStep(int ang)//각도를 step으로 변환
{
int st = 0 ;
st = ang * 0.58;
return st;
}
void loop()
{
int n_X = 0; //RealX
int n_Z = 0; //RealZ
while (1)
{
if ( Serial.available()) //정보가 들어올 때까지 무한반복
{
str = readSerial();
break;
}
}
if (str!=""){ //정보값 처리
Serial.println(str);
int first = str.indexOf(",");// 첫 번째 콤마 위치
int sec = str.indexOf(",",first+1);// 두 번째 콤마 위치
int third = str.indexOf(",",sec+1);// 세 번째 콤마 위치
int len = str.length(); // 문자열 길이
String strname = str.substring(0, first); // 첫 번째 토큰 차량이름
String strx = str.substring(first+1, sec); // 두 번째 토큰 x축
String strz = str.substring(sec+1,third); // 세 번째 토큰 y축
String strth = str.substring(third+1, len); //네번째 토큰 th
n_X = atoi(strx.c_str()); //x 값 int 로 변환
n_Z = atoi(strz.c_str()); //y 값 int 로 변환
stepN_X = n_X*3.9 ; //바꿈
stepN_Z = n_Z*2.5 ; //바꿈
}
StepNX(stepN_X);
sumN_X=sumN_X+stepN_X;
sensor();
distance = ((340 * cycletime) / 10000) / 2;
StepNZ(stepN_Z);
sumN_Z=sumN_Z+stepN_Z;
Linear(); //digitalWrite(atm,LOW);
/*
digitalWrite(uno,HIGH); //기울기 동작 시작
delay (1000);
digitalWrite(uno,LOW); //기울기 동작 종료
delay (1000); */
if(sum_time>=800){
StepNZ(-sumN_Z); //comeback
sumN_Z=0;
Lcomeback();//
StepNX(-sumN_X); //comeback
sumN_X=0;
delay(1000);
}
while (Serial.available()>0){ //버퍼 비우기
Serial.read();
}
}
void sensor()
{
delay(100);
digitalWrite(echo, LOW);
digitalWrite(trig, LOW);
delayMicroseconds(3);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
cycletime = pulseIn(echo, HIGH);
delayMicroseconds(3);
}
void Linear()//z축 모터 제어 함수
{
double Ymove = distance;
m_time = 10*300;//모터 동작 시간
sum_time = sum_time+m_time;
delay(300);
digitalWrite(motor_d,HIGH);//리니어모터 -z방향으로 동작 ,,,리니어 3.5cm/sec ,,모터 4cm/1바퀴
analogWrite(motor_v,200);//모터 동작 : 최대 속도의 78%
delay(m_time);//m_time동안 리니어모터 동작(얼마나 이동하는지 정함)
analogWrite(motor_v,0);//모터 정지
delay(2000);//7초동안 충전
}
void Lcomeback()//리니어모터가 초기상태로 돌아가는 함수
{
digitalWrite(motor_d,LOW);//리니어모터 방향 +z방향으로 동작
analogWrite(motor_v,200);//모터 동작 : 최대 속도의 78%
delay(sum_time+3000);//(m_time+1)초동안 리니어모터 동작(얼마나 이동하는지 정함)
analogWrite(motor_v,0);//모터 정지
sum_time=0;
delay(1000);}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void StepNX(double a)
{
if (a > 0)
{
stepper.setStep(stepsPerRevolution);
}
if (a <0)
{
stepper.setStep(-stepsPerRevolution);
}
stepper.moveStep();
}
void StepNZ(double b)
{
if (b > 0)
{
stepper2.setStep(stepsPerRevolution);
}
if (b <0)
{
stepper2.setStep(-stepsPerRevolution);
}
stepper2.moveStep();
}
이 부분이 이상합니다
모터가 안 돌아가요
코딩은 opencv에서 좌표를 받아서
n_X랑 n_Y값을 받아서
Step_NX랑 Step_NZ에 넣어서 계산하여
모터가 돌아가는건데요
모터에서 띡띡소리만 나고 안돌아갑니다ㅠㅠ
시험용으로 예제 코딩으로 돌려봤는데
#include <StepperMulti5.h>
StepperMulti5 stepper(200, 22,24,23,25);
StepperMulti5 stepper2(200, 7, 6, 5, 4);
void setup()
{
Serial.begin(9600);
stepper.setSpeed(120);
stepper2.setSpeed(60);
}
void loop()
{
if (Serial.available())
{
int steps = Serial.parseInt();
if(steps != 0)
{
stepper.setStep(steps);
stepper2.setStep(steps);
//stepper.setStep(200);
//stepper2.setStep(200);
Serial.print("steps : ");
Serial.println(steps);
}
}
stepper.moveStep();
stepper2.moveStep();
}
이걸로 시리얼모니터에스텝수 넣어서 돌려보니까아주 잘돌아갑니다 ㅠㅠ뭐가 잘못된건지 도저히 모르겠습니다 ㅠㅠLinear랑 Lzcomeback부분은 리니어모터라서 상관 없습니다
댓글 0
조회수 7,786등록된 댓글이 없습니다.