CHM(CHu력 Meter)는 원래 하이브리드 로켓엔진을 위해서 만들었지만…

395F9239-A70E-44AB-B15A-C75A21C0207C_4_5005_c.jpeg

777AC3B6-F740-48D4-9A88-BD2580F55D2E_4_5005_c.jpeg

기존의 추력 측정기가 테스트중 무게를 견디지 못하고 3D프린팅 파츠와 에폭시로 결합된 부위가 부서지는 문제가 발생하여, 어쩔 수 없이 계획을 앞당겨 진행하게 되었다.

완성된 모습이다.

완성된 모습이다.

내가 CHM위에 올라갔을 때 이다. 내 몸무게가 51kg 정도 되니, 꽤 정확하다고 할 수 있다

내가 CHM위에 올라갔을 때 이다. 내 몸무게가 51kg 정도 되니, 꽤 정확하다고 할 수 있다

초기 디자인. 이후 제작 과정에서 비용 등의 이유로 가로세로 길이가 짧아졌다.

초기 디자인. 이후 제작 과정에서 비용 등의 이유로 가로세로 길이가 짧아졌다.

특징

크기 : 24x24x32cm 부피 : 18,432cm^3

무게 :

평균 밀도 :

추력 측정 범위

0~300kg 로드셀을 구매하여 사용했기 때문에, 이론상 300kg까지는 측정할 수 있다. 사람(본인)이 올라가도 부서지지 않고 정상적으로 작동하는 모습을 보였다.

최대 동체 사이즈

20cm짜리 알루미늄 프로파일을 사용했기 때문에,동체의 최대 직경은 20cm이다. 또한 높이는 제한이 없지만 안정적으로 고정하려면 40cm를 초과하지 않아야 한다.

원격 데이터 로깅

RYLR998 Lora 모듈을 사용해서 최대 15km 거리에서도 데이터를 받을 수 있다.

릴레이를 이용한 원격 점화

(개선할 부분) 기기가 켜지고 1분이 지나면 릴레이가 켜지면서 점화기에 전원이 공급되도록 설계했다. 이를 통해 설치 후 1분 카운터를 새고 점화하는 것을 통해, 안정성을 확보할 수 있게 됐다.

코드

#include "HX711.h"
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;
const int relayPin = 7; // 릴레이 핀

HX711 scale;

float calibration_factor = 6600;

// 10개씩 무게를 모을 배열 및 카운터
float weightBuffer[10];
unsigned long timeBuffer[10];  // 각 무게 측정 시점의 millis() 값
int weightCount = 0;

void setup() {
  // 시리얼 통신 및 릴레이 설정
  Serial.begin(9600);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // 릴레이 초기 상태는 꺼짐

  // 로드셀 설정
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale();
  scale.tare(); // 로드셀 초기화

  // RYLR988 모듈 초기화 (Serial1 사용)
  Serial1.begin(9600);
  delay(1000);

  // 모듈 상태 확인
  Serial1.println("AT");
  delay(500);

  // 송신부 주소를 1번으로 설정 (필요하다면 다른 주소로 변경)
  Serial1.println("AT+ADDRESS=1");
  delay(500);

  // PLX-DAQ용 헤더 출력 (필요 시 생략 가능)
  Serial.println("LABEL,Weight (kg)");
}

void loop() {
  // 로드셀로 무게 측정
  scale.set_scale(calibration_factor); 
  float weight = scale.get_units() * 0.453592; 
  weightBuffer[weightCount] = weight;
  timeBuffer[weightCount] = millis();
  weightCount++;

  // 10개 누적 시 한번에 전송
  if (weightCount >= 10) {
    // 10개의 무게와 해당 측정 시간을 하나의 문자열로 합침
    // 각 항목은 "무게:시간" 형태, 데이터 사이 구분자도 ":"로 처리
    String combined = "";
    for (int i = 0; i < 10; i++) {
      combined += String(weightBuffer[i], 3);
      combined += ",";
      combined += String(timeBuffer[i]);
      combined += ":";
    }
    
    int dataLength = combined.length();

    // AT 명령어로 RYLR988 모듈에 무게 전송 (주소 2번 예시)
    Serial1.print("AT+SEND=2,");
    Serial1.print(dataLength);
    Serial1.print(",");
    Serial1.println(combined);

    // 모듈로부터의 응답 확인(필요 시 생략 가능)
    Serial.println(Serial1.readStringUntil('\\n'));

    // PLX-DAQ 양식에 맞춰 데이터 출력 (필요 시 생략 가능)
    Serial.println(combined);

    // 카운터 초기화
    weightCount = 0;
  }

  // 예시로 60~63초 사이에 릴레이 제어
  unsigned long currentMillis = millis();
  if (currentMillis >= 60000 && currentMillis <= 63000) { 
    digitalWrite(relayPin, HIGH);
    Serial.println("1분이 경과되었습니다.");
  } else {
    digitalWrite(relayPin, LOW);
  }

  delay(100);
}