BASIC4MCU | 질문게시판 | 아두이노에서 블루투스로 값을 2개 받으려하는데 질문드립니다.
페이지 정보
작성자 가붝 작성일2020-10-23 11:20 조회7,324회 댓글3건본문
안녕하세요.
안드로이드 앱을 이용해서 아두이노 rc카 조종하는걸 만들어보고 있습니다.
안드로이드앱에서 아두이노와 블루투스 연결하여 하나의 값을 전송해주어 값에 따라 rc카가 동작할 수 있게 해주었습니다.
그런데 몇 초동안 앞으로 가는것과 같은 동작을 구현하기 위해서 안드로이드 앱에서 2개의 값을 아두이노로 전송해주고
아두이노에서는 2개의 값을 받아 동작하게 하고 싶은데 어떻게 구현해야 할지 모르겠습니다.
input = BT.read(); 이렇게 안드로이드 앱으로 값을 받아오는데
아두이노에선
input1 = BT.read();
input2 = BT.read();
안드로이드에선
Bluetooth.send("K", true);
Bluetooth.send(num1,true);
이런식으로 해야겠다고 생각했는데 해결이 되지 않아 문의드립니다.
비전공자라 허접할 수 있는 질문 죄송합니다 ㅠㅠ
아두이노 코드입니다.
#include<SoftwareSerial.h>
#include <Servo.h>
#define TRIG 9
#define ECHO 10
int blueTx=6; //Tx (보내는핀 설정)at
int blueRx=7; //Rx (받는핀 설정)
SoftwareSerial BT(blueTx,blueRx);
Servo servo;
int motor1_input1=2;
int motor1_input2=3;
int motor2_input1=4;
int motor2_input2=5;
int servo_motor=8;
const int init_servo_angle = 90;
const int left_servo_angle = 100;
const int right_servo_angle = 40;
bool Mode;
bool auto_check;
char input;
void setup() {
BT.begin(9600);
Serial.begin(9600);
pinMode(motor1_input1,OUTPUT);
pinMode(motor1_input2,OUTPUT);
pinMode(motor2_input1,OUTPUT);
pinMode(motor2_input2,OUTPUT);
servo.attach(servo_motor);
servo.write(init_servo_angle);
// 초음파 센서
pinMode(TRIG,OUTPUT);
pinMode(ECHO, INPUT);
Mode = false; //false(수동), true(자동)
}
void loop() {
long duration, distance;
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn (ECHO, HIGH);
distance = duration * 17 / 1000;
if(BT.available()){
if(Serial.available()){
Serial.println("------");
Serial.println(BT.read());
}
input = BT.read();
if(Mode==true && input!='M'){
Block_Coding(input);
}
if(input == 'A' || input == 'M' || input == 'C'){
switch(input){
case 'A': //자동주행
break;
case 'M': //수동주행
Mode=false;
break;
case 'C':
Mode=true;
break;
}
}else if(Mode==false){
Manual_Drive(input);
}
}
}
void GO(){
digitalWrite(motor1_input1,HIGH);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,HIGH);
digitalWrite(motor2_input2,LOW);
servo.write(init_servo_angle);
}
void BACK(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,HIGH);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,HIGH);
servo.write(init_servo_angle);
}
void Left(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,LOW);
servo.write(left_servo_angle);
}
void Right(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,LOW);
servo.write(right_servo_angle);
}
void F_L(){
digitalWrite(motor1_input1,HIGH);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,HIGH);
digitalWrite(motor2_input2,LOW);
servo.write(left_servo_angle);
}
void F_R(){
digitalWrite(motor1_input1,HIGH);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,HIGH);
digitalWrite(motor2_input2,LOW);
servo.write(right_servo_angle);
}
void B_L(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,HIGH);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,HIGH);
servo.write(left_servo_angle);
}
void B_R(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,HIGH);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,HIGH);
servo.write(right_servo_angle);
}
void STOP(){
digitalWrite(motor1_input1,LOW);
digitalWrite(motor1_input2,LOW);
digitalWrite(motor2_input1,LOW);
digitalWrite(motor2_input2,LOW);
servo.write(init_servo_angle);
}
void Manual_Drive(char input){
Serial.println(input);
switch(input){
case 'F':
GO();
break;
case 'B':
BACK();
break;
case 'L':
Left();
break;
case 'R':
Right();
break;
case 'Q': // F+L
F_L();
break;
case 'W': // F+R
F_R();
break;
case 'E': // B+L
B_L();
break;
case 'T': // B+R
B_R();
break;
case 'S':
STOP();
break;
}
}
void Block_Coding(char input){
Serial.println(input);
switch(input){
case 'G':
GO();
delay(1000);
STOP();
break;
case 'L':
F_L();
delay(1000);
STOP();
break;
case 'R':
F_R();
delay(1000);
STOP();
break;
case 'K':
BACK();
delay(1000);
STOP();
break;
}
}
--------------------------------------------------------------------------------------------
안드로이드 코드입니다.
blockStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!list.isEmpty()) {
delayHandler.postDelayed(new Runnable() {
@Override
public void run() {
while(!list.isEmpty()) {
String blockName = list.get(0);
num1 = inputNum.getText().toString();
// Toast.makeText(getApplicationContext(), "실행 : " + blockName, Toast.LENGTH_SHORT).show();
list.remove(0);
adapter.notifyDataSetChanged();
if (blockName == "GO") {
Bluetooth.send("G", true);
} else if (blockName == "BACK") {
Bluetooth.send("K", true);
} else if (blockName == "LEFT") {
Bluetooth.send("L", true);
} else if (blockName == "RIGHT") {
Bluetooth.send("R", true);
}
}
}
}, 10);
댓글 3
조회수 7,324master님의 댓글
master 작성일
Bluetooth.send(num1,true);
속도를 주고 싶어서 두 가지의 데이터를 전송하려는 것인가요?
알파벳 대문자 'A'는 0x41, 십진수 65 입니다.
알파벳 소문자 'a'는 0x61, 십진수 97 입니다.
스피드 값의 범위는 pwm값인 0~255를 다 쓰지말고 값을 축소해서 전송할 필요가 있습니다.
0~100 범위도 알파벳과 겹치므로 제외하고
0~25 를 전송해보세요
pwm 출력할 때는 10을 곱해서 출력하면 됩니다.
if(BT.available()){
input = BT.read();
if(input<=25){ // 속도 입력
}
else{ // 알파벳 명령
if(input=='A'){}
if(input=='B'){}
if(input=='C'){}
}
이런식으로 속도와 명령을 처리하면 됩니다.
master님의 댓글
master 작성일
if(BT.available()){
if(Serial.available()){
Serial.println("------");
Serial.println(BT.read()); // <-- 여기서 읽으면 오류가 발생합니다.
}
input = BT.read(); // 위에서 읽은 경우에는 input에는 0xFF가 들어가게 됩니다.
//
오류가 발생하지 않도록 처리 순서를 변경해드리죠
if(BT.available()){
input = BT.read();
if(Serial.available()){
Serial.println("------"); Serial.println(input); // 저장되어 있는 input 변수를 출력하면 오류가 발생하지 않습니다.
}
가붝님의 댓글
가붝
친절하게 답변해주셔서 정말 감사드립니다.