산업용 아두이노에 HMI 연결하는 방법
Modbus RTU 또는 I²C로 실시간 I/O와 공정 값을 터치스크린 HMI에 노출하는 방법과 레지스터 매핑 예제를 제공합니다.
7분 분량
목표: 운전원 화면에 실시간 I/O 표시
HMI를 MPINO 산업용 Arduino에 연결한다는 것은 컨트롤러의 물리적 세계, 즉 입력, 릴레이, 트랜지스터, 아날로그 채널을 운전원 패널에서 보고 제어할 수 있게 만드는 것을 의미합니다. HMI는 실시간 입력 상태를 표시하고, 운전원이 출력을 명령하게 하며, 아날로그 값을 트렌드로 보여주는데, 이 모든 것을 운전원이 컨트롤러를 직접 만지지 않고도 수행합니다.
MPINO는 거의 모든 HMI가 기본으로 지원하는 프로토콜인 RS-485 기반 Modbus RTU를 통해 I/O를 HMI에 노출하는 것이 일반적입니다. 또한 나열된 모든 모델에 온보드 I²C 버스가 제공되어, 패널 아키텍처에 더 적합한 경우 로컬 주변장치나 보조 프로세서에 대한 근거리 연결에 사용할 수 있습니다.
패턴은 모델 크기와 무관하게 동일합니다. 소형 MPINO-8A8R-S를 배치하든 완전히 채워진 MPINO-16A8R8T를 배치하든, 레지스터 및 코일 맵을 게시하고 ILIB Modbus 슬레이브를 실행하며 HMI 객체를 해당 주소에 바인딩합니다. 이 가이드의 나머지는 그 매핑과 이를 뒷받침하는 펌웨어를 안내합니다.
전송 방식 선택: Modbus RTU 또는 I²C
운전원 HMI의 경우 RS-485 기반 Modbus RTU가 거의 항상 올바른 전송 방식입니다. 길고 노이즈에 강한 케이블 위에서 동작하고, 모든 주요 HMI 브랜드가 Modbus RTU 드라이버를 포함하며, 요청-응답 모델이 입력 읽기와 코일 쓰기에 직접 대응합니다. MPINO 오토 디렉션 트랜시버와 ILIB 슬레이브 스택은 관리할 드라이버 인에이블 타이밍 없이 MPINO를 깔끔한 Modbus 노드로 만듭니다.
I²C는 다른 역할에 적합합니다. 이는 동일 패널이나 보드 상의 통신, 예를 들어 MPINO와 로컬 디스플레이 컨트롤러, 익스팬더, 또는 감시용 마이크로컨트롤러 간 통신을 위한 근거리 다중 장치 버스입니다. 나열된 모든 MPINO가 직렬 인터페이스와 함께 I²C를 제공하므로, 설계자는 HMI에 대한 장거리 Modbus 링크와 인근 장치에 대한 로컬 I²C 링크를 결합할 수 있습니다.
HMI가 컨트롤러에서 어느 정도 떨어진 독립형 운전원 패널일 때는 Modbus RTU를 선택하십시오. 이것이 전형적인 산업 사례입니다. I²C는 짧은 도달 거리와 단순한 2선 버스가 제약이 아니라 이점이 되는, 캐비닛 내부에 밀결합된 주변장치에 한정해 사용하십시오.
레지스터 및 코일 맵 설계
레지스터 맵은 각 주소가 정확히 무엇을 의미하는지 정의하므로 HMI 통합에서 가장 중요한 산출물입니다. 펌웨어를 작성하기 전에 배치하고 게시된 인터페이스로 취급하십시오. HMI가 읽기만 하는 입력은 디스크리트 입력과 입력 레지스터에, HMI가 명령하는 출력은 코일과 홀딩 레지스터에 둡니다.
MPINO-8A8R의 명확한 맵은 다음과 같습니다. 코일 0-7이 8개 릴레이를 구동하고, 디스크리트 입력 0-7이 8개 디지털 입력을 보고하며, 입력 레지스터 0-3이 EXTERNAL 기준 ADC의 원시 0-1023 카운트로 4개 아날로그 채널을 운반합니다. HMI 작성자가 표시 스케일링을 올바르게 구성하도록 각 레지스터 옆에 단위와 스케일링을 문서화하십시오.
MPINO-16A8R8T 같은 더 풍부한 컨트롤러는 동일한 방식을 확장합니다. 16개 디지털 입력은 디스크리트 입력 0-15, 릴레이는 코일 0-7, 8개 트랜지스터 출력은 코일 8-15, 4개 아날로그 입력과 2개 NTC 채널은 입력 레지스터, 2개 아날로그 출력은 홀딩 레지스터에 둡니다. 안정적이고 잘 라벨링된 맵은 HMI 통합 담당자가 펌웨어 개발과 병행해 작업할 수 있게 합니다.
펌웨어: 입력 읽기와 릴레이 코일 쓰기
맵이 고정되면 펌웨어는 간결한 루프로 축소됩니다. 실시간 디지털 및 아날로그 입력을 슬레이브의 디스크리트 입력 및 입력 레지스터 테이블로 복사하고, poll 호출로 마스터를 서비스한 뒤, 마스터가 쓴 코일 값을 물리적 릴레이와 트랜지스터 출력에 적용합니다.
아래 스케치는 Modbus RTU 슬레이브로 동작하는 MPINO-16A8R8T에 대해 바로 이것을 구현합니다. 16개 디스크리트 입력과 4개 아날로그 입력 레지스터를 갱신하고, HMI 마스터가 읽고 코일을 쓸 수 있도록 poll()을 호출한 뒤, 코일 0-15로 8개 릴레이와 8개 트랜지스터 출력을 구동합니다. MPINO 아날로그 프런트엔드가 올바른 ADC 판독을 위해 요구하는 analogReference(EXTERNAL)에 유의하십시오.
이 구조는 매 스캔마다 입력 데이터를 신선하게 유지하고 poll 직후 운전원 명령을 결정론적으로 적용하므로, HMI가 표시하는 것과 명령하는 것이 물리적 I/O와 긴밀하게 동기화됩니다.
#include <ILIB.h>
// MPINO-16A8R8T Modbus RTU slave for HMI access
ModbusSlave mb;
const uint8_t DI[16] = {22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37};
const uint8_t RELAY[8] = {38,39,40,41,42,43,44,45};
const uint8_t TR[8] = {46,47,48,49,2,3,4,5};
const uint8_t AI[4] = {A0,A1,A2,A3};
void setup() {
analogReference(EXTERNAL); // required for MPINO analog
for (uint8_t i=0;i<16;i++) pinMode(DI[i], INPUT);
for (uint8_t i=0;i<8;i++) pinMode(RELAY[i], OUTPUT);
for (uint8_t i=0;i<8;i++) pinMode(TR[i], OUTPUT);
mb.begin(1, 19200); // slave id 1
}
void loop() {
// Inputs -> discrete inputs 0..15
for (uint8_t i=0;i<16;i++)
mb.setDiscreteInput(i, digitalRead(DI[i]));
// Analog -> input registers 0..3 (raw 0..1023)
for (uint8_t i=0;i<4;i++)
mb.setInputRegister(i, analogRead(AI[i]));
mb.poll(); // HMI reads inputs, writes coils
// Coils 0..7 -> relays, 8..15 -> transistor outputs
for (uint8_t i=0;i<8;i++) digitalWrite(RELAY[i], mb.getCoil(i));
for (uint8_t i=0;i<8;i++) digitalWrite(TR[i], mb.getCoil(8+i));
}HMI 측 구성
HMI에서 baud rate, 데이터 비트, 패리티, 스톱 비트가 MPINO의 begin() 호출과 정확히 일치하는 Modbus RTU 직렬 드라이버를 생성합니다. MPINO를 슬레이브 주소로 장치 항목에 추가한 뒤, 게시된 주소를 가리키는 태그를 생성합니다. 입력 램프용 디스크리트 입력 태그, 출력 버튼용 코일 태그, 아날로그 표시용 레지스터 태그입니다.
화면 위젯을 이 태그에 바인딩합니다. 순시 또는 유지형 푸시버튼은 코일을 쓰고, 표시등은 디스크리트 입력을 읽으며, 숫자 표시나 트렌드는 입력 레지스터를 읽어 맵에 문서화한 스케일링을 적용합니다. 코일은 읽기/쓰기이므로 HMI는 릴레이를 명령하는 동시에 확인을 위해 명령된 상태를 다시 읽을 수 있습니다.
합리적인 폴링 간격(일반적으로 100-500 ms)을 설정하고 인접 주소를 그룹화해 HMI가 단일 Modbus 트랜잭션으로 읽도록 하십시오. 이는 버스 트래픽을 최소화하고, ATmega128 또는 ATmega2560이 컨트롤러의 전체 I/O를 처리할 때에도 화면 갱신을 부드럽게 유지합니다.
검증, 안전, 실제 값
패널을 운전원에게 인계하기 전에 매핑된 모든 포인트를 종단 간 검증하십시오. 각 물리적 입력을 토글하고 해당 HMI 램프가 따라오는지 확인하며, 각 HMI 버튼을 눌러 해당 릴레이나 트랜지스터 출력이 작동하는지 확인합니다. 아날로그 표시가 각 채널에 인가한 알려진 기준을 추종하고 문서화된 스케일링이 올바른 공학 단위를 산출하는지 검증합니다.
HMI 알람이나 인터록이 실제 값처럼 작용할 수 있는 플레이스홀더나 0 값을 MPINO가 게시하지 않도록 하십시오. setup()에서 출력을 정의된 안전 상태로 초기화하고, 통신 손실 시 마지막 명령 상태를 무기한 래치하지 않고 기계를 안전한 조건으로 두도록 코일 로직을 설계하십시오.
인명 안전에 영향을 줄 수 있는 출력에 대해서는 HMI-Modbus 경로에만 의존하지 마십시오. 하드와이어 비상 정지와 안전 인터록을 컨트롤러와 네트워크와 독립적으로 유지하십시오. MPINO와 그 HMI는 감시 제어와 가시성을 제공하며, 기능 안전은 전용 하드와이어 안전 회로의 영역으로 남습니다.
관련 컨트롤러

