products:mpino_8a4t_s
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| products:mpino_8a4t_s [2026/09/07 17:23] – 바깥 편집 127.0.0.1 | products:mpino_8a4t_s [2026/09/15 17:45] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 4: | 줄 4: | ||
| Arduino IDE(Arduino C/C++) 또는 MPINO STUDIO 2(Arduino C/C++ & 래더로직)로 프로그램할 수 있습니다. | Arduino IDE(Arduino C/C++) 또는 MPINO STUDIO 2(Arduino C/C++ & 래더로직)로 프로그램할 수 있습니다. | ||
| + | |||
| + | [[: | ||
| + | |||
| + | |||
| + | |||
| + | |||
| {{ : | {{ : | ||
| 줄 24: | 줄 30: | ||
| | ::: | ::: | SRAM | 4KB | | | ::: | ::: | SRAM | 4KB | | ||
| | ::: | ::: | EEPROM | | ::: | ::: | EEPROM | ||
| + | |||
| + | **Markdown 자료:** [[https:// | ||
| + | |||
| ===== 디지털 입력 ===== | ===== 디지털 입력 ===== | ||
| + | [[: | ||
| ^ 단자 ^ Arduino 핀 ^ 입력 구성 ^ 단자대 및 결선 예시 ^ | ^ 단자 ^ Arduino 핀 ^ 입력 구성 ^ 단자대 및 결선 예시 ^ | ||
| | P0~P3 | D0~D3 | 디지털 입력 4점, COM0 공유 | {{: | | P0~P3 | D0~D3 | 디지털 입력 4점, COM0 공유 | {{: | ||
| 줄 155: | 줄 165: | ||
| ===== 트랜지스터 출력 ===== | ===== 트랜지스터 출력 ===== | ||
| + | [[: | ||
| ^ 단자 ^ Arduino 핀 ^ 출력 방식 ^ 최대 정격 ^ 단자대 및 결선 예시 ^ | ^ 단자 ^ Arduino 핀 ^ 출력 방식 ^ 최대 정격 ^ 단자대 및 결선 예시 ^ | ||
| | P32 | D32 | SINK 출력 | DC 100V, 1A/1점 | {{: | | P32 | D32 | SINK 출력 | DC 100V, 1A/1점 | {{: | ||
| 줄 190: | 줄 201: | ||
| | A4, A5 | 전압 입력 | DC 0~10V | ::: | | | A4, A5 | 전압 입력 | DC 0~10V | ::: | | ||
| | A6, A7 | NTC 온도센서 입력 | NTC 10kΩ, 3950K | ::: | | | A6, A7 | NTC 온도센서 입력 | NTC 10kΩ, 3950K | ::: | | ||
| - | |||
| ==== 예제 프로그램 · 아날로그 입력 ==== | ==== 예제 프로그램 · 아날로그 입력 ==== | ||
| 줄 387: | 줄 397: | ||
| **관련 내장 명령어** | **관련 내장 명령어** | ||
| + | |||
| + | === 함수 예제 · 듀티값 지정: PWM() === | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void PWM(uint8_t pin, uint16_t val, bool onDutybit16 = false); | ||
| + | </ | ||
| + | |||
| + | PWM(pin, val, onDutybit16)은 듀티값을 지정합니다. 기본 8비트는 0~255, 세 번째 인수를 true로 지정한 16비트는 0~65535입니다. 예제는 PWM0(D21)에 16비트 중간값 32768을 출력합니다. PWM0~2(D21~D23)는 Timer3를 공유하므로 같은 분해능으로 사용합니다. PWM_RESET()으로 타이머 모드를 정리한 뒤 시작합니다. | ||
| + | |||
| + | <code cpp> | ||
| + | void setup() { | ||
| + | PWM_RESET(); | ||
| + | PWM(21, 32768, true); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | } | ||
| + | </ | ||
| === 함수 예제 · 주파수·듀티 설정: FDPWM() === | === 함수 예제 · 주파수·듀티 설정: FDPWM() === | ||
| 줄 396: | 줄 426: | ||
| </ | </ | ||
| - | FDPWM(pin, | + | FDPWM(pin, |
| <code cpp> | <code cpp> | ||
| void setup() { | void setup() { | ||
| + | PWM_RESET(); | ||
| FDPWM(21, 1000, 50.0f); | FDPWM(21, 1000, 50.0f); | ||
| } | } | ||
| 줄 407: | 줄 438: | ||
| </ | </ | ||
| + | === 함수 예제 · 지정 개수 펄스 출력: NPWM_BEGIN(), | ||
| - | ==== 예제 | + | **함수 원형** |
| + | |||
| + | <code cpp> | ||
| + | void NPWM_BEGIN(uint8_t pin, uint32_t intHz, float Duty, uint32_t N); | ||
| + | void NPWM(uint8_t pin); | ||
| + | </ | ||
| + | |||
| + | NPWM_BEGIN(pin, | ||
| + | |||
| + | <code cpp> | ||
| + | void setup() { | ||
| + | PWM_RESET(); | ||
| + | NPWM_BEGIN(21, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | NPWM(21); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === 함수 예제 · 채널 출력 정지·재개: | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void PWMOFF(uint8_t pin, bool POff); | ||
| + | </ | ||
| + | |||
| + | PWMOFF(pin, true)는 해당 채널의 정지 상태를 설정하고 false는 해제합니다. 이 제품에서는 설정 직후 PWM() 또는 FDPWM()을 다시 호출해야 출력에 반영됩니다. | ||
| + | |||
| + | <code cpp> | ||
| + | void setup() { | ||
| + | PWM_RESET(); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | PWMOFF(21, false); | ||
| + | FDPWM(21, 1000, 50.0f); | ||
| + | delay(2000); | ||
| + | |||
| + | PWMOFF(21, true); | ||
| + | FDPWM(21, 1000, 50.0f); | ||
| + | digitalWrite(21, | ||
| + | delay(2000); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === 함수 예제 | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void PWM_RESET(); | ||
| + | </ | ||
| + | |||
| + | PWM_RESET()은 Timer1·Timer3의 제어 레지스터와 카운터를 초기화하여 해당 타이머 출력을 모두 정지합니다. 예제는 PWM0(D21)에 1kHz를 2초 출력한 후 정지합니다. PWM0~2 전체와 같은 타이머를 사용하는 기능에 영향을 주므로 채널 하나만 멈출 때는 PWMOFF()를 사용합니다. PWMOFF()로 설정한 정지 플래그까지 해제하는 함수는 아닙니다. | ||
| + | |||
| + | <code cpp> | ||
| + | void setup() { | ||
| + | PWM_RESET(); | ||
| + | FDPWM(21, 1000, 50.0f); | ||
| + | delay(2000); | ||
| + | PWM_RESET(); | ||
| + | digitalWrite(21, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 예제 프로그램 · 펄스 카운트 | ||
| - | attachInterrupt()로 | + | CLK(D24)는 풀업되어 입력이 없으면 HIGH입니다. 외부 신호가 GND로 당기는 HIGH→LOW 순간을 FALLING으로 계수하고 500ms마다 표시합니다. 32비트 |
| <code cpp> | <code cpp> | ||
| 줄 423: | 줄 526: | ||
| void setup() { | void setup() { | ||
| Serial.begin(115200); | Serial.begin(115200); | ||
| - | // CLK = D24, 내장 | + | // CLK는 풀업 |
| - | attachInterrupt(digitalPinToInterrupt(CLK), | + | attachInterrupt(digitalPinToInterrupt(CLK), |
| } | } | ||
| 줄 438: | 줄 541: | ||
| </ | </ | ||
| - | 엔코더 | + | |
| + | ==== 예제 프로그램 · 엔코더 | ||
| + | |||
| + | 풀업된 | ||
| <code cpp> | <code cpp> | ||
| 줄 447: | 줄 553: | ||
| void readEncoder() { | void readEncoder() { | ||
| - | // A상 상승 | + | // A상 하강 |
| - | if (digitalRead(DIO) == HIGH) { | + | if (digitalRead(DIO) == LOW) { |
| if (position < INT32_MAX) position++; | if (position < INT32_MAX) position++; | ||
| } else { | } else { | ||
| 줄 458: | 줄 564: | ||
| Serial.begin(115200); | Serial.begin(115200); | ||
| // 엔코더 A상 → CLK(D24), B상 → DIO(D25) | // 엔코더 A상 → CLK(D24), B상 → DIO(D25) | ||
| - | attachInterrupt(digitalPinToInterrupt(CLK), | + | attachInterrupt(digitalPinToInterrupt(CLK), |
| } | } | ||
| 줄 480: | 줄 586: | ||
| | I²C | D18(SCL), D19(SDA) | '' | | I²C | D18(SCL), D19(SDA) | '' | ||
| - | ==== 예제 프로그램 · 통신과 다운로드 | + | ==== 예제 프로그램 · 기본 |
| Serial(115200bps)로 받은 문자를 Serial1(9600bps, | Serial(115200bps)로 받은 문자를 Serial1(9600bps, | ||
| 줄 500: | 줄 606: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | |||
| + | ==== 예제 프로그램 · I²C 통신 ==== | ||
| Wire로 0x08~0x77의 I²C 주소를 검색하고 응답한 주소를 3초마다 시리얼 모니터에 표시합니다. endTransmission()의 반환값이 0이면 해당 주소에서 응답한 것입니다. | Wire로 0x08~0x77의 I²C 주소를 검색하고 응답한 주소를 3초마다 시리얼 모니터에 표시합니다. endTransmission()의 반환값이 0이면 해당 주소에서 응답한 것입니다. | ||
| 줄 530: | 줄 639: | ||
| </ | </ | ||
| + | |||
| + | ==== 예제 프로그램 · Modbus RTU 통신 ==== | ||
| + | |||
| + | **관련 내장 명령어** | ||
| + | |||
| + | === 함수 예제 · Modbus RTU Slave: ImodbusRTUMem(), | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void ImodbusRTUMem(uint16_t m_size, uint16_t d_size); | ||
| + | void ImodbusRTUAdr(uint16_t m_offset, uint16_t d_offset); | ||
| + | void ImodbusRTUInit(HardwareSerial& | ||
| + | void ImodbusRTU(); | ||
| + | </ | ||
| + | |||
| + | P0 상태를 M[0], A0 원시값(0~1023)을 D[0]에 넣어 상대 기기에서 읽습니다. RS-232(Serial1), | ||
| + | |||
| + | M과 D는 코어가 제공하는 공유 전역 메모리입니다. 이 스케치는 단독 실행하며, | ||
| + | |||
| + | <code cpp> | ||
| + | unsigned long lastPrint = 0; | ||
| + | bool memoryReady = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | ImodbusRTUMem(8, | ||
| + | ImodbusRTUAdr(0, | ||
| + | ImodbusRTUInit(Serial1, | ||
| + | memoryReady = (M != nullptr && D != nullptr); | ||
| + | if (!memoryReady) Serial.println(F(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | if (!memoryReady) return; | ||
| + | M[0] = digitalRead(0); | ||
| + | D[0] = analogRead(A0); | ||
| + | ImodbusRTU(); | ||
| + | |||
| + | if (millis() - lastPrint >= 1000) { | ||
| + | lastPrint = millis(); | ||
| + | Serial.print(F(" | ||
| + | Serial.print(M[0]); | ||
| + | Serial.print(F(", | ||
| + | Serial.println(D[0]); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === 함수 예제 · Modbus RTU Master: ImodbusRTUmasterInit(), | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void ImodbusRTUmasterInit(HardwareSerial& | ||
| + | uint8_t ImodbusRTUmaster(HardwareSerial& | ||
| + | </ | ||
| + | |||
| + | RS-232(Serial1)로 상대 슬레이브의 홀딩 레지스터 1개를 1초마다 읽습니다. 상대 기기는 국번 1, 9600bps, 8N1, FC03·실제 시작 주소 0으로 준비합니다. 응답은 received[0]에 저장하며 성공한 경우에만 표시합니다. 오류 코드는 16진수로 표시합니다. 위 슬레이브 예제와는 별도 스케치이며, | ||
| + | |||
| + | <code cpp> | ||
| + | unsigned long lastRequest = 0; | ||
| + | uint16_t received[1]; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | ImodbusRTUmasterInit(Serial1, | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | if (millis() - lastRequest < 1000) return; | ||
| + | lastRequest = millis(); | ||
| + | const uint8_t result = ImodbusRTUmaster(Serial1, | ||
| + | |||
| + | if (result == IMODBUS_RTU_SUCCESS) { | ||
| + | Serial.print(F(" | ||
| + | Serial.println(received[0]); | ||
| + | } else { | ||
| + | Serial.print(F(" | ||
| + | Serial.println(result, | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 예제 프로그램 · LS산전 Cnet 통신 ==== | ||
| + | |||
| + | **관련 내장 명령어** | ||
| + | |||
| + | === 함수 예제 · LS산전 Cnet SLave: ICnetMem(), ICnetAdr(), ICnetInit(), | ||
| + | |||
| + | **함수 원형** | ||
| + | |||
| + | <code cpp> | ||
| + | void ICnetMem(uint16_t m_size, uint16_t d_size, uint16_t r_size = 100); | ||
| + | void ICnetAdr(uint16_t m_offset, uint16_t d_offset, uint16_t r_offset = 0); | ||
| + | void ICnetInit(HardwareSerial& | ||
| + | void ICnet(); | ||
| + | </ | ||
| + | |||
| + | P0 상태를 M[0], A0 원시값(0~1023)을 D[0]에 넣어 HMI에서 읽습니다. 상대 기기는 LS산전 Cnet, RS-232, 국번 1, 9600bps, 8N1로 설정합니다. 비트는 %MX00000(M[0]), | ||
| + | |||
| + | M·D·R은 코어가 제공하는 공유 전역 메모리이며, | ||
| + | |||
| + | <code cpp> | ||
| + | unsigned long lastPrint = 0; | ||
| + | bool memoryReady = false; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | ICnetMem(8, 8, 0); // M 8비트와 D 8워드 할당, R은 사용하지 않음 | ||
| + | ICnetAdr(0, 0, 0); // M과 D의 통신 시작 주소를 0으로 설정 | ||
| + | ICnetInit(Serial1, | ||
| + | memoryReady = (M != nullptr && D != nullptr); | ||
| + | if (!memoryReady) Serial.println(F(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | if (!memoryReady) return; | ||
| + | M[0] = digitalRead(0); | ||
| + | D[0] = analogRead(A0); | ||
| + | ICnet(); | ||
| + | |||
| + | if (millis() - lastPrint >= 1000) { | ||
| + | lastPrint = millis(); | ||
| + | Serial.print(F(" | ||
| + | Serial.print(M[0]); | ||
| + | Serial.print(F(", | ||
| + | Serial.println(D[0]); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| [[products: | [[products: | ||
products/mpino_8a4t_s.1788769425.txt.gz · 마지막으로 수정됨: 저자 127.0.0.1
