BASIC4MCU | 질문게시판 | MEGA-UNO-BT모듈 질문입니다.
페이지 정보
작성자 맹균 작성일2023-11-01 20:36 조회402회 댓글1건본문
이건 메가 보드의 코드입니다. 조건에 충족할시에 시리얼3으로 우노에게 R을 전송합니다.
//#include <SoftwareSerial.h>
#include <TFMPlus.h> // TFMini Plus 라이브러리 v1.5.0 포함
TFMPlus tfmP; // TFMini Plus 객체 생성
#include "printf.h" // Intel 기반 아두이노를 지원하도록 수정됨
int16_t tfDist = 0; // 물체까지의 거리 (센티미터)
int16_t tfFlux = 0; // 반환 신호의 강도 또는 품질
int16_t tfTemp = 0; // 리다 센서 칩의 내부 온도
//SoftwareSerial bluetooth(10, 11); // 블루투스 모듈의 TX와 RX 핀 설정
const int laserSensorPin = 22; // 레이저센서 on/off 변수
const int lidarSensorPin = 23; // 라이다센서 on/off 변수
const int sensorPin = 24; // 예시 핀 번호 - 연결한 핀에 따라 변경
unsigned long previousMillis = 0; // 이전 시간 저장
const long interval = 5000; // 5초 (5000 밀리초)
enum Mode { ST, R, G };
Mode currentMode = ST;
unsigned long modeStartTime=0;
bool objectDetected = false;
void setup() {
pinMode(laserSensorPin, INPUT);
pinMode(sensorPin, INPUT);
pinMode(lidarSensorPin, INPUT);
Serial.begin(19200);
//bluetooth.begin(9600); /// 메가-블루투스
Serial2.begin(38400); // 메가-우노보드
Serial3.begin(9600); //메가-우노(블루투스용)
////////////////////////////////////////라이다//////////////////////////////
Serial1.begin(115200); // 메가-라이다
delay(20); // 포트가 초기화되기 위한 시간 제공
printf_begin(); // printf 초기화.
printf("\r\nTFMPlus on"); // '안녕하세요' 출력
//Serial2.begin(115200); // TFMPlus 장치 시리얼 포트 초기화
delay(20); // 포트가 초기화되기 위한 시간 제공
tfmP.begin(&Serial1); // 장치 라이브러리 객체 초기화 및...
// 장치 시리얼 포트를 객체로 전달.
printf("소프트 리셋: "); // 시리얼 포트 리셋
if (tfmP.sendCommand(SOFT_RESET, 0))
{
printf("성공.\r\n");
}
else
tfmP.printReply();
delay(500); // 시스템 리셋이 완료될 충분한 시간을 줄 수 있도록 추가
printf("펌웨어 버전: ");
if (tfmP.sendCommand(GET_FIRMWARE_VERSION, 0))
{
printf("%1u.", tfmP.version[0]); // 세 개의 숫자를 '.'로 구분하여 출력
printf("%1u.", tfmP.version[1]);
printf("%1u\r\n", tfmP.version[2]);
}
else
tfmP.printReply();
printf("데이터 프레임 속도: ");// - - 데이터 프레임 속도를 20Hz로 설정 - - - - - - - -
if (tfmP.sendCommand(SET_FRAME_RATE, FRAME_20))
{
printf("%2uHz.\r\n", FRAME_20);
}
else
tfmP.printReply();
delay(500);
///////////////////////////// 라이다////////////////////////////////////
}
void STmode() { /////////////// 라이다 센서 사용////////////////////
Serial.println("ST 모드"); // 디버깅용 모드 진입 확인
static bool sentR = false; // R을 보냈는지 여부를 추적
if (!sentR) {
Serial2.print("R"); // R을 한 번만 보내기
delay(1000); // 전송이 완료될 때까지 잠깐 대기
sentR = true; // R을 보냈음을 표시
}
//delay(100); // 전송이 완료될 때까지 잠깐 대기
//digitalWrite(laserSensorPin, LOW); // 레이저 센서 비활성화
//digitalWrite(lidarSensorPin, HIGH); // Lidar 센서 활성화
////////////////////////////라이다 동작///////////////////////////////////
delay(50); // 20Hz 데이터 프레임 속도와 일치하는 루프 지연
if (tfmP.getData(tfDist, tfFlux, tfTemp)) // 장치에서 데이터 가져오기
{
printf("거리:%04i cm ",tfDist); // 거리 출력,
printf("강도:%05i ", tfFlux); // 신호 강도/품질 출력,
printf("온도:%2i %s", tfTemp, "C"); // 온도 출력,
printf("\r\n"); // 줄 바꿈.
// 30cm 이하 블루투스로 "R" 전송
if (tfDist <= 30)
{
sentR = false; // R을 다시 보내도록 변수 재설정
Serial3.print('R');
delay(300);
/*bluetooth.write("R"); // 블루투스모듈로 "R" 전송
delay(300); // 전송 대기*/
//digitalWrite(lidarSensorPin, LOW); // Lidar 센서 비활성화
delay(3000); // 3초 대기
currentMode = G; // G 모드로 전환
}
}
else // 명령이 실패하면...
{
tfmP.printFrame(); // 오류 및 HEX 데이터 출력
}
///////////////////////////////////라이다 동작//////////////////////////////////////
modeStartTime = millis();
}
void Rmode() { ///////// 레이저센서 사용 ////////////////////
Serial.println("R 모드"); // 디버깅용 모드 진입 확인
static bool sentR = false; // R을 보냈는지 여부를 추적
if (!sentR) {
Serial2.print("R"); // R을 한 번만 보내기
delay(1000); // 전송이 완료될 때까지 잠깐 대기
sentR = true; // R을 보냈음을 표시
}
if ((millis() - modeStartTime) >= 30000) { // R모드 유지 시간이 30초를 초과하면
Serial3.print("ST");
currentMode = ST; // ST 모드로 전환
} else if (digitalRead(sensorPin) == LOW && (millis() - previousMillis) >= 5000) {
// 레이저 센서 조건
Serial3.print("ST");
currentMode = ST; // ST 모드로 전환
}
}
void Gmode() { /////////////////// 도트매트릭스만 작동 ///////////////////////
Serial.println("G 모드"); // 디버깅용 모드 진입 확인
Serial3.print('R');
static bool sentG = false; // R을 보냈는지 여부를 추적
if (!sentG) {
Serial2.print("G"); // G을 한 번만 보내기
delay(1000); // 전송이 완료될 때까지 잠깐 대기
sentG = true; // G을 보냈음을 표시
}
delay(1000); // 전송이 완료될 때까지 잠깐 대기
digitalWrite(laserSensorPin, LOW); // 레이저 센서 비활성화
digitalWrite(lidarSensorPin, LOW); // 라이다 센서 비활성화
if (Serial3.available() && Serial3.readStringUntil('\n') == "ST") {
sentG = false; // R을 다시 보내도록 변수 재설정
currentMode = ST;
}
}
void loop() {
switch (currentMode) {
case ST:
STmode();
break;
case R:
Rmode();
break;
case G:
Gmode();
break;
}
// R 모드 수신
if (Serial3.available() && Serial3.read() == 'R') {
currentMode=R; // 현재 모드 R로 변경
Serial2.print("R"); // 우노에게 "R" 전송
//digitalWrite(lidarSensorPin, LOW); // Lidar 센서 비활성화
//digitalWrite(laserSensorPin, HIGH); // 레이저 센서 활성화
modeStartTime = millis(); // 모드 시작 시간 초기화
}
}
//////////이건 우노 보드의 코드입니다. 우노보드는 메가로 부터 받은정보를 BT모듈로 전송하고 BT모듈로 받은정보를 메가보드로 전송합니다./////
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // RX, TX
void setup() {
// 시리얼 통신 설정
Serial.begin(9600);
BTSerial.begin(9600);
}
void loop() {
// Mega 보드에서 Bluetooth 모듈로 데이터를 전송
if (Serial.available()) {
char dataReceived = Serial.read();
BTSerial.print(dataReceived);
}
// Bluetooth 모듈에서 Mega 보드로 데이터를 전송
if (BTSerial.available()) {
char dataReceived = BTSerial.read();
Serial.print(dataReceived);
}
}
여기서 BT모듈로 받은 정보는 메가보드로가서 의도한 동작을 하는데 그 반대의 경우 즉 메가로 부터 받은 정보를 우노는 BT모듈로 전송하지 못하고 있습니다.
BT모듈은 AT커맨드를 사용해 M/S 설정도 해주었고 보드간 보드 레이트도 맞춘상태입니다.
어떤게 문제일까요?
댓글 1
조회수 402master님의 댓글
master 작성일
우노 코드는 BT모듈 설정용 코드일 뿐 메가(BT)와 통신하는 코드가 아닙니다.
(엄밀하게는 함수가 달라서 설정용 코드도 아님)
두 개의 코드를 모두 만족하려면 BT 송신 코드를 추가하면 됩니다.
BTSerial.print(dataReceived);
BTSerial.write(dataReceived);
이 두개(print()와write())의 차이점도 아셔야 합니다.
//
void loop(){
if(Serial.available()){
char s=Serial.read();
BTSerial.write(s);
}
//
if(BTSerial.available()){
char b=BTSerial.read(); // mega(BT)에서 받은 데이터를
Serial.write(b); // 시리얼모니터에도 송신하고
BTSerial.write(b); // mega(BT)로도 송신 // <--- 추가
}
}