BASIC4MCU | 질문게시판 | 아두이노 블루투스 통신 관련 질문 있습니다!!
페이지 정보
작성자 블루툿 작성일2022-05-21 10:51 조회610회 댓글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; //trig = 초음파 발신부
int lechoPin1 = 2; //echo = 장애물에 부딪히면서 다시 돌아오는 초음파 수신부
int ltrigPin2 = 6;
int lechoPin2 = 5;
int rtrigPin1 = 9;
int rechoPin1 = 8;
int rtrigPin2 = 12;
int 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); //아두이노 & IDE 간 통신
BTSerial.begin(9600);
}
void loop()
{
//왼쪽 초음파 센서
digitalWrite(ltrigPin1, HIGH); //trig 신호 on
delayMicroseconds(10); // 10us 정도 유지
digitalWrite(ltrigPin1, LOW); //trig 신호 off
long lduration1 = pulseIn(lechoPin1, HIGH); //trig에서 발신한 초음파가 echo로 다시 돌아오기까지의 시간
long ldistance1 = lduration1 / 29 / 2; //거리 = 시간 * 속도
digitalWrite(ltrigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(ltrigPin2, LOW);
long lduration2 = pulseIn(lechoPin2, HIGH);
long ldistance2 = lduration2 / 29 / 2;
//오른쪽 초음파 센서
digitalWrite(rtrigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(rtrigPin1, LOW);
long rduration1 = pulseIn(rechoPin1, HIGH);
long rdistance1 = rduration1 / 29 / 2;
digitalWrite(rtrigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(rtrigPin2, LOW);
long rduration2 = pulseIn(rechoPin2, HIGH);
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 초기화
lcd.backlight(); //lcd 백라이트 켬
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.setCursor(8, 0);
lcd.print(left);
lcd.setCursor(7, 1);
lcd.print("R");
lcd.setCursor(8, 1);
lcd.print(right);
}
}
댓글 0
조회수 610등록된 댓글이 없습니다.