Arduino pojazd zdalnie sterowany

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
Mimal9999
Majsterkowicz
Posty: 64
Rejestracja: 6 wrz 2016, 18:24

Arduino pojazd zdalnie sterowany

Post autor: Mimal9999 » 5 mar 2018, 21:46

Witam. Od jakiegoś czasu (rok może więcej) staram się zrobić pojazd podobny do czołgu (skręcanie). Mimo że projekt wydaje się łatwy a czas bardzo długi to jest on spowodowany licznymi problemami. Aktualnie nie mam pojęcia co zrobiłem źle, ale pojazd nie chce skręcać, a czasem prawidłowo jeździć. Robot jest sterowany przez klona Arduino MEGA tak samo jak pilot. Sterowanie odbywa się za pomocą modułów NRF24. Do sterowania silnikami używam https://learn.adafruit.com/adafruit-mot ... pper-class oraz czterech silników DC z przekładnią Zasilanie z baterii 9V - shield i arduino dwoma oddzielnymi. Jazda przód / tył odbywa się prawie prawidłowo. Czasem pilot nie chce się połączyć z pojazdem i albo nic się nie dzieje, albo robot zaczyna jechać sam w losowym kierunku, albo wszystko działa normalnie. Skręcanie natomiast powoduje przygaszenie lekko diody na sterowniku, robot lekko drga we wskazanym kierunku i zwykle przestaje reagować na następne polecenia. To może być wina zasilania, ale nie wiem jakiego użyć. Następny problem to piszczenie robota w bezruchu, tak jakby silniki chciały się poruszyć, ale bardzo powoli. Próbowałem pare razy, ale nie wiem jak to wyeliminować. Czy ktoś wie czy problem jest w kodzie, czy w samym urządzeniu? Albo może ktoś ma lepsze rozwiązanie jak to zrobić żeby tylko działało? Z góry dziękuję za pomoc i mam nadzieję, że tym razem uda mi się otrzymać odpowiedź (już parę moich tematów zostało porzuconych).

Pilot:

Kod: Zaznacz cały

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


#define BACKLIGHT_PIN 3

LiquidCrystal_I2C	lcd(0x27,2,1,0,4,5,6,7);
//================================================================
//Biblioteki
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//Biblioteki
//===============================================================
//Radio

RF24 radio(9, 10);

const byte rxAddr[6] = "00001";

int pre[6];
int j = 0;
int jj = 0;
int dzwiek;
int swiatlo;
int dzw;
int swi;


//Radio
//================================================================
//Joysticki

int xPin = A0;
int yPin = A1;  //pierwszy joy
int buttonPin = 2;

int xPin2 = A2;
int yPin2 = A3;  //drugi joy
int buttonPin2 = 3;

int xPosition = 0;
int yPosition = 0;  //pierwszy joy
int buttonState = 0;

int xPosition2 = 0;
int yPosition2 = 0;  //drugi joy
int buttonState2 = 0;

//Joysticki
//================================================================


void setup()
{
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  
  lcd.begin (16,2);
 lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
 lcd.setBacklight(HIGH);
  
  Serial.begin(9600);
  
  pinMode(xPin, INPUT);//joy 1
  pinMode(yPin, INPUT);//joy 1
  
  pinMode(xPin2, INPUT);//joy 2
  pinMode(yPin2, INPUT);//joy 2
  
  pinMode(buttonPin, INPUT_PULLUP); 
  pinMode(buttonPin2, INPUT_PULLUP); 
  
  pinMode(6, INPUT_PULLUP); //przycisk
  radio.begin();
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);
  
  radio.stopListening();
}

void loop()
{
  xPosition = analogRead(xPin);
  yPosition = analogRead(yPin);
  buttonState = digitalRead(buttonPin);
  
  xPosition2 = analogRead(xPin2);
  yPosition2 = analogRead(yPin2);
  buttonState2 = digitalRead(buttonPin2);

//Joy
//================================================================
  
//  if (digitalRead(6) == LOW)
//  {
//    
//  const char text[] = "Hello World";
//  radio.write(&text, sizeof(text));
//  
//  delay(1000);
  // Serial.println("X  1 : ");
 // Serial.println(xPosition);
  
 // Serial.println("X  2 : ");
  //Serial.println(yPosition);
 // Serial.println(analogRead(A6));
  if (analogRead(A6) == 0)
  {
    dzwiek = 0;
  }
  if (analogRead(A6) != 0) 
  {
    dzwiek = 1;
   
  }
  
  if (analogRead(A7) == 0)
  {
    swiatlo = 0;
  }
  if (analogRead(A7) != 0) 
  {
    swiatlo = 1;
   
  }
  
  
  pre[0] = yPosition;
  pre[1] = yPosition2;
  pre[2] = dzwiek;
  pre[3] = swiatlo;
  pre[4] = buttonState;
  pre[5] = buttonState2;
  
  Serial.println(yPosition2);
  
  radio.write(&pre, sizeof(pre));
 
   //j = ( xPosition - 516 ) / 2;
   //jj = j;
  //radio.write(&yPosition, sizeof(int));
 // if (j < 0)
  // {
  //      jj = j * (-1);
  // }
  //Serial.println(j);
  
  lcd.home ();
  lcd.print("  Predkosc = ");
  lcd.print(jj);
  delay(20);
  lcd.clear();  
  

  
  
}


