如何用arduino nano 做一个滑翔机-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1118|回复: 3

如何用arduino nano 做一个滑翔机

[复制链接]
发表于 2022-4-17 19:20 | 显示全部楼层 |阅读模式
本产品主要用的是nrf24l01 PA通信
接收端代码
//发送端
#include<SPI.h>
#include"RF24.h"
#include<nRF24L01.h>
#include "LiquidCrystal_I2C.h"
#include "Wire.h"
//定义RF的引脚
int ce = 7;
int  csn = 8;
//定义左边遥感的引脚
int  vrx_left = A0;
int vry_left = A1;
int  button_left = A2;
//定义右边遥感的引脚
int vrx_right  = A3;
int vry_right = A4;
int button_right = A5;
//定义一个点位器的引脚
int dianweiqi1 = A8;
int  dianweiqi2 = A9;
int button_left_read=45;
int button_right_read=22;
LiquidCrystal_I2C mylcd(0x27, 16, 2);//初始化一个IIC
RF24 radio(ce, csn);
//定义一个结构体来存放摇杆的值
int i ,clk,dangwei;
String lr,lr1;

float poting1, poting2;
const byte address[6] = "00001";


void setup()
{
  mylcd.init();            //、、、、、、、、、、、、、、、、、、、、、、、初始化liquidcrytal_2c
  mylcd.backlight();

  Serial.begin(9600);
  delay (1000);

  delay (1000);
  Serial.print("");
  radio.begin();
  radio.openWritingPipe(address);   //要写入的地址
  //数组长度,以及地址
  radio.setPALevel(RF24_PA_MAX);     //发送最小距离
  radio.stopListening();
  pinMode(vrx_left, INPUT);           //定义了引脚,输出值据查,应该值为0-1023
  pinMode(vry_left, INPUT);
  pinMode(button_left, INPUT);
  pinMode(vrx_right, INPUT);
  pinMode(vry_right, INPUT);
  pinMode(button_right, INPUT);
   pinMode(dianweiqi1, INPUT);
   pinMode(dianweiqi2, INPUT);
   pinMode(button_left_read, INPUT);
    pinMode(button_right_read=22, INPUT);
}

void loop()
{
  struct data_pack
{
  byte left_pot_Y;
  byte left_pot_X;
  byte left_button;
  byte right_pot_Y;
  byte right_pot_X;
  byte right_button;
  byte poting1;
  byte poting2;
  byte  button_left_read;
  byte  button_right_read;
};
data_pack data;

  data.left_pot_Y = map(analogRead(vrx_left), 504, 1023, 1, 255);
  data.left_pot_X = map(analogRead(vry_left), 0, 1023, 1, 255);
  data.left_button = digitalRead(button_left);
  data.right_pot_Y = map(analogRead(vrx_right), 0, 1023, 1, 255);
  data.right_pot_X = map(analogRead(vry_right), 0, 1023, 1, 255);
  data.right_button = digitalRead(button_right);
  data.poting1 = map(analogRead(dianweiqi1), 0, 1023, 1, 255);
  data.poting2 = map(analogRead(dianweiqi2), 0, 1023, 1, 255);
  data.button_left_read=digitalRead(button_left_read);
  data.button_right_read=digitalRead(button_right_read);
   radio.write(&data, sizeof(data_pack));

if(data.left_pot_Y>70)
{
  dangwei=1;
  }
if(data.left_pot_Y>170)
{
  dangwei=2;
  }
  if(data.left_pot_Y>230)
{
  dangwei=3;
  }


if(data.right_pot_X==1)
{
  lr="left";
  }
else  if(data.right_pot_X==255)
{
  lr="righ";
  }
else   if(data.right_pot_X>120&&data.right_pot_X<135)
{
  lr="goo!";
  }





if(data.right_pot_Y<20)
{
  lr1="dow";
  }
  else  if(data.right_pot_Y>240)
{
  lr1="UP~";
  }else if(data.right_pot_X>120&&data.right_pot_X<135)
{
  lr1="go!";
  }

mylcd.setCursor(0,0);
  mylcd.print("G:");       //在1602上面显示T;
  mylcd.setCursor(2,0);    //光标放在第五列第一行
  mylcd.print(dangwei);
  mylcd.setCursor(4,0); //光标放在第一行第二列
  mylcd.print("F:");
  mylcd.setCursor(6,0);
  mylcd.print(lr);
  mylcd.setCursor(11,0); //光标放在第一行第二列
  mylcd.print("Q:");
  mylcd.setCursor(13,0);
  mylcd.print(lr1);
  mylcd.setCursor(0,1);
  mylcd.print("DL:");
  mylcd.setCursor(3,1);
  mylcd.print(data.poting1);
  mylcd.setCursor(7,1);
  mylcd.print("RP:");
  mylcd.setCursor(10,1);
  mylcd.print(data.poting2);
   mylcd.setCursor(13,1);
  mylcd.print(data.button_left_read);
   mylcd.setCursor(15,1);
  mylcd.print(data.button_right_read);
    Serial.println(data.right_pot_X);

  clk=millis();
  if(clk%10==0)
  {
   mylcd.clear();
   clk=0;
  }

}
接收端

