DIY 아두이노 자동 열차 제어 – 심플하고 신뢰성 높은 커스터마이징 가능
부품 및 소모품
| 부품 | 수량 |
| 점퍼 와이어 | 1 |
| Arduino UNO (나노, 메가 등 어떤 보드든 가능) | 1 |
| L298 듀얼 H-브리지 모터 드라이버 (모듈 형태 권장) | 1 |
앱 및 온라인 서비스
프로젝트 소개
이 간단한 회로로 열차 운행 스케줄을 쉽게 자동화할 수 있습니다. 운행 시간, 정차 시간, 가속/감속 프로파일 모두 설정 가능. 스케치의 스케줄 파라미터만 바꾸면 어떤 자동 운행 패턴이든 만들 수 있습니다. 전원만 켜면 열차가 알아서 출발합니다.
스케치에서 시간 파라미터 변경으로 시간표 작성
// 1 | 0초 ~ 5초: 출발
if (counterScheduler <= 5) { ...... }
// 2 | 10초 ~ 15초: 정차
if ((counterScheduler >= 10) && (counterScheduler <= 15)) { ...... }
// 3 | 16초: 방향 전환
if (counterScheduler == 16) { .... }
// 등등...
이동 파라미터
int brakingDelta = 5; // 감속 스텝
int accelerateDelta = 6; // 가속 스텝
열차의 가속/감속 특성을 정의합니다.
방향 제어
// 기본 방향: 전진
digitalWrite(L298_IN1, HIGH);
digitalWrite(L298_IN2, LOW);
D6, D7 핀 상태(L298_IN1, L298_IN2)로 방향 결정. 스케치를 마음껏 수정해 새로운 자동 운행 패턴을 만들어보세요.
즐거운 운행 되세요!
코드
Swing (왕복 운행) 스케치
// L298 핀 정의
#define L298_ENA 5
#define L298_IN1 6
#define L298_IN2 7
// 스케줄 변수
int counterScheduler;
unsigned long timerScheduler = 0;
unsigned long timerLocal = 0;
byte speedAuto = 0;
void setup() {
pinMode(L298_ENA, OUTPUT);
pinMode(L298_IN1, OUTPUT);
pinMode(L298_IN2, OUTPUT);
// 기본 방향: 전진
digitalWrite(L298_IN1, HIGH);
digitalWrite(L298_IN2, LOW);
}
void loop() {
// 스케줄러: 1초마다 카운터 증가
if (millis() > (timerScheduler + 1000)) {
counterScheduler++;
timerScheduler = millis();
}
// ------------- 스크립트: 왕복 운행 -------------
int brakingDelta = 5;
int accelerateDelta = 6;
// 1단계: 0~5초 - 가속 출발
if (counterScheduler <= 5) {
if (millis() > (timerLocal + 100)) {
if (speedAuto < 240) speedAuto += accelerateDelta;
else speedAuto = 255;
analogWrite(L298_ENA, speedAuto);
timerLocal = millis();
}
}
// 2단계: 10~15초 - 정차 (감속 후 정지)
if ((counterScheduler >= 10) && (counterScheduler <= 15)) {
if (millis() > (timerLocal + 100)) {
if (speedAuto > 30) speedAuto -= brakingDelta;
else speedAuto = 0;
analogWrite(L298_ENA, speedAuto);
timerLocal = millis();
}
}
// 3단계: 16초 - 방향 전환
if (counterScheduler == 16) {
digitalWrite(L298_IN1, LOW);
digitalWrite(L298_IN2, HIGH);
}
// 4단계: 20~30초 - 반대 방향 가속 출발
if ((counterScheduler >= 20) && (counterScheduler <= 30)) {
if (millis() > (timerLocal + 100)) {
if (speedAuto < 240) speedAuto += accelerateDelta;
else speedAuto = 255;
analogWrite(L298_ENA, speedAuto);
timerLocal = millis();
}
}
// 5단계: 31~40초 - 정차 (감속 후 정지)
if ((counterScheduler >= 31) && (counterScheduler <= 40)) {
if (millis() > (timerLocal + 100)) {
if (speedAuto > 30) speedAuto -= brakingDelta;
else speedAuto = 0;
analogWrite(L298_ENA, speedAuto);
timerLocal = millis();
}
}
// 6단계: 40초 초과 - 1단계로 복귀 (무한 루프)
if (counterScheduler > 40) {
counterScheduler = 0;
digitalWrite(L298_IN1, HIGH);
digitalWrite(L298_IN2, LOW);
}
}
회로도
배선 회로도:

