BASIC4MCU | 질문게시판 | 스텝모터, 컬러센서를 이용한 아두이노
페이지 정보
작성자 초식동물 작성일2023-12-02 22:50 조회2,954회 댓글3건본문
안녕하세요. 스텝 모터를 이용한 리니어 레일에다가 TCS3200 컬러 센서 2개를 사용했습니다. 레일의 왼쪽 끝과 오른쪽 끝 아래에 컬러 센서를 각각 1개씩 달아서 레일이 처음에 정지 상태에 있다가 왼쪽 컬러 센서에 파란색이 인식되면 레일이 왼쪽으로 이동(역방향) 하고 오른쪽 컬러 센서에 파란색이 인식되면 레일이 오른쪽으로 이동(정방향) 하게 코드를 짜봤습니다. 여기서 컬러 센서가 파란색을 인식했을 때 시리얼 모니터에는 파란색을 인식했다고 출력이 되는데 파란색을 인식해도 레일이 움직이지를 않더라고요. 컬러 센서가 파란색을 인식했을 때 레일이 작동하도록 하고 싶습니다. 코드에 수정해야 할 부분이 있을까요? 아두이노 메가를 쓰고 있습니다.
#include <HCMotor.h>
/* TCS3200 센서의 핀 정의 */
const int sensor1S0 = 24;
const int sensor1S1 = 26;
const int sensor1S2 = 28;
const int sensor1S3 = 30;
const int sensor1OUT = 22; // Sensor1의 출력 핀
const int sensor2S0 = 25;
const int sensor2S1 = 27;
const int sensor2S2 = 29;
const int sensor2S3 = 31;
const int sensor2OUT = 23; // Sensor2의 출력 핀
/* 모터드라이버 및 리미트스위치 연결핀 */
#define DIR_PIN 52 // 스텝모터드라이버 DIR 연결핀
#define CLK_PIN 50 // 스텝모터드라이버 CLK 연결핀
#define LLIMIT_PIN 3 // 왼쪽 리미트스위치 연결핀
#define RLIMIT_PIN 2 // 오른쪽 리미트스위치 연결핀
/* HCMotor 라이브러리 인스턴스 생성 */
HCMotor HCMotor;
int Speed = 10;
bool railMoving = false; // 레일의 현재 움직임 상태
void setup() {
Serial.begin(9600);
Serial.println("TCS3200 Color Sensor and Linear Rail Test");
/* TCS3200 센서 초기화 */
pinMode(sensor1S0, OUTPUT);
pinMode(sensor1S1, OUTPUT);
pinMode(sensor1S2, OUTPUT);
pinMode(sensor1S3, OUTPUT);
pinMode(sensor1OUT, INPUT);
pinMode(sensor2S0, OUTPUT);
pinMode(sensor2S1, OUTPUT);
pinMode(sensor2S2, OUTPUT);
pinMode(sensor2S3, OUTPUT);
pinMode(sensor2OUT, INPUT);
initializeSensor(sensor1S0, sensor1S1, sensor1S2, sensor1S3); // 센서 1 초기화
initializeSensor(sensor2S0, sensor2S1, sensor2S2, sensor2S3); // 센서 2 초기화
/* 모터드라이버 초기화 */
HCMotor.Init();
HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN);
HCMotor.Steps(0, CONTINUOUS);
HCMotor.DutyCycle(0, Speed);
pinMode(LLIMIT_PIN, INPUT);
pinMode(RLIMIT_PIN, INPUT);
}
void loop() {
int r1, g1, b1;
int r2, g2, b2;
/* TCS3200 센서에서 RGB 값을 읽어오기 */
readRGB(sensor1S2, sensor1S3, sensor1OUT, &r1, &g1, &b1);
Serial.print("Sensor 1 - R: "); Serial.print(r1); Serial.print(" G: "); Serial.print(g1); Serial.print(" B: "); Serial.print(b1); Serial.println();
readRGB(sensor2S2, sensor2S3, sensor2OUT, &r2, &g2, &b2);
Serial.print("Sensor 2 - R: "); Serial.print(r2); Serial.print(" G: "); Serial.print(g2); Serial.print(" B: "); Serial.print(b2); Serial.println();
delay(1000);
/* 리미트스위치 감지 및 모터 제어 */
if (digitalRead(LLIMIT_PIN) == LOW) {
Serial.println(" - Left Limit Switch activated!");
HCMotor.DutyCycle(0, 0); // 모터 정지
railMoving = false; // 레일 상태 업데이트
} else if (digitalRead(RLIMIT_PIN) == LOW ) {
Serial.println(" - Right Limit Switch activated!");
HCMotor.DutyCycle(0, 0); // 모터 정지
railMoving = false; // 레일 상태 업데이트
} else {
/* 모터를 계속해서 동작하도록 설정 */
HCMotor.DutyCycle(0, Speed);
// 레일 움직임을 감지하고 처리
if (!railMoving) {
if (b1 > 120 && b1 < 160) {
Serial.println(" - BLUE detected! Moving rail in the forward direction.");
HCMotor.Direction(0, REVERSE); // 모터를 역방향으로 설정
railMoving = true; // 레일 상태 업데이트
} else if (b2 > 120 && b2 < 160) {
Serial.println(" - BLUE2 detected! Moving rail in the reverse direction.");
HCMotor.Direction(0, FORWARD); // 모터를 정방향으로 설정
railMoving = true; // 레일 상태 업데이트
}
}
}
}
void initializeSensor(int s0, int s1, int s2, int s3) {
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
}
void readRGB(int s2, int s3, int out, int *red, int *green, int *blue) {
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
*red = pulseIn(out, HIGH, 50000);
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
*green = pulseIn(out, HIGH, 50000);
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
*blue = pulseIn(out, HIGH, 50000);
}
댓글 3
조회수 2,954master님의 댓글
master 작성일
void loop() {
HCMotor.Direction(0, REVERSE); delay(1000); // 모터를 역방향으로 설정
HCMotor.Direction(0, FORWARD); delay(1000); // 모터를 정방향으로 설정
}
모터가 구동하는 것은 모터구동 코드만으로 체크하면 되겠죠?
//
초식동물님의 댓글
초식동물 작성일모터 구동 코드를 넣으니까 왼쪽 센서가 파란색을 인식하면 왼쪽으로 움직이고 오른쪽센서가 파란색을 인식하면 오른쪽으로 움직이는건 구현이 되었습니다. 그런데 여기서 레일이 왼쪽이나 오른쪽 끝까지 가면 리미트 스위치때문에 멈추는데 리미트 스위치가 계속 눌러져있는 상태라서 한번 끝까지가면 정지상태에서 다시 움직이질 않더라구요. 어떻게 하면 끝에 가서 멈춰도 반대쪽컬러센서를 인식하면 다시 움직이게 할 수 있을까요?
master님의 댓글
master 작성일
int r1, g1, b1;
int r2, g2, b2;
long t,t1;
//
void loop() {
t=millis();
if(t-t1>=1000){ t1=t; /* TCS3200 센서에서 RGB 값을 읽어오기 */
readRGB(sensor1S2, sensor1S3, sensor1OUT, &r1, &g1, &b1);
Serial.print("Sensor 1 - R: "); Serial.print(r1); Serial.print(" G: "); Serial.print(g1); Serial.print(" B: "); Serial.print(b1); Serial.println();
readRGB(sensor2S2, sensor2S3, sensor2OUT, &r2, &g2, &b2);
Serial.print("Sensor 2 - R: "); Serial.print(r2); Serial.print(" G: "); Serial.print(g2); Serial.print(" B: "); Serial.print(b2); Serial.println();
}
/* 리미트스위치 감지 및 모터 제어 */
if (b1 > 120 && b1 < 160) {
if (digitalRead(RLIMIT_PIN) == LOW ) {
Serial.println(" - Right Limit Switch activated!");
HCMotor.DutyCycle(0, 0); // 모터 정지
}
else{
HCMotor.DutyCycle(0, Speed);
Serial.println(" - BLUE detected! Moving rail in the forward direction.");
HCMotor.Direction(0, REVERSE); // 모터를 역방향으로 설정
}
}
//
if (b2 > 120 && b2 < 160) {
if (digitalRead(LLIMIT_PIN) == LOW) {
Serial.println(" - Left Limit Switch activated!");
HCMotor.DutyCycle(0, 0); // 모터 정지
}
else{
Serial.println(" - BLUE2 detected! Moving rail in the reverse direction.");
HCMotor.Direction(0, FORWARD); // 모터를 정방향으로 설정
}
}
}