找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lxf 于 2020-8-17 13:10 编辑

第46课 三轴倾斜度ADXL345
X和Y轴控制小车前进、后退和转弯


目标

利用NRF24L01 2.4G无线模块和三轴倾斜度ADXL345传感器模块,X轴控制小车前进和后退,Y轴控制小车转弯。

实验材料

Arduino UNO开发板*2
NRF24L01 2.4G无线模块*2
三轴倾斜度ADXL345传感器模块
L298N电机驱动板
9V充电锂电池和9V电池扣子
装有两个直流电机马达小车
配套USB数据线
配套杜邦线若干
Arduino IDE软件

微信图片_20200717094525.png

内容

利用NRF24L01 2.4G无线模块和三轴倾斜度ADXL345传感器模块,远程控制小车,当三轴倾斜度ADXL345传感器的X轴方向往前倾斜时,小车前进,当方向往后倾斜时,小车后退,当Y轴向左边倾斜时,小车左转弯,当Y轴向右倾斜时,小车右转弯,当X轴方向即不往前也不往后,且Y轴方向即不向左倾斜也不向右倾斜时,小车停止。

接线图

图片1.png
(小车接线图)

图片2.png
(三轴倾斜度ADXL345传感器模块控制接线图)

小车接线方式

Arduino UNO1    <------>     NRF24L01 2.4G无线模块1
             3.3V        <------>            VCC
            GND        <------>            GND
              8            <------>             CSN
              7            <------>             CE  
            13            <------>             SCK
            11            <------>             MOSI
            12            <------>             MISO
Arduino UNO1    <------>    L298N电机驱动板
             5V           <------>          +5V
            GND         <------>           GND
            ENA          <------>             2
            IN1           <------>             3
           IN2            <------>              4
           ENB           <------>             5
           IN3            <------>             6      
           IN4            <------>             9
L298N电机驱动板   <------>    直流减速电机A
         OUT1            <------>        一端接口
        OUT2             <------>      另一端接口
L298N电机驱动板   <------>    直流减速电机B
        OUT3             <------>        一端接口
        OUT4             <------>       另一端接口
9V充电锂电池   <------>    L298N电机驱动板
        正极         <------>             +12V
        负极         <------>              GND

三轴倾斜度ADXL345传感器模块控制接线方式

Arduino UNO2    <------>     NRF24L01 2.4G无线模块2
      3.3V               <------>            VCC
     GND               <------>            GND
       8                   <------>            CSN
       7                   <------>             CE  
      13                  <------>            SCK
      11                  <------>            MOSI
      12                  <------>            MISO
Arduino UNO2    <------>    三轴倾斜度ADXL345传感器模块
      5V                  <------>            VCC
    GND                <------>            GND
     5V                   <------>             CS
   GND                 <------>             SD0
     A4                   <------>            SDA
     A5                   <------>            SCL
需要用到三轴倾斜度ADXL345传感器模块第三方库文件,文件名为“ADXL345”和“I2Cdev”。
提取码:0ig6
下载后解压,把文件名为“ADXL345”和“I2Cdev”的两个文件夹复制放到Arduino安装包的“libraries”文件夹里面。

程序实现代码

发送端程序 Sender.ino

  1. #include <Wire.h>
  2. #include <I2Cdev.h>
  3. #include <ADXL345.h>  //三轴倾斜度ADXL345传感器模块库文件
  4. ADXL345 accel;
  5. #include <SPI.h>
  6. #include <nRF24L01.h>
  7. #include <RF24.h>   //NRF24L01 2.4G无线模块的库文件
  8. RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
  9. const byte address[6] = "00001";  //创建一个数组,建立发送机地址,或者说两个模块将用于通信的“管道”
  10. volatile int X;  //定义一个整型变量X
  11. volatile int Y;  //定义一个整型变量Y
  12. volatile int item;  //定义一个整型变量item
  13. void setup() {
  14.    Serial.begin(9600);  
  15.    Wire.begin();
  16.   accel.initialize();
  17.     X = 0;  //初始化整型变量X为0
  18.     Y = 0;  //初始化整型变量Y为0
  19.     item = 0;   //初始化整型变量item为0
  20.   radio.begin();    //初始化radio对象
  21.   radio.openWritingPipe(address);  //使用radio.openWritingPipe()函数设置的发送机地址
  22.   radio.setPALevel(RF24_PA_MIN);  //设置功率放大器级别,将其设置为最小值
  23.   radio.stopListening();  // 使用radio.stopListening()函数将模块设置为发送机
  24. }
  25. void loop() {
  26. X = accel.getAccelerationX();  //把三轴倾斜度ADXL345传感器模块的X轴加速度数值赋值给X
  27. Y = accel.getAccelerationY();   //把三轴倾斜度ADXL345传感器模块的Y轴加速度数值赋值给Y
  28. if ((X > -100 && X < 100) && (Y > -100 && Y < 100)) {  //当X轴方向即不往前也不往后,且Y轴方向即不向左倾斜也不向右倾斜时
  29.     item = 1;      //item赋值为1
  30.     }  else if ((X > 100)&& (Y > -100 && Y < 100)){   //当X轴往前倾斜时
  31.      item = 2;    //item赋值为2
  32.     }  else if ((X  < -100)&& (Y > -100 && Y < 100)){   //当X轴往后倾斜时
  33.        item = 3;  //item赋值为3
  34.     } else if ((X > -100 && X < 100) && (Y > 100)){   //当Y轴往左倾斜时
  35.     item = 4;     //item赋值为4
  36.    } else if ((X > -100 && X < 100) && (Y < -100)){   //当Y轴往右倾斜时
  37.     item = 5;   //item赋值为5

  38.    }
  39.   radio.write(&item, sizeof(item));   //使用radio.write()函数将消息发送给接收机,item是要发送的整型数值变量,
  40. // sizeof(item)设置了我们要从item变量中获取的整型数长度。
  41. }
