Skocz do zawartości

Sterowanie dwoma silnikami przez NRF24 + kilka pytań


Seraphim

Pomocna odpowiedź

Witajcie,

Jestem na etapie budowy pojazdu elektrycznego na napięcie 24V. Taki rodzaj platformy pod kosiarkę spalinową z napędem w postaci dwóch silników od wózka inwalidzkiego. Póty co jestem na etapie prototypu w mikro skali i testowania go. Posłużyłem się arduino, 2 x NRF2401 , joystick oraz L298N - taki standard ogólnie znany. W przypadku spełnienia już założeń pokładanych w nim zamienię wspomniany L298N na BTS7960 który będzie obsługiwał silniki z reduktorem DC 200W każdy. Nie mniej jednak podczas programowania wyszły pewne kwiatki, a mianowicie:

1. W przypadku uruchomienia najpierw odbiornika, a później nadajnika pojazd zaczyna kręcić jednym silnikiem (prawym). Teraz to nie problem, ale jak to będzie ważyło kilkanaście kg to może zrobić krzywdę. Czy to kod jest zły, czy zakłócenia? Da się to wyeliminować?

2. Ze względu na dużą czułość joysticka niewiele potrzeba żeby osiągnąć max obroty - obawiam się, że będzie to duży prąd na początku dla silników dlatego zacząłem coś kombinować z kodem, żeby wprowadzić "miękki start". Nie wychodzi mi to - po uruchomieniu zaczyna kręcić na dwa koła - dlatego ten fragment kodu jest w komentarzu.

3.Czy ktoś badał temat instalowania kondensatorów ceramicznych na module NRF2401 na sekcji zasilania? Chciałem kupić i zamontować kondensatory SMD 0603 na 6,3V samsunga 1uF + 4,7uF. Coś dołożyć, bądź innego zmontować?

Poniżej przedstawiam kody na nadajnik i odbiornik:

Odbiornik:

/* ODBIORNIK */
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define enA 3  
#define in1 2
#define in2 4
#define enB 6   
#define in3 5
#define in4 7
RF24 radio(8, 9); // CE, CSN
const byte address[6] = "00001";
char receivedData[32] = "";
int  xAxis, yAxis;
int motorSpeedA = 0;
int motorSpeedB = 0;
int motorSpeedAOld = 0;
int motorSpeedBOld = 0;
int przysp = 3;

void setup() {
  pinMode(enA, OUTPUT); // sterowanie PWM silnik A
  pinMode(enB, OUTPUT); // sterowanie PWM silnik B
  pinMode(in1, OUTPUT); // sterowanie kierunkiem 1 silnik A
  pinMode(in2, OUTPUT); // sterowanie kierunkiem 2 silnik A
  pinMode(in3, OUTPUT); // sterowanie kierunkiem 1 silnik B
  pinMode(in4, OUTPUT); // sterowanie kierunkiem 2 silnik B
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {   // Jesli modul odbiera
   
    radio.read(&receivedData, sizeof(receivedData)); // odczyt danych
    xAxis = atoi(&receivedData[0]); // konwersja X do integera
    delay(10);
    
    radio.read(&receivedData, sizeof(receivedData)); // odczyt danych
    yAxis = atoi(&receivedData[0]); // konwersja Y do integera
    delay(10);
  }

  // OŚ X - STEROWANIE PINAMI DLA KIERUNKU TYŁ (dla wartości analogowej x poniżej 490)(przyjęto średnią 510 +-20)
  if (xAxis < 510) {
    // kierunek tył dla silnika A
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    // kierunek tył dla silnika B
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    // Konwersja danych z osi X z 490 do 0 do PWM 0-255:
    motorSpeedA = map(xAxis, 490, 0, 0, 255);
    motorSpeedB = map(xAxis, 490, 0, 0, 255);
  }
  // OŚ X - W INNYM PRZYPADKU - STEROWANIE PINAMI DLA KIERUNKU PRZÓD (dla wartości analogowej x powyżej 530)
  else if (xAxis >= 510) {
    // kierunek przód dla silnika A:
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    // kierunek przód dla silnika B 
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    // Konwersja danych z osi Y z 530 do 1023 do zmiennej motorspeed A i B w zakresie od 0 do 255 (PWM)
    motorSpeedA = map(xAxis, 530, 1023, 0, 255);
    motorSpeedB = map(xAxis, 530, 1023, 0, 255);
  }
  // Jeśli dżojstick jest na środku to nic nie rób:
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }
  // OŚ Y - MODYFIKACJA PRĘDKOŚCI SILNIKÓW - KIEROWANIE
  if (yAxis < 490) // skręt w lewo
   { int xMapped = map(yAxis, 490, 0, 0, 255); // Konwersja danych z osi Y z 490 do 0 do PWM 0-255
    // skręt w lewo - silnik A minus
    motorSpeedA = motorSpeedA - xMapped;
    
    // Określenie limitu dla sygnału PWM (od 0 do 255)
    if (motorSpeedA < 0) {
    motorSpeedA = 0; // w przypadku gdyby wartość miała być poniżej 0
    }
    if (motorSpeedB > 255) {
    motorSpeedB = 255; // w przypadku gdyby wartość miała być powyżej 255
    }
  }
  
  if (yAxis > 530) // skręt w prawo
   { int xMapped = map(yAxis, 530, 1023, 0, 255); // Konwersja danych z zwiększania wartości X zakres od 530 do 1023 -> 0-255 - PWM
    // skręt w prawo - silnik B minus:
    motorSpeedB = motorSpeedB - xMapped;
    // Określenie limitu dla sygnału PWM dla poszczególnych silników:
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  /* //miękki start:
  if (motorSpeedA >= motorSpeedAOld) {
  motorSpeedA = motorSpeedAOld + przysp;
  }
  if (motorSpeedB >= motorSpeedBOld) {
  motorSpeedB = motorSpeedBOld + przysp;
  }
  motorSpeedAOld = motorSpeedA;
  motorSpeedBOld = motorSpeedB; */
  
    analogWrite(enA, motorSpeedA); // Wysłanie PWM signal do silnika A
  analogWrite(enB, motorSpeedB); // Wysłanie PWM signal do silnika B 
}

Nadajnik:

// Nadajnik

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8,9); // CE, CSN
const byte address[6] = "00001";
char xyData[32] = "";
String xAxis, yAxis;
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}
void loop() {
  
  xAxis = analogRead(A1); // odczyt analogowy osi X
  yAxis = analogRead(A0); // odczyt analogowy osi Y
 
  // WARTOŚĆ X
  xAxis.toCharArray(xyData, 5); // stringowy charakter X
  radio.write(&xyData, sizeof(xyData)); // wysyłka wartości X do NRF24L01
 
  // WARTOŚĆ Y
  yAxis.toCharArray(xyData, 5); // stringowy charakter Y
  radio.write(&xyData, sizeof(xyData)); // wysyłka wartości X do NRF24L01
  
  delay(20);
  Serial.println("X:");
  Serial.println(xAxis);
  Serial.println("Y:");
  Serial.println(yAxis);  
}

Schematu nie wstawiłem, bo myślę że każdy kto miał styczność z 298 wie jaki jest 🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.