如何使用ATtiny85制作便携式超声波数字尺

2023-08-11 11:26:07 |人围观 | 评论:

  人、设备或车辆或移动物体的路径中物体的距离测量被用于机器人运动控制、车辆控制、盲人手杖、医疗设备等大量应用中。有很多可用于距离测量的方法,但使用超声波传感器进行测量是其他选项中最便宜的方法之一。在这个项目中,我们将使用HC-SR04 超声波传感器与 ATtiny85微控制器ICOLED显示模块来构建数字超声波尺。

  超声波尺所需组件

  阁楼85 IC

  HC-SR04 超声波传感器

  I 2 C OLED显示模块

AMS1117 5V 稳压器

  3×10KΩ电阻

  1× 10 µf电容器

  9V电池

  超声波数字尺电路图

  使用 ATtiny85的超声波尺原理图如下:

poYBAGLjozqASZYRAAGgNtKWaAI475.png

  上图显示了超声波传感器和 OLED 显示器与 Attiny85 IC接口的电路图。OLED Display 和 ATtiny85 之间的接口必须使用I2C协议来实现。因此,ATtiny85 的 SCL 引脚 (PB2) 连接到 OLED 显示器的 SCL 引脚。同样,ATtiny85 的SDA 引脚 (PB0) 连接到 OLED 显示器的 SDA 引脚。超声波传感器的 Echo 和 Trig 引脚分别连接到 ATtiny85 的 PB3 和 PB4 引脚。最后,为所有组件供电,我们使用了 9V 电池。然后使用 AMS117-5V 稳压器将此 9V 转换为 5V。

  注意:按照我们之前的教程使用 Digispark Bootloader 直接通过USB编程ATtiny85 IC 或使用Arduino编程 ATtiny85对 ATtiny85 IC 进行编程。

  超声波尺PCB制作

  现在我们有了原理图,我们可以继续使用 ATtiny85 为超声波测距仪布置 PCB 。您可以使用您选择的任何 PCB 软件来设计 PCB。

  下面是超声波标尺PCB顶层和底层的3D模型视图:

poYBAGLjozaAPrXfAAKVln5xVrk768.png

  组装 Attiny85 超声波标尺 PCB

  几天后,我们收到了整齐包装的 PCB,PCB 质量一如既往地好。板子的顶层和底层如下图所示:

poYBAGLjozOARvp1AATjMtcH8vI462.png

  在确保轨道和脚印是正确的之后。我继续组装PCB。完全焊接的板如下所示:

pYYBAGLjozCAYsG3AAN6Dek6WnE637.png

  ATtiny85超声波尺码说明

  文档末尾给出了完整的 Arduino 计步器代码。在这里,我们将解释代码的一些重要部分。

  该代码使用TinyWireM.h和TinyOzOLED.h库。TinyWireM 库可以从 Arduino IDE 中的库管理器下载并从那里安装。为此,打开 Arduino IDE 并转到Sketch 《 Include Library 《 Manage Libraries。现在搜索TinyWireM.h并安装 Adafruit 的TinyWireM库。

pYYBAGLjoyyAXaQlAAL6Kev2T3I733.png

  而TinyOzOLED.h库可以从给定的链接下载。

  将库安装到 Arduino IDE 后,通过包含所需的库文件来启动代码。

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

在接下来的几行中,定义超声波传感器引脚。我们已经定义了超声波传感器的触发和回波引脚,如下所示。

常量 int trigPin = 4; //P4 int echoPin = 3; //P3

然后是setup()函数。这是我们将 ATtiny85 引脚定义为输入/输出并开始 ATtiny85 和 OLED 之间的通信的地方。

无效设置(){ TinyWireM.begin(); ozOled.init(); OzOled.clearDisplay(); OzOled.setNormalDisplay(); OzOled.sendCommand(0xA1); OzOled.sendCommand(0xC8); pinMode(trigPin,输出); }

现在在loop()函数中,我们首先使用超声波传感器测量距离,然后将其显示在 OLED 显示屏上。要使用超声波传感器测量距离,首先,您必须将触发引脚设置为LOW 状态 2 µs 以确保清晰。现在要生成超声波,将trigPin设置为高电平 10 µs。之后,使用pulseIn()函数读取行程时间并将读数存储到名为“duration”的变量中。pulseIn()函数有2个参数,第一个是echo pin的名字,第二个是echo pin的状态。然后在获得距离后,我们将其显示在 OLED 显示屏上。

数字写入(trigPin,低); 延迟微秒(2); digitalWrite(trigPin, HIGH); 延迟微秒(10); 数字写入(trigPin,低); pinMode(echoPin,输入); 持续时间=脉冲输入(回声针,高); cm = 微秒到厘米(持续时间); OzOled.printString("距离:", 3, 4); OzOled.printNumber(cm, 0, 12, 4);

  测试我们的超声波标尺

  组装好 PCB 并编程 ATtiny85 进行距离测量后,我们现在可以测试超声波尺了。为此,使用 9V 为电路板供电并等待测量的距离显示在 OLED 显示屏上。您可以使用刻度尺或卷尺检查测量的距离是否正确。

poYBAGLjoyWATIRdAAaEIW_gxT4696.png

  #include “TinyWireM.h”

  #include “TinyOzOLED.h”

  const int trigPin = 4; //P4

  int echoPin = 3; //P3

  int 持续时间,cm;

  void setup() {

  TinyWireM.begin();

  ozOled.init();

  OzOled.clearDisplay();

  OzOled.setNormalDisplay();

  OzOled.sendCommand(0xA1); // 设置方向

  OzOled.sendCommand(0xC8);

  pinMode(trigPin,输出);

  }

  void loop()

  {

  //OzOled.clearDisplay();

  数字写入(trigPin,低);

  延迟微秒(2);

  digitalWrite(trigPin, HIGH);

  延迟微秒(10);

  数字写入(trigPin,低);

  //设置输入引脚,并在uS

  pinMode(echoPin,INPUT)中接收持续时间;

  持续时间=脉冲输入(回声针,高);

  // 将脉冲传播时间转换为距离

  cm = microsecondsToCentimeters(duration);

  显示OLED();

  延迟(1000);

  OzOled.clearDisplay();

  }

  void displayOLED() {

  OzOled.printString(“距离:”, 3, 3);

  OzOled.printNumber(cm, 0, 12, 3);

  OzOled.printString(“(在 CM 中)”, 5, 5);

  }

  long microsecondsToCentimeters(long microseconds)

  {

  // 声速为 340 m/s (29 us/cm)

  return microseconds / 29 / 2;

  }





标签: [db:tags]