4층에서 작동하는 서비스 리프트의 제어 시스템을 설계하고 테스트합니다. 마이크로컨트롤러(ATMega2560)를 사용하여 현재 리프트가 어느 층에 있는지 확인하고, 어느 컨택터에 전원을 공급해 리프트 모터를 상하로 움직일지 결정합니다. 제어 시스템은 리프트가 목표 층에 도달하면 모터 전원을 차단할 수 있어야 합니다. 또한 리프트가 상하 이동하기 전에 항상 문이 닫히도록 하는 안전 기능을 필수적으로 구현해야 합니다.
제어 시스템은 원하는 층으로 리프트를 이동시키기 위해 어느 컨택터에 전원을 공급해야 하는지 성공적으로 판단합니다. 또한 리프트가 이동해야 할 때 안전 도어 모터를 제어해 문을 닫고, 목표 층에 도달하면 자동으로 문을 여는 기능도 구현했습니다.
데모 비디오
[데모 비디오 링크]
1.1 3상 모터 배선
이 애플리케이션에서는 무거운 하중을 감당할 수 있는 강력한 모터가 필요하므로 3상 모터를 사용합니다. 3상 모터는 메인 3상 전원으로 구동됩니다. 메인을 통한 전원은 두 개의 메인 컨택터를 통해 흐릅니다. 첫 번째 컨택터가 켜지고 두 번째 컨택터가 꺼지면, 전원이 첫 번째 컨택터를 통해 모터 권선으로 흐르며 모터가 정방향(상승)으로 회전합니다.
반대로 두 번째 컨택터가 켜지고 첫 번째 컨택터가 꺼지면, 전원이 두 번째 컨택터를 통해 모터 권선으로 흐르며 모터가 역방향(하강)으로 회전합니다. 역방향일 때는 배선이 다르게 구성됩니다.
1.2 층 감지
현재 리프트가 어느 층에 있는지 감지하기 위해 리미트 스위치를 사용합니다. 리프트가 상하로 움직일 때 각 층의 리미트 스위치가 닫히고 열립니다. 리프트가 특정 층에 있으면 해당 층의 리미트 스위치가 닫혀 마이크로컨트롤러에 현재 층 정보를 전달합니다. 리프트가 움직이면 리미트 스위치가 열려 마이크로컨트롤러에 리프트가 이동 중임을 알립니다.
리프트가 층을 통과할 때 리미트 스위치가 로우에서 하이로 전환되는 신호는 아주 짧은 시간(수분의 1초) 동안 발생하므로 마이크로컨트롤러가 감지하기 어려운 경우가 많습니다. 리미트 스위치는 5V DC 전원에 연결되고, NO(상시 개방) 단자 출력이 마이크로컨트롤러의 IO 핀에 연결됩니다. 4개 층의 리미트 스위치가 각각 마이크로컨트롤러로 데이터를 보내므로, 어느 핀이 로우에서 하이로 전환되었는지 확인해 현재 층을 판단할 수 있습니다. 리미트 스위치 상태 전환은 아래 다이어그램과 같습니다.
로우에서 하이로의 전환을 마이크로컨트롤러가 감지하도록 하는 것이 핵심 과제입니다. 두 가지 접근 방법이 있습니다. 첫 번째는 루프 함수 내에서 if 조건을 사용해 리미트 스위치 핀이 HIGH가 되는지 확인하는 것입니다. 하지만 이 방식은 프로그램이 지속적으로 HIGH 신호를 감시하므로 메모리를 많이 차지하고, 루프가 다른 코드를 실행 중일 때 전환이 발생하면 이를 놓칠 수 있습니다. 이러한 문제를 해결하기 위해 인터럽트(Interrupt)를 사용합니다. 인터럽트는 특정 조건이 충족되면 코드 실행을 일시 중단하고 별도의 함수(ISR)를 실행합니다. 이는 리프트 작동에 이상적입니다. 리미트 스위치 핀이 로우에서 하이로 바뀌면 인터럽트 함수가 실행되어 현재 층이 목표 층인지 확인하고, 맞으면 리프트를 멈추거나 계속 이동시킵니다. 프로그램이 강제로 인터럽트 함수를 실행하므로 의도치 않게 층 감지를 건너뛰는 일을 방지할 수 있습니다. 이 애플리케이션에 사용된 아두이노 메가 2560은 인터럽트용으로 사용할 수 있는 6개의 디지털 핀을 제공하므로 4개 층 제어에 적합합니다. attachInterrupt의 첫 번째 매개변수는 인터럽트 번호인데, 보통 digitalPinToInterrupt(pin)를 사용해 실제 디지털 핀을 특정 인터럽트 번호로 변환합니다. 예를 들어 3번 핀에 연결했다면 digitalPinToInterrupt(3)를 첫 번째 매개변수로 사용합니다. 또한 ISR 내부에서는 delay() 함수가 작동하지 않는다는 점에 유의해야 합니다.
위 다이어그램은 리미트 스위치가 MCU에 어떻게 연결되는지 보여줍니다. MCU 핀은 풀다운 저항을 통해 접지에 연결됩니다. 이 저항은 리미트 스위치가 열려 있을 때 MCU 핀을 접지로 끌어내려 LOW 전압이 읽히도록 보장합니다. 저항 구성은 아래 다이어그램과 같습니다.
1.3 모터 상하 제어
두 개의 12V DC 릴레이를 사용해 모터 컨택터에 AC 전원을 공급함으로써 모터 방향(상승/하강)을 제어합니다. Multisim으로 설계한 회로도는 아래와 같습니다.
두 릴레이의 코일 한쪽은 PNP 트랜지스터를 통해 12V DC 전원에 연결됩니다. 이 방식의 주된 이유는 리프트 문이 닫힐 때까지 모터에 전원이 공급되지 않도록 하기 위함입니다. 리프트 문이 닫히면 DoorSwitch 출력 핀이 PNP 트랜지스터의 게이트로 연결되어 접지로 풀다운되면서 PNP가 켜지고, 두 릴레이 모두에 VCC 전원이 공급됩니다. 따라서 MotorUp 또는 MotorDown 신호가 HIGH여도 문이 열려 있으면 릴레이가 켜지지 않습니다. 릴레이 코일의 다른 쪽은 NPN 트랜지스터를 통해 접지로 풀다운됩니다. MotorUp 신호는 MCU에서 생성되며, HIGH가 되면 첫 번째 NPN 트랜지스터가 활성화되어 릴레이 코일의 다른 쪽을 접지에 연결함으로써 업 릴레이에 전원을 공급해 모터를 구동합니다. 다운 릴레이도 같은 방식으로 작동합니다. 릴레이 구동에 트랜지스터를 사용하는 이유는 다음과 같습니다.
두 릴레이 모두 12V DC 코일을 사용하므로, MCU가 5V만 출력할 수 있어 코일 고압 측(12V)을 스위칭하려면 PNP 트랜지스터가 필요합니다.
트랜지스터는 베이스에 적은 전류만 흘러도 활성화되어 릴레이를 스위칭할 수 있으므로 MCU 전력을 절약할 수 있습니다.
MCU 핀으로 역전류가 흘러들어가 MCU가 손상되는 것을 방지하는 절연 효과도 있습니다.
1.3.1 플라이백 다이오드를 통한 추가 보호
릴레이 코일 접점 양단에 플라이백 다이오드를 설치해, 코일이 켜지고 꺼질 때 발생하는 역전류가 흐를 경로를 제공합니다. 릴레이 코일 같은 유도성 부하에 공급 전류가 갑자기 차단되면 순간적인 전압 스파이크가 발생하는데, 이는 MCU에 추가적인 보호가 필요합니다. 아래 다이어그램은 릴레이 코일 접점에 플라이백 다이오드를 연결하는 방법을 보여줍니다.
1.3.2 사용자 입력 제어
사용자는 층 버튼을 통해 리프트 작동을 제어합니다. 4개의 층 푸시 버튼이 있으며, 버튼을 누르면 마이크로컨트롤러에 원하는 층으로 리프트를 이동시키라는 신호가 전달됩니다.
푸시 버튼을 누르면 순간적으로 HIGH 신호가 발생했다가 버튼을 떼면 LOW 신호가 됩니다. 마이크로컨트롤러의 임무는 사용자가 누른 층 버튼의 HIGH 신호를 식별하는 것입니다. 이 작업은 인터럽트로 처리할 필요가 없습니다. 사용자가 버튼을 충분히 오래 누르면 MCU가 신호를 인식할 수 있습니다. 다음으로 MCU는 사용자 입력과 현재 리프트 층을 바탕으로 업 모터 또는 다운 모터를 켤지 판단합니다.
마이크로컨트롤러의 스마트한 프로그래밍을 통해, 순수 로직과 아날로그 회로로 설계했다면 필요했을 추가 하드웨어를 제거할 수 있습니다. 이전 리프트 시스템에서는 리프트 이동 방향(상승/하강)을 식별하기 위해 아래 다이어그램과 같은 별도의 방향 스위치가 필요했습니다.
하지만 현재 리프트 층을 변수에 저장하고 사용자 입력과 비교하는 알고리즘을 설계함으로써, 리프트가 목표 층으로 가기 위해 어느 방향으로 움직여야 할지 판단하는 방향 스위치를 완전히 없앨 수 있었습니다. 예를 들어: 위 '입력 및 층 감지 MCU 연결' 다이어그램에서 리프트가 2층에 있음을 핀 3을 통해 MCU에 알립니다. 사용자가 4층 버튼을 누르면 MCU는 이 명령을 받고 두 입력을 비교합니다. 사용자 입력 '4'가 리미트 스위치 입력 '2'보다 크므로 MCU는 MotorUp 핀을 통해 신호를 보내 트랜지스터를 활성화하고 업 릴레이에 전원을 공급합니다.
리프트가 상승하면서 3층에 도달하면 프로그램 내 현재 층 변수가 업데이트됩니다. 리미트 스위치가 트리거되면 즉시 사용자 입력 값(이 경우 '4')과 비교해 업데이트된 현재 층과 비교하여 목표 층에 도달했는지 판단합니다. 4층 리미트 스위치가 트리거되면 MCU는 리프트가 4층에 도달했음을 인지하고 MotorUp 신호 핀에 LOW 신호를 보내 모터 전원을 차단해 더 이상 이동하지 않게 합니다.
1.3.3 제어부와 입력부의 절연
또 다른 중요한 요소는 마이크로컨트롤러의 DC 제어부를 시스템 입력을 통해 유입될 수 있는 AC 간섭으로부터 격리하는 것입니다. 초기에는 절연 하드웨어를 설치하지 않아, 리프트 금속 몸체에서 발생한 AC 간섭이 리미트 스위치를 통해 MCU로 전달되었습니다. 리미트 스위치는 별도 DC 전원으로 작동하지만, 입력이 직접 MCU로 연결되어 있어 리프트가 움직일 때 AC 간섭이 발생하고 이로 인해 MCU가 현재 층을 정확히 식별하지 못하는 문제가 발생했습니다. 이 문제를 해결하기 위해 각 입력에 옵토커플러(Optocoupler)를 사용해 MCU를 외부 간섭으로부터 격리했습니다.
옵토커플러의 목적은 층 리미트 스위치에서 생성된 입력 신호를 LED와 포토트랜지스터를 통해 MCU로 전달하는 것입니다. 리미트 스위치가 닫히면 LED에 전원이 공급되고, LED에서 나온 빛이 포토트랜지스터의 게이트를 활성화해 HIGH 신호를 MCU로 전달함으로써 외부 입력과 MCU를 성공적으로 격리합니다.