BASIC4MCU | 질문게시판 | 답변 : 마스터님 봐주세요~
페이지 정보
작성자 master 작성일2019-01-23 09:50 조회22,994회 댓글10건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-23 오전 9:56:25// by Ok-Hyun Park////-------------------------------<마스터보드>#include <SoftwareSerial.h>SoftwareSerial btSerial(2,3);//void setup(){Serial.begin(9600); // 시리얼 통신을 시작하며,통신속도는 9600btSerial.begin(9600);pinMode(4,INPUT);}//void loop(){int push=digitalRead(4);int X=analogRead(1);int Y=analogRead(0);int a,b,c,d;if(Y<440){ Serial.print('a'); btSerial.print('a'); }if(Y>550){ Serial.print('b'); btSerial.print('b'); }if(X<460){ Serial.print('c'); btSerial.print('c'); }if(X>590){ Serial.print('d'); btSerial.print('d'); }delay(300); // 0.3초 대기}//-------------------------------<슬레이브 보드>#include <SoftwareSerial.h>SoftwareSerial btSerial(2,3);//#include <Servo.h>Servo Motor_H,Motor_V;//int H=0,V=0;int posx=90,posy=90;int mode=0;//void setup(){Serial.begin(9600);btSerial.begin(9600);Motor_H.attach(5); Motor_V.attach(6);Motor_H.write(90); Motor_V.write(90);}//void loop(){if(btSerial.available()){char r=btSerial.read();if(r=='a')mode=r;if(r=='b')mode=r;if(r=='c')mode=r;if(r=='d')mode=r;}//if(mode=='a'){if(posx<180){ posx++; Motor_H.write(posx); Serial.print(posx); }}if(mode=='b'){if(posx>0){ posx--; Motor_H.write(posx); Serial.print(posx); }}if(mode=='c'){if(posy<180){ posy++; Motor_V.write(posy); Serial.print(posy); }}if(mode=='d'){if(posy>0){ posy--; Motor_V.write(posy); Serial.print(posy); }}}
댓글 10
조회수 22,994현이꽃님의 댓글
현이꽃 작성일
아 감사합니다 잘됩니다 조이 스틱 부분에 코드를 하나 더 추가 해야 될요? 현재 상태에서는
끝에서 끝으로 넘어가는데 레버를 움직이면 모터가 돌다가 중립에 되면 서게 하고싶은데용
쉽게 조이스틱이 움직일때만 모터가 돌도록 하고싶습니다
슬레이브하고 마스터쪽에
If( r=='e')mode==r 이렇게 추가하고
룹문 에서if(mode=='e')이렇게하고뒤에따로 명령문을 안넣는다면 중립에왔을때 멈추지안을까 하는 제짧은생각인데 맞는지모르겠습니다
폰 이라 두서 업이 적어서 죄송합니다
master님의 댓글
master
중간이란 511이 아니고
오차 범위를 줘야합니다.
예를들면
오차 범위로 +-11 정도를 준다면
500~522가 중간 지점이 되겠죠
조이스틱의 기계적인 오차가 커서 이보다 더 넓은 범위를 중간 지점으로 잡아야 할겁니다.
현이꽃님의 댓글
현이꽃 작성일
마스터
#include <SoftwareSerial.h>
SoftwareSerial btSerial(2,3);
//
#include <Servo.h>
Servo Motor_H,Motor_V;
//
int H=0,V=0;
int posx=90,posy=90;
int mode=0;
//
void setup(){
Serial.begin(9600);
btSerial.begin(9600);
Motor_H.attach(5); Motor_V.attach(6);
Motor_H.write(90); Motor_V.write(90);
}
//
void loop(){
if(btSerial.available()){
char r=btSerial.read();
if(r=='a')mode=r;
if(r=='b')mode=r;
if(r=='c')mode=r;
if(r=='d')mode=r;
if(r=='e')mode=0; //<<이부분 추가..
}
//
if(mode=='a'){
if(posx<180){ posx++; Motor_H.write(posx); Serial.print(posx); }
}
if(mode=='b'){
if(posx>0){ posx--; Motor_H.write(posx); Serial.print(posx); }
}
if(mode=='c'){
if(posy<180){ posy++; Motor_V.write(posy); Serial.print(posy); delay(10); }
}
if(mode=='d'){
if(posy>0){ posy--; Motor_V.write(posy); Serial.print(posy); delay(10); }
}
}
슬레이브
#include <SoftwareSerial.h>
SoftwareSerial btSerial(2,3);
//
void setup(){
Serial.begin(9600); // 시리얼 통신을 시작하며,통신속도는 9600
btSerial.begin(9600);
pinMode(4,INPUT);
}
//
void loop(){
int push=digitalRead(4);
int X=analogRead(1);
int Y=analogRead(0);
int a,b,c,d;
if(Y<440){ Serial.print('a'); btSerial.print('a'); }
if(Y>550){ Serial.print('b'); btSerial.print('b'); }
if(X<460){ Serial.print('c'); btSerial.print('c'); }
if(X>590){ Serial.print('d'); btSerial.print('d'); }
if(X,Y<>524,506){ Serial.print('e'); btSerial.print('e'); } //<<이부분이 오류가 생겨요 ;;
delay(300); // 0.3초 대기
e키를 조이스틱 중간값으로 주고 데이타 전송을 하면 될듯한데.. 잘 안되네여 ..
조이스틱 중간값도좀 변하고요 ㅠㅠ 도와주십시요 마스터님 ㅠ
}
master님의 댓글
master
if(X,Y<>524,506)
이런 조건식은 처음 봅니다.
무슨 조건일까요?
master님의 댓글
master
중간값을 체크하기 위한 조건식인가 보군요
if(X<524 && X>506 && Y<524 && Y>506){ Serial.print('e'); btSerial.print('e'); }
현이꽃님의 댓글
현이꽃 작성일
일단 부끄럽습니다
C언어에대해 이해를 못하고 잇으니
일반적인생각 으로 하다보니 저리된거같습니다 여러예제를 보고 해도 이해가잘안되요 결론은 서보모터2개를 우노2개와 블루투스 마스터 슬래이브를설정하여 조이스틱 으로 움직이는건데 결과는 같습니다 조이스틱움직이면 움직이고 멈추면 멈추고 헌데 하는 사람 마다 스타일이 틀린건지 업로드 방법도 좀 다르더라구요 그래서 혼란스러운게 사실입니다
쉬운예로 1+1=2 인데 응용 으로 0.5+0.5+0.5+0.5= 2가되는거처럼요 ㅡㅡㅋ
위처럼 한것은 조이스틱 중간값이 시리얼 모니터에 x 525 y 506으로
나오길래 오차값업이 정 숫자만 준것이고 예를 들어 조이스틱 y축 y>440 또는이상 나왔을때 a로데이타가 전송 되는것이 아닌지요? 해서 <>이렇게하면 가운데 잇지안을까 해서 저리한것입니다 ㅡㅡㅋ 그러면 중간 값을 어떤식으로줘야되는지요??슬래이브쪽은 맞게 한건가요?
하면할수록 어려운거같으면서도 하고나면 성취감잇고 그러네요
master님의 댓글
master
if(X<545 && X>505 && Y<526 && Y>486){ Serial.print('e'); btSerial.print('e'); }
현이꽃님의 댓글
현이꽃
모터쪽에는
if(r=='e')mode=0; //<<이부분 추가.. 맞나용 ?
master님의 댓글
master
네
현이꽃님의 댓글
현이꽃 작성일감사합니다 마스터님 찬찬히 해석해보면서 해보겟습니다