문서의 이전 판입니다!
목차
MPINO-8A4T-S
MPINO-8A4T-S는 디지털 입력 8점과 SINK 트랜지스터 출력 4점을 갖춘 일체형 산업용 아두이노입니다. 전압·전류 아날로그 입력, NTC 온도센서 입력, PWM, 고속 입력과 RS-232 통신 기능을 한 장의 PCB에 구성했습니다.
Arduino IDE(Arduino C/C++) 또는 MPINO STUDIO 2(Arduino C/C++ & 래더로직)로 프로그램할 수 있습니다.
제품 사양서
| 구분 | 개수 | 접점명 | 사양 |
|---|---|---|---|
| 전원 | - | 전원전압 | DC 12~24V (DC 24V 사용 시 0.5A 이상) |
| 디지털 입력 | 8점 (무접점·절연) | P0~P7 | 동작 입력 전압: DC 0~40V HIGH 인식 전압: DC 5V 이상 8점/1COM NPN·PNP 입력 지원 |
| 트랜지스터 출력 | 4점 (무접점·절연) | P32~P35 | 출력 방식: SINK 출력 출력 동작: ON 시 V-와 연결 최대 출력 허용 전류: 1A/1점 부하 전압: DC 0~100V V+·V- 단자에 부하 전원 연결 |
| 아날로그 입력 | 2점 (비절연) | A0, A1 | 입력 전압: DC 0~5V 분해능: 10bit (0~1023) 입력저항: 100MΩ (±1%) |
| 아날로그 입력 | 2점 (비절연) | A2, A3 | 입력 전류: 0~20mA 또는 4~20mA 분해능: 0~20mA는 10bit (0~1023), 4~20mA는 0~818 입력저항: 250Ω (±1%) |
| 아날로그 입력 | 2점 (비절연) | A4, A5 | 입력 전압: DC 0~10V 분해능: 10bit (0~1023) 입력저항: 200kΩ (±1%) |
| 온도센서 입력 | 2점 (비절연) | NTEMP A6, A7 | 입력 온도: -40~120℃ 센서: NTC 3950K, 10kΩ(25℃) 분해능: 0.1℃ (0~40℃ 기준) |
| 인터럽트 고속카운터·엔코더 | 4점 (비절연) | D24(CLK), D25(DIO) D18(SCL), D19(SDA) | 입력 전압: DC 0~5V HIGH 인식 전압: DC 3V 이상 입력 주파수: 최대 50kHz D24·D25: 4.7kΩ 풀업 내장 D18·D19: 4.7kΩ 풀업 내장 |
| 펄스 출력 | 3점 (비절연) | PWM D21, D22, D23 | 출력 전압: LOW(DC 0V), HIGH(DC 5V) 최대 출력 전류: 30mA |
| 통신 채널 | 1채널 (비절연) | I²C | I²C 마스터·슬레이브 지원 인터럽트 포트로 사용 가능 (4.7kΩ 풀업) |
| RS-232 | Serial1 사용 Modbus RTU Master & Slave 내장 명령어 지원 LS산전 Cnet 내장 명령어 지원 |
||
| 메모리 | - | Flash | 128KB |
| SRAM | 4KB | ||
| EEPROM | 4KB |
디지털 입력
디지털 입력은 포토커플러로 절연되어 있으며 DC 5~24V의 NPN 또는 PNP 입력을 연결할 수 있습니다. 입력 방식은 COM 결선 방향으로 선택합니다.
예제 프로그램 · 디지털 입력
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
P0~P7 입력 상태 읽기
IdigitalRead(pin, 5)로 입력을 5회 연속 판독하고 200ms마다 P0~P7 상태를 시리얼 모니터에 표시합니다. 5회 값이 모두 같으면 상태를 갱신하고, 섞여 있으면 이전 상태를 유지합니다. NPN·PNP에 맞는 COM0·COM1 결선은 위 그림을 따릅니다.
// MPINO-8A4T-S: P0~P7 입력 상태를 시리얼 모니터에 표시합니다. void setup() { Serial.begin(115200); } void loop() { for (uint8_t pin = 0; pin < 8; pin++) { Serial.print('P'); Serial.print(pin); Serial.print('='); Serial.print(IdigitalRead(pin, 5)); // 5회 판독이 일치하면 상태 갱신 Serial.print(' '); } Serial.println(); delay(200); }
트랜지스터 출력
| 단자 | Arduino 핀 | 출력 방식 | 최대 정격 | 단자대 및 결선 예시 |
|---|---|---|---|---|
| P32 | D32 | SINK 출력 | DC 100V, 1A/1점 | |
| P33 | D33 | SINK 출력 | DC 100V, 1A/1점 | |
| P34 | D34 | SINK 출력 | DC 100V, 1A/1점 | |
| P35 | D35 | SINK 출력 | DC 100V, 1A/1점 |
트랜지스터 출력은 ON될 때 출력 단자가 V-와 연결되는 SINK 방식입니다. V+와 V- 단자에는 제어할 부하의 외부 DC 전원을 연결합니다.
예제 프로그램 · 트랜지스터 출력
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
P0~P3 입력으로 P32~P35 출력 제어
IdigitalRead(channel, 5)로 읽은 입력을 P0→P32, P1→P33, P2→P34, P3→P35로 대응시킵니다. 5회 연속 판독이 일치하면 상태를 갱신합니다. HIGH일 때 출력이 V-와 연결됩니다. 부하의 다른 쪽은 V+에 연결하고, 부하 전원은 출력을 OFF한 상태에서 공급합니다.
// MPINO-8A4T-S: P0~P3 입력으로 P32~P35 SINK 출력을 제어합니다. void setup() { for (uint8_t channel = 0; channel < 4; channel++) { digitalWrite(32 + channel, LOW); // 출력을 OFF로 시작 } } void loop() { for (uint8_t channel = 0; channel < 4; channel++) { digitalWrite(32 + channel, IdigitalRead(channel, 5)); } }
아날로그 입력ㆍ온도센서 입력
예제 프로그램 · 아날로그 입력ㆍ온도센서 입력
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
전압·전류와 NTC 온도 읽기
IanalogReadf()로 A0·A1은 V(0~5V), A2·A3은 mA(0~20mA), A4·A5는 V(0~10V)를 표시하고, ntcReadf()로 A6·A7의 섭씨 온도를 읽습니다. 4~20mA 입력도 실제 전류값을 읽으므로 환산 범위는 0~20mA를 사용합니다. NTC 10kΩ(25℃), B=3950K를 A6 또는 A7과 GND 사이에 연결합니다. ntcReadf()는 범위 밖 값을 -40~120℃의 끝값으로 제한하므로 센서 단선·단락을 별도로 판정하지 않습니다. 정밀 측정에는 외부 DC 전원을 사용합니다.
void setup() { Serial.begin(115200); } void loop() { const uint8_t pins[] = {A0, A1, A2, A3, A4, A5, A6, A7}; for (uint8_t channel = 0; channel < 8; channel++) { Serial.print('A'); Serial.print(channel); Serial.print(F(": ")); if (channel < 2) { Serial.print(IanalogReadf(pins[channel], 0.0f, 5.0f), 3); Serial.println(F(" V")); } else if (channel < 4) { Serial.print(IanalogReadf(pins[channel], 0.0f, 20.0f), 3); Serial.println(F(" mA")); } else if (channel < 6) { Serial.print(IanalogReadf(pins[channel], 0.0f, 10.0f), 3); Serial.println(F(" V")); } else { Serial.print(ntcReadf(pins[channel]), 1); Serial.println(F(" C")); } } Serial.println(); delay(1000); }
PWM·고속 입력
| 기능 | Arduino 핀 | 점수 | 커넥터 핀 배열 |
|---|---|---|---|
| PWM 출력 | D21, D22, D23 | 3점 | |
| 고속 입력·인터럽트 | D18, D19, D24, D25 | 4점 | |
| 엔코더 입력 | D24, D25 | 2점 |
D18과 D19는 I²C의 SCL·SDA 기능을 공유합니다. I²C 통신을 사용하는 동안에는 해당 핀을 고속 입력으로 동시에 사용할 수 없습니다.
예제 프로그램 · PWM·고속 입력
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
PWM 3채널 출력
FDPWM(핀, 주파수Hz, 듀티%)으로 PWM0·PWM1·PWM2에 1kHz, 약 25%·50%·75% 듀티를 출력합니다. 세 출력은 Timer3를 공유하므로 주파수를 동일하게 지정합니다. DC 5V 신호 입력 기기의 GND와 보드 GND를 연결합니다.
// MPINO-8A4T-S: PWM0(D21), PWM1(D22), PWM2(D23) void setup() { FDPWM(21, 1000, 25.0f); // PWM0: 1kHz, 25% 듀티 FDPWM(22, 1000, 50.0f); // PWM1: 1kHz, 50% 듀티 FDPWM(23, 1000, 75.0f); // PWM2: 1kHz, 75% 듀티 } void loop() { }
CLK 펄스 카운트
CLK(D24)의 상승 에지를 누적합니다. 신호는 DC 0~5V이며 신호원의 GND를 보드 GND에 연결합니다. 다른 입력을 쓰려면 CLK를 DIO, SCL 또는 SDA로 바꿀 수 있습니다. SCL·SDA를 입력으로 쓰는 동안 Wire 통신은 사용하지 않습니다. 이 예제는 소프트웨어 인터럽트 방식이므로 제품의 최대 입력 주파수에서 무손실 계수를 보장하는 성능 예제가 아닙니다.
#include <util/atomic.h> volatile uint32_t pulseCount = 0; void countPulse() { pulseCount++; } void setup() { Serial.begin(115200); // CLK = D24, 내장 풀업 사용 attachInterrupt(digitalPinToInterrupt(CLK), countPulse, RISING); } void loop() { uint32_t snapshot; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { snapshot = pulseCount; } Serial.print(F("CLK pulses: ")); Serial.println(snapshot); delay(500); }
CLK·DIO 엔코더 방향 판별
A상은 CLK(D24), B상은 DIO(D25)에 연결하며 1배 카운트합니다. 신호는 DC 0~5V이고 GND를 공통으로 연결합니다. 표시 방향이 반대라면 A·B 결선 또는 증감 방향을 바꿉니다. 32비트 값은 인터럽트를 잠시 막고 읽어 깨진 값이 출력되지 않도록 합니다.
#include <util/atomic.h> #include <stdint.h> volatile int32_t position = 0; void readEncoder() { // A상 상승 시 B상에 따라 방향 판별 (1배 카운트) if (digitalRead(DIO) == HIGH) { if (position < INT32_MAX) position++; } else { if (position > INT32_MIN) position--; } } void setup() { Serial.begin(115200); // 엔코더 A상 → CLK(D24), B상 → DIO(D25) attachInterrupt(digitalPinToInterrupt(CLK), readEncoder, RISING); } void loop() { int32_t snapshot; ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { snapshot = position; } Serial.print(F("Encoder: ")); Serial.println(snapshot); delay(500); }
통신과 다운로드
예제 프로그램 · 통신과 다운로드
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
시리얼 모니터 ↔ RS-232 문자 전송
시리얼 모니터에 입력한 문자를 Serial1로 보내고, 상대 기기의 수신 문자를 모니터에 표시합니다. RS-232 상대 기기는 9600 bps, 8-N-1로 설정하고 TX↔RX 및 GND를 연결합니다. 간단한 문자 확인용이며 Modbus·Cnet 프로토콜 예제는 아닙니다. USB 쪽에서 상대 기기가 처리할 수 있는 속도보다 빠르게 연속 전송하면 수신 버퍼가 넘칠 수 있습니다.
// MP 다운로드 케이블의 Serial 모니터 ↔ RS-232 Serial1 void setup() { Serial.begin(115200); Serial1.begin(9600); // 상대 기기도 9600 bps, 8-N-1 설정 } void loop() { if (Serial.available() && Serial1.availableForWrite()) { Serial1.write(Serial.read()); } if (Serial1.available() && Serial.availableForWrite()) { Serial.write(Serial1.read()); } }
I²C 장치 주소 확인
GND·SDA·SCL을 연결한 장치의 7비트 주소를 3초마다 검색합니다. 5V 단자는 5V를 지원하는 장치의 전원에만 연결합니다. I²C 사용 중에는 D18·D19에 고속 입력 인터럽트를 함께 설정하지 않습니다.
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(); Wire.setClock(100000); } void loop() { uint8_t found = 0; for (uint8_t address = 0x08; address <= 0x77; address++) { Wire.beginTransmission(address); const uint8_t result = Wire.endTransmission(); if (result == 0) { Serial.print(F("I2C: 0x")); if (address < 16) Serial.print('0'); Serial.println(address, HEX); found++; } } Serial.print(F("Devices: ")); Serial.println(found); delay(3000); }
