BASIC4MCU | 질문게시판 | 답변 : steppermulti5 질문
페이지 정보
작성자 master 작성일2022-06-22 08:34 조회107회 댓글1건본문
#include <StepperMulti5.h>
const int `=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,distance; // 초음파
float m_time,sum_time; // 모터
//
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;
//
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);
}
//
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 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);
}
//
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); sumN_Z=0; //comeback
Lcomeback();
StepNX(-sumN_X); sumN_X=0; //comeback
delay(1000);
}
while(Serial.available()>0){ Serial.read(); } //버퍼 비우기
}
수신데이터가 제대로 받아 질 것으로 생각되지 않습니다.참고한 예제를 다시 잘 살펴보세요수신받은 후에 시리얼모니터에 각각의 값을 출력해보면 수신을 제대로 한 것인지 확인이 가능하겠죠
댓글 1
조회수 107응애님의 댓글
응애 작성일
수신데이터는 잘 받아집니다
통신은 잘 하는데
통신해서 얻어진 스텝수를 움직이질 않습니다ㅠㅠ
모터쪽 코딩이잘못된것같은데
처음에 stepper.h로 상을 직접 high신호줘서 모터를 2개 제어했었는데 rpm을 바꿀수가 없어서
Steppermulti5.h로 바꿨는데 안돌아갑니다
선도 재대로 꽂았고 예제대로하면 돌아가는데 이상합니다ㅜㅜ