?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

블루투스 통신 . 마스터 터치센서 슬레이브 서보모터

페이지 정보

작성자 adriano 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-06-03 11:56 조회706회 댓글1건

본문

마스터 터치센서를 4개를 눌렀을 경우 슬레이브에서 신호를 받아 서보모터가 동작 할 수 있도록 하였습니다.

하지만 슬레이브에서 신호를 받는데 블루투스 시리얼에 나타나와 있는 것을 시리얼에서 한번만 받는게 아니고 계속 받고 있습니다 . 예를 들어 마스터에서 abcd 를 눌렀다면 슬레이브에서는 abcd abcd abcd  이런 식으로 계속 받고 있습니다. 전원을 빼지 않는 이상 계속 받고 있네요. 제가 아직 c언어에 미숙하여 터치센서 기본 예제에 블루투스 c를 짜집기하여 구성하였습니다. ㅠㅠ

마스터 코드 입니다

#include <Wire.h> // include I2C library
#include <i2c_touch_sensor.h>
#include <MPR121.h>
i2ctouchsensor touchsensor;

 

long previousMillis = 0;
long interval = 100;
void setup()
  {   
    Serial.begin(9600); // for debugging    
    Wire.begin(); // needed by the GroveMultiTouch lib    
    touchsensor.initialize(); 
  }
void loop()
{    
   unsigned char MPR_Query=0;
   unsigned long currentMillis = millis();

 

 if(currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis;
    touchsensor.getTouchState();
  }

 

 for (int i=0 ; i<4 ; i++)
 {
 if (touchsensor.touched&(1<<i))
   {

 

         if(i== 0)
         {
          Serial.write('A');
          delay(1000);
          }

 

         else if (i== 1)
          {
          Serial.write('B');
          delay(1000);
           }

 

         else if (i== 2)
          {
          Serial.write('C');
          delay(1000);
           }
        
         else if (i== 3)
          {
          Serial.write('D');
          delay(1000);
          i=4;
           }
         }
       }
     } 

 

슬레이브

#include <Servo.h>
#include <SoftwareSerial.h>

 

int Tx = 0;
int Rx = 1;

 

SoftwareSerial bluetooth(Tx, Rx);
Servo myservo1;
Servo myservo2;
Servo myservo3;

 

void setup() {
Serial.begin(9600);
bluetooth.begin(9600);
myservo1.attach(4);
myservo2.attach(5);
myservo3.attach(6);
}

 

void loop() {
if(bluetooth.available())
 {
  char data = Serial.read();      // ch라는 문자형 변수를 선언한다.그래서 블루투스의 데이터를 읽어서
  Serial.println(data);            //ch라는 변수에 저장하고 시리얼 모니터에 나타낸다
  delay(1000);
 
  if(data =='A')
 {
  myservo1.attach(4);
  myservo1.write(180);
  delay(1000);
  myservo1.write(0);
  delay(1000);
 }
 
  if(data == 'B')
 {
  myservo2.attach(5);
  myservo2.write(180);
  delay(1000);
  myservo2.write(0);
  delay(1000);
 }
 
if(data == 'C')
{
  myservo3.attach(5);
  myservo3.write(180);
  delay(1000);
  myservo3.write(0);
  delay(1000);
  }
 }
 

터치센서 기본 예제입니다

#include <Wire.h> // include I2C library
#include <i2c_touch_sensor.h>
#include <MPR121.h>
// include our Grove I2C touch sensor library
// initialize the Grove I2C touch sensor
// IMPORTANT: in this case, INT pin was connected to pin7 of the Arduino
// (this is the interrupt pin)
i2ctouchsensor touchsensor; // keep track of 4 pads' states
//boolean padTouched[4];
long previousMillis = 0;
long interval = 100;
void setup()
  {   
    Serial.begin(9600); // for debugging  
    Serial.print("begin to init"); 
    Wire.begin(); // needed by the GroveMultiTouch lib    
    touchsensor.initialize(); // initialize the feelers     // initialize the containers    
    //for(int i=0; i<=3; i++)
    //{         
   // padTouched[i]=false;    
    //}
 
  }
void loop()
{    
   unsigned char MPR_Query=0;
   unsigned long currentMillis = millis();
 if(currentMillis - previousMillis > interval)
  {
    previousMillis = currentMillis;
    touchsensor.getTouchState();
  }
 for (int i=0;i<12;i++)
 {
 if (touchsensor.touched&(1<<i))
  {
  Serial.print("pin ");
        Serial.print(i);
        Serial.println(" was  touched");
         }
 }

 

 

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

변수를 몇 개 생성해서 현재 터치 센서의 값을 항상 기억하도록 만드세요. loop() 함수가 반복될 때 이전 터치센서의 값과 다를때만 BT로 데이터를 보내도록 만들어보세요.
그리고 delay(1000) 함수는 가급적 사용하지 않고 만드시는게 좋을 것 같습니다.