BASIC4MCU | 질문게시판 | 스텝모터 제어하는 소스파일 수정방법 질문드립니다.
페이지 정보
작성자 Bs드리프터 작성일2023-09-15 14:58 조회998회 댓글0건본문
저희가 사용중인 하드웨어는 아두이노 우노, A4988 드라이버, 2004 I2C LCD, 택트 스위치 5개를 이용해서 스텝모터를 제어하는 프로그램을 설계중입니다. 앞전에도 질문글을 작성했는데 수정사항이 생겨 질문드립니다. 동작은 다음과 같습니다.
스위치 1을 눌렀을 때 모터가 회전을 시작합니다. 스위치 2는 누른 횟수만큼 스텝 모터가 회전을 합니다. 이 때 모터의 회전수는 LCD에 표기됩니다. 스위치 3은 누른 횟수만큼 스텝 모터 회전을 discount하는데 0보다는 작아지지 않게 설계했습니다. 스위치 4는 모터의 회전 속도가 빨라집니다 (200까지 올라감). 스위치 5는 회전 속도가 느려지게 설계했습니다.
동작은 원활하게 되나, 버튼 2를 한번 누를때마다 스텝모터가 (360도*15퀴 회전) 5,400도만큼 증가하게 소스파일을 수정하고 싶습니다. 마지막으로 작성한 소스파일을 아래에 작성한 후 질문 마치도록 하겠습니다. 감사합니다.
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); #define bt_start 2 #define bt_countup 3 #define bt_countdown 4 #define bt_speedup 5 #define bt_speeddown 6 #define DIR 8 #define STEP 9 bool flag_countup=0; bool flag_countdown=0; int speed=3000; int pulse=0; int Speed; void setup() { pinMode(bt_start,INPUT_PULLUP); pinMode(bt_countup,INPUT_PULLUP); pinMode(bt_countdown,INPUT_PULLUP); pinMode(bt_speedup,INPUT_PULLUP); pinMode(bt_speeddown,INPUT_PULLUP); pinMode(DIR,OUTPUT); pinMode(STEP,OUTPUT); lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print(" FILAMENT WINDER"); lcd.setCursor(0,1); lcd.print(" CAPSTONE DESIGN"); lcd.setCursor(0,2); lcd.print(" INJE UNIV"); lcd.setCursor(0,3); lcd.print(" HELLO WORLD"); delay(3000); lcd.clear(); } void lcd_disp() { Speed = map(speed, 15000, 500, 0, 100); lcd.setCursor(0,0); lcd.print("StepMotor Pulse "); lcd.setCursor(0,1); lcd.print("200pulse:1spin ~ "); lcd.print(pulse/200); lcd.setCursor(0,2); lcd.print("StepMotor Speed"); lcd.setCursor(0,3); lcd.print("0% to 100% ~ "); lcd.print(Speed); } void run() { for(int i=0;i<pulse;i++) //1.8도: 1pulse = 360도: 200pulse { digitalWrite(STEP,HIGH); delayMicroseconds(speed); digitalWrite(STEP,LOW); delayMicroseconds(speed); } } void loop() { lcd_disp(); if(digitalRead(bt_start)==0) { run(); } if(digitalRead(bt_countup)==0) { if(flag_countup==0) { flag_countup=1; pulse+=200; lcd_disp(); } } else { if(flag_countup) { flag_countup=0; } } if(digitalRead(bt_countdown)==0) { if(flag_countdown==0) { flag_countdown=1; pulse-=200; if(pulse<0) { pulse=0; lcd_disp(); } } } else { if(flag_countdown) { flag_countdown=0; } } if(digitalRead(bt_speedup)==0) { speed-=100; if(speed<500) { speed=500; } lcd_disp(); } if(digitalRead(bt_speeddown)==0) { speed+=100; if(speed>15000) { speed=15000; } lcd_disp(); } }
댓글 0
조회수 998등록된 댓글이 없습니다.