산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

부품 및 소모품

SparkFun Arduino Pro Mini 328 - 3.3V/8MHz × 1

프로젝트 소개

소개

이 기기는 비행 중(활공기, 패러글라이더, 행글라이더, 열기구 등) 파일럿이 사용하는 장비로, 열기류의 중심을 찾아 더 높고 효율적으로 상승할 수 있도록 돕습니다.

간략한 설명

상승(올라갈 때)과 하강(내려갈 때) 시 소리를 내는 매우 민감한 기압계입니다. 소리는 단순한 '삐-삐' 비프음으로, 초당 1회 또는 2회, 상승 시에는 더 빠른 주파수로 울립니다(상승 속도가 빠를수록 비프음 빈도 증가). 단 몇 cm/초의 상승만으로도 비프음이 울릴 만큼 예민합니다. 손에 쥐고 팔을 천천히 들어 올리기만 해도 소리를 확인할 수 있습니다. 하강 속도 -1m/초 이상에서는 지속적인 '삐이이이-' 경고음이 발생합니다.

부품 목록

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

위 Fritzing 회로도에는 회로 제작에 필요한 모든 것이 나와 있습니다. 검은색 스위치 바로 아래 갈색 '세라믹 커패시터'는 실제로는 리셋 가능 퓨즈입니다(적절한 부품 도안을 찾지 못했습니다). 8개 저항 대신 8개의 4.7kΩ 저항이 내장된 단일 네트워크 저항 부품을 사용했습니다. 다음 사진에서 확인 가능합니다. 파란색 딥스위치 위쪽에 있는 검은색 부품으로 핀이 9개(1개 공통, 8개 저항용)입니다. Fritzing 회로도 파일은 아래에서 다운로드 가능합니다.

딥스위치의 의미

바리오미터의 파라미터를 선택하고 변경하기 위해 파란색 8핀 딥스위치를 사용했습니다. 각 핀의 기능은 다음과 같습니다:

핀 1은 미사용으로, 온/오프 어느 위치든 영향을 주지 않습니다.

핀 2는 부저 볼륨 레벨을 변경합니다. 전기적으로 동작하며, 핀이 온이면 부저와 직렬인 저항을 쇼트시켜 더 많은 전류가 흐르게 해 볼륨을 높입니다.

핀 3과 4는 하강 레벨(내려갈 때)을 설정합니다. 이 값 이하로 내려가면 바리오미터가 '삐이이이-' 소리를 냅니다. 두 핀은 2비트 바이너리 코드로 4가지 설정: 00=0, 01=1, 10=2, 11=3. 핀 3=오프, 핀 4=오프(바이너리 00)면 -999m/s(제한 없음, 절대 비프음 안 울림). 다른 값은 -1, -2, -3m/s로 각각 핀 3=오프/4=온, 3=온/4=오프, 3=온/4=온으로 설정. 예를 들어 2번 위치면 -2m/s 초과 하강 시에만 경고음. 테스트용으로 엘리베이터 3층에서 1층으로 내려가거나 계단을 빨리 뛰어내려가며 확인 가능.

핀 5와 6은 비프 주파수 설정으로, 위와 같은 바이너리 코드 방식. 같은 상승 속도에서 +2Hz 설정 시 +1Hz보다 더 빠르게 '삐-삐' 울림. 천천히 울리는 걸 선호해 덜 '스트레스' 받는 분도 계십니다.

핀 7과 8은 기기 감도 설정: +0.0은 상승 움직임에 대한 최대 감도로, 10cm/s 미만 속도에서도 비프음. 이 위치에선 제자리에서도 미세한 기압 변화(방문 닫기로 인한 실내 기압 상승 등)를 감지해 가끔 비프음이 울리기도 함. 전기적 '노이즈'도 잡지만 꽤 안정적이고 유용. 4번째 위치(+0.5m/s)는 기압 변화에 훨씬 덜 민감해, 비프음을 얻으려면 '훨씬 더' 빠른 상승 속도 필요. 테스트용으로 엘리베이터 1층에서 3층으로 올라가며 확인 가능.

