질문게시판 > 아두이노 로봇팔 서보모터4개 블루트스 제어 우노 와 서보모터 결합방법 알려주세요

TODAY1,101 TOTAL508,946
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 아두이노 로봇팔 서보모터4개 블루트스 제어 우노 와 서보모터 결합방법 알려주세요

페이지 정보

작성자 안녕하세여 작성일2019-03-11 07:18 조회111회 댓글1건

본문

	

소스코드는 구했는데  블루트스 모듈로  로봇팔 서보모터4개를 휴대폰으로 제어 할려는데 우노 에다 결합하는 배선을 어떻게할줄 모르겠습니다 가르쳐주세요 배선 회로도좀 짜주세요

소스 코드 도 좀 봐주세요


// F :
#include <EEPROM.h>
//#include <Wire.h>
#include <SoftwareSerial.h>
#include <Servo.h>

#define turnPin 3                       //수평회전 서보모터 핀번호   ............ 사용자가 할당한 핀 번호를 지정하십시요.....
#define highlowPin 4                    //올리고 내리는 서보모터 핀번호
#define stretchPin 5                     //뻗고 오므리기 핀번호
#define grapPin 6                       //집게 열고 닫기 핀번호

int maxHigh = 150 ; int minLow = 0;  // 실제 작동을 해보고 절절한 값을 찾으십시요
int maxStretch = 150; int minStretch = 0; // 실제 작동을 해보고 절절한 값을 찾으십시요
int value_grap=75; int grapClosed = 120; int grapOpen = 30; // 실제 작동을 해보고 절절한 값을 찾으십시요

char c;
long milli ;                           // millis() 값을 받아서 사용하기 위한 것
long actionTerm = 100;
long actionTime = 0;
int dr = 5;                            // 회전 감도.... 초기값 : 5
int16_t A;                            // 아날로그 값을 담기 위해 사용되는 변수

int16_t angle[5] = {0, 30,75,75,75};                                        //이곳에 개별 수치 대입하면 프로그램 처리시 오류 발생함....아두이노 자체 오류...
int16_t CenterValue[5] = {0,30,75,75,75} ;
int16_t grabOpen, grabClosed;
int16_t centerD[5]={0,0,0,0,0};
int d = 2000;
int data = 0;
int8_t i,j,k;
byte b;
bool autoPlay, centerRecorded;
String code ="";

SoftwareSerial SoftSerial(0,1);        // 블루투스 연결 하기 위함
Servo turn;
Servo highlow;
Servo stretch;
Servo grap;

