欢迎光临
我们一直在努力

【实验六】Arduino开发板实战

目录

一、ADXL3xx 实验测试

1.1 硬件接线方式

1.2 中文注释代码

1.3 测试结果

1.4 核心原理

二、Knock 实验测试

2.1 硬件接线方式

2.2 中文注释代码

2.3 核心原理

三、Memsic2125 实验测试

3.1 硬件接线方式

3.2 中文注释代码

3.3 核心原理

四、Ping 实验测试

4.1 硬件接线方式

4.2 中文注释代码

4.3 核心原理


本实验硬件平台为 Arduino Uno R3 主控板,核心主控芯片为 ATmega328P,具备多路数字与模拟引脚、串口通信接口,可通过 USB 直接供电和程序烧录。

软件开发环境为 Arduino IDE,本次测试代码为内置 06.Sensors 官方传感器采集示例,路径为文件→示例→06.Sensors,包含 ADXL3xx、Knock、Memsic2125、Ping 共 4 个范例,主要用于学习加速度传感器、震动敲击传感器、双轴倾角传感器、超声波测距传感器的模拟 / 数字信号采集、数据读取与串口解析等传感器信号检测技术。


一、ADXL3xx 实验测试

1.1 硬件接线方式

  • 加速度传感器接线(ADXL3xx 三轴加速度模块)
    • X 轴输出 → 模拟引脚 A3
    • Y 轴输出 → 模拟引脚 A2
    • Z 轴输出 → 模拟引脚 A1
    • 模块 VCC → 模拟引脚 A5(复用为数字输出高电平供电)
    • 模块 GND → 模拟引脚 A4(复用为数字输出低电平接地)
    • 自检引脚 → 模拟引脚 A0
  • 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑,完成供电、程序上传,串口波特率设置为 9600
  • 打开串口监视器查看三轴加速度原始数值
  • 下面是上图所示配置的引脚连接:

    扩展板引脚自测Z轴Y轴X轴地VDD
    Arduino模拟输入引脚 0 1 2 3 4 5

    或者,如果你只是用加速度计的话:

    ADXL3xx 引脚自测Z轴Y轴X轴地VDD
    Arduino 引脚 无(未连接) 模拟输入1 模拟输入2 模拟输入3 GND 5V

    注意,有些加速度计使用3.3V电源,5V可能会损坏它们。查阅供应商的文档以确定正确的电压。

    1.2 中文注释代码

    /*
    ADXL3xx 三轴加速度传感器读取示例

    读取ADI公司ADXL3xx系列加速度传感器三轴模拟输出,通过串口输出X/Y/Z轴加速度数值
    复用模拟引脚作为供电引脚,可直接直插连接传感器分线板

    电路说明:
    – 模拟引脚A3:X轴输出
    – 模拟引脚A2:Y轴输出
    – 模拟引脚A1:Z轴输出
    – 模拟引脚A4:复用为接地
    – 模拟引脚A5:复用为电源供电

    */

    // 引脚常量定义
    const int groundpin = 18; // 模拟引脚4编号,用作接地
    const int powerpin = 19; // 模拟引脚5编号,用作供电
    const int xpin = A3; // X轴加速度输入
    const int ypin = A2; // Y轴加速度输入
    const int zpin = A1; // Z轴加速度输入(仅三轴型号支持)

    void setup() {
    // 初始化串口通信,波特率9600
    Serial.begin(9600);

    // 复用模拟引脚作为数字IO,为传感器提供电源和地
    // 若直接接Arduino原生5V和GND引脚,可删除以下四行
    pinMode(groundpin, OUTPUT);
    pinMode(powerpin, OUTPUT);
    digitalWrite(groundpin, LOW);
    digitalWrite(powerpin, HIGH);
    }

    void loop() {
    // 打印X轴加速度原始数值
    Serial.print(analogRead(xpin));
    Serial.print("\\t"); // 制表符分隔
    // 打印Y轴加速度原始数值
    Serial.print(analogRead(ypin));
    Serial.print("\\t");
    // 打印Z轴加速度原始数值并换行
    Serial.print(analogRead(zpin));
    Serial.println();

    delay(100); // 采样间隔延时
    }

    1.3 测试结果

            这里是一些加速度计的读数,是通过将 ADXL322 2g 加速度计的 y 轴以不同角度相对于地面放置收集的。其他轴的数值应该相同,但会根据设备的灵敏度有所不同。当轴水平(即与地面平行或 0°)时,加速度计的读数应该在 512 左右,但其他角度的数值对于不同的加速度计(例如 ADXL302 5g)会有所不同。

    1.4 核心原理

  • 模拟量加速度输出:ADXL3xx 加速度传感器将三轴加速度转换为对应模拟电压,通过 ADC 采样读取三轴原始数值,反映各方向受力与倾斜状态
  • 模拟引脚复用供电:将 A4、A5 配置为数字输出模式,分别输出低电平和高电平,直接为传感器提供地和电源,简化接线实现直插连接
  • 多通道 ADC 采样:依次读取三个模拟引脚 ADC 数值,以制表符分隔串口输出,便于查看三轴数据对应关系
  • 固定周期采样:100ms 延时控制采样频率,稳定输出加速度数据
  • 功能目的:学习三轴加速度传感器模拟信号采集方法,掌握多通道 ADC 读取与串口格式化输出,理解模拟引脚复用为数字 IO 的用法

  • 二、Knock 实验测试

    2.1 硬件接线方式

  • 压电震动传感器接线
    • 压电片正极引脚接模拟输入 A0
    • 压电片负极引脚直接接 GND
    • 1MΩ 电阻并联在 A0 与 GND 之间,用于泄放电荷、稳定电压
  • LED 说明:直接使用板载 D13 自带 LED,无需额外外接
  • 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑供电、上传程序,串口波特率 9600,打开串口监视器查看敲击提示文字
  • 2.2 中文注释代码

    /*
    Knock Sensor 压电敲击震动检测示例

    通过压电陶瓷片采集敲击震动产生的模拟电压信号,设置阈值判断是否发生敲击;
    检测到敲击后翻转D13板载LED状态,并通过串口打印"Knock!"提示

    电路说明:
    – 压电元件正极接模拟引脚A0,负极接GND
    – 1MΩ电阻并联在A0与GND之间,释放压电产生的电荷

    创建:2007.3.25 by David Cuartielles
    修改:2011.8.30 by Tom Igoe

    */

    // 固定常量定义
    const int ledPin = 13; // 板载LED引脚
    const int knockSensor = A0; // 压电震动传感器模拟输入引脚
    const int threshold = 100; // 敲击判断阈值

    // 可变全局变量
    int sensorReading = 0; // 存储压电传感器采样数值
    int ledState = LOW; // 记录LED当前电平状态,用于翻转

    void setup() {
    pinMode(ledPin, OUTPUT); // 设置LED引脚为输出模式
    Serial.begin(9600); // 初始化串口通信
    }

    void loop() {
    // 读取压电传感器模拟电压采样值
    sensorReading = analogRead(knockSensor);

    // 采样值超过阈值,判定为有效敲击
    if (sensorReading >= threshold) {
    ledState = !ledState; // 翻转LED状态(取反)
    digitalWrite(ledPin, ledState); // 更新LED引脚电平
    Serial.println("Knock!"); // 串口输出敲击提示
    delay(100); // 消抖延时,防止频繁触发
    }
    }

    2.3 核心原理

  • 压电电荷感应原理:压电陶瓷受敲击震动时会瞬间产生微弱电压,通过 ADC 读取 A0 引脚电压得到采样数值;并联 1MΩ 电阻快速释放电荷,避免电压持续堆积造成误触发
  • 阈值判断逻辑:设定阈值 100,采样数值大于等于阈值时判定为有效敲击,区分环境轻微震动与人为敲击
  • LED 状态翻转:使用取反运算符!切换 LED 电平,每次敲击切换亮灭状态,直观反馈敲击事件
  • 消抖延时处理:触发后增加 100ms 延时,屏蔽短时间内连续多次采样触发,防止串口刷屏、LED 频繁闪烁
  • 功能目的:学习压电震动传感器模拟信号采集、阈值判定方法,掌握电平状态翻转、简单事件消抖编程思路

  • 三、Memsic2125 实验测试

    3.1 硬件接线方式

  • Memsic2125 双轴加速度传感器接线
    • 传感器 X 脉冲输出 → 数字引脚 D2
    • 传感器 Y 脉冲输出 → 数字引脚 D3
    • 传感器 VCC 引脚 → Arduino +5V
    • 传感器 GND 引脚 → Arduino GND
  • 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑供电、上传程序,串口波特率 9600,打开串口监视器查看 X、Y 轴加速度数值
  • 无额外 LED、电阻配件需求
  • 3.2 中文注释代码

    /*
    Memsic2125 双轴脉冲型加速度传感器读取示例

    读取Memsic2125输出的X、Y轴脉冲宽度,通过公式换算为毫g单位加速度值并串口打印
    1g重力等于1000毫g,通过脉冲宽度判断传感器倾斜、受力状态

    电路说明:
    – 加速度计X脉冲输出接数字引脚2
    – 加速度计Y脉冲输出接数字引脚3
    – 传感器电源接+5V,地接GND

    */

    // 引脚常量定义
    const int xPin = 2; // 加速度计X轴脉冲输出引脚
    const int yPin = 3; // 加速度计Y轴脉冲输出引脚

    void setup() {
    Serial.begin(9600); // 初始化串口通信
    pinMode(xPin, INPUT); // 设置X轴引脚为输入模式
    pinMode(yPin, INPUT); // 设置Y轴引脚为输入模式
    }

    void loop() {
    int pulseX, pulseY; // 存储读取到的X、Y轴脉冲宽度
    int accelerationX, accelerationY; // 存储换算后的加速度值

    // pulseIn函数测量高电平脉冲持续时间(单位:微秒)
    pulseX = pulseIn(xPin, HIGH);
    pulseY = pulseIn(yPin, HIGH);

    // 将脉冲宽度换算为毫g加速度,1g = 1000 milli-g
    accelerationX = ((pulseX / 10) – 500) * 8;
    accelerationY = ((pulseY / 10) – 500) * 8;

    // 制表符分隔打印双轴加速度数据
    Serial.print(accelerationX);
    Serial.print("\\t");
    Serial.print(accelerationY);
    Serial.println();

    delay(100); // 采样间隔延时,稳定输出数据
    }

    3.3 核心原理

  • 脉冲输出式加速度检测:Memsic2125 不输出模拟电压,而是输出随加速度变化宽度的脉冲信号,脉冲宽度对应对应轴受力大小
  • pulseIn 脉冲测量函数:精准测量指定引脚高电平脉冲的微秒级时长,获取原始脉冲宽度数据
  • 工程单位换算公式:通过标定公式把脉冲时长转换为毫 g (milli-g) 重力单位,直观量化倾斜与加速度大小,标准重力为 1000 milli-g
  • 双通道同步采集:依次读取 X、Y 轴脉冲并换算,格式化串口输出双轴数据,方便观测二维倾斜状态
  • 功能目的:学习数字脉冲信号采集、pulseIn 函数使用,掌握脉冲型传感器数据标定换算方法,区分模拟输出与脉冲输出两类加速度传感器的读取逻辑

  • 四、Ping 实验测试

    4.1 硬件接线方式

  • Ping))) 超声波测距传感器接线
    • 传感器 VCC 引脚 → Arduino +5V
    • 传感器 GND 引脚 → Arduino GND
    • 传感器 SIG 信号引脚 → 数字引脚 D7
  • 整体供电:Arduino Uno R3 通过 USB 数据线连接电脑供电、上传程序,串口波特率 9600,打开串口监视器同步查看英寸、厘米两种单位测距数据
  • 无需额外电阻、LED 外设
  • 4.2 中文注释代码

    /*
    Ping))) Sensor 超声波测距传感器示例

    驱动Parallax Ping超声波模块,通过单引脚完成发射触发与回波脉冲接收
    根据声波往返脉冲时长,换算出障碍物距离,分别输出英寸、厘米两种单位

    电路说明:
    – Ping模块VCC接+5V,GND接GND
    – Ping模块SIG信号脚接数字引脚7

    */

    // 传感器信号引脚常量
    const int pingPin = 7;

    void setup() {
    // 初始化串口通信,波特率9600
    Serial.begin(9600);
    }

    void loop() {
    long duration, inches, cm;
    // duration:声波往返总微秒时长
    // inches:英寸距离,cm:厘米距离

    // 第一步:配置引脚为输出,发送触发脉冲启动超声波发射
    pinMode(pingPin, OUTPUT);
    digitalWrite(pingPin, LOW);
    delayMicroseconds(2); // 先拉低保证干净触发脉冲
    digitalWrite(pingPin, HIGH);
    delayMicroseconds(5); // 至少5微秒高电平触发模块发射声波
    digitalWrite(pingPin, LOW);

    // 第二步:切换引脚为输入,读取回波高电平脉冲宽度
    pinMode(pingPin, INPUT);
    duration = pulseIn(pingPin, HIGH);

    // 把脉冲时长换算为距离
    inches = microsecondsToInches(duration);
    cm = microsecondsToCentimeters(duration);

    // 串口打印两种单位测距结果
    Serial.print(inches);
    Serial.print("in, ");
    Serial.print(cm);
    Serial.print("cm");
    Serial.println();

    delay(100); // 100ms间隔,稳定测距刷新频率
    }

    // 微秒时间转换为英寸距离
    long microsecondsToInches(long microseconds) {
    // 声速对应每英寸往返耗时74微秒,除以2得到单程距离
    return microseconds / 74 / 2;
    }

    // 微秒时间转换为厘米距离
    long microsecondsToCentimeters(long microseconds) {
    // 声速对应每厘米往返耗时29微秒,除以2得到单程距离
    return microseconds / 29 / 2;
    }

    4.3 核心原理

  • 单引脚分时复用:同一数字引脚先配置为输出发送触发脉冲,再切换为输入接收回波脉冲,完成超声波模块驱动
  • 声波时差测距原理:模块发射超声波,遇到障碍物反射产生回波;pulseIn测量发射到接收的总时长,声速固定,通过时间计算单程距离
  • 双单位换算函数:分别封装英寸、厘米换算函数,根据声速标定系数除以 2 抵消声波往返路程,输出直观可读距离数值
  • 脉冲触发规范:先输出低电平再输出 5μs 以上高电平,保证稳定触发超声波发射,避免信号干扰造成测距失效
  • 功能目的:学习单引脚分时复用 IO、pulseIn 脉冲测量函数,掌握超声波时差测距算法,理解距离传感器信号收发与单位换算逻辑

  • 参考链接 :https://docs.arduino.cc/built-in-examples

    赞(0)
    未经允许不得转载:171主机测评 » 【实验六】Arduino开发板实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址