전자 회로 관점에서 핀 1과 3~8은 멀티플렉서 4051 칩을 통해 아날로그 방식으로 읽히며, 소프트웨어가 온/오프(값 > 512 여부)를 판단합니다. 8개 입력이 1개 공통 포트로 연결되어 아두이노 입력으로 들어갑니다. 8개 포트 중 어느 것을 읽을지 선택하기 위해 MCU(아두이노)가 3비트 출력(000~111, 0~7 = 8포트 = 8개 온/오프 스위치)을 설정합니다. 코드의 'readDIPswitch()' 함수 참고.

배터리 관리

두 개의 10kΩ 저항과 47uF 커패시터가 전압 분배기 역할을 해 배터리 전압을 측정합니다. LiPo는 3.3V 미만으로 방전되면 치명적이므로, 10초마다(BATTinterval) 'checkBATT()' 함수가 호출되어 저전압 시 부저가 1초에 6번 짧은 비프음으로 알립니다. 너무 오래 기다리지 말고 곧 충전하세요!

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

케이스에 공기가 통과할 구멍을 최소 하나는 꼭 뚫어야 합니다. 센서가 기압 변화를 감지하려면 공기 순환이 필요합니다. 사진처럼 두 구멍을 뚫었습니다: 하나는 부저 소리용, 하나는 충전 상태 LED 확인용. 마이크로 USB용 구멍도 별도. 구멍이 생기면 방수는 안 됩니다.

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계
초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

녹색 끈은 기체 내 어딘가에 안전하게 고정하기 위함: 절대 잃어버리면 안 됩니다!

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

PCB

단면 PCB를 사용해 몇 개의 와이어 점퍼(점선)가 전체 회로 라우팅을 위해 필요했습니다. 아래에 부품 면과 납땜 면(미러링) 파일이 모두 있어 레이저 프린터로 '노란색' 또는 '파란색' 시트에 인쇄 가능. 노란색 시트를 썼지만 파란색이 더 좋다 합니다(가격은 더 비쌈). 인쇄 시 토너 절약 설정 끄고 1200dpi 해상도로 진한 검은색 결과 얻기. 매직 시트에서 PCB로 토너 전사는 다리미로 진행. 양면 인쇄로 프로젝트가 '전문적'이 됩니다.

아두이노 핀 10여 개 사용. 사용 안 하는 핀 납땜은 불필요하며 비워두세요. 미니 프로 윗면에 6핀 암 헤더를 달아 향후 FTDI 인터페이스 연결로 소프트웨어 업데이트 가능하게.

USB 승압 전원 회로는 거꾸로 장착. USB 커넥터 옆 'Power USB' 표시 부분에 플라스틱 벨트 없는 일반 아두이노용 수 핀 2개를 강한 핀으로 써서 고정. 납땜으로 핀 2개와 USB 커넥터를 모두 고정. 3개 와이어가 Gnd-, Batt+, Out+ 단자를 이 회로에 연결.

초고감도 음향 바리오미터: 파일럿을 위한 정밀 기압계

기압 센서

GY-63(MS5611) 기압 센서는 소형 기판에 실장되어 있으며, 아두이노와 I2C 버스로 통신. 온도 센서도 내장되어 있으나 사용 안 함.

프로그램은 'readPSensor()' 함수를 호출하는데 이것이 소프트웨어의 핵심. 필요한 것은 고도의 상대적 변화입니다. 함수가 초당 여러 번 읽어 PrexTotal에 누적. 0.5초마다(PrexInterval) 고도 평균 변화를 계산해 딥스위치 설정에 따라 비프음 또는 장음 발생. 이 단순 필터링으로 충분하며, 칼만 필터, 마드윅/마호니 필터 알고리즘도 시도했으나 본 프로젝트 목적상 유의미한 이점 없었음.

