문서의 이전 판입니다!
목차
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 입력 상태 읽기
시리얼 모니터를 115200 bps로 열면 입력 상태를 확인할 수 있습니다.
// MPINO-8A4T-S: P0~P7 입력 상태를 시리얼 모니터에 표시합니다. void setup() { Serial.begin(115200); for (uint8_t pin = 0; pin < 8; pin++) pinMode(pin, INPUT); } void loop() { for (uint8_t pin = 0; pin < 8; pin++) { Serial.print('P'); Serial.print(pin); Serial.print('='); Serial.print(digitalRead(pin)); 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 제어
P0~P3 입력이 ON되면 대응하는 P32~P35 출력이 ON됩니다. 표의 결선도처럼 외부 부하 전원을 연결합니다.
// MPINO-8A4T-S: P0~P3 입력으로 P32~P35 SINK 출력을 제어합니다. void setup() { for (uint8_t channel = 0; channel < 4; channel++) { pinMode(channel, INPUT); digitalWrite(32 + channel, LOW); // 출력 래치를 먼저 OFF로 설정 pinMode(32 + channel, OUTPUT); } } void loop() { for (uint8_t channel = 0; channel < 4; channel++) { digitalWrite(32 + channel, digitalRead(channel)); } }
아날로그 입력ㆍ온도센서 입력
| 채널 | 입력 종류 | 입력 범위 | 커넥터 핀 배열 |
|---|---|---|---|
| A0, A1 | 전압 입력 | DC 0~5V | |
| A2, A3 | 전류 입력 | 0~20mA 또는 4~20mA | |
| A4, A5 | 전압 입력 | DC 0~10V | |
| A6, A7 | NTC 온도센서 입력 | NTC 10kΩ, 3950K |
아날로그 입력을 사용할 때는 setup()에서 analogReference(EXTERNAL)을 설정합니다.
예제 프로그램 · 아날로그 입력ㆍ온도센서 입력
Arduino IDE에서 보드를 MPINO-8A4R(T)-S로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
전압·전류·NTC 온도 읽기
A0~A5는 입력 범위에 맞춰 전압·전류로 환산하고, A6·A7은 NTC 10kΩ(B=3950)의 온도를 표시합니다. 시리얼 모니터는 115200 bps입니다.
#include <math.h> // 보드 내장 10kΩ 풀업 + NTC 10kΩ(25°C), B=3950K float ntcCelsius(int raw) { if (raw <= 0 || raw >= 1023) return NAN; const float resistance = 10000.0f * raw / (1023.0f - raw); const float kelvin = 1.0f / (log(resistance / 10000.0f) / 3950.0f + 1.0f / 298.15f); return kelvin - 273.15f; } void setup() { analogReference(EXTERNAL); 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++) { const int raw = analogRead(pins[channel]); Serial.print('A'); Serial.print(channel); Serial.print(F(": ")); if (channel < 2) { Serial.print(raw * (5.0f / 1023.0f), 3); Serial.println(F(" V")); } else if (channel < 4) { Serial.print(raw * (20.0f / 1023.0f), 3); Serial.println(F(" mA")); } else if (channel < 6) { Serial.print(raw * (10.0f / 1023.0f), 3); Serial.println(F(" V")); } else { const float temperature = ntcCelsius(raw); if (isnan(temperature) || temperature < -40 || temperature > 120) { Serial.println(F("CHECK SENSOR / RANGE")); } else { Serial.print(temperature, 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점 출력
PWM0~PWM2에 약 25%·50%·75% 듀티를 출력합니다.
// MPINO-8A4T-S: PWM0(D21), PWM1(D22), PWM2(D23) void setup() { pinMode(21, OUTPUT); pinMode(22, OUTPUT); pinMode(23, OUTPUT); analogWrite(21, 64); // 약 25% 듀티 analogWrite(22, 128); // 약 50% 듀티 analogWrite(23, 191); // 약 75% 듀티 } void loop() { }
CLK 펄스 카운트
CLK(D24)의 상승 에지를 인터럽트로 셉니다. 이 소프트웨어 예제는 입력 사양의 최대 50kHz 처리를 보장하는 예제가 아닙니다.
#include <util/atomic.h> volatile uint32_t pulseCount = 0; void countPulse() { pulseCount++; } void setup() { Serial.begin(115200); pinMode(CLK, INPUT); // 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)에 연결합니다. A상 상승 에지만 세는 1배 카운트 예제입니다.
#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); pinMode(CLK, INPUT); // 엔코더 A상 → CLK(D24) pinMode(DIO, INPUT); // 엔코더 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로 선택합니다. 아래 코드는 각각 별도 스케치로 실행합니다.
USB 시리얼 ↔ RS-232
MP 다운로드 케이블로 업로드한 뒤 시리얼 모니터를 115200 bps로 엽니다. RS-232 상대 기기는 9600 bps, 8-N-1로 설정합니다. 입력 문자를 양방향으로 전달합니다.
// 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 연결 기기 주소 확인
Wire를 사용해 연결된 기기의 7비트 주소를 찾습니다. 시리얼 모니터는 115200 bps이며, D18·D19는 이 예제에서 I²C 전용으로 사용합니다.
#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); }
