BASIC4MCU | 질문게시판 | 아두이노 코딩 문제 도움주시면 감사하겠습니다.
페이지 정보
작성자 제발요 작성일2024-04-05 15:36 조회1,346회 댓글0건본문
먼저 전체 과정을 말씀드리겠습니다. 'A'를 누르면 step모터가 forward로 움직이고 리미트스위치에 닿으면 멈추고 airpump가 작동됩니다. 그리고 키패드로 숫자를(초) 입력하고 '#'를 누르면 바로 서보모터가 90도가 되고 입력한 초가 지나면 서보모터가 0도가 됩니다.
그 동시에 airpump가 멈추고 솔레노이드가 바뀐후 vaccumpump가 작동됩니다. 정해진 시간이 지나면 vaccumpump가 멈추고 그 동시에 step모터가 reverse로 움직이고 리미트스위치에 닿으면 멈춥니다.
문제점이 3개가 있습니다.
1. 프로세스 시작하기 위해 키패드 'A'를 누르면 잘 인식하는데 중간에 키패드로 시간을 입력할 때는 입력이 안되는 경우가 생깁니다. 또 어떤경우는 잘되고요. 왜 그런걸까요?
2. 마지막부분인 void stopVacuumPump에서 vaccumpump_13.write(0);이후에 reverseLinearActuator();를 인식을 못하는것 같습니다. 인식후 void reverseLinearActuator()로 가서 step모터가 reverse로 움직여야하는데 꿈쩍을 안합니다. 왜 그런걸까요?
3.void startVacuumPump()에서 솔레노이드가 바뀐후 stopVacuumPump();를 읽고 reverseLinearActuator();를 읽어서 step모터가 reverse로 움직여야하는데 다시 airpump가 켜질 때가 있습니다. 아두이노가 다시 윗부분을 읽는 것 같은데 왜 아래부분코딩을 읽지 않는걸까요?
1번 문제는 각 부품과 아두이노 핀을 다시 끼면 해결될 때가 많은데 2,3번 문제 즉 마지막 단계인 step모터가 reverse로 움직이는 건 한번도 성공하지 못했습니다.
정말 간절합니다 알려주시면 감사하겠습니다. 또는 코드를 수정해 주시면 감사하겠습니다.
아래는 코드 입니다.
#include <Keypad.h>#include <LiquidCrystal_I2C.h>#include <Servo.h>#include <HCMotor.h>#include <Wire.h>/* 모터드라이버 연결핀 */#define DIR_PIN A3 //스텝모터드라이버 DIR 연결핀#define CLK_PIN A2 //스텝모터드라이버 CLK 연결핀/* 리미트스위치 연결핀 */#define LLIMIT_PIN A0#define RLIMIT_PIN A1Servo airpump_12;Servo vaccumpump_13;Servo solenoide_10;Servo servoMotor;unsigned long servoMoveTime = 0;unsigned long previousMillis = 0;const long interval = 8000; // 2초/* HCMotor 라이브러리 인스턴스 생성 */HCMotor HCMotor;int Speed = 10;//const int LINEAR_ACTUATOR_PIN = A0;//const int LLIMIT_SENSOR_PIN = A0;//const int RLIMIT_SENSOR_PIN = A1;//const int AIR_PUMP_PIN = 12;const int SERVO_PIN = 11;const int VACUUM_PUMP_PIN = 13;const int AIR_PUMP_PIN = 12;//const int START_BUTTON_PIN = A2;//LiquidCrystal lcd(12, 11, 10, 16, 15, 14);LiquidCrystal_I2C lcd(0x27,20,4);const int ROWS = 4;const int COLS = 4;char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};byte rowPins[ROWS] = {9, 8, 7, 6};byte colPins[COLS] = {5, 4, 3, 2};Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);bool linearActuatorMoving = false;//bool airPumpRunning = false; // 에어펌프 작동 여부를 나타내는 변수bool vacuumPumpRunning = false;//unsigned long startTime;//unsigned long elapsedTime;//unsigned long endTime;unsigned long airPumpStartTime = 0;unsigned long servoEndTime = 0;bool servoMoving = false;bool servoAtZero = true;int key = 0; // 사용자 입력 시간(초)unsigned long servoStopTime = 0;String input_value;void setup() {lcd.begin(16, 2);//pinMode(LINEAR_ACTUATOR_PIN, OUTPUT);pinMode(LLIMIT_PIN, INPUT);pinMode(RLIMIT_PIN, INPUT);//pinMode(AIR_PUMP_PIN, OUTPUT);pinMode(SERVO_PIN, OUTPUT);pinMode(VACUUM_PUMP_PIN, OUTPUT);//pinMode(START_BUTTON_PIN, INPUT_PULLUP);servoMotor.attach(SERVO_PIN);airpump_12.attach(12);vaccumpump_13.attach(13);solenoide_10.attach(10);/* 라이브러리 초기화 */HCMotor.Init();lcd.backlight();/* 모터0을 스텝모터로 설정하고 연결된 핀을 지정 */HCMotor.attach(0, STEPPER, CLK_PIN, DIR_PIN);/* 모터를 연속동작모드로 설정 */HCMotor.Steps(0, CONTINUOUS);servoMotor.write(0);solenoide_10.write(0);input_value.reserve(120);}void loop() {unsigned long currentTime = millis();char key = keypad.getKey();if (key != NO_KEY) {lcd.setCursor(0,0);//lcd.println(key);//lcd.setCursor(4,0);//lcd.print("sec");if (key == 'A') {startProcess();delay(3000);lcd.clear();}/*if(key != 'A') {int duration = (key - '0') * 1000; // 입력된 숫자를 millisecond 단위로 변환servoMotor.write(90); 서보모터를 열기위해 90도로 설정delay(duration); 입력된 시간만큼 대기servoMotor.write(0); // 서보모터를 닫기위해 0도로 설정}*/}if (/*linearActuatorMoving && */digitalRead(RLIMIT_PIN) == LOW) {stopLinearActuator();startAirPump(); // 에어펌프 시작//lcd.print("AirPumping");//delay(3000);// 이거 있으면 키패드가 안눌림//lcd.clear();}/*if (currentTime - airPumpStartTime >= 5000) {//servoMotor.write(90); // 서보 모터를 90도로 움직임servoEndTime = currentTime; // 서보 모터가 움직인 시간 기록}if (servoMoving && currentTime - servoEndTime >= key * 1000 && servoAtZero) {servoMotor.write(0); // 서보 모터를 0도로 움직임servoAtZero = false; // 서보 모터가 0도에 도달함servoStopTime = currentTime; // 서보 모터가 멈춘 시간 기록stopAirPump();startVacuumPump();}if (vacuumPumpRunning && millis() - currentTime >= 15000) {stopVacuumPump();reverseLinearActuator();}*/if (/*linearActuatorMoving && */digitalRead(LLIMIT_PIN) == LOW) {stopLinearActuator();}}void startProcess() {//linearActuatorMoving = true;HCMotor.Direction(0, FORWARD);Speed=10;HCMotor.DutyCycle(0,Speed/3);//startTime = millis();lcd.clear();lcd.print("Process started");// Start moving linear actuator//digitalWrite(LINEAR_ACTUATOR_PIN, HIGH);}void stopLinearActuator() {//linearActuatorMoving = false;//digitalWrite(LINEAR_ACTUATOR_PIN, LOW);Speed = 0;HCMotor.DutyCycle(0,Speed);}void startAirPump() {//airPumpRunning = true; // 에어펌프 작동 플래그 설정airpump_12.write(180);step2();//servoMoveTime = millis();//if( millis() - servoMoveTime == 5000){//}}//digitalWrite(AIR_PUMP_PIN, HIGH);void step2() {char key = keypad.getKey();if (key) {lcd.print(key);if (key == '*') {input_value = ""; // clear input valuelcd.clear();} else if (key == '#') {unsigned long timer = input_value.toInt();timer = timer * 1000; // time in seconds//unsigned long currentMillis = millis();//unsigned long previousMillis = currentMillis;//while (currentMillis - previousMillis < interval) {//currentMillis = millis(); // Update current time//}servoMotor.write(90);delay(timer); // Wait for 1 second (adjust if needed)servoMotor.write(0);stopAirPump();input_value = ""; // clear input value} else {input_value += key; // append new character to input value string}}}void stopAirPump() {//airPumpRunning = false; // 에어펌프 작동 플래그 해제//digitalWrite(AIR_PUMP_PIN, LOW);airpump_12.write(0);startVacuumPump();}//void startServoMotor() {//servoMotor.write(90);//elapsedTime = millis() - startTime;//}//void stopServoMotor() {//servoMotor.write(0);//}void startVacuumPump() {//unsigned long currentTime = millis();//vacuumPumpRunning = true;///digitalWrite(VACUUM_PUMP_PIN, HIGH);solenoide_10.write(180);delay(500);vaccumpump_13.write(180);delay(2000);stopVacuumPump();//currentTime = millis();}void stopVacuumPump() {vaccumpump_13.write(0);reverseLinearActuator();//vacuumPumpRunning = false;//digitalWrite(VACUUM_PUMP_PIN, LOW);}void reverseLinearActuator() {//digitalWrite(LINEAR_ACTUATOR_PIN, LOW);HCMotor.Direction(0, REVERSE);Speed=10;HCMotor.DutyCycle(0,Speed/3);// Code for reversing linear actuator}
댓글 0
조회수 1,346등록된 댓글이 없습니다.