BASIC4MCU | 질문게시판 | tcs34725(컬러센서)와 dc모터 구동
페이지 정보
작성자 robot2cher 작성일2023-04-12 16:27 조회3,276회 댓글2건본문
안녕하세요
TCS34725컬러센서, 초음파센서, DC모터를 이용하여 색깔 감지에 따라 움직임의 변화를 주려고 합니다
1. 빨간색 감지 : 멈춤
2. 노란색 감지 : 10초 정지 후 전진
3. 파란색 감지: 감지 확인 후 전진
움직임을 만들려합니다.
노란색 감지가 잘 안되는데 멈추고 재감지 하면서 전진이 안됩니다. millis나 flag 를 이용하여 해봤으나 첫 감지 후 다시 감지하면서 전진하지 않네요
다른 방법이 있을까 질문합니다
#include <Wire.h>
#include "Adafruit_TCS34725.h"
/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_240MS, TCS34725_GAIN_4X);
const int interruptPin = 2;
volatile boolean state = false;
void isr()
{
state = true;
}
void getRawData_noDelay(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c)
{
*c = tcs.read16(TCS34725_CDATAL);
*r = tcs.read16(TCS34725_RDATAL);
*g = tcs.read16(TCS34725_GDATAL);
*b = tcs.read16(TCS34725_BDATAL);
}
//dc모터 드라이버 변수
int motorA1 = 6; //A_1A
int motorA2 = 7; //A_1B
int motorB1 = 5; //B_1A
int motorB2 = 4; //B_1B
int speed = 255 ; // speed : 0 ~ 255
int flag = 0;
//초음파센서
#define TRIG 10
#define ECHO 11
unsigned long t_prev = 0;
const unsigned long t_delay = 5000;
void setup(void) {
Serial.begin(9600);
if (tcs.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1);
}
pinMode( motorA1 , OUTPUT);
pinMode( motorA2 , OUTPUT);
pinMode( motorB1 , OUTPUT);
pinMode( motorB2 , OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
forward();
pinMode(interruptPin, INPUT_PULLUP); //TCS interrupt output is Active-LOW and Open-Drain
attachInterrupt(digitalPinToInterrupt(interruptPin), isr, FALLING);
tcs.write8(TCS34725_PERS, TCS34725_PERS_NONE);
tcs.setInterrupt(true);
}
void loop(void) {
unsigned long t_now = millis();
if (state == true)
{
uint16_t r, g, b, c, colorTemp, lux;
tcs.getRawData(&r, &g, &b, &c);
long duration, distance;
//초음파를 보내며, 다 보내면 에코가HIGH(신호받기)상태로 대기
digitalWrite(TRIG, HIGH);
delay(10);
digitalWrite(TRIG, LOW);
duration = pulseIn (ECHO, HIGH); //물체에 반사되어 돌아온 초음파의 시간을 변수에 저장
distance = duration * 17 / 1000;
Serial.print(r);
Serial.print(",");
Serial.print(g);
Serial.print(",");
Serial.print(b);
Serial.println("");
Serial.print("\nDistance : ");
Serial.print(distance); //측정된 물체로부터 거리값(cm값)을 보여줍니다.
Serial.println(" Cm");
if (distance < 8 && r >= 300) // 빨강색 감지 : 정지
{
Stop();
}
else
forward();
if (distance <= 5 && g >= 650)//노랑색 감지 : 10초 정지한 후 다시 전진, 노랑은 R+G, 측정하면 B값이 상대적으로 낮음
{
Stop();
delay(5000);
forward();
}
}
}
void forward() { //전진
analogWrite( motorA1 , 200); //200이상일때는 빠른 속도로 인해 감지 거리 측정을 미리 해야함
analogWrite( motorA2 , 0);
analogWrite( motorB2 , 200);
analogWrite( motorB1 , 0);
}
void back() { //후진
analogWrite( motorA1 , 0);
analogWrite( motorA2 , 200);
analogWrite( motorB2 , 0);
analogWrite( motorB1 , 200);
}
void Stop() {
digitalWrite( motorA1 , 0);
digitalWrite( motorA2 , 0);
digitalWrite( motorB1 , 0);
digitalWrite( motorB2 , 0);
}
void leftgo() {
analogWrite( motorA1 , 0);
analogWrite( motorA2 , 0);
analogWrite( motorB2 , 255);
analogWrite( motorB1 , 0);
}
void rightgo() {
analogWrite( motorA1 , 255);
analogWrite( motorA2 , 0);
analogWrite( motorB2 , 0);
analogWrite( motorB1 , 0);
}
댓글 2
조회수 3,276master님의 댓글
master 작성일
Stop(); delay(5000);
forward();
}
5초 정지한 후 전진하고 빠져나오면
그 사이에 ISR()이 실행되어서 바로 if()문을 실행 하게되겠죠
같은 조건을 만족하더라도
또 5초 쉬고, 짧게 전진하기를 반복하므로 전진하는 시간이 너무 짧게 됩니다.
인터럽트 주기가 얼마인지 모르겠지만 정지 시간과 전진 시간의 분배를 고려해서 코드를 작성하세요
robot2cher님의 댓글
robot2cher 작성일조언 감사합니다! 다시 작성해봐야겠네요