반응형

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초 대기
}

 

아스키 문자가 아닌 바이너리 데이터이기 때문에 Arduino IDE의 Serial Monitor를 통해 확인하면 알 수 없는 문자가 표시된다.

 

시리얼 통신용 프로그램을 사용하면 바이너리 데이터를 직접 확인할 수 있다.

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)

 

반응형
Posted by J-sean
: