[CFMEGA2] OMRON E8Y Pressure Sensor 압력 센서
Embedded 2026. 6. 25. 21:25 |반응형
CFMEGA2에서 OMRON E8Y 압력 센서를 사용해 보자.

// CFMEGA2에서 A0~A3은 0~20mA 전류값을 0~1023의 디지털 값으로 변환한다. (Analog to Digital Converter)
// OMRON E8Y 압력 센서는 압력에 따라 4~20mA의 아날로그 전류를 출력한다.
//
// 4mA의 ADC 값: 약 204 (1023의 20%)
// 20mA의 ADC 값: 1023
//
// 그럼 이론적으로는 CFMEGA2에서 204~1023의 값을 감지할 것이다. (범위: 819)
// 하지만 압력 센서를 연결하고 압력을 가하지 않은 상태의 값을 확인해 보면 195,
// 센서가 감지할 수 있는 최대 압력을 가한 상태의 값을 확인해 보면 985가 나온다. (범위: 790)
//
// 실제 값에 맞게 보정해 주어야 한다.
const int sensorPin = A0; // 0~20mA 전용 입력 핀에 연결 (회색 선).
const float maxPressure = 1000.0f; // 압력 센서 데이터시트에 기재된 최대 측정 압력값. (1,000Pa)
const float maxCurrent = 20.0f; // 압력 센서 데이터시트에 기재된 최대 측정 전류값.
const int initialADCValue = 195; // 압력이 없을때 ADC 값으로 195가 들어온다.
const int maxADCValue = 985; // 최대 압력일때 ADC 값으로 985가 들어온다.
void setup() {
Serial.begin(9600);
Serial.println("----------- CFMEGA2 Pressure Measure Start -----------");
}
void loop() {
int adcValue = analogRead(sensorPin);
// 센서 단선 또는 전원 오류 확인 (4mA 미만 확인)
// 오차를 감안해 ADC 값이 190(약 3.7mA) 미만으로 떨어지면 오류로 간주
if (adcValue < 190) {
Serial.println("Error: Weak Sensor Signal. Check the sensor or the cable.");
} else {
// ADC 값(204~1023)을 압력(0~maxPressure)으로 비례 변환
float pressure = (adcValue - initialADCValue) * (maxPressure / (maxADCValue - initialADCValue));
// 값 보정: 실제 센서에 압력이 전혀 안 걸려 있을 때 출력되는 전류가 정확히
// 4mA(ADC 204)가 아닐 수 있다. 초기값이 미세하게 맞지 않는다면 initialADCValue 값을
// 실제 측정된 초기 ADC 값으로 조금씩 수정하여 보정한다.
// 내 경우엔 195다. 최대 압력이 걸렸을때는 1023이 아니라 985다.
// 센서에서 현재 출력되는 전류(mA) 역산
float current_mA = adcValue * (maxCurrent / maxADCValue);
Serial.print("adc: ");
Serial.print(adcValue);
Serial.print(" | Current: ");
Serial.print(current_mA, 2); // 소수점 둘째 자리까지 출력
Serial.print(" mA | Pressure: ");
Serial.print(pressure, 2);
Serial.println(" Pa");
}
delay(1000); // 1초 대기
}

이번엔 아스키 문자가 아닌 바이너리 데이터를 전달해 보자.
const int sensorPin = A0; // 0~20mA 전용 입력 핀에 연결 (회색 선)
const float maxPressure = 1000.0f; // 압력 센서 데이터시트에 기재된 최대 측정 압력값
const float maxCurrent = 20.0f; // 압력 센서 데이터시트에 기재된 최대 측정 전류값
const int initialADCValue = 195; // 압력이 없을때 ADC 값으로 195가 들어온다.
const int maxADCValue = 985; // 최대 압력일때 ADC 값으로 985가 들어온다.
void setup() {
Serial.begin(9600);
//Serial.println("----------- CFMEGA2 Pressure Measure Start -----------");
}
void loop() {
int adcValue = analogRead(sensorPin);
// 센서 단선 또는 전원 오류 확인 (4mA 미만 확인)
// 오차를 감안해 ADC 값이 190(약 3.7mA) 미만으로 떨어지면 오류로 간주
if (adcValue < 190) {
Serial.println("Error: Weak Sensor Signal. Check the sensor or the cable.");
} else {
// ADC 값(204~1023)을 압력(0~maxPressure)으로 비례 변환
float pressure = (adcValue - initialADCValue) * (maxPressure / (maxADCValue - initialADCValue));
// 값 보정: 실제 센서에 압력이 전혀 안 걸려 있을 때 출력되는 전류가 정확히
// 4mA(ADC 204)가 아닐 수 있다. 초기값이 미세하게 맞지 않는다면 initialADCValue 값을
// 실제 측정된 초기 ADC 값으로 조금씩 수정하여 보정한다.
// 내 경우엔 195다. 최대 압력이 걸렸을때는 1023이 아니라 985다.
// 센서에서 현재 출력되는 전류(mA) 역산
float current_mA = adcValue * (maxCurrent / maxADCValue);
//Serial.print("adc: ");
//Serial.print(adcValue);
//Serial.print(" | Current: ");
//Serial.print(current_mA, 2); // 소수점 둘째 자리까지 출력
//Serial.print(" mA | Pressure: ");
//Serial.print(pressure, 2);
//Serial.println(" Pa");
// CFMEGA2(Arduino)의 int는 2바이트(16비트) 크기를 가진다.
Serial.write(highByte((int)pressure)); // 상위 1바이트(8비트) 먼저 전송
Serial.write(lowByte((int)pressure)); // 하위 1바이트(8비트) 이어서 전송
}
delay(1000); // 1초 대기
}


1초당 2바이트씩 데이터를 읽는다. 처음 4초간은 압력이 없기 때문에 00 01이 4번 입력되고 5초에 177 Pa의 압력이 가해져 00 B1이 입력되었다.
센서가 출력하는 전류값이나 CFMEGA2가 읽는 전류값은 높은 정밀도를 가질 수 없을 것이다.
압력이 없을 때 센서를 통해 CFMEGA2에 들어온 ADC값이 처음엔 195였는데 몇 번 테스트하는 과정에서 196으로 바뀌었고 변환 과정을 거쳐 압력은 1로 표시되었다. 최대 압력일 때 ADC값도 최초 985에서 986으로 바뀌었다. 986은 변환식을 통해 1001이 된다.
예) (h): HEX, (d): DEC
■ 00 01(h): 1(d)
■ 00 B1(h): 177(d)
■ 01 20(h): 288(d)
...
■ 03 E9(h): 1001(d)
반응형
'Embedded' 카테고리의 다른 글
| [CFMEGA2] Hardware SPI Communication Pin (0) | 2026.06.28 |
|---|---|
| Serial(RS232) Modbus Relay 시리얼 릴레이 (0) | 2026.06.11 |
| PC Serial Communication 컴퓨터 시리얼 통신 (0) | 2026.06.05 |
| USB to Serial(RS232) Converter KW-880C (0) | 2026.05.31 |
| [Arduino] 사용중인 시리얼 포트 및 사용 프로세스 확인 (0) | 2026.05.24 |