업데이트 / 팁

이상으로 끝입니다. 이 프로젝트 정말 즐거웠어요! 여러분도 해보세요! :-)

Marco Zonca

코드

Acoustic Variometer 코드 Arduino

/* 이 스케치는 패러글라이딩용 바리오미터로 동작, Marco Zonca 2020
Arduino MiniPro 3.3 CPU, GY-63(MS5611) 기압 센서, 8핀 딥스위치, 부저, Mux 4051, LiPo 1s 3.7v 350mA, 3.7v->5v 승압 + LiPo USB 충전기
딥스위치: 1=미사용 2=하드웨어 저/고 부저 볼륨 3=\ 하강 경보: OFF -1.0 -2.0 -3.0 m/s 4=/ 5=\ 비프 주파수: +1.0 +1.5 +2.0 +3.0 Hz 6=/ 7=\ 감도: +0.0 +0.1 +0.2 +0.5 m/s 8=/ */
#include <MS5611.h>
#include <NewTone.h>
const int muxIOpin = 15;
const int vbattPin = 14;
const int muxbit0 = 4;
const int muxbit1 = 5;
const int muxbit2 = 6;
const int buzzerPin = 7;
const int DIPSWinterval = 5000;
const int BATTinterval = 10000;
const int PrexInterval = 500;
const boolean isDebug = false;
float sensibility[5];
float frequency[5];
float sinkalarm[5];
long n=0;
boolean dipswitch[9];
String dips;
unsigned long prevDIPSWmillis = 0;
unsigned long prevBATTmillis = 0;
float n1=0;
float n2=0;
float SensorVBatt=0;
double referencePressure = 0;
unsigned long prevPrexMillis = 0;
unsigned long currPrexMillis = 0;
double realPressure = 0;
float absoluteAltitude = 0;
float relativeAltitude = 0;
float avgAltitude = 0;
float avgPrevAltitude = 0;
long PrexCounter = 0;
float PrexTotal = 0;
float PrexVario = 0;
boolean isFirstCalc = true;
MS5611 psensor; // 기압 센서

