BASIC4MCU | 질문게시판 | 블루투스가 한번 작동하고 그 다음부터 작동을 하지 않습니다.
페이지 정보
작성자 아야어여 작성일2019-08-13 14:54 조회9,275회 댓글1건본문
안녕하세요
픽시캠을 이용해서 사물인식 제어를 하고 있습니다.
리모트 컨트롤 모듈 - 현재 마스터로 설정
(아두보이스-음성인식 보드+블루투스 모듈-hc06)
엑츄에이터 카 모듈 - 슬레이브로 지정
(아두이노 우노+픽시캠+hc06+모터 드라이버)
이렇게 구성 되어 있습니다.
사물 인식을 해서 원하는 단계까지는 구현이 되었고,
리모트 컨트롤 모듈에서 엑츄에이터 카 모듈로
블루투스를 이용해서 0을 전송 받으면 엑츄에이터 카가 동작을 하고
1을 전송 받으면 정지하는 시스템을 구현하는 중입니다.
그런데 문제는 0을 전송을 받고 바퀴가 3번 ~ 5번 정도 돈 후에 작동을 멈춥니다.
여기에 블루투스 모듈 두 개가 연결 되었다가 끊기는 현상도 발생합니다.
그러면 여기서 다시 0을 전송을 하면 바퀴가 3번 ~ 5번 정도 돈 후에 다시 작동을 멈춥니다.
하지만 리모트컨트롤 모듈이 아닌 스마트폰 앱을 통해서 0을 보내게 되면
블루투스 모듈도 끊키지 않고 작동도 잘 됩니다.
어떤 이유 때문에 그런지 알고 싶습니다.
//////////////////////////리모트 컨트롤 모듈 코드 //////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial voiceSerial(8,7);
//
void setup(){
Serial.begin(9600);
while(!Serial){} // 시리얼모니터
Serial1.begin(9600); // 블루투스
voiceSerial.begin(9600);
}
//
char id,accuracy;
//
void loop(){
if(voiceSerial.available()){
id=voiceSerial.read();
accuracy=voiceSerial.read();
switch(id){
case '0': Serial.println("0");
Serial1.println("0"); // 시작
break;
case '1': Serial.println("1");
Serial1.println("1"); // 정지
break;
case '2': Serial.println("2");
Serial1.println("2");
break;
case '3': Serial.println("3");
Serial1.println("3");
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////엑츄에이터 카 모듈 코드/////////////////////////////////////////////////////////
#include <Wire.h>
#include <Pixy2.h>
#include <SoftwareSerial.h>
/// 모터드라이버 핀
#define mg2 7
#define mg1 8
#define md1 9
#define md2 10
#define ledPin 5 // 블루투스가 제대로 들어왔는지 확인하는 led
Pixy2 pixy;
SoftwareSerial mySerial(2, 3); //블루투스 핀
void setup() {
pinMode(md1, OUTPUT);
pinMode(md2, OUTPUT);
pinMode(mg1, OUTPUT);
pinMode(mg2, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(115200); //메인 시리얼 속도
Serial.print("Starting...\n");
mySerial.begin(9600); //블루투스 시리얼 속도
pixy.init();
}
void loop() {
static int i = 0;
int32_t left, right; //왼쪽바퀴, 오른쪽 바퀴
int j;
uint16_t blocks; //객체 인식용 변수
char buf[32];
char code; //블루투스 코드 받을 변수
pixy.ccc.getBlocks();
blocks = pixy.ccc.getBlocks();
if(mySerial.available()){
code=(mySerial.read());
if(code == '0' or '1'){
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
}
}
if(code == '0') //코드가 0이면 동작
{
if (blocks)
{
i++;
// do this (print) every 50 frames because printing every
// frame would bog down the Arduino
if (i%50==0) //최대 50프레임, 픽시캠의 객체를 찾는 함수
{
sprintf(buf, "Detected %d:\n", blocks);
Serial.print(buf);
for (j=0; j<blocks; j++)
{
sprintf(buf, " block %d: ", j);
Serial.print(buf);
pixy.ccc.blocks[j].print();
}
}
if((pixy.ccc.blocks[0].m_x>120)&&(pixy.ccc.blocks[0].m_x<190)) {go();} //객체가 120에서 190사이면 직진
if((pixy.ccc.blocks[0].m_x<120) && (pixy.ccc.blocks[0].m_x>10)) {gauche();} //객체가 10에서 120사이면 좌회전
if(pixy.ccc.blocks[0].m_x>190) {droite();}}//객체가 190미만이면 우회전
else{stop();}} //객체가 아무것도 보이지 아니하면 정지
else{stop();}} //코드가 다른 것 들어오면 정지
//////////////////직진, 좌회전, 우회전 함수
void droite(){
analogWrite(mg1,0);
analogWrite(mg2,0);
analogWrite(md1,255);
analogWrite(md2,0);
delay(30);}
void gauche(){;
analogWrite(mg1,255);
analogWrite(mg2,0);
analogWrite(md1,0);
analogWrite(md2,0);
delay(30);}
void stop(){
analogWrite(mg1,0);
analogWrite(mg2,0);
analogWrite(md2,0);
analogWrite(md1,0);
delay(30); }
void go (){
analogWrite(mg1,255);
analogWrite(mg2,0);
analogWrite(md1,255);
analogWrite(md2,0);
delay(30); }
댓글 1
조회수 9,275master님의 댓글
master 작성일모듈을 사용해보지 않아서 도움을 드리지 못합니다.