BASIC4MCU | 질문게시판 | 아두이노 스텝모터 스위치로 제어
페이지 정보
작성자 냐냐냐 작성일2020-10-24 22:48 조회9,851회 댓글3건본문
스텝모터에 a4988드라이버로 모터 제어중입니다.
목적은 택트 스위치 사용하여 창문을 개폐하는 것 입니다.
스위치1 누르면 계속 정회전 또는 누르는 동안 정회전
스위치2 누르면 계속 역회전 또는 누르는 동안 역회전
창문 양 끝에 리미트 스위치를 부착하여 인식되면 모터가 멈추는 동작을 하려고합니다.
아래있는 코드가 리미트 스위치 활용하여 창문 개폐 하는 코드로 알고있는데
이 코드에서 스위치 두개를 추가하여 정회전과 역회전 하려면 어떤 것을 추가해야하나요 부탁드립니다.
#define STEP_DELAY 5
#define STEP_COUNT 200
#define DIR_PIN 5
#define STEP_PIN 4
#define LIMIT_PIN1 7
#define LIMIT_PIN2 8
int window_status = 0; // 0 : 수동 , 1 : 열림 , 2 : 닫힘
unsigned long last_step_millis; // 마지막으로 모터를 움직인 시간을 저장
int last_step_pin_status;
int prev_limit_1_status;
int prev_limit_2_status;
void setup()
{
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(LIMIT_PIN1, INPUT_PULLUP);
pinMode(LIMIT_PIN2, INPUT_PULLUP);
digitalWrite(DIR_PIN, HIGH);
last_step_millis = millis();
prev_limit_1_status = digitalRead(LIMIT_PIN1);
prev_limit_2_status = digitalRead(LIMIT_PIN2);
window_status = 2;
}
void loop()
{
if ( window_status == 1 )
{
if ( ( millis() - last_step_millis ) > STEP_DELAY )
{
digitalWrite(DIR_PIN, HIGH);
last_step_pin_status = !last_step_pin_status;
digitalWrite(STEP_PIN, last_step_pin_status);
last_step_millis = millis();
int limit_status = digitalRead(LIMIT_PIN1);
if ( limit_status == LOW ) // LIMIT 스위치가 눌러진 경우
{
window_status = 0; // 대기 상태로 변경
}
}
}
if ( window_status == 2 )
{
if ( ( millis() - last_step_millis ) > STEP_DELAY )
{
digitalWrite(DIR_PIN, LOW);
last_step_pin_status = !last_step_pin_status;
digitalWrite(STEP_PIN, last_step_pin_status);
last_step_millis = millis();
int limit_status = digitalRead(LIMIT_PIN2);
if ( limit_status == LOW ) // LIMIT 스위치가 눌러진 경우
{
window_status = 0; // 대기 상태로 변경
}
}
}
}
댓글 3
조회수 9,851master님의 댓글
master 작성일
window_status 가 1이면 정회전(?), 2면 그 반대로 회전하겠죠
if(digitalRead(2))window_status=1;
if(digitalRead(3))window_status=2;
이런식으로 작성하세요
또, setup 함수 마지막의 window_status = 2; 이 코드는 삭제하세요
냐냐냐님의 댓글
냐냐냐 작성일
피드백 정말 감사합니다. 몇가지 더 여쭤보겠습니다
1. 제가 위 코드에서 빗물감지센서와 온습도센서로 자동으로 닫히는 코드를 작성을 했는데요.
시리얼 모니터에 확인이 되고 설정값이 되면 모터가 작동을 하긴 하는데 엄청 천천히 움직입니다.
원래 잘 작동하였는데 무엇이 문제일까요ㅠㅠ
2. 시리얼 모니터에 측정값이 엄청 빠르게 측정을 하는데 딜레이 값을 주려면 어느 부분에 삽입하면 될까요?
/////////////////////////////
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
#define STEP_DELAY 5
#define STEP_COUNT 200
#define DIR_PIN 5
#define STEP_PIN 4
#define LIMIT_PIN1 7
#define LIMIT_PIN2 8
int window_status = 0; // 0 : 수동 , 1 : 열림 , 2 : 닫힘
unsigned long last_step_millis; // 마지막으로 모터를 움직인 시간을 저장
int last_step_pin_status;
int prev_limit_1_status;
int prev_limit_2_status;
void setup()
{
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(LIMIT_PIN1, INPUT_PULLUP);
pinMode(LIMIT_PIN2, INPUT_PULLUP);
digitalWrite(DIR_PIN, HIGH);
Serial.begin(9600);
dht.begin();
last_step_millis = millis();
prev_limit_1_status = digitalRead(LIMIT_PIN1);
prev_limit_2_status = digitalRead(LIMIT_PIN2);
}
void loop()
{
if(digitalRead(11))window_status=1;
if(digitalRead(12))window_status=2;
if(digitalRead(3))window_status=0;
float temp = dht.readTemperature();
int rain_value = analogRead(A0);
Serial.print("rain : ");
Serial.print(rain_value);
Serial.print(temp);
Serial.print("temp : ");
if(rain_value<500||temp<22)window_status=2; //
int limit_status = digitalRead(LIMIT_PIN1);
if ( limit_status == LOW ) // LIMIT 스위치가 눌러진 경우
{
window_status = 0; // 대기 상태로 변경
}
if ( window_status == 1 )
{
if ( ( millis() - last_step_millis ) > STEP_DELAY )
{
digitalWrite(DIR_PIN, HIGH);
last_step_pin_status = !last_step_pin_status;
digitalWrite(STEP_PIN, last_step_pin_status);
last_step_millis = millis();
int limit_status = digitalRead(LIMIT_PIN1);
if ( limit_status == LOW ) // LIMIT 스위치가 눌러진 경우
{
window_status = 0; // 대기 상태로 변경
}
}
}
if ( window_status == 2 )
{
if ( ( millis() - last_step_millis ) > STEP_DELAY )
{
digitalWrite(DIR_PIN, LOW);
last_step_pin_status = !last_step_pin_status;
digitalWrite(STEP_PIN, last_step_pin_status);
last_step_millis = millis();
int limit_status = digitalRead(LIMIT_PIN2);
if ( limit_status == LOW ) // LIMIT 스위치가 눌러진 경우
{
window_status = 0; // 대기 상태로 변경
}
}
}
}
master님의 댓글
master 작성일
#define STEP_DELAY 5
스텝딜레이를 줄여서 돌려보세요