카테고리 없음
(아두이노) 로터리 엔코더와 모스펫 XY-MOS으로 DC 모터 돌리기
미친토끼
2025. 6. 10. 10:26
참고:
https://www.youtube.com/watch?v=lNbHm7EqfA0
RC카용 5V 모터를 모스펫에 연결하여 그 모스펜 signal(triger/pwm) 핀에 PWM 신호를 보내 모터 속도를 조절하는 코드다.
4핀을 모스펫에 납땜하여 GND는 아두이노의 GND에, trig/pwm은 6번에 연결했다. 5V 2A 아답터에서 출력한 전기를 V+, V- 터미널 단자에, 모터의 +, -를 OUT+, OUT-에 연결했다. 모터를 초기 가동하려면 PWM신호를 120정도를 줘야 하는데 이게 3.5V정도에 해당한다. 돌아다가다 멈추는 시점은 PWM 70정도 되는데, 관성 때문에 낮은 전압에도 돌아가지만, 처음에 멈춰 있을 때 이를 돌아가게 하는 데는 제법 큰 전기가 돌아간다.
아래는 모스펫으로 5V DC 모터를 돌리기는 기본 스케치다.
#define MOSFET 6
#define MIN_PWM 70
#define MAX_PWM 255
void setup() {
Serial.begin(9600);
//pinMode(MOSFET, OUTPUT);
}
void loop() {
for (int i = MIN_PWM; i < MAX_PWM; i++) {
analogWrite(MOSFET, i);
Serial.println(i);
delay(100);
}
delay(1000);
for (int i = MAX_PWM; i >= MIN_PWM; i--) {
analogWrite(MOSFET, i);
Serial.println(i);
delay(100);
}
}
https://www.youtube.com/shorts/HGcZqPdVICo
여기에 로터리 엔코더를 달아서, 엔코더를 통해 모스펫에 PWM 신호를 보낼 수 있다. 그리하여 DC 모터 속도를 조절할 수 있다.
#define CLK 5
#define DT 4
#define SW 3
#define MAX_PWM 255
#define MIN_PWM 100
#define MOSFET 6
int counter = MIN_PWM;
int lastCLK = HIGH;
int curCLK;
void setup() {
Serial.begin(9600);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP);
}
void loop() {
curCLK = digitalRead(CLK);
if (curCLK != lastCLK) {
int dt = digitalRead(DT);
if (dt != curCLK) {
counter++;
if (counter > MAX_PWM) counter = MAX_PWM;
} else {
counter--;
if (counter < MIN_PWM) counter = MIN_PWM;
}
analogWrite(MOSFET, counter);
Serial.println(counter);
//Serial.print("\tdt = ");
//Serial.print(dt);
//Serial.print("\tcurCLK = ");
//Serial.println(curCLK);
}
lastCLK = curCLK;
if (digitalRead(SW) == LOW) {
Serial.println("Button pressed!");
}
}
https://www.youtube.com/shorts/Lix9lCk5m5k