//***************************************************************
void setup() {
//***************************************************************
 
if (Serial) {Serial.begin(9600);} else {SoftSerial.begin(9600);}
autoPlay = ! EEPROM.read(7);            // 7 번지 저당된 값이 0 이면 자동 진행 수행

b=EEPROM.read(0);
if( b>0 && b<10){
  centerRecorded = true ; Serial.print("저장된 기준값..");
  CenterValue[1]=EEPROM.read(1); Serial.print(CenterValue[1]); Serial.print(" ");angle[1] = CenterValue[1]; centerD[1]= CenterValue[1]-75; //돌리기
  CenterValue[2]=EEPROM.read(2); Serial.print(CenterValue[2]); Serial.print(" ");angle[2] = CenterValue[2]; centerD[2]= CenterValue[2]-75;   //올리고내리기
  CenterValue[3]=EEPROM.read(3); Serial.print(CenterValue[3]); Serial.print(" ");angle[3] = CenterValue[3]; centerD[3]= CenterValue[3]-75;  //펼치기
  CenterValue[4]=EEPROM.read(4); Serial.print(CenterValue[4]); Serial.print(" ");angle[4] = CenterValue[4]; centerD[4]= CenterValue[4]-75;  //집게
  grabOpen=CenterValue[4]-35; grabClosed = CenterValue[4]+20;
  Serial.println();
}
Serial.println("**********************************************");
Serial.println("        4개 자유도 로봇팔 동작 합니다. ");
Serial.println("                        - 21세기의봄 - ");
Serial.println("                          2019-01-10") ;
Serial.println("**********************************************");
Serial.println(" 입력창에 글자를 입력하고 전송하세요..........");
Serial.println(" R 또는 L 또는 1,2 -> 좌우 돌리기");
Serial.println(" F 또는 B 또는 3,4-> 올리기/내리기");
Serial.println(" G 또는 I 또는 5,6 -> 펼치고 오무르기");
Serial.println(" W 또는 U 또는 7,8-> 집게 열고 닫기");
Serial.println(" 'z,x,c,v' --> 중신 원점으로 이동");
Serial.println("+ - --> 회전 감도 올리고 내리기");
Serial.println(" a .. 자동 동작 진행 on/off");
Serial.println(" o .. 중심점 서보값 설정및 저장");
Serial.println(" p .. 중심점 서보값을 전체 75 값으로 환원");
Serial.println(" t .. 전체 서보 동작 test ...");
Serial.println(" l .. ");
Serial.println(" ");

if (autoPlay){Serial.println("자동 모드입니다... 모드 변경은 5초 내에 'a' 전송...");}

turn.attach(turnPin);
highlow.attach(highlowPin);
stretch.attach(stretchPin);
grap.attach(grapPin);
//서보모터 중립
Straight();
milli = millis();
}
//***************************************************************
void loop(){
//***************************************************************

if (autoPlay && millis()> milli + 5000) {
   // 여기에 자동으로 실행될 올을 쓰세요...
   Serial.println(" 자동 동작 모드 시작합니다....");                          //g: grab, h: 높낮이, s: 뻗히기, t: 돌리기, d: 멈추기
   code = "g0,h50,s25,g100,s5,h-15,t-85,s25,h50,g0,d300,h-15,s5,t0" ;                    //g0-> grab Open, g100-> grab close
   DoCode(); delay(500);
   DoCode(); delay(500);
   DoCode(); delay(500);
   Serial.println(" 자동 동작 모드 마쳤습니다.....");Serial.println();
     milli = millis();

while (Serial.available()) {
     c = Serial.read();
     if(c> 13){Serial.print(c); Serial.print(" ");}                             //char(13),char(10)은 무시...
     SoftSerial.print(c);
}
while (SoftSerial.available()) {         // 블루투스 기기로 수신되는 문자에 따라서 운전 조작 결정,
    c = SoftSerial.read();
    SoftSerial.print(c);                 //블루투스로 들어온 문자를 직렬통신창에 출력
    if (c>64 && c<123){break;}   
}      
if (c == '-') { dr -=1; if (dr<1){dr = 1;} Serial.print("회전 감도 ..."); Serial.println(dr);}
if (c== '+') { dr ++; if (dr >10){dr = 10;} Serial.print("회전 감도 ..."); Serial.println(dr);}
if (c == 'F'|| c == 'f' || c=='3') { ServoTurn(angle[2]+dr, 2);}
if (c == 'B'|| c == 'b' || c=='4') { ServoTurn(angle[2]-dr, 2);}
if (c == 'R'|| c == 'r' || c=='1') { ServoTurn(angle[1]+dr, 1);}
if (c == 'L'|| c == 'l' || c=='2') { ServoTurn(angle[1]-dr, 1);}
if (c == 'G'|| c == 'g' || c=='5') { ServoTurn(angle[3]+dr, 3);}
if (c == 'I'|| c == 'i' || c=='6') { ServoTurn(angle[3]-dr, 3);}
if (c == 'W'|| c == 'w' || c=='7') { ServoTurn(angle[4]+dr, 4);}
if (c == 'U'|| c == 'u' || c=='8') { ServoTurn(angle[4]-dr, 4);}
if (c == 'z'){ ServoTurn(CenterValue[1], 1);}  
if (c =='x' ){ ServoTurn(CenterValue[2], 2);   }
if (c == 'c'){ ServoTurn(CenterValue[3], 3);   }
if (c == 'v'){ ServoTurn(CenterValue[4], 4);   }
if (c == 't'){ Test(); }
if (c == 's'){ Straight(); }
if (c == 'a'){                                           // 자동진행 모드 끔/켬
   autoPlay = !autoPlay;
   EEPROM.write(7, !autoPlay);               //autoPlay 값과 반대 값을 저장....
   Serial.print("자동 동작 진행 모드 변경...."); if(autoPlay){Serial.println(" 예 ");} else { Serial.println("아니오");}
   if(autoPlay){Serial.println("리셋하여주시기 바랍니다.....!!"); while(true){};}
}  
if (c == 'o') {                                         // 현재 정렬 상태를 서보모터값을 기본 값으로 저장
   EEPROM.write(0, 3);
   for (i = 1; i<5 ; i ++){
       CenterValue[i] = angle[i];
       b = byte(CenterValue[i]); Serial.print(b); Serial.print(" ");
       EEPROM.write(i, b);
   }
   Serial.println("... 서보모터의 중심점 기준값이 저장되었습니다....");
}
if(c == 'p'){
   EEPROM.write(0, 0);                                     //서보모터의 중심값을 전체 75로 환원
   for (i = 1; i<7 ; i ++){
       CenterValue[i] = 75;
       EEPROM.write(i, byte(75)); 
   }
   Serial.println("서보모터의 중심점 기준점 값이 잔체 75  로 환원 되었습니다....");   
}     
c=0;     //c 값 초기화
}
//*****************************************************************   
void ServoTurn(int16_t angleTo, uint8_t servoNum){
//***************************************************************** 
int8_t directn = 2; bool directnB = true;
if (angleTo < angle[servoNum]) {directn *=-1; directnB = false; }
for (int16_t k = angle[servoNum]; k <= angleTo && directnB || k >= angleTo && ! directnB; k +=directn){
   switch(servoNum){
   case 1 : turn.write(k) ; break;
   case 2 : highlow.write(k) ; break;
   case 3 : stretch.write(k) ; break;
   case 4 : grap.write(k) ; break;
   }
   delay(30);
}
angle[servoNum]= angleTo;                            //현재 값 ........
switch(servoNum){
case 1 : Serial.print("t 회전 각도 ..........."); break;
case 2 : Serial.print("h 올리고내리기 각도 ...");  break;
case 3 : Serial.print("s 펼치기 각도 .........");  break;
case 4 : Serial.print("g 집게 각도 ...........");  break;
}
Serial.print(angle[servoNum]); Serial.print(" ");Serial.println(angle[servoNum]-CenterValue[servoNum]);
}
//*****************************************************************   
void Straight(){
//*****************************************************************   
Serial.println("기준값으로 차렷...");
for (i=1;i <5 ; i ++){
    ServoTurn(CenterValue[i],i);
}
}
//*****************************************************************   
void Test(){
//*****************************************************************   
Straight();
for (i=1;i <4 ; i ++){
    ServoTurn(CenterValue[i]-30,i);
    ServoTurn(CenterValue[i]+30,i);
    ServoTurn(CenterValue[i],i);
   
}
ServoTurn(grapOpen,4);
ServoTurn(grapClosed,4);
ServoTurn(grapOpen,4);
ServoTurn(grapClosed,4);
}
//*****************************************************************   
void DoCode(){
//*****************************************************************   
String unitOrder;   
int8_t L,L1,L2;  L1=-1;L2=0; uint8_t codeL = code.length();
while (L2>-1){
   if(L1>-1){L2= code.indexOf(",",L1+1);} else {L2 = code.indexOf(",");}                                //단위 명령 추출...',' 로 구분
   if (L2>0){ unitOrder = code.substring(L1+1,L2);L1=L2;}
       else {if (codeL>L1){ unitOrder = code.substring(L1+1);}
         else { unitOrder ="";}
   }

   L=unitOrder.length();                                //단위 명령 실행
    if (L>0){
       char order = unitOrder.charAt(0);
       int16_t value = unitOrder.substring(1).toInt() ;
     switch(order){
       case 't' :  value +=CenterValue[1] ;ServoTurn(value,1) ; break;          //중심 조정 값 반영하여 실행
       case 'h' :  value +=CenterValue[2] ;ServoTurn(value,2) ; break;
       case 's' :  value +=CenterValue[3] ;ServoTurn(value,3) ; break;
       case 'g' :  if (value==0){value =grabOpen;}
                   else {if (value >=100){value = grapClosed;}
                         else {value +=CenterValue[4] ;}
                   }     
                   ServoTurn(value,4) ; break  ;
       case 'd' : delay(value); break;
     }
    }
}
 
}
 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 111

master님의 댓글

master 작성일

소스코드 구한 곳에 연결방법 등이 설명되어 있지 않을까요?

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 340
공지 사이트 이용 안내댓글[7] master 17-10-29 6451
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 2516
질문 아두이노 코딩 질문드립니다! 새글 김정훈 19:46 6
질문 로드셀로 측정한 무게가 음수인 이유가 궁금해요 이미지새글첨부파일 야거 19:22 3
질문 압력센서 코딩 도와주세연 새글 지그개시키 17:39 5
질문 마스터님 도와주세요!!! Vhdl 코드 해석이 잘 안되는데 새글 양뜨 16:42 6
질문 IG-43GM+Encoder 01TYPE에 대한 질문 있습니다. 이미지새글 YDyd 15:59 5
질문 아두이노 슬레이브 코드 질문 합니다. 새글 쥬스 13:28 7
답변 답변글 답변 : 아두이노 슬레이브 코드 질문 합니다. 새글 master 15:18 5
질문 아두이노 코딩댓글[1] 새글 대구간 12:45 10
답변 답변글 답변 : 아두이노 코딩 새글 master 15:03 9
질문 센서,모터 연결 질문댓글[3] 이미지새글 가든 10:05 25
질문 아두이노 블루투스 전송댓글[1] 새글 으아아악 02:33 15
질문 아두이노 심박센서댓글[3] 새글 으아아악 19-05-26 26
질문 pixycam을 이용하고 있는데 질문드립니다~~댓글[1] 이미지새글첨부파일 아야어여 19-05-26 17
질문 블루투스에서 아두이노 전송댓글[2] 이미지새글첨부파일 상오 19-05-26 26
질문 이두이노 코드 질문드립니다. 새글 서든칼신 19-05-26 13
답변 답변글 답변 : 이두이노 코드 질문드립니다. 새글 master 19-05-26 10
질문 ATMEGA128 fnd에 분과 초를 표시하는 소스코드 새글 기벡장인 19-05-26 15
답변 답변글 답변 : ATMEGA128 fnd에 분과 초를 표시하는 소스코드 새글 master 19-05-26 14
질문 항상 감사합니다. 혹시 앱인벤터에 관한 내용도 질문가능할까요?댓글[1] 새글 푸링이 19-05-26 16
질문 Atmega128a 디지털시계댓글[3] 이미지새글첨부파일 아트메가잘하고싶다 19-05-25 39
질문 안녕하세요 서보모터 블루투스 연결 질문드려요 깈잌으 19-05-25 14
답변 답변글 답변 : 안녕하세요 서보모터 블루투스 연결 질문드려요 새글 master 19-05-25 15
질문 아두이노 MQ-7 관련 질문있습니다.댓글[7] 아쿠아맨 19-05-25 15
질문 서보모터 시간제어댓글[1] 코시 19-05-25 14
질문 초음파센서, 가변저항 차고댓글[1] 코시 19-05-25 8
답변 답변글 답변 : 초음파센서, 가변저항 차고 새글 master 19-05-25 7
질문 atmega128a 광센서댓글[1] 첨부파일 동스타 19-05-25 17
게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기