Pojazd:

Kod: Zaznacz cały

//Biblioteki
//================================================================
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <AFMotor.h>
//Biblioteki
//================================================================
//Radio

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

RF24 radio(22, 23);

const byte rxAddr[6] = "00001";

int pre[6];

//Radio
//================================================================
//Silniki

 int predkosc;


 int yPosition;
 int yPosition2;
 int dzw;
 int swi;
 int button;
 int button2;

 

 void setup() {
  // put your setup code here, to run once:
  
 
  while (!Serial);
  Serial.begin(9600);
  
   
  radio.begin();
  radio.openReadingPipe(0, rxAddr);
  
  radio.startListening();
}

 void loop() {
  // put your main code here, to run repeatedly:
  
  
  int j = 0;
  int jj = 0;
  int dzw = 0;
  
  if (radio.available())
  {
    //char text[32] = {0};
    
    radio.read(&pre, sizeof(pre));
    //radio.read(&yPosition, sizeof(int));
    //radio.read(&yPosition, sizeof(int));
    //Serial.println(pre[0]);
    //Serial.println(pre[1]);
    
    //Serial.println(xPosition);
    //Serial.println(yPosition);
    
    yPosition = pre[0];
    yPosition2 = pre[1];
    dzw = pre[2];
    swi = pre[3];
    button = pre[4];
    button2 = pre[5];
    
    
    //Serial.println(pre[0]);
    
    if (button == 0)
    {
     //digitalWrite(24, HIGH); 
    
    }
    if (button != 0)
    {
     //digitalWrite(24, LOW); 
     
    }
    
    if (swi != 0)
    {
     // noTone(buzzer);
    }
    if (swi == 0)
    {
//      tone(buzzer, 3830);
//      delay(10);
//      tone(buzzer, 3400);
//      delay(10);
//      tone(buzzer, 3038);
//      delay(10);
//      tone(buzzer, 2864);
//      delay(10);
//      tone(buzzer, 2550);
//      delay(10);
//      tone(buzzer, 2272);
//      delay(10);
//      tone(buzzer, 2028);
//      delay(10);
//      tone(buzzer, 1912);
//      delay(10);
    }
    
    if (dzw == 0)
    {
     // digitalWrite(22, LOW);
    }
    if (dzw != 0)
    {
      //digitalWrite(22, HIGH);
    }

    j = ( yPosition - 535 ) / 2; //lewe koła
    
    
    //(1023 - 535) / 2
    if (j > 0)
    {
        predkosc = j;
        if (predkosc > 240)
          predkosc = 255;
        

         motor3.run(FORWARD);
         motor4.run(FORWARD);
         

          motor3.setSpeed(predkosc);
          motor4.setSpeed(predkosc);
        Serial.println("back");
        Serial.println(predkosc);
        
    }
    if (j == 0)
    {
     predkosc = j;
       Serial.println("stop");

          motor3.run(RELEASE);
          motor4.run(RELEASE);
          

          //motor3.setSpeed(0);
         // motor4.setSpeed(0);        
       
       
      
    }
    //(0 - 535) / 2
   if (j < 0)
   {
        predkosc = j * (-1);
        if (predkosc > 255)
          predkosc = 255;
        

          motor3.run(BACKWARD);
          motor4.run(BACKWARD);

          motor3.setSpeed(predkosc);
          motor4.setSpeed(predkosc);
        
        Serial.println("adv");
        Serial.println( predkosc);
        
    }
    
//==================================================================================================================================    
    jj = ( yPosition2 - 498 ) / 2; //prawe koła

    
    
    if (jj > 0)
    {


          predkosc = jj;
        if (predkosc > 240)
          predkosc = 255;
        

         motor1.run(FORWARD);
         motor2.run(FORWARD);
         

          motor1.setSpeed(predkosc);
          motor2.setSpeed(predkosc);
        Serial.println("back");
        Serial.println(predkosc);
        
    }
    if (j == 0)
    {
         motor1.run(RELEASE);
         motor2.run(RELEASE);
         

         // motor1.setSpeed(0);
        //  motor2.setSpeed(0);
      
    }
   if (jj < 0)
   {

        
         predkosc = jj * (-1);
        if (predkosc > 255)
          predkosc = 255;
        

          motor1.run(BACKWARD);
          motor2.run(BACKWARD);

          motor1.setSpeed(predkosc);
          motor2.setSpeed(predkosc);
        
        Serial.println("adv");
        Serial.println( predkosc);
    }
    
    
    
    
   
  }
 }

 

// void lewo() 
// {
//   motor1.run(FORWARD);
//   motor2.run(FORWARD);
//    motor1.setSpeed(255);
//    motor2.setSpeed(255);
//    
//    
//  motor3.run(BACKWARD);
//   motor4.run(BACKWARD);
//    motor3.setSpeed(255);
//    motor4.setSpeed(255);
// }
//  void prawo() 
// {
//   motor1.run(BACKWARD);
//   motor2.run(BACKWARD);
//    motor1.setSpeed(255);
//    motor2.setSpeed(255);
//    
//    
//  motor3.run(FORWARD);
//   motor4.run(FORWARD);
//    motor3.setSpeed(255);
//    motor4.setSpeed(255);
// }
 


 

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


ODPOWIEDZ

Strony partnerskie: