아두이노 ATtiny85를 사용하여 휴대용 초음파 디지털 눈금자를 만드는 방법

2021. 8. 7. 18:02카테고리 없음

아두이노 ATtiny85를 사용하여 휴대용 초음파 디지털 눈금자를 만드는 방법

사람, 장비 또는 차량 또는 움직이는 물체의 경로에서의 거리 측정은 로봇 이동 제어, 차량 제어, 시각장애인의 보행 막대, 의료 장비 등 다수의 응용 프로그램에 사용됩니다. 거리 측정은 여러 방법이 있지만 초음파 센서를 이용한 측정은 다른 옵션 중 가장 저렴하다. 이번 프로젝트에서는 AT Tiny85 마이크로컨트롤러 IC와 OLED 디스플레이 모듈과 함께 HC-SR04 초음파 센서를 사용해 디지털 초음파 자를 제작할 예정입니다. 우리는 이 프로젝트를 PCB로 구축했으며 이 프로젝트를 위해 보드를 제작하기 위해 PCBWay를 사용했습니다. 이 초음파 눈금자의 PCB 보드를 설계, 주문, 조립하는 전체 절차를 기사의 아래 절에서 자세히 다루어 귀사가 직접 쉽게 제작할 수 있도록 하였습니다.

이 보드는 거리 측정, 물체 감지 및 기타 다양한 용도에 사용할 수 있습니다. 또한, 아두이노를 사용하여 더 많은 측정기를 제작하는 것에 관심이 있다면, 이전에 우리가 만든 이 아두이노 디지털 프로텍터도 확인하실 수 있습니다.

 

초음파 눈금자에 필요한 구성 요소

ATtiny85
HC-SR04 초음파 센서
I2C OLED 디스플레이 모듈
AMS1117 5V 전압 레귤레이터
3×10KΩ 저항기
1×10µf 캐패시터
9V 배터리

 

초음파 디지털 눈금자 회로도

ATtiny85를 사용하는 초음파 눈금자의 도식은 다음과 같습니다.

위 이미지는 초음파 센서와 OLED 디스플레이를 Attiny85 IC와 인터페이스하기 위한 회로도를 보여줍니다. OLED 디스플레이와 Atiny85 사이의 인터페이스는 I2C 프로토콜을 사용하여 구현되어야 합니다. 따라서 AT Tiny85의 SCL 핀(PB2)은 OLED 디스플레이의 SCL 핀에 연결됩니다. 마찬가지로 AT Tiny85의 SDA 핀(PB0)은 OLED 디스플레이의 SDA 핀에 연결됩니다. 초음파센서의 에코 핀은 ATtiny85의 PB3와 PB4 핀에 각각 연결된다. 마지막으로, 모든 부품에 전원을 공급하기 위해 9V 배터리를 사용했습니다. 그런 다음 AMS117-5V 전압 조절기를 사용하여 이 9V를 5V로 변환합니다.

 

참고: Digispark Bootloader를 사용하여 USB를 통해 ATiny85 IC 프로그래밍 또는 Arduino를 사용하여 ATiny85 IC 프로그래밍을 참조하십시오.

초음파 눈금자용 PCB 제작
이제 개략도가 잡혔고 ATtiny85를 사용하여 초음파 범위파인더용 PCB 배치를 진행할 수 있습니다. 원하는 PCB 소프트웨어를 사용하여 PCB를 설계할 수 있습니다.

다음은 초음파 눈금자 PCB의 상단 및 하단 레이어의 3D 모델 뷰입니다.

 

위 회로의 PCB 레이아웃은 아래 링크에서 Gerber로 다운로드할 수도 있습니다.

AT tiny85 초음파 눈금자용 Gerber 파일

PCBWay에서 PCB 주문
이제 설계를 완료한 후 PCB 주문을 진행할 수 있습니다.

1단계: https://www.pcbway.com/,에 처음 가입하는 경우 가입하십시오. 그런 다음 PCB 프로토타입 탭에서 PCB 치수, 레이어 수 및 필요한 PCB 수를 입력합니다.

 

2단계: '지금 견적' 버튼을 클릭하여 계속하십시오. 페이지로 이동하여 보드 유형, 레이어, PCB 재료, 두께 등과 같은 몇 가지 추가 매개변수를 설정할 수 있습니다. 대부분 기본적으로 선택되어 있습니다. 특정 매개변수를 선택하는 경우 여기에서 해당 매개변수를 선택할 수 있습니다.

3단계: 마지막 단계는 Gerber 파일을 업로드하고 결제를 진행하는 것입니다. 원활한 처리를 위해 PCBWAY는 결제를 진행하기 전에 Gerber 파일이 유효한지 확인합니다. 이렇게 하면 PCB가 제작에 적합하고 약속된 대로 PCB에 도달할 수 있습니다.

