BASIC4MCU | 질문게시판 | 아두이노 코딩 질문입니다.
페이지 정보
작성자 바리 작성일2018-06-20 21:43 조회6,898회 댓글0건첨부파일
본문
손가락의 특정 동작으로 RC car를 조종하는데 앱도 함께 연동하려고 합니다.
예를 들어 앱에서 '앞으로 가세요'라는 지시와 함께 아두이노로 A라는 문자를 보내면 아두이노가 A를 받고 사람이 앞으로 가는 손동작을 하는 순간 RC카가 앞으로 5초동안 움직이는 코딩을 하려고 합니다. 지금 코딩에서는 아두이노로 A가 들어오는 그 순간 손동작을 해야만 RC카가 앞으로 갑니다. 저는 아두이노에 A가 들어오고 바로 손동작을 하는 것이 아니고 그 시간이 얼마나 걸리든 상관없이 앞으로 가는 동작을 하는 순간에 RC카가 움직일 수 있도록 하고 싶습니다. 도움 부탁드립니다!
#include <SPI.h>
#include "RF24.h"
#include <SoftwareSerial.h> //시리얼통신 라이브러리 호출SoftwareSerial btSerial(2, 10); //시리얼 통신을 위한 객체선언
const int IN1 = 9; //Right Motor (-)
const int IN2 = 6; //Right Motor (+)
const int IN3 = 5; //Left Motor (+)
const int IN4 = 3; //Left Motor (-)int msg[4];
char data;
unsigned long pre_time = 0;
long interval = 5000;RF24 radio(7,8);
const uint64_t pipe = 0xE8E8F0F0E1LL;void setup(){
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);Serial.begin(19200); //시리얼모니터
btSerial.begin(19200);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}void loop(){
unsigned long cur_time = millis();
char c = Serial.read();
if (radio.available()){
radio.read(msg, sizeof(msg));
if (btSerial.available()) {
data = btSerial.read();
//data = A 경우 앞으로 가는 손동작을 했을 때 5초 동안 RC카 앞으로 간다.
if (data == 'A') {
pre_time = cur_time;
Go();
Serial.print("Go");
}
//data = B 경우 뒤로 가는 손동작을 했을 때 5초 동안 RC카 뒤로 간다.
else if (data == 'B') {
pre_time = cur_time;
Back();
Serial.print("Back");
}
//data = C 경우 왼쪽으로 가는 손동작을 했을 때 5초 동안 RC카 왼쪽으로 간다.
else if (data == 'C') {
pre_time = cur_time;
Left();
Serial.print("Left");
}
//data = D 경우 오른쪽으로 가는 손동작을 했을 때 5초 동안 RC카 오른쪽으로 간다.
else if (data == 'D') {
pre_time = cur_time;
Right();
Serial.print("Right");
}
}
}
if (pre_time > 0 && (cur_time - pre_time > interval)){
pre_time = cur_time;
analogWrite(IN1, 0);
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, 0);
}
}void Go() {
if(msg[0]>0 && msg[1]>0 && msg[2]>0 && msg[3]>0){
//forward 다 피면 앞으로
analogWrite(IN1, 150);
analogWrite(IN2, 0);
analogWrite(IN3, 150);
analogWrite(IN4, 0);
}
}
void Back() {
if(msg[0]>0 && msg[1]==0 && msg[2]==0 && msg[3]<7){
//backward 엄지 피면 뒤로
analogWrite(IN1, 0);
analogWrite(IN2, 150);
analogWrite(IN3, 0);
analogWrite(IN4, 150);
}
}
void Left() {
if(msg[0]>0 && msg[1]>0 && msg[2]>0 && msg[3]<7){
//left_엄지 검지 중지 피면 왼쪽
analogWrite(IN1,0);
analogWrite(IN2,150);
analogWrite(IN3,150);
analogWrite(IN4,0);
}
}
void Right() {
if(msg[0]==0 && msg[1]==0 && msg[2]>0 && msg[3]>0){
//right_중지 약지 피면 오른쪽
analogWrite(IN1,150);
analogWrite(IN2,0);
analogWrite(IN3,0);
analogWrite(IN4,150);
}
}
void Stop() {
if(msg[0]==0 && msg[1]==0 && msg[2]==0 && msg[3]<7){
//stop_다 접으면 정지
analogWrite(IN1,0);
analogWrite(IN2,0);
analogWrite(IN3,0);
analogWrite(IN4,0);
}
}
댓글 0
조회수 6,898등록된 댓글이 없습니다.