Skip to main content

点亮LED和超声波测距

  1. 点亮LED灯

    #include <Arduino.h>

    void setup()
    {
    pinMode(2,OUTPUT); // 2号引脚为output模式
    }

    void loop()
    {
    digitalWrite(2,LOW); // 低电平,打开LED
    delay(1000);
    // 休眠1000ms
    digitalWrite(2,HIGH); // 高电平,关闭LED
    delay(1000);
    }
  2. 超声波测量距离

    原理:发出一段高电平,检测高电平持续时间,利用高电平持续时间来计算传感器与物体之间的距离

    公式:(单位换算,输出时间为微秒,声速为343m/s)

    Δt×0.0343÷2\Delta t \times 0.0343 \div 2
    #include <Arduino.h>

    #define TRIG 27 // 超声波与哪一个引脚相连
    #define ECHO 21

    void setup()
    {
    pinMode(TRIG,OUTPUT); // TRIG为输出模式
    pinMode(ECHO,INTPUT); // TRIG为输入模式
    }

    void loop()
    {
    digitalWrite(TRIG,HIGH);
    delayMicroseconds(10); // 延时10微妙
    digitalWrite(TRIG,LOW);

    double delta_time = pulseln(ECHO,HIGH); //检测高电平持续时间
    float detect_distance = delta_time * 0.0343 / 2; //计算距离
    Serial.printf("distance=%f cm\n", detect_distance)
    }
  3. 使用第三方库来驱动IMU(惯性测量器)

    arduino支持第三方库

    MP6050

    1. 引入开源库

      代理:http://github.fishros.org/

      lib_deps = https://github.com/fishros/MPU6050_light.git
    2. 修改代码

      在example中查看如何使用

      /* Get all possible data from MPU6050
      * Accelerometer values are given as multiple of the gravity [1g = 9.81 m/s²]
      * Gyro values are given in deg/s
      * Angles are given in degrees
      * Note that X and Y are tilt angles and not pitch/roll.
      *
      * License: MIT
      */

      #include "Wire.h"
      #include <MPU6050_light.h>

      MPU6050 mpu(Wire);


      void setup() {
      Serial.begin(115200); //波特率
      Wire.begin(18,19); //sda, scl初始化总线I^2C通信协议

      byte status = mpu.begin();
      Serial.print(F("MPU6050 status: "));
      Serial.println(status);
      while(status!=0){ } // stop everything if could not connect to MPU6050

      Serial.println(F("Calculating offsets, do not move MPU6050"));
      delay(1000);
      mpu.calcOffsets(true,true); // gyro and accelero
      Serial.println("Done!\n");

      }

      unsigned long timer = 0;

      void loop() {
      mpu.update();

      if(millis() - timer > 1000){ // print data every second
      Serial.print(F("TEMPERATURE: "));Serial.println(mpu.getTemp());
      Serial.print(F("ACCELERO X: "));Serial.print(mpu.getAccX());
      Serial.print("\tY: ");Serial.print(mpu.getAccY());
      Serial.print("\tZ: ");Serial.println(mpu.getAccZ());

      Serial.print(F("GYRO X: "));Serial.print(mpu.getGyroX());
      Serial.print("\tY: ");Serial.print(mpu.getGyroY());
      Serial.print("\tZ: ");Serial.println(mpu.getGyroZ());

      Serial.print(F("ACC ANGLE X: "));Serial.print(mpu.getAccAngleX());
      Serial.print("\tY: ");Serial.println(mpu.getAccAngleY());

      Serial.print(F("ANGLE X: "));Serial.print(mpu.getAngleX());
      Serial.print("\tY: ");Serial.print(mpu.getAngleY());
      Serial.print("\tZ: ");Serial.println(mpu.getAngleZ());
      Serial.println(F("=====================================================\n"));
      timer = millis();
      }

      }