BASIC4MCU | 질문게시판 | 답변 : 아두이노 블루투스 통신 관련 질문 있습니다!!
페이지 정보
작성자 master 작성일2022-05-21 11:05 조회1,316회 댓글0건본문
초음파 센서로부터 측정된 거리값을 마스터가 받아 슬레이브로 전송 후,
이 측정된 거리값을 lcd 디스플레이에 표시하려고 합니다.
초음파 센서로부터 측정된 거리값인 ldistance와 rdistance를 각각 전송하는데 어려움이 있어
이를 sonic=ldistance*1000+rdistance로 변환 후 sonic 1개의 데이터를 보내려고 합니다.
(초음파 센서로부터 측정된 거리값이 최대 3자리수 인점을 고려)
이후 슬레이브가 sonic을 받으면 다음과 같이
left=sonic/1000,right =sonic % 1000
몫 연산자와 나머지 연산자를 사용하여 ldistance와 rdistance로 값을 나누려고 합니다.
마스터에서 최대 6자리수의 데이터를 전송하는 것을 확인하였는데,
슬레이브에서 left에는 0이,right에는 데이터 값 3자리가 표시됩니다ㅠ
혹시 블루투스 통신을 통해 6자리 숫자를 전송하는 것이 불가능한 부분인가요..??ㅠ
아무리 생각해도 코드에는 이상이 없는거 같은데 왜 left와 right를 슬레이브가 나눠서 받지 못하는지 모르겠습니다ㅠㅠㅠ
아래 코드 첨부합니다!!
//
//마스터=연결을 하는 쪽,데이터 보냄 -> 초음파 센서
//
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
SoftwareSerial BTSerial(4,10); // RX=4,TX=10 -> 이때 결선은 블루투스 핀의 RX에 10,TX핀에 4번 꽂기
//
int ltrigPin1=3,lechoPin1=2;
int ltrigPin2=6,lechoPin2=5;
int rtrigPin1=9,rechoPin1=8;
int rtrigPin2=12,rechoPin2=11;
//
void setup(){
pinMode(ltrigPin1,OUTPUT); pinMode(lechoPin1,INPUT);
pinMode(ltrigPin2,OUTPUT); pinMode(lechoPin2,INPUT);
pinMode(rtrigPin1,OUTPUT); pinMode(rechoPin1,INPUT);
pinMode(rtrigPin2,OUTPUT); pinMode(rechoPin2,INPUT);
Serial.begin(9600);
BTSerial.begin(9600);
}
//
void loop(){
//왼쪽 초음파 센서
digitalWrite(ltrigPin1,1); delayMicroseconds(10); digitalWrite(ltrigPin1,0);
long lduration1=pulseIn(lechoPin1,1); long ldistance1=lduration1/29/2;
digitalWrite(ltrigPin2,1); delayMicroseconds(10); digitalWrite(ltrigPin2,0);
long lduration2=pulseIn(lechoPin2,1); long ldistance2=lduration2/29/2;
//오른쪽 초음파 센서
digitalWrite(rtrigPin1,1); delayMicroseconds(10); digitalWrite(rtrigPin1,0);
long rduration1=pulseIn(rechoPin1,1); long rdistance1=rduration1/29/2;
digitalWrite(rtrigPin2,1); delayMicroseconds(10); digitalWrite(rtrigPin2,0);
long rduration2=pulseIn(rechoPin2,1); long rdistance2=rduration2/29/2;
//
int ldistance=min(ldistance1,ldistance2);
int rdistance=min(rdistance1,rdistance2);
long sonic=ldistance*1000+rdistance;
BTSerial.write(sonic);
}
//
//슬레이브=연결을 당하는 쪽,데이터 받음 -> LCD 디스플레이
//
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
SoftwareSerial BTSerial(4,10); //SCL=A5,SDA=A4에 꽂기
LiquidCrystal_I2C lcd(0x27,20,4);
//
long receive=0;
//
void setup(){
lcd.init(); lcd.backlight();
Serial.begin(9600);
BTSerial.begin(9600);
}
//
void loop(){
if(BTSerial.available()>0){
receive=BTSerial.read();
int left =receive/1000;
int right=receive%1000;
lcd.setCursor(7,0); lcd.print("L"); lcd.print(left); lcd.print(" ");
lcd.setCursor(7,1); lcd.print("R"); lcd.print(right); lcd.print(" ");
}
}
//
BTSerial.write(); 1바이트 송신 함수입니다.
BTSerial.read(); 1바이트 수신 함수입니다.
char i=1; BTSerial.write(); // 1바이트 송신 됩니다. (값=1)
int i=0x1234; BTSerial.write(); // 1바이트 송신 됩니다. (값=0x34, 상위바이트 0x12는 제거 됨)
long i=0x12345678; BTSerial.write(); // 1바이트 송신 됩니다. (값=0x78, 상위바이트 0x123456은 제거 됨)
여러바이트(2바이트 이상) 전송은 간단하지 않습니다.
프로토콜(전송포멧)을 만들어서 주고 받아야 하며
전송 포멧의 기본은 받는 곳에서 (지금 받는 데이터가 어느 부분인지) 구분이 편하도록 보내야 합니다.
댓글 0
조회수 1,316등록된 댓글이 없습니다.