#include<SPI.h>
#include <RF24.h>
#include <Servo.h>
#include<nRF24L01.h>

int ce = 7;
int sec =8;
int dianji1_pin = A0; //电机
int dianji2_pin = A2; //电机
int myservo_left_pin = 3; //左翅膀电机
int myserve_right_pin = 5;  //右翅膀电机
int myservo_last_pin  = 9;  // 机尾左右机
int myservo_buttom_pin = 4;  //机尾升降机
int myservo_duraction_pin = 10; // 滑轮左右摇摆
int led = 6;
RF24 radio(ce, sec);

struct data_pack1
  {
    byte left_pot_Y;
    byte left_pot_X;
    byte left_button;
    byte right_pot_Y;
    byte right_pot_X;
    byte right_button;
    byte poting1;
    byte poting2;
    byte  button_left_read;
    byte  button_right_read;
  };
  data_pack1 data1;

Servo dianji1;
Servo dianji2;
Servo myservo_left;
Servo myserve_right;
Servo myservo_last;
Servo myservo_buttom;
Servo myservo_duraction;
const byte address[6] = "00001";

int throttleValue, rudderValue = 90, elevatorValue = 80, aileron1Value = 90, aileron2Value, travelAdjust1, travelAdjust2;
void setup()
{
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);   //要写入的地址
  radio.setPALevel(RF24_PA_MAX);
  radio.startListening(); //  Set the module as receiver

  dianji1.attach(dianji1_pin);
  dianji2.attach(dianji2_pin);
  myservo_left.attach(myservo_left_pin);
  myserve_right.attach(myserve_right_pin);
  myservo_last.attach(myservo_last_pin);
  myservo_buttom.attach(myservo_buttom_pin);
  myservo_duraction.attach(myservo_duraction_pin);

  pinMode(led, OUTPUT);
}
void loop()
{
  if (radio.available())
  {

    travelAdjust1 = map(data1.poting1, 0, 255, 1000,1700 );
    travelAdjust2 = map(data1.poting2, 0, 255, 0, 35);
    radio.read(&data1, sizeof(data_pack1));//读取整个数据并存储到'data'结构中
    throttleValue = map(data1.left_pot_Y, 0, 255, travelAdjust1, 2000);
    //
 楼主| 发表于 2022-4-18 18:14 | 显示全部楼层
哈哈哈哈哈哈哈
 楼主| 发表于 2022-4-18 18:15 | 显示全部楼层

感谢各位大佬的帮助
这是他们的博客,以及问题解决方法
程序看上去毫无问题;
你用的是印刷天线的小NRF模块还是带有SMA天线的NRF+PA+LNA模块?前者用板子的3.3V供电就行,后者需要专门加转接板,且转接板需要5V供电。直接用5V给NRF模块供电可能会烧坏
    此外,建议检查一下SPI的接线是否正确(MOSI、MISO有没有接反,CE、CSN有没有接反)如果软硬件都没有问题,那么很有可能是模块坏了虽然“一出问题就怀疑是硬件损坏”是一种毛病,但这种事情真的存在。我也买到过内部短路/死活读不出数的NRF模块,别人都行就它不行。只能换一家买
NRF+PA+LNA输入电压3.3V,但其所需的工作电流大于Arduino控制板3.3V端口所能提供的最大电流。
目前最有效的解决方案是使用转接板 / 接口转换板。接线方式如图(楼下试着发);需要注意的是转接板的VCC连接Arduino的5V供电端口。除了简化接线,转接板也实现了5V到3V的电压转换,以及电容过滤交流信号(1)的功能。使用转接板后通信正常,有轻微的丢包现象,影响不大。
   Arduino官方论坛上有人建议用2节5号碱性电池(AA)给NRF+PA+LNA供电,同时在VCC和GND之间接一只10uF电容,用于滤除供电电压信号中的交流分量。但是这一方法本人亲测不可行。卖给我NRF+PA+LNA的商家表示自己一直用转接板测试产品,2节AA电池仍然不能起到很好的供电作用。
(1)这个交流分量主要是噪音信号,因此电容要尽可能地靠进NRF+PA+LNA的VCC、GND脚。个人猜测交流信号是外界磁场在电路中通过电磁感应激发的,很微弱,但对高功率通信模块干扰很大。
(53条消息) nrf24l01引脚图及功能_教大家使用NRF24L01做一个无线遥控开关,远程控制很方便!..._颢卿的博客-CSDN博客
用Mirf库实现NRF24L01及同类无线模块收发数据-Arduino中文社区 - Powered by Discuz!
问题解决:参考
Arduino+nRF24L01+PA+LNA-Arduino中文社区 - Powered by Discuz!
关于mega2560与nrf24l01通讯的探讨-Arduino中文社区 - Powered by Discuz!

 楼主| 发表于 2022-4-18 18:16 | 显示全部楼层
程序看上去毫无问题;
你用的是印刷天线的小NRF模块还是带有SMA天线的NRF+PA+LNA模块?前者用板子的3.3V供电就行,后者需要专门加转接板,且转接板需要5V供电。直接用5V给NRF模块供电可能会烧坏
    此外,建议检查一下SPI的接线是否正确(MOSI、MISO有没有接反,CE、CSN有没有接反)如果软硬件都没有问题,那么很有可能是模块坏了虽然“一出问题就怀疑是硬件损坏”是一种毛病,但这种事情真的存在。我也买到过内部短路/死活读不出数的NRF模块,别人都行就它不行。只能换一家买
NRF+PA+LNA输入电压3.3V,但其所需的工作电流大于Arduino控制板3.3V端口所能提供的最大电流。
目前最有效的解决方案是使用转接板 / 接口转换板。接线方式如图(楼下试着发);需要注意的是转接板的VCC连接Arduino的5V供电端口。除了简化接线,转接板也实现了5V到3V的电压转换,以及电容过滤交流信号(1)的功能。使用转接板后通信正常,有轻微的丢包现象,影响不大。
   Arduino官方论坛上有人建议用2节5号碱性电池(AA)给NRF+PA+LNA供电,同时在VCC和GND之间接一只10uF电容,用于滤除供电电压信号中的交流分量。但是这一方法本人亲测不可行。卖给我NRF+PA+LNA的商家表示自己一直用转接板测试产品,2节AA电池仍然不能起到很好的供电作用。
(1)这个交流分量主要是噪音信号,因此电容要尽可能地靠进NRF+PA+LNA的VCC、GND脚。个人猜测交流信号是外界磁场在电路中通过电磁感应激发的,很微弱,但对高功率通信模块干扰很大。
(53条消息) nrf24l01引脚图及功能_教大家使用NRF24L01做一个无线遥控开关,远程控制很方便!..._颢卿的博客-CSDN博客
用Mirf库实现NRF24L01及同类无线模块收发数据-Arduino中文社区 - Powered by Discuz!
问题解决:参考
Arduino+nRF24L01+PA+LNA-Arduino中文社区 - Powered by Discuz!
关于mega2560与nrf24l01通讯的探讨-Arduino中文社区 - Powered by Discuz!

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:40 , Processed in 0.225826 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表