复制代码

接收端程序 Receiver.ino

  1. #include <SPI.h>
  2. #include <nRF24L01.h>
  3. #include <RF24.h>   //NRF24L01 2.4G无线模块的库文件
  4. RF24 radio(7, 8);   //创建一个RF24的对象CE=7, CSN=8
  5. const byte address[6] = "00001";  //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道”
  6. void setup() {
  7.   Serial.begin(9600);
  8.   pinMode(2, OUTPUT);   //定义2号引脚为输出
  9.   pinMode(3, OUTPUT);   //定义3号引脚为输出
  10.   pinMode(4, OUTPUT);   //定义4号引脚为输出
  11.   pinMode(5, OUTPUT);   //定义5号引脚为输出
  12.   pinMode(6, OUTPUT);   //定义6号引脚为输出
  13.   pinMode(9, OUTPUT);   //定义6号引脚为输出
  14.   digitalWrite(2,LOW);   //初始化小车为停止状态
  15.   digitalWrite(5,LOW);
  16.   radio.begin();   //初始化radio对象
  17.   radio.openReadingPipe(0, address);   //使用radio.openReadingPipe()函数设置的接收机地址
  18.   radio.setPALevel(RF24_PA_MIN);   //设置功率放大器级别,将其设置为最小值
  19.   radio.startListening();    // 使用radio..startListening()将模块设置为接收机
  20. }
  21. void loop() {
  22.    if (radio.available()) {  //判断是否有要接收的数据
  23.     int text = 0;    //定义一个整型变量text并赋值为0
  24.     radio.read(&text, sizeof(text));  //读取数据,并将其存储到text变量中
  25.     Serial.println(text);  //打印变量text的数据,即接收到的数据
  26.     delay(500);  //延迟等待0.5秒
  27.    if (text == 1) {  //如果三轴倾斜度ADXL345传感器模块X轴方向即不往前也不往后,那么小车停止
  28.      digitalWrite(2,LOW);
  29.      digitalWrite(5,LOW);
  30.     }
  31. else if (text == 2) {   //如果三轴倾斜度ADXL345传感器模块X方向往前倾斜,那么小车前进
  32. digitalWrite(2,HIGH);
  33.     digitalWrite(3,HIGH);
  34.     digitalWrite(4,LOW);
  35.     digitalWrite(5,HIGH);
  36.     digitalWrite(6,LOW);
  37.     digitalWrite(9,HIGH);
  38. }
  39. else if (text == 3) {    //如果三轴倾斜度ADXL345传感器模块X轴方向往后倾斜,那么小车后退
  40.    digitalWrite(2,HIGH);
  41.     digitalWrite(3,LOW);
  42.     digitalWrite(4,HIGH);
  43.     digitalWrite(5,HIGH);
  44.     digitalWrite(6,HIGH);
  45.     digitalWrite(9,LOW);
  46. }
  47. else if (text == 4) {    //如果三轴倾斜度ADXL345传感器模块Y轴方向往左倾斜,那么小车左转
  48.   digitalWrite(2,HIGH);
  49.     analogWrite(3,60);
  50.     digitalWrite(4,LOW);
  51.     digitalWrite(5,LOW);
  52. }else if (text == 5) {    //如果三轴倾斜度ADXL345传感器模块Y轴方向往右倾斜,那么小车右转
  53.    digitalWrite(2,LOW);
  54.     digitalWrite(5,HIGH);
  55.     digitalWrite(6,LOW);
  56.     analogWrite(9,60);
  57. }
  58. }
  59. }
复制代码
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册