Шум двигателя на arduino RC?

Поэтому я хотел сделать радиоуправляемый автомобиль на основе двух нанотехнологий arduino, двух nrf24l01 (rx и tx) и драйвера двигателя с щеткой pololu (этот), и это более или менее сработало. Иногда это работало очень хорошо, и все шло хорошо, и вдруг "зависает" и перестает принимать, и когда это происходит, сервопривод всегда переходит на 0°(я думаю, что это должен быть Rx, потому что он печатает одно и то же значение до следующего перезапуска на последовательном мониторе). Кажется, сервопривод утрояется в том же направлении (до 0°) только тогда, когда я посылаю высокие значения шим, пока не перестанет считывать новые данные и "зависнет". У меня есть 2 батареи, одна для nano с повышающим преобразователем, а другая для сервопривода и щеточного двигателя, и они имеют общую основу. Все находится близко друг к другу и соединено проводами, припаянными к макету прототипа. Это действительно грязно, но создает хороший контакт. Так что это похоже на проблему с шумом, не так ли? Но что еще это может быть? Как я могу подавить этот шум? Я уже смотрел руководство pololu по шуму, но я не пробовал обходные конденсаторы, так как не знаю, как их правильно припаять (могут ли они сжечь сервопривод?)

Вот код для Tx


#include <SPI.h>
#include "RF24.h"
const int ledBot = 8;
const int padx = A0;
const int pady = A1;
const int sw = 3;
int sws;
int x;
int y;
int botState;
int aBotState;
int ledState;
const float un = 0.25;
const float fy = 0.176; 
int sens [4]; // 0: throttle, 1: foward/backwards, 2: steering, 3: lights

RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";
void setup() {
  //Serial.begin(9600);
  pinMode(padx, INPUT);
  pinMode(pady, INPUT);
  pinMode(sw, INPUT);
  pinMode(ledBot, INPUT_PULLUP);
  radio.begin();
  radio.setDataRate (RF24_2MBPS);
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
  
}
void loop() {
  x = analogRead(padx);
  y = analogRead(pady);
  sws = digitalRead(sw);
  botState = digitalRead(ledBot);
  y = 1024-y;

  switch (sws){ //foward and backwards
  
  case 0:
    sens [0] = un*x; 
    sens [1] = 0;
    sens [2] = min(135, max(50, y*fy-2));
    break;
   
  case 1:

  
    sens [0] = un*x;
    sens [1] = 1;
    sens [2] = min(135, max(50, y*fy-2));   
    break;
  }

  if ( botState == HIGH && aBotState == LOW){ //button switch part
    if (ledState == 0){
      ledState = 1;
      sens [3] = ledState;
    }
    else {
      ledState = 0;
      sens [3] = ledState;
    }
  }
  aBotState = botState;
  radio.write(&sens, sizeof(sens));
 
 
 
 
  //Serial.println(sens[0]);
 //Serial.println(ledState);
 // Serial.println(sens[1]);
 //Serial.println(sens [3]);
  
  
}

И вот для Rx

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

int sens [4];
const int polph = 7; 
const int polen = 6; 
const int led1 = 2;
const int led2 = 3;
const int ledError = 8;


Servo servo;
RF24 radio(9, 10); // 
const byte address[6] = "00001";

void setup() {
 
  pinMode(polph, OUTPUT);
  pinMode(polen, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  
  pinMode(ledError, OUTPUT);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  delay(300);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  delay(300);
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  delay(300);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  servo.attach(5);
 //Serial.begin(9600);
  radio.begin();
  radio.setDataRate (RF24_2MBPS);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
  
}
void loop() {
  if (radio.available()) {
    digitalWrite(ledError, LOW);
    radio.read(&sens, sizeof(sens));
    analogWrite(polen, sens [0]);
    digitalWrite(polph, sens[1]);
    servo.write(sens [2]);
    digitalWrite(led1, sens [3]);
    digitalWrite(led2, sens [3]);
    
    
  }
  
  
}

Спасибо, что ответили.

, 👍1

Обсуждение

Действительно трудно диагностировать проблему, когда вы ее не видите. Опубликуйте коды и схему подключения, чтобы у кого-то действительно была надежда увидеть проблему., @Delta_G


1 ответ


1

Электрический шум является проблемой довольно часто. Чтобы свести к минимуму шум, необходимо соблюдать несколько ключевых моментов:

  1. Припаяйте по одному керамическому конденсатору емкостью 0,1 мкФ от каждой клеммы к корпусу двигателя. Они называются развязывающими конденсаторами и используются для подавления высокочастотных помех, проникающих от двигателей из-за искрения/искрения.

  2. Выберите подходящий рейтинг AWS для ваших проводов двигателя и адекватный источник питания. Неподобающе тонкие провода или недостаточный ток разряда батареи могут привести к резкому падению напряжения при ускорении, что приведет к внезапным сбросам микроконтроллера (сбросам коричневого цвета).

  3. Поверните провода друг вокруг друга. Это помогает еще больше свести на нет арочный шум.

Что касается Arduino, то это не лучший способ создания надежного программного обеспечения RC, потому что оно делает ужасно неправильные простые вещи, например, последовательный опрос программного обеспечения вместо использования аппаратного захвата ввода. Я бы настоятельно рекомендовал научиться писать прошивку для микроконтроллеров в собственном режиме.

Ознакомьтесь с этой ссылкой, чтобы получить некоторое представление о том, как создать драйвер RC-двигателя:

https://github.com/neoxic/STM8-RC-PWM-Mixer#building-a-dual-12a-bidirectional-esc

,