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

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

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


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

페이지 정보

작성자 안녕하세여 작성일2019-03-11 07:18 조회33회 댓글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

조회수 33

master님의 댓글

master 작성일

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

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

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 129
공지 사이트 이용 안내 댓글[5] master 17-10-29 5121
질문 AVR STUDIO 4.19 & AVRISP MKII USB 댓글[1] 새글 오박사 19-03-18 12
질문 예제 코드 구합니다 댓글[1] 새글첨부파일 오박사 19-03-18 10
질문 마스터님! 고생하십니다! 인터럽트 질문좀 드리겠습니다. 새글 닷모드 19-03-18 8
답변 답변글 답변 : 마스터님! 고생하십니다! 인터럽트 질문좀 드리겠습니다. 새글 master 10:36 4
질문 시리얼 통신 키보드 질문드립니다. 댓글[1] 새글 이이제이 19-03-18 15
질문 스텝모터 제어 역방향 회전시 힘이 약하게 돌아가는 현상 궁금합니다 19-03-16 13
답변 답변글 답변 : 스텝모터 제어 역방향 회전시 힘이 약하게 돌아가는 현상 댓글[2] master 19-03-16 20
질문 아두이노시리얼 0xff가 available 사용해도 계속 뜨네요ㅠㅠ yangty01 19-03-16 8
답변 답변글 답변 : 아두이노시리얼 0xff가 available 사용해도 계속 뜨네요ㅠㅠ master 19-03-16 6
질문 atmega128 Switch를 이용한 FND제어 질문 master 19-03-16 6
질문 아두이노 시리얼통신 질문합니다. 댓글[3] 이이제이 19-03-16 25
질문 ATmega128에 대해서... 댓글[2] YDyd 19-03-15 24
질문 프로세싱 RFID 태그시 색변화.. 댓글[1] ksyh2030 19-03-14 23
질문 avr i2c eeprom 코드관련해서요 댓글[1] 이미지첨부파일 남이 19-03-14 21
질문 avr에 대해서... 댓글[3] YDyd 19-03-14 32
질문 초음파 용착기에 대해 질문드립니다! ! 댓글[2] 닷모드 19-03-12 30
질문 Pir센서 감지 후 rf433 송신기 A반장 19-03-12 18
답변 답변글 답변 : Pir센서 감지 후 rf433 송신기 댓글[13] master 19-03-12 40
답변 답변글 답변 : 답변 : Pir센서 감지 후 rf433 송신기 댓글[11] master 19-03-14 40
질문 레오나르도 시리얼통신 마우스 질문드립니다. 댓글[1] 이이제이 19-03-11 20
답변 답변글 답변 : 레오나르도 시리얼통신 마우스 질문드립니다. 댓글[5] master 19-03-12 36
답변 답변글 답변 : 답변 : 레오나르도 시리얼통신 마우스 질문드립니다. 댓글[4] master 19-03-12 28
답변 답변글 답변 : 답변 : 답변 : 레오나르도 시리얼통신 마우스 질문드립니다. 댓글[18] master 19-03-13 83
답변 답변글 답변 : 답변 : 답변 : 답변 : 레오나르도 시리얼통신 마우스 질문드립니다. 댓글[2] master 19-03-14 26
질문 아두이노 스텝모터 제어에 대해 질문드립니다. 닷모드 19-03-11 26
답변 답변글 답변 : 아두이노 스텝모터 제어에 대해 질문드립니다. 댓글[6] master 19-03-12 39
답변 답변글 답변 : 답변 : 아두이노 스텝모터 제어에 대해 질문드립니다. 댓글[2] master 19-03-14 29
질문 ATmega에 대하여 궁금합니다. YDyd 19-03-11 15
게시물 검색

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
모바일버전으로보기