我们基于arduino用nrf24l01模块来远程控制电机,已经调试到可以正常工作的程度,然后我们将nrf24l01上的线改接为2m长线,这时发现异常,电机不听遥控控制了,经过排查我们发现nrf24l01上的mosi口和sck口出现问题。
我们将其他的口换为长线后,一切正常。
当sck口与mosi口都接为长线后,尽管遥控器没有接入电源,在没有收到信号的情况下,仍然读取到信号为0,打开遥控器电源后也依然只读取到0;
将mosi口改回短线,sck口保持长线,则同上;
将sck口改回短线,而mosi保持长线,则没有收到任何信号,打开遥控电源后依然没有读取到任何信号;
将mosi也改回短线后,一切恢复正常。
实在无法理解出现什么问题,请赐教
代码如下
遥控端
:
```#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 9);
const byte address[6] = "00001";
char xyData[32] = "";
String xAxis, yAxis;
boolean shang=0;
boolean xia=0;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
xAxis = analogRead(A0);
yAxis = analogRead(A1);
shang = digitalRead(A2);
xia = digitalRead(A3);
xAxis.toCharArray(xyData, 5);
radio.write(&xyData, sizeof(xyData));
yAxis.toCharArray(xyData, 5);
radio.write(&xyData, sizeof(xyData));
radio.write(&shang,sizeof(shang));
radio.write(&xia,sizeof(xia));
Serial.print(shang);
Serial.print(xia);
delay(40);
}
电机端
:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define enA 5
#define in1 6
#define in2 7
#define enB 2
#define in3 3
#define in4 4
#define enC A4
#define in5 A2
#define in6 A3
RF24 radio(8, 9);
const byte address[6] = "00001";
char receivedData[32] = "";
boolean shang=1;
boolean xia=1;
int xAxis=525, yAxis=525;
int motorSpeedA = 0;
int motorSpeedB = 0;
int motorSpeedC = 0;
void setup() {
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(in5, OUTPUT);
pinMode(in6, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
xia=1;
radio.read(&receivedData, sizeof(receivedData)); // Read the data and put it into character array
xAxis = atoi(&receivedData[0]); // Convert the data from the character array (received X value) into integer
Serial.print(xAxis);
delay(10);
radio.read(&receivedData, sizeof(receivedData));
yAxis = atoi(&receivedData[0]);
delay(10);
radio.read(&shang, sizeof(shang));
delay(10);
radio.read(&xia,sizeof(xia));
delay(10);
if(shang==0&&xia==1)
{
digitalWrite(in5,HIGH);
digitalWrite(in6,LOW);
motorSpeedC=200;
}
else if(shang==1&&xia==0)
{
digitalWrite(in6,HIGH);
digitalWrite(in5,LOW);
motorSpeedC=200;
}
else motorSpeedC=0;
}
if (yAxis < 470) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
motorSpeedA = map(yAxis, 470, 0, 0, 255);
motorSpeedB = map(yAxis, 470, 0, 0, 255);
}
else if (yAxis > 550) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
motorSpeedA = map(yAxis, 550, 1023, 0, 255);
motorSpeedB = map(yAxis, 550, 1023, 0, 255);
}
else {
motorSpeedA = 0;
motorSpeedB = 0;
}
if (xAxis < 470) {
int xMapped = map(xAxis, 470, 0, 0, 255);
motorSpeedA = motorSpeedA - xMapped;
motorSpeedB = motorSpeedB + xMapped;
if (motorSpeedA < 0) {
motorSpeedA = 0;
}
if (motorSpeedB > 255) {
motorSpeedB = 255;
}
}
if (xAxis > 550) {
int xMapped = map(xAxis, 550, 1023, 0, 255);
motorSpeedA = motorSpeedA + xMapped;
motorSpeedB = motorSpeedB - xMapped;
if (motorSpeedA > 255) {
motorSpeedA = 255;
}
if (motorSpeedB < 0) {
motorSpeedB = 0;
}
}
if (motorSpeedA < 70) {
motorSpeedA = 0;
}
if (motorSpeedB < 70) {
motorSpeedB = 0;
}
analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
analogWrite(enB, motorSpeedB);// Send PWM signal to motor B
analogWrite(enC, motorSpeedC);
}
这么长的线不出问题那才是异常
1,降低工作频率
2,对两条线都进行上拉,增加驱动能力