MPINO-16A8R8T
MPINO-16A8R8T 산업용 아두이노 컨트롤러
관련 가이드
FAQ
HMI를 MPINO에 Modbus RTU로 연결해야 합니까, I²C로 연결해야 합니까?▾
독립형 운전원 HMI에는 RS-485 기반 Modbus RTU를 사용하십시오. 길고 노이즈에 강한 케이블 위에서 동작하며 모든 주요 HMI가 지원합니다. I²C는 MPINO와 디스플레이 컨트롤러나 익스팬더 같은 로컬 주변장치 간의 근거리 캐비닛 내부 연결에 한정하십시오.
HMI는 MPINO 릴레이를 어떻게 명령합니까?▾
HMI는 해당 릴레이에 매핑된 Modbus 코일을 씁니다. 펌웨어에서 ILIB 슬레이브는 8개 릴레이에 대해 코일 0-7을 노출하며, poll() 이후 스케치가 mb.getCoil(i)로 digitalWrite()를 호출하므로 HMI의 버튼 누름이 물리적 릴레이를 여자 또는 소자시킵니다.
HMI에서 아날로그 값을 읽을 수 있습니까?▾
네. 각 아날로그 채널을 입력 레지스터에 매핑하면 펌웨어가 EXTERNAL 기준 0-1023 ADC 카운트를 게시하고 HMI가 문서화된 스케일링을 적용해 공학 단위를 표시합니다. MPINO-16A8R8T는 2개 NTC 온도 채널도 같은 방식으로 노출합니다.

