//==============================================================
// MSD-224 / MSD-224N + MAS-001 연속운전 예제
// Arduino Uno + MAS-001
//
// [MAS-001 입력]
// 버튼1=D13 / 버튼2=D12 / 볼륨=A0
// [드라이버 결선]
// D9 -> PUL+ / D5 -> DIR+ / D6 -> ENA+
// GND -> PUL- / DIR- / ENA-
//
// 버튼1: 운전/정지
// 버튼2: 정지 후 방향 변경(변경 뒤 버튼1로 재기동)
// 볼륨: 약 100~4000Hz
//
// 주의: 연속운전 시험용. 위치제어·엔코더 피드백은 수행하지 않음.
//==============================================================
const byte PUL_PIN = 9;
const byte DIR_PIN = 5;
const byte EN_PIN = 6;
const byte BTN1_PIN = 13;
const byte BTN2_PIN = 12;
const byte POT_PIN = A0;
const byte ENA_ENABLE_LEVEL = LOW;
const byte ENA_DISABLE_LEVEL = HIGH;
bool running = false;
bool dirCW = true;
bool btn1Prev = HIGH;
bool btn2Prev = HIGH;
unsigned int currentHz = 100;
unsigned int targetHz = 100;
unsigned long lastRampMs = 0;
void stopPulse() {
noTone(PUL_PIN);
running = false;
currentHz = 100;
}
void setup() {
pinMode(PUL_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
// MAS-001 회로에 버튼 풀업이 구성되어 있어 눌림=LOW
pinMode(BTN1_PIN, INPUT);
pinMode(BTN2_PIN, INPUT);
digitalWrite(DIR_PIN, dirCW ? HIGH : LOW);
digitalWrite(EN_PIN, ENA_ENABLE_LEVEL);
digitalWrite(PUL_PIN, LOW);
Serial.begin(9600);
Serial.println(F("MSD-224 + MAS-001 ready"));
}
void loop() {
bool b1 = digitalRead(BTN1_PIN);
bool b2 = digitalRead(BTN2_PIN);
// 버튼1: 운전/정지 토글
if (btn1Prev == HIGH && b1 == LOW) {
if (running) {
stopPulse();
Serial.println(F("STOP"));
} else {
currentHz = 100;
targetHz = map(analogRead(POT_PIN), 0, 1023, 100, 4000);
running = true;
tone(PUL_PIN, currentHz);
Serial.println(F("RUN"));
}
delay(30);
}
btn1Prev = b1;
// 버튼2: 펄스를 먼저 멈춘 뒤 방향 변경
if (btn2Prev == HIGH && b2 == LOW) {
stopPulse();
delay(5);
dirCW = !dirCW;
digitalWrite(DIR_PIN, dirCW ? HIGH : LOW);
delayMicroseconds(20);
Serial.println(dirCW ? F("DIR: CW - press BTN1 to run")
: F("DIR: CCW - press BTN1 to run"));
delay(30);
}
btn2Prev = b2;
if (running) {
targetHz = map(analogRead(POT_PIN), 0, 1023, 100, 4000);
// 약 20ms마다 50Hz씩 변화시켜 급격한 속도 변경을 완화
if (millis() - lastRampMs >= 20) {
lastRampMs = millis();
if (currentHz < targetHz) {
currentHz = min((unsigned int)(currentHz + 50), targetHz);
} else if (currentHz > targetHz) {
unsigned int nextHz = (currentHz > 150) ? currentHz - 50 : 100;
currentHz = max(nextHz, targetHz);
}
tone(PUL_PIN, currentHz);
}
}
}
//==============================================================
// MSD-224 / MSD-224N 아두이노 직결 연속운전 예제
// Arduino Uno / 시리얼 모니터 9600bps, 새 줄
//
// D9 -> PUL+ / D5 -> DIR+ / D6 -> ENA+
// GND -> PUL- / DIR- / ENA-
//
// f2000 : CW 2000Hz r500 : CCW 500Hz
// s : 펄스 정지 e1 : 드라이버 활성
// e0 : 드라이버 비활성
//
// 주의: 연속운전 시험용. 위치제어·엔코더 피드백은 수행하지 않음.
//==============================================================
const byte PUL_PIN = 9;
const byte DIR_PIN = 5;
const byte EN_PIN = 6;
const byte ENA_ENABLE_LEVEL = LOW;
const byte ENA_DISABLE_LEVEL = HIGH;
bool running = false;
bool enabled = true;
bool directionCW = true;
unsigned int currentHz = 100;
unsigned int targetHz = 100;
unsigned long lastRampMs = 0;
void stopPulse() {
noTone(PUL_PIN);
running = false;
currentHz = 100;
}
void setDirection(bool cw) {
stopPulse();
delay(5);
directionCW = cw;
digitalWrite(DIR_PIN, directionCW ? HIGH : LOW);
delayMicroseconds(20);
}
void setup() {
pinMode(PUL_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
digitalWrite(PUL_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
digitalWrite(EN_PIN, ENA_ENABLE_LEVEL);
Serial.begin(9600);
Serial.setTimeout(50);
Serial.println(F("Ready: f2000 r500 s e1 e0"));
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd.length() > 0) {
char c = cmd.charAt(0);
long value = cmd.substring(1).toInt();
switch (c) {
case 'f':
case 'F':
if (value <= 0) {
stopPulse();
Serial.println(F("STOP"));
break;
}
setDirection(true);
targetHz = constrain(value, 100, 20000);
currentHz = 100;
running = enabled;
if (running) tone(PUL_PIN, currentHz);
Serial.print(F("CW target "));
Serial.print(targetHz);
Serial.println(F("Hz"));
break;
case 'r':
case 'R':
if (value <= 0) {
stopPulse();
Serial.println(F("STOP"));
break;
}
setDirection(false);
targetHz = constrain(value, 100, 20000);
currentHz = 100;
running = enabled;
if (running) tone(PUL_PIN, currentHz);
Serial.print(F("CCW target "));
Serial.print(targetHz);
Serial.println(F("Hz"));
break;
case 's':
case 'S':
stopPulse();
Serial.println(F("STOP - holding torque remains if enabled"));
break;
case 'e':
case 'E':
enabled = (value != 0);
digitalWrite(EN_PIN, enabled ? ENA_ENABLE_LEVEL : ENA_DISABLE_LEVEL);
if (!enabled) stopPulse();
Serial.println(enabled ? F("DRIVER ENABLED") : F("DRIVER DISABLED"));
break;
default:
Serial.println(F("? use: f2000 r500 s e1 e0"));
break;
}
}
}
// 목표 주파수까지 완만하게 변경
if (running && enabled && millis() - lastRampMs >= 20) {
lastRampMs = millis();
if (currentHz < targetHz) {
currentHz = min((unsigned int)(currentHz + 50), targetHz);
} else if (currentHz > targetHz) {
unsigned int nextHz = (currentHz > 150) ? currentHz - 50 : 100;
currentHz = max(nextHz, targetHz);
}
tone(PUL_PIN, currentHz);
}
}
상품이 장바구니에 담겼습니다.
바로 확인하시겠습니까?
상품이 찜 리스트에 담겼습니다.
바로 확인하시겠습니까?