本帖最后由 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软件
内容
利用NRF24L01 2.4G无线模块和三轴倾斜度ADXL345传感器模块,远程控制小车,当三轴倾斜度ADXL345传感器的X轴方向往前倾斜时,小车前进,当方向往后倾斜时,小车后退,当Y轴向左边倾斜时,小车左转弯,当Y轴向右倾斜时,小车右转弯,当X轴方向即不往前也不往后,且Y轴方向即不向左倾斜也不向右倾斜时,小车停止。
接线图
(小车接线图)
(三轴倾斜度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”。 下载后解压,把文件名为“ADXL345”和“I2Cdev”的两个文件夹复制放到Arduino安装包的“libraries”文件夹里面。
程序实现代码
发送端程序 Sender.ino
- #include <Wire.h>
- #include <I2Cdev.h>
- #include <ADXL345.h> //三轴倾斜度ADXL345传感器模块库文件
- ADXL345 accel;
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立发送机地址,或者说两个模块将用于通信的“管道”
- volatile int X; //定义一个整型变量X
- volatile int Y; //定义一个整型变量Y
- volatile int item; //定义一个整型变量item
- void setup() {
- Serial.begin(9600);
- Wire.begin();
- accel.initialize();
- X = 0; //初始化整型变量X为0
- Y = 0; //初始化整型变量Y为0
- item = 0; //初始化整型变量item为0
- radio.begin(); //初始化radio对象
- radio.openWritingPipe(address); //使用radio.openWritingPipe()函数设置的发送机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.stopListening(); // 使用radio.stopListening()函数将模块设置为发送机
- }
- void loop() {
- X = accel.getAccelerationX(); //把三轴倾斜度ADXL345传感器模块的X轴加速度数值赋值给X
- Y = accel.getAccelerationY(); //把三轴倾斜度ADXL345传感器模块的Y轴加速度数值赋值给Y
- if ((X > -100 && X < 100) && (Y > -100 && Y < 100)) { //当X轴方向即不往前也不往后,且Y轴方向即不向左倾斜也不向右倾斜时
- item = 1; //item赋值为1
- } else if ((X > 100)&& (Y > -100 && Y < 100)){ //当X轴往前倾斜时
- item = 2; //item赋值为2
- } else if ((X < -100)&& (Y > -100 && Y < 100)){ //当X轴往后倾斜时
- item = 3; //item赋值为3
- } else if ((X > -100 && X < 100) && (Y > 100)){ //当Y轴往左倾斜时
- item = 4; //item赋值为4
- } else if ((X > -100 && X < 100) && (Y < -100)){ //当Y轴往右倾斜时
- item = 5; //item赋值为5
- }
- radio.write(&item, sizeof(item)); //使用radio.write()函数将消息发送给接收机,item是要发送的整型数值变量,
- // sizeof(item)设置了我们要从item变量中获取的整型数长度。
- }
复制代码
接收端程序 Receiver.ino
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道”
- void setup() {
- Serial.begin(9600);
- pinMode(2, OUTPUT); //定义2号引脚为输出
- pinMode(3, OUTPUT); //定义3号引脚为输出
- pinMode(4, OUTPUT); //定义4号引脚为输出
- pinMode(5, OUTPUT); //定义5号引脚为输出
- pinMode(6, OUTPUT); //定义6号引脚为输出
- pinMode(9, OUTPUT); //定义6号引脚为输出
- digitalWrite(2,LOW); //初始化小车为停止状态
- digitalWrite(5,LOW);
- radio.begin(); //初始化radio对象
- radio.openReadingPipe(0, address); //使用radio.openReadingPipe()函数设置的接收机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.startListening(); // 使用radio..startListening()将模块设置为接收机
- }
- void loop() {
- if (radio.available()) { //判断是否有要接收的数据
- int text = 0; //定义一个整型变量text并赋值为0
- radio.read(&text, sizeof(text)); //读取数据,并将其存储到text变量中
- Serial.println(text); //打印变量text的数据,即接收到的数据
- delay(500); //延迟等待0.5秒
- if (text == 1) { //如果三轴倾斜度ADXL345传感器模块X轴方向即不往前也不往后,那么小车停止
- digitalWrite(2,LOW);
- digitalWrite(5,LOW);
- }
- else if (text == 2) { //如果三轴倾斜度ADXL345传感器模块X方向往前倾斜,那么小车前进
- digitalWrite(2,HIGH);
- digitalWrite(3,HIGH);
- digitalWrite(4,LOW);
- digitalWrite(5,HIGH);
- digitalWrite(6,LOW);
- digitalWrite(9,HIGH);
- }
- else if (text == 3) { //如果三轴倾斜度ADXL345传感器模块X轴方向往后倾斜,那么小车后退
- digitalWrite(2,HIGH);
- digitalWrite(3,LOW);
- digitalWrite(4,HIGH);
- digitalWrite(5,HIGH);
- digitalWrite(6,HIGH);
- digitalWrite(9,LOW);
- }
- else if (text == 4) { //如果三轴倾斜度ADXL345传感器模块Y轴方向往左倾斜,那么小车左转
- digitalWrite(2,HIGH);
- analogWrite(3,60);
- digitalWrite(4,LOW);
- digitalWrite(5,LOW);
- }else if (text == 5) { //如果三轴倾斜度ADXL345传感器模块Y轴方向往右倾斜,那么小车右转
- digitalWrite(2,LOW);
- digitalWrite(5,HIGH);
- digitalWrite(6,LOW);
- analogWrite(9,60);
- }
- }
- }
复制代码 |