|
|
민선생의 전자공방 ・ 2026. 7. 20. 11:12
| 피지컬 코딩 실습 · 인버티드 펜듈럼 프로젝트 15-상편 아두이노 인버티드 펜듈럼 스윙업 도전기 — 실패에서 배운 스텝모터의 한계와 DC모터 비교 에너지 펌핑과 위상 동기 뱅뱅, 그리고 보류의 기록 아두이노 프로젝트 · 민선생의 전자공방 |
| 이번 편에서 배우는 것 | 내용 |
| 스윙업의 물리학 | 그네 타기와 에너지 펌핑 — 진자를 세우는 두 가지 길 |
| 실패의 정량 분석 | v1~v7, 일곱 번의 도전이 남긴 데이터와 원인 규명 |
| 스텝모터의 본질 | 속도-토크 특성, 탈조(Pull-out), 가속의 물리적 상한 |
| 모터 선택의 공학 | 스텝모터 vs DC모터 — 비용·복잡도·성능의 삼각 트레이드오프 |
| 설계 교훈 | 차후 펜듈럼 제작 시 스윙업 성공을 위한 체크리스트 |
▶ 1. 들어가며 — 손으로 세우는 진자에 대한 변명
원래 15편은 스윙업(Swing-up)을 성공해 진자가 아래로 축 늘어진 상태에서 카트가 스스로 좌우로 흔들어 진자를 꼭대기까지 차올리는, 인버티드 펜듈럼 제어 백미 스윙업 기동을 해보고 소개하려고 했습니다.
결론부터 말씀드리면 — 스윙업을 성공하지 못했습니다.^^;
그래서 스윙업을 건너뛰어 PID제어로 넘어 가려합니다. 우선 패스... 나중에 PID제어까지 잘 성공하면 나중에 다시 스윙업을 도전해야지 하는 생각입니다.
두 차례의 하드웨어 보강, 전원 승압까지 거기에 다양한 알고리즘을 도입해 SW적으로도 시도 했지만 진자는 97°에서 더 올라가지 못했습니다. 수직(180°)의 문턱은커녕 수평을 간신히 넘는 높이입니다.
이번 15편은 성공기가 아니라 도전기입니다. 무엇을 시도했고, 왜 안 됐는지, 그리고 다음에 만들 사람(어쩌면 미래의 저)은 무엇을 다르게 해야 하는지를 기록합니다.
30년 전, MC68000으로 펜듈럼은 스업은 해볼수 없는 구조 였고, 초기화 이후에 펜듈럼 직립상태에서 시작해 제어 했었습니다. 이번에 아두이노로 다시 도전하면서 그 시절의 숙제를 마치고 싶었는데, 스윙업이라는 절반은 또 한 번 다음을 기약하게 됐습니다.
ㅎㅎ 저도 많이 아쉽습니다. 펜듈럼의 하드웨어적 특성이 좋지않아 PID도 쉽지 않을 것 같아. 이제 스윙업은 미완으로 남겨놓고. 인버티드 펜듈럼 직립 PID제어 단계로 스킵하려 합니다.
인버티드펜듈럼 스윙업 시도 (2026.07.20.)
인버티드 펜듈럼 스윙업 시도 영상, 모터의 에너지가 약하고 LM 가이드 저항도 영향이 있는것 같습니다
▶ 2. 스윙업이란 — 그네 타기의 물리학
스윙업은 본질적으로 아이가 그네를 구르는 것과 같습니다. 그네에 앉은 아이는 아무 때나 다리를 구르지 않습니다. 그네가 최저점을 지나는 순간, 진행 방향으로 힘을 보탭니다. 진동의 위상(phase)에 맞춰 에너지를 조금씩 적립하는 것이지요. 이것이 공진 펌핑(resonant pumping)입니다.
진자를 수직으로 세우는 데 필요한 에너지는 명확하게 계산됩니다. 길이 L인 진자가 아래로 늘어진 상태(0°)에서 꼭대기(180°)까지 올라가려면, 무게중심이 2L만큼 상승해야 합니다.
| 에너지로 보는 스윙업 |
| 필요 에너지 E = m × g × 2L (위치에너지 증가분) 각도 θ까지 올렸을 때의 에너지 : E(θ) = m × g × L × (1 − cosθ) θ = 90° → E = 1.00 mgL (수평 : 필요량의 50%) θ = 97° → E = 1.12 mgL (우리의 최고 기록 : 56%) θ = 180° → E = 2.00 mgL (목표) |
즉 우리 시스템은 필요 에너지의 약 56%까지만 적립하고, 그 이상은 아무리 흔들어도 에너지가 쌓이지 않았습니다. 왜 쌓이지 않았을까요? 이것이 이번 편의 핵심 질문입니다. 답을 미리 요약하면 — 카트가 에너지를 넣어주는 속도(주입률)가, 마찰과 벨트가 에너지를 훔쳐가는 속도(손실률)와 97° 부근에서 정확히 균형을 이뤘기 때문입니다. 은행에 비유하면, 매달 넣는 적금과 매달 나가는 수수료가 같아지는 지점에서 잔고가 멈춘 셈입니다.
| 💡 공진 펌핑의 조건 진자에 에너지를 보태려면 힘을 주는 타이밍이 진자의 속도 방향과 일치해야 합니다. 물리적으로 : 일률 P = F × v 이므로, 힘(카트 가속)과 진자 속도의 부호가 같을 때만 에너지가 양(+)으로 적립됩니다. 타이밍이 어긋나면 오히려 진자를 감속시키는 브레이크가 됩니다 — 그네를 거꾸로 구르는 아이처럼요. |
▶ 3. 일곱 번의 도전 — v1에서 v7까지
스윙업 개발은 총 7개 버전, 약 2주에 걸쳐 진행됐습니다. 각 버전이 무엇을 시도했고 무엇을 배웠는지 표로 정리합니다. 이 표의 오른쪽 열이야말로 이번 편에서 가장 값진 부분입니다.
| 버전 | 시도한 것 | 결과와 배운 것 |
| v1~v2 | 기본 좌우 왕복으로 진자 흔들기 + 자이로 기반 각도 추정 | 자이로 축 방향 버그 발견·수정. 무작정 흔들면 위상이 어긋나 에너지가 쌓이다 도로 빠짐 — '타이밍'이 전부임을 확인 |
| v3 | 스텝 펄스 생성을 타이머 ISR로 이관 | MPU 읽기(1.4ms)와 LCD 갱신이 펄스를 끊어 모터가 털털거리던 문제 해결. 제어와 펄스의 시간 분리 — 이후 전 버전의 뼈대 |
| v4~v5 | 위상 동기 뱅뱅(bang-bang) : 진자 각속도 부호에 맞춰 카트 방향 전환 | 최저점 통과 순간 방향을 바꾸는 그네 전략 구현. 진폭이 착실히 성장 — 그러나 60~70°에서 성장 정체 시작 |
| v6 | 도움닫기(레일 전체를 쓰는 초기 대가속) + 에너지 정량 분석 도입 | 첫 스윙 진폭을 키워 초반 적립 가속. 에너지 수지 계산으로 '주입률 한계' 가설 수립 |
| v7 | 3-COMBO 시퀀스(도움닫기 → 위상 동기 펌핑 → 하사점 임펄스 킥) 완성 | 최고 기록 97°. 그러나 하드웨어 보강 후에도 안정 재현 극점은 ~80° — 물리적 한계로 판정, 보류 결정 |
v7의 '3-COMBO'는 세 가지 무기를 순서대로 쓰는 시퀀스였습니다. 먼저 레일 전체를 활용한 도움닫기로 첫 진폭을 크게 만들고, 이어서 진자의 각속도 부호에 동기화된 펌핑으로 에너지를 적립하고, 마지막으로 진자가 최저점을 지나는 무부하 순간에 짧고 강한 속도 점프(임펄스 킥)를 먹이는 것입니다. 이 조합 자체는 완성도가 높았습니다 — 백 번을 돌리면 백 번 모두 같은 궤적으로 진자를 차올렸으니까요. 문제는 그 백 번이 전부 같은 높이에서 멈췄다는 것입니다.
| v7 3-COMBO 핵심 로직 (개념 코드) |
| // v7 스윙업의 심장부 — 위상 동기 + 하사점 킥 (개념 발췌) // ① 위상 동기 : 진자 각속도(gyroRate)의 부호 = 카트가 갈 방향 if (pendulumSwinging) { int dir = (gyroRate > 0) ? +1 : -1; // 그네와 같은 방향으로 setCartMove(dir, SWING_MMS); // 카트가 '따라가며' 밀기 } // ② 하사점 임펄스 킥 : 최저점 통과(각도≈0, 속도 최대) 순간 if (fabsf(cfAngle) < KICK_ZONE && fabsf(gyroRate) > KICK_RATE_MIN) { kickSpeed = fabsf(gyroRate) * KICK_GAIN; // 속도에 비례한 펀치 setCartMove(dir, kickSpeed); // 순간 가속! } |
▶ 4. 하드웨어 문제해결 — 벨트 서포터와 텐션 스프링
소프트웨어가 한계에 다다르자 하드웨어를 의심하기 시작했습니다. 관찰 결과 범인 후보는 명확했습니다 — 벨트였습니다. 카트를 좌우로 격렬하게 흔드는 스윙업에서는 벨트가 매 순간 당김과 풀림을 반복하는데, 이때 벨트의 처짐과 늘어남이 모터의 힘을 잡아먹고 있었습니다.
■ 보강 ① 벨트 장력 서포터
긴 벨트 구간이 출렁이지 않도록 중간을 받쳐주는 서포터를 제작해 장착했습니다. 방향 전환 순간의 벨트 펄럭임이 눈에 띄게 줄었습니다.
■ 보강 ② 텐션 스프링
벨트에 상시 장력을 걸어주는 텐션 스프링을 추가했습니다. 벨트가 느슨해지는 순간(백래시)을 줄여, 모터의 방향 전환이 카트에 더 즉각적으로 전달되도록 한 것입니다.
■ 보강 ③ 전원 승압 : 12V → 20V
스텝모터 드라이버(DRV8825)의 공급 전압을 노트북 어댑터를 활용해 20V로 올렸습니다. 스텝모터는 공급 전압이 높을수록 코일 전류가 빨리 차올라 고속에서의 토크 감소가 완화됩니다. 실측 최고 속도가 170mm/s에서 190mm/s로 개선됐습니다.
그런데 — 이 세 가지 보강을 모두 하고도 안정 재현 극점은 80° 부근이었고, 최고 기록 97°는 갱신되지 않았습니다. 보강이 무의미했다는 뜻이 아닙니다. 보강 덕에 재현성이 크게 올라갔고, 무엇보다 '벨트가 주범이 아니라 공범이었다'는 사실이 확정됐습니다. 진짜 주범은 더 근본적인 곳에 있었습니다.
💡 승압 시 주의
DRV8825의 모터 전압(VMOT)은 최대 45V까지 허용되지만, 전압을 올렸다면
① VMOT 단자에 100µF급 전해 커패시터를 가까이 달아 서지를 흡수하고
② 드라이버의 전류 제한(Vref)을 반드시 다시 확인하세요. 전압을 올리는 것이지 전류를 올리는 것이 아닙니다. 모터 발열도 한동안 손으로 점검하시길 권합니다.
| 💡 나중에 직립 제어 단계에서 실측된 충격적 수치 직립 제어를 개발하며 카트에 가속 명령을 주고 실제 응답을 측정해 보니 — 명령한 가속도의 약 47%만 진자에 전달되고 있었습니다. 나머지 절반은 벨트의 탄성 늘어남이 스프링처럼 흡수했다가 뒤늦게 되돌려주고 있었던 것입니다. 스윙업의 임펄스 킥처럼 '짧고 강한' 힘일수록 이 흡수는 치명적입니다. 펀치를 날렸는데 상대에게 닿기 전에 스펀지가 절반을 먹는 셈입니다. |
▶ 5. 실패 원인의 정량 분석 — 스윙업 에너지 부족의 원인은 무엇일까?
일곱 버전의 시리얼 로그를 쌓아놓고 분석한 결과, 실패는 하나의 원인이 아니라 네 개의 제약이 겹친 합작품이었습니다.
■ 원인 ① 스텝모터의 속도-토크 특성 — 그리고 탈조
스텝모터의 토크는 속도가 올라갈수록 급격히 떨어집니다. 코일에 전류가 차오르는 데 시간이 걸리는데, 고속에서는 다음 스텝이 오기 전에 전류가 다 차지 못하기 때문입니다. 그리고 부하 토크가 그 순간의 가용 토크를 넘는 순간 — 모터는 스텝을 놓치고 헛돕니다. 이것이 탈조(Pull-out, 脫調)입니다.
탈조의 무서움은 두 가지입니다. 첫째, 스텝모터는 위치를 스텝 수로 세는 개방 루프(open-loop)라서 탈조 순간 카트의 실제 위치를 잃어버립니다. 둘째, 탈조 시의 격렬한 진동이 카트 위의 IMU 센서(자이로)를 오염시켜 각도 추정까지 무너뜨립니다. 실제로 저희 로그에는 명령 속도 대비 실측 이동이 12%에 불과했던 완전 탈조 구간과, 자이로가 ±429°/s의 유령 회전을 기록한 오염 구간이 고스란히 남아 있습니다.
| 로그로 잡아낸 탈조의 증거 |
| 탈조의 현장 검증법 (시리얼 로그 대조) 명령 : vCmd = -160 mm/s (0.35초 동안) 기대 이동 : 160 × 0.35 = 56mm 실측 이동 : pos 변화량 = 6.7mm ← 명령의 12%! → 모터는 '가라'고 펄스를 받았지만 자석이 회전자를 붙잡지 못하고 미끄러진 것. 이것이 탈조의 지문입니다. |
■ 원인 ② 가속의 상한 — 슬루 제한의 딜레마
탈조를 막는 방법은 알고 있었습니다. 속도를 한 번에 확 바꾸지 말고 경사로(ramp)처럼 서서히 바꾸는 것 — 슬루 레이트 제한입니다. 실제로 직립 제어에서는 이 기법이 탈조를 완전히 없애 주었습니다. 그런데 스윙업에서는 이것이 족쇄가 됩니다. 에너지 주입률은 카트 가속도에 비례하는데, 탈조를 피하려 가속을 제한하면 주입률도 함께 깎이기 때문입니다.
즉 스텝모터 스윙업은 구조적 딜레마에 갇힙니다 — 세게 치면 탈조로 헛돌고, 살살 치면 에너지가 안 쌓입니다. 그 두 절벽 사이의 좁은 능선이 바로 우리가 도달한 97°였습니다.
■ 원인 ③ 벨트의 탄성 흡수 (실효 47%)
4장에서 설명한 그대로입니다. 특히 임펄스 킥처럼 수십 ms짜리 짧은 힘은 벨트 스프링의 시정수보다 짧아 대부분 흡수됩니다. 하사점 킥이 '이론상 완벽한 타이밍'에 들어가도 진자에 닿는 것은 절반짜리 펀치였습니다.
■ 원인 ④ 인버티드펜듈럼의 유효 이동 레일 336mm — 가속할 거리가 부족했습니다.
제가 만든 인버티드펜듈럼의 레일 유효 길이는 336mm입니다. 진자를 밀어주는 힘은 카트가 움직이는 동안만 작용하는데, 카트는 레일 중앙 부근 ±140mm 안에서만 왕복할 수 있습니다. 진폭이 커질수록 진자의 주기 대비 카트가 힘을 실어줄 수 있는 시간·거리의 비율이 줄어듭니다. 도움닫기로 초반은 벌 수 있지만, 후반(80° 이상)에서는 좁은 무대가 충분한 스업 에너지를 만들지 못한것 같습니다.
| 제약 | 증상 | 시도한 대응 | 한계 |
| 속도-토크 특성 | 고속 구간 힘 부족 | 20V 승압 | 완화는 되나 특성 자체는 불변 |
| 탈조 | 위치 상실·센서 오염 | 슬루 제한, 킥 최소화 | 주입률 동반 하락 (딜레마) |
| 벨트 탄성 | 임펄스 절반 흡수 | 서포터·텐션 스프링 | 백래시 개선, 탄성은 잔존 |
| 레일 길이 | 가속 거리 부족 | 도움닫기 시퀀스 | 후반 진폭에선 무대가 좁음 |
| 💡스윙업 실패의 원인 분석 — 에너지 수지의 균형점 네 제약을 종합하면 : 카트가 1스윙당 넣어줄 수 있는 에너지(주입)는 진폭이 커질수록 줄고, 마찰·벨트 손실(유출)은 속도가 커질수록 늘어납니다. 두 곡선이 만나는 지점이 우리 시스템에서는 약 97° — 그 위로는 물리적으로 잔고가 늘지 않는 것입니다. 코드를 아무리 다듬어도 이 교차점 자체는 하드웨어가 정하는 값입니다. 저는 '소프트웨어의 한계'가 아니라 ' 제가 만든 인버티드펜듈럼의 구조적 한계'라고 판단 하였습니다. 그래서 프로젝트에서 스윙업은 우선 보류하고 다음단계를 진행하고자 하였습니다. (정말 아쉽지만....... !!) |
▶ 6. DC 모터였다면? — 모터 선택의 공학
여기서 자연스러운 질문이 나옵니다. "애초에 DC 모터를 썼다면 됐을 것 아닌가?" — 좋은 질문이고, 답은 '아마도 그렇다, 하지만 공짜가 아니다'입니다. 두 모터는 철학이 다릅니다.
DC 모터는 힘의 모터입니다. 전류를 흘리는 만큼 토크가 나오고(T = Kt × I), 정지 상태부터 고속까지 연속적인 토크를 냅니다. 탈조라는 개념 자체가 없습니다 — 힘이 부족하면 그냥 느려질 뿐, 헛돌며 위치를 잃지 않습니다. 스윙업처럼 폭발적 가속이 필요한 과제에는 체질적으로 맞습니다.
그런데 DC 모터는 자기가 어디 있는지 모릅니다. 스텝모터는 '몇 스텝 보냈는지'만 세면 위치를 알지만, DC 모터로 카트 위치를 알려면 로터리 엔코더를 축에 달아야 합니다. 분해능이 좋은 엔코더는 모터보다 비싼 경우가 흔하고, A/B상 펄스를 놓치지 않고 세는 인터럽트 처리, 속도 계산, 그리고 전류(토크)–속도–위치로 이어지는 다단 폐루프 제어가 추가로 필요합니다. H브리지 드라이버, PWM 전류 제어까지 — 시스템 복잡도가 한 단계 뛰어오릅니다.
| 항목 | 스텝모터 (우리의 선택) | DC 모터 + 엔코더 |
| 위치 파악 | 스텝 카운트 = 위치 (개방 루프, 공짜) | 로터리 엔코더 필수 (고가, 배선·인터럽트 처리 추가) |
| 토크 특성 | 저속 강함, 속도↑ 토크 급감 | 전 속도 대역 연속 토크 (T = Kt×I) |
| 가속 능력 | 탈조 한계 내로 제한 — 스윙업의 족쇄 | 전류가 허용하는 한 자유 — 스윙업에 유리 |
| 실패 양상 | 탈조 시 위치 상실 + 진동으로 센서 오염 | 힘 부족 시 그냥 느려짐 (위치는 보존) |
| 드라이버 | DRV8825 등 저가·간단 (STEP/DIR 두 핀) | H브리지 + PWM + 전류 감지 (복잡) |
| 제어 구조 | 속도 명령만으로 구동 (단순) | 전류→속도→위치 다단 폐루프 튜닝 필요 |
| 정지 유지 | 여자 상태로 강한 유지 토크 | 능동 제어 필요 (전류 계속 소모) |
| 비용 | 모터+드라이버 합계 저렴 | 모터+엔코더+드라이버로 수 배 |
정리하면 — 스텝모터는 '위치는 공짜, 가속은 유료'인 모터이고, DC 모터는 '가속은 공짜, 위치는 유료'인 모터입니다. 직립 유지처럼 정밀 위치가 중요하고 가속 요구가 완만한 과제에는 스텝모터가 탁월한 가성비를 보여줍니다(제가 펜듈럼을 만들때 있는 부품 활용, 저렴한 부품으로 누구나 해볼수 있도록 가성비가 제 펜듈럼의 제1 고려 조건이었습니다. 저렴한 스텝모터, 저렴한 센서 MPU-6050으로 구현하는 인버티드 펜듈럼이 목표였습니다.).
반면 스윙업처럼 순간 가속이 승부를 가르는 과제는 DC(또는 서보) 모터의 영역입니다. 하나의 장치에 두 과제가 공존하는 인버티드 펜듈럼이야말로, 모터 선택에 정답이 없고 트레이드오프만 있다는 것을 가르쳐주는 교재인 셈입니다.
| 💡 어떤 선택지가 있을까? 클로즈드 루프 스텝모터 : 스텝모터 뒤에 엔코더를 붙여 탈조를 감지·보정하는 하이브리드. 두 세계의 장점을 상당히 취합니다. BLDC 서보 : 소형 서보 드라이버 가격이 많이 내려와, 취미 영역에서도 현실적인 선택지가 되고 있습니다. |
▶ 7. 다음 설계를 위한 체크리스트 — 스윙업이 되는 펜듈럼
이 프로젝트를 다시 설계한다면(혹은 이 글을 보고 직접 만드신다면), 스윙업 성공을 위해 아래 항목을 권합니다. 전부 이번 실패가 가리킨 지점들입니다.
• 레일 길이 500mm 이상 — 가속 무대를 넓히는 것이 가장 확실한 투자입니다. 진자 길이 대비 레일이 길수록 스윙업 난이도는 급격히 내려갑니다.
• 구동계 강성 확보 — 벨트라면 강화(스틸 코어) 벨트 + 상시 텐셔너를 처음부터 설계에 포함하고, 가능하다면 랙&피니언이나 볼스크류 같은 강결합 방식을 검토하세요. 임펄스가 살아서 도착해야 합니다.
• 모터 토크 여유 3배 — 계산상 필요한 토크의 3배 이상. 스텝모터를 사용한다면 NEMA23급 이상 + 고전압 드라이버, 이상적으로는 클로즈드 루프 스텝 또는 DC+엔코더.
• 진자 설계 — 가벼운 봉 + 끝단 집중 질량. 같은 길이라도 관성 모멘트를 줄이면 필요한 에너지와 토크가 함께 줄어듭니다. 봉을 길게 하면 주기가 느려져 제어 여유도 커집니다.
• 마찰 관리 — 진자 회전축의 볼베어링은 필수입니다. 에너지 '유출' 곡선을 낮추는 것은 '주입' 곡선을 높이는 것과 등가입니다.
• 전원 여유 — 스텝모터라면 드라이버 허용 최대 전압에 가깝게. 전압이 곧 고속 토크입니다.
• 제어 전략 — 위상 동기 펌핑 + 에너지 기반 종료 판정(E가 2mgL 근접 시 캐치 모드 전환)의 조합을 권합니다. 그리고 캐치 존을 ±20° 이상으로 넉넉히 — 스윙업의 마지막 순간은 생각보다 빠릅니다.
▶ 8. 마치며 — 실패의 기록이 지식이 되도록
이 글을 쓰며 일곱 버전의 로그도 다시 확인해 보았습니다. 탈조를 처음 잡아냈을 때만 해도, 서포터를 달고 처음 돌렸을 때도 정말 잘 될줄 알았는데 개인적으로 많이 아쉽습니다. ^^;
그렇지만 여기서 쳇바퀴를 돌순 없어 정말 아쉽지만 우선 스윙업은 건너뛰고 PID제어로 넘어갑니다.
스윙업은 보류지만 포기는 아닙니다. 하드웨어를 손볼 기회가 오면 이 체크리스트를 들고 다시 도전할 것입니다. 소걸음으로 천 리를 갑니다(牛步千里).
그리고 다음 편 — 손으로 세운 진자를 붙잡는 직립 제어를 천천히 진행해 보려 합니다. 지난 방학때도 한번 도전해 보았는데 제가 만든 인버티드 펜듈럼 시스템의 하드웨어적 한계는 있어보입니다.
그래도 한번 직립제어 만이라도 성공해보고 싶어 다음 단계인 PID 직립제어 넘어갑니다.
| ▶ 다음 편 예고 — 16편. 직립 제어 • 인버티드 펜듈럼 PID 직립제어 : 손으로 세운 진자를 카트가 이어받는 '캐치' 시퀀스부터 시작합니다 |
민선생의 전자공방 · 피지컬 코딩 실습 — 인버티드 펜듈럼 프로젝트 15편
태그#아두이노#Arduino#인버티드펜듈럼#역진자#피지컬코딩#민선생의전자공방#아두이노프로젝트#스윙업#SwingUp#에너지펌핑#위상동기#제어공학#PID제어#방구석연구소#스텝모터#StepperMotor#DC모터#모터제어#탈조#엔코더#DRV8825#백래시#메이커스#DIY#트레이드오프#실패학#하드웨어설계
