Visualizza messaggio singolo
Vecchio 05 maggio 20, 18:11   #116 (permalink)  Top
Smsteves
User
 
Data registr.: 03-05-2020
Residenza: milano
Messaggi: 47


Bene, quindi c'e' una soluzione..
Ma hai provato con i due servi dello sterzo anteriore e posteriore? L'unico problema e' che i circa 2.8 decimi di secondo di ritardo tra davanti e dietro ti possano creare dei problemi..

Ti metto qui lo sketch che ho modificato io, mi sono dilettato ad aggiungere funzioni.

1) centratura Automatica del servo
Accendi tx poi la ricevente non tocchi nulla e conti fino a 5
2) Maxspeed automatico e Slowlimit invece pure..
Basta accellerare al max, quando lo fai aggiorna maxspeed e slowlimit

Cosi' chiunque volesse provarlo non deve trovare i valori della sua configurazione.

Il bello del software e' che vi sono molte strade per fare la stessa cosa, alcune lunghe e impervie alcune semplici e rettilinee… e alcune illuminate da led
Se si fa per gioco e modellismo e' anche divertente…

Smsteves

Codice:

/*
 * Created by Stefano Prevedini
 * Date 05/05/2020 V0.1
 * Project: Arduino Four Steering Wheels Control 
*/
 

#define Tolerance 5 //-- if poor quality servo vibrates try 5
#define Max_gain 500 //-- gain steering reduction by throttle if reverse add -
//#define Slowlimit 1600 //-- slow forward without endpoint correction
#include <Servo.h>
Servo myservo;


unsigned int Rxpulse;
unsigned int Gaspulse ;
unsigned int Gascorse ;
unsigned int Gain;
unsigned int Neutral;// -- minimum forward signal
signed int NewPos, OldPos;
int  Stato;
int Stato_Led = 0;
int Ledpin = 13;
int Led = 0;
boolean Cmd_Led = false;
unsigned int Maxspeed; // -- maximum forward signal
unsigned int Antsx ; // -- in front servo signal sx
unsigned int Antdx; // -- in front servo signal dx
unsigned int Postsx; // out rear servo sx endpoint if inverted with postdx it reverse
unsigned int Postdx; //-- out rear servo dx endpoint if inverted with postsx it reverse
unsigned int Center = 0; //-- add or subtract xx value to center steering
unsigned int Slowlimit = 200;
unsigned int Sterzo = 300;
unsigned int Scala_GAS = 1;
unsigned int Scala_RX = 1;
double Percentuale;

void setup() {
  pinMode(7, INPUT); //-- throttle signal in pin
  pinMode(8, INPUT); //-- front servo signal in pin
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  pinMode(Cmd_Led, OUTPUT);
  myservo.attach(10); //-- rear servo signal out pin
  Stato = 0;
}

void loop() {
  if (millis() < 50) {
    Stato == 10;
    Led = 10;
    noInterrupts();
    Neutral = pulseIn(7, HIGH);
    Center = pulseIn(8, HIGH);
    interrupts();
    Postsx = Center - Sterzo;
    Postdx = Center + Sterzo;
    Antsx = Center - Sterzo;
    Antdx = Center + Sterzo;
    Maxspeed = Neutral + Gascorse;
  }
  if ((millis() > 2000) && (millis() < 3100)) {
    Serial.print("*******************");
    Serial.print("\n");
    delay(50);
    Stato == 10;
    Maxspeed=Neutral+100;
    Slowlimit=Neutral+50;
  }
  
  if (Stato == 0) {
    noInterrupts();
    Rxpulse = pulseIn(8, HIGH);
    Gaspulse = pulseIn(7, HIGH);
    interrupts();
    if (Rxpulse > (Sterzo + Center))  {
      Sterzo = Rxpulse - Center;
      Gain = Sterzo;
    }
    if (Rxpulse < (Center - Sterzo))  {
      Sterzo = Center - Rxpulse;
      Gain = Sterzo;
    }
    Rxpulse = Rxpulse - Antsx;
    Rxpulse = Rxpulse / Scala_RX;
    Rxpulse = Rxpulse * Scala_RX ;
    Rxpulse = Rxpulse + Antsx;
    if (Gaspulse > Maxspeed)  {
      Maxspeed = Gaspulse;
      Slowlimit = ((Maxspeed - Neutral) / 3) + Neutral;
    }
    Gaspulse = Gaspulse - Neutral;
    Gaspulse = Gaspulse / Scala_GAS;
    Gaspulse = Gaspulse * Scala_GAS;
    Gaspulse = Gaspulse + Neutral;
  }

  if (Stato == 1) {
    if (Gaspulse > Slowlimit) {
      if (Rxpulse > Center) 
        Percentuale = 0;
        Percentuale = ((Gaspulse - Slowlimit) * 100) / (Maxspeed - Slowlimit);
        if (Rxpulse > Center) {
          NewPos = Center + (((Rxpulse - Center) * (100 - Percentuale) / 100));
                Led = 3;
        }
        if (Rxpulse < Center) {
          NewPos = Center - (((Center - Rxpulse) * (100 - Percentuale) / 100));
                Led = 4;
        }
      
      Led = 1;
    }
    else {
      NewPos = Rxpulse;
      Led = 2;
    }
  }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  if (Stato == 2) {
    if (abs(NewPos - OldPos) > Tolerance) {
      myservo.write(NewPos );
      OldPos = NewPos;
    }

  }
  ++Stato;
  ++Stato_Led;
  if (Stato > 2) {
    Stato = 0;
  }
  delay(1);
  if (Led == 1) {
    //led veloce
    if (Stato_Led > 60) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
    digitalWrite(Ledpin, Cmd_Led);
  }
  if (Led == 2) {
    //led lento
    if (Stato_Led > 30) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 3) {
    //led lento
    if (Stato_Led > 10) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  if (Led == 4) {
    //led lento
    if (Stato_Led > 5) {
      Cmd_Led = !Cmd_Led;
      Stato_Led = 0;
    }
  }

  digitalWrite(Ledpin, Cmd_Led);

}
Smsteves non è collegato   Rispondi citando