void setup() {
  Serial.begin(9600);
  pinMode(muxbit0, OUTPUT);
  pinMode(muxbit1, OUTPUT);
  pinMode(muxbit2, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  sensibility[4]=0; sensibility[3]=0.5; sensibility[2]=0.2; sensibility[1]=0.1; sensibility[0]=0.0;
  frequency[4]=0; frequency[3]=3.0; frequency[2]=2.0; frequency[1]=1.5; frequency[0]=1.0;
  sinkalarm[4]=0; sinkalarm[3]=-3.0; sinkalarm[2]=-2.0; sinkalarm[1]=-1.0; sinkalarm[0]=-999.9;
  readDIPswitch();
  psensor.begin();
  referencePressure = psensor.readPressure();
  if (isDebug == true) Serial.println("Vario is on");
  NewTone (buzzerPin,4); delay(750); noNewTone();
}

void loop() {
  readPSensor();
  if ((prevDIPSWmillis+DIPSWinterval) < millis()) { readDIPswitch(); prevDIPSWmillis=millis(); }
  if ((prevBATTmillis+BATTinterval) < millis()) { checkBATT(); prevBATTmillis=millis(); }
}

void readPSensor() {
  realPressure = psensor.readPressure();
  absoluteAltitude = psensor.getAltitude(realPressure);
  relativeAltitude = psensor.getAltitude(realPressure, referencePressure);
  PrexCounter = PrexCounter + 1;
  PrexTotal = PrexTotal + relativeAltitude;
  currPrexMillis = millis();
  if (currPrexMillis - prevPrexMillis >= PrexInterval) {
    avgAltitude = PrexTotal / PrexCounter;
    if (isFirstCalc == true) { avgPrevAltitude=avgAltitude; isFirstCalc=false; }
    PrexVario=(avgAltitude-avgPrevAltitude) * (1000/PrexInterval);
    if ((PrexVario <= sensibility[4]) && (PrexVario >= sinkalarm[4])) { noNewTone(); }
    if ((PrexVario > sensibility[4])) { NewTone (buzzerPin,((int)(PrexVario+frequency[4]))); }
    if ((PrexVario < sinkalarm[4])) { NewTone (buzzerPin,0.1); }
    avgPrevAltitude=avgAltitude;
    prevPrexMillis = currPrexMillis;
    PrexTotal=0; PrexCounter=0;
    if (isDebug == true) { Serial.print("Vario="); Serial.println(PrexVario); }
  }
}

void readDIPswitch() {
  int s=0;
  for (n=1; n<9; n++) {
    dips="0000"+String(n-1, BIN);
    dips=(dips.substring(dips.length()-3,dips.length()));
    if (dips.substring(2,3) == "0") digitalWrite(muxbit0, LOW); else digitalWrite(muxbit0, HIGH);
    if (dips.substring(1,2) == "0") digitalWrite(muxbit1, LOW); else digitalWrite(muxbit1, HIGH);
    if (dips.substring(0,1) == "0") digitalWrite(muxbit2, LOW); else digitalWrite(muxbit2, HIGH);
    if (analogRead(muxIOpin) > 512) dipswitch[n]=false; else dipswitch[n]=true;
    if (isDebug == true) { if (dipswitch[n]==false) Serial.print("0"); else Serial.print("1"); }
  }
  if (isDebug == true) Serial.println("");
  s=0;
  if (dipswitch[7]==true) s = s + 2;
  if (dipswitch[8]==true) s = s + 1;
  sensibility[4]=sensibility[s];
  if (isDebug == true) { Serial.print("Sensibility="); Serial.println(sensibility[4]); }
  s=0;
  if (dipswitch[5]==true) s = s + 2;
  if (dipswitch[6]==true) s = s + 1;
  frequency[4]=frequency[s];
  if (isDebug == true) { Serial.print("Frequency="); Serial.println(frequency[4]); }
  s=0;
  if (dipswitch[3]==true) s = s + 2;
  if (dipswitch[4]==true) s = s + 1;
  sinkalarm[4]=sinkalarm[s];
  if (isDebug == true) { Serial.print("SinkAlarm="); Serial.println(sinkalarm[4]); }
}

void checkBATT() {
  n1 = analogRead(vbattPin);
  n2=(((6.60 * n1) / 1023.00));
  SensorVBatt=(n2 + ((n2 * 0.0) /100));
  if (SensorVBatt <= 3.4) { NewTone (buzzerPin,6,1000); }
  if (isDebug == true) { Serial.print("VBatt="); Serial.println(SensorVBatt); }
}

제조공정

  1. 구글 클라우드 Secret Manager로 민감 데이터 안전하게 저장 및 관리하기
  2. 무수은 기압계: 설계, 역사 및 압력 측정의 미래
  3. 첨단 탐지 기술, 트랜지스터 결함을 전례 없는 민감도로 정밀 식별
  4. 혁신적 초박막 MXene 변형 센서, 로봇 팔 정밀도와 안전성 향상
  5. 우주 통신을 위한 고성능 광학 수신기
  6. Amstrong® Ultra 650MC – 우수한 용접성을 위한 고강도 저탄소 강철
  7. Amstrong® Ultra 650MCT – 우수한 용접성을 위한 고강도 저탄소 강철
  8. Amstrong® Ultra 700MC – 초고강도 미립자강, 우수한 용접성 구현
  9. Amstrong® Ultra 700MCT – 초고항복강도 저탄소 미립자강, -40°C 인성 보증
  10. 초고순도 크로뮴 (UHP Cr) – 99.95%+ 중요 용도용 고품질