Attiny85 초음파 눈금자 PCB 조립
며칠 후, 우리는 PCB를 깔끔한 패키지로 받았고 PCB 품질은 평소와 다름없이 좋았습니다. 보드의 맨 위 레이어와 맨 아래 레이어는 다음과 같습니다.

트랙과 발자국이 정확한지 확인하고 나서. PCB 조립을 진행하였습니다. 완전히 납땜된 보드는 다음과 같습니다.

AT tiny85 초음파 눈금자 코드 설명
전체 Arduino 단계 카운터 코드는 문서 끝에 제공됩니다. 여기서 우리는 코드의 몇 가지 중요한 부분을 설명하고 있습니다.

이 코드는 TinyWireM.H 및 TinyOzOLED.h 라이브러리를 사용합니다. TinyWireM 라이브러리는 Arduino IDE의 Library Manager에서 다운로드하여 설치할 수 있습니다. 그러려면 아두이노 IDE를 열고 스케치 < 라이브러리 포함> 라이브러리 관리를 참조하십시오. 이제 TinyWireM.h를 검색하고 Adafruit에서 TinyWireM 라이브러리를 설치합니다.

반면 TinyOzOLED.h 라이브러리는 지정된 링크에서 다운로드할 수 있습니다.

Arduino IDE에 라이브러리를 설치한 후 필요한 라이브러리 파일을 포함하여 코드를 시작합니다.

#include "TinyWireM.h"
#include "TinyOzOLED.h"

다음 라인에서 초음파 센서 핀을 정의합니다. 초음파 센서의 trig와 에코 핀을 아래와 같이 정의하였습니다.

const int trigPin = 4; //P4
int echoPin = 3; //P3

그런 다음 설정() 기능이 제공됩니다. 여기서 ATtiny85 핀을 입출력이라고 정의하고 ATtiny85와 OLED 간의 통신을 시작합니다.

void setup() {
  TinyWireM.begin();
  OzOled.init();
  OzOled.clearDisplay(); 
  OzOled.setNormalDisplay();
  OzOled.sendCommand(0xA1);      
  OzOled.sendCommand(0xC8);
  pinMode(trigPin, OUTPUT);
}

이제 루프() 기능 안에서 초음파 센서를 이용해 거리를 측정한 후 OLED 디스플레이에 표시합니다. 초음파 센서를 사용하여 거리를 측정하려면 우선 Trigpin LOW 상태를 2µs만 설정하여 선명하게 표시해야 합니다. 이제 Ultra Sound Wave를 생성하기 위해 trigPin을 10µs 동안 HIGH로 설정합니다. 그런 다음 pulseIn() 함수를 사용하여 이동 시간을 읽고 판독치를 "duration"이라는 변수에 저장합니다. 펄스 입력() 기능에는 2개의 파라미터가 있으며, 첫 번째 파라미터는 에코 핀의 이름이고 두 번째 파라미터는 에코 핀의 상태입니다. 그런 다음 거리를 구한 후 OLED 디스플레이에 표시했습니다.

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm = microsecondsToCentimeters(duration);
OzOled.printString("Distance:", 3, 4);
OzOled.printNumber(cm, 0, 12, 4);

초음파 눈금자 테스트
PCB를 조립하고 거리 측정을 위해 ATtiny85를 프로그래밍한 후, 이제 초음파 눈금자를 테스트할 수 있습니다. 이를 위해 9V로 보드에 전원을 공급하고 OLED 디스플레이에 측정 거리가 표시될 때까지 기다립니다. Scale 또는 측정 테이프를 사용하여 측정된 거리가 정확한지 여부를 확인할 수 있습니다.

전체 작동 비디오 및 코드는 아래에서 확인할 수 있습니다. 프로젝트를 즐기고 유용한 정보를 얻으셨기를 바라며, 질문이 있으면 아래 의견란에 남겨주시거나 포럼을 통해 이에 대한 토론을 시작하십시오.

 

Code

#include "TinyWireM.h"
#include "TinyOzOLED.h"
const int trigPin = 4; //P4
int echoPin = 3; //P3
int duration, cm;
void setup() {
  TinyWireM.begin();
  OzOled.init();
  OzOled.clearDisplay();  
  OzOled.setNormalDisplay();
  OzOled.sendCommand(0xA1);        // set Orientation
  OzOled.sendCommand(0xC8);
  pinMode(trigPin, OUTPUT);
}
void loop()
{
//OzOled.clearDisplay(); 
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
//setting up the input pin, and receiving the duration in uS
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
// convert the pulse travel time into a distance
cm = microsecondsToCentimeters(duration);
displayOLED();
delay(1000);
OzOled.clearDisplay(); 
}
void displayOLED() {
  OzOled.printString("Distance:", 3, 3);
  OzOled.printNumber(cm, 0, 12, 3);
  OzOled.printString("(In CM)", 5, 5);
}
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s (29 us/cm)
return microseconds / 29 / 2;
}