Visualizza messaggio singolo
Vecchio 05 maggio 20, 18:22   #118 (permalink)  Top
wrighizilla
Guest
 
Data registr.: 17-07-2013
Messaggi: 3.734
Citazione:
Originalmente inviato da Smsteves Visualizza messaggio


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);

}
scusa ma in base a cosa puoi fare la centratura automatica del servo?
altrettanto slowlimit automatico, in base a quale fattore può essere automatica una cosa che dipende strettamente dallo stile di guida personale e dalle caratteristiche della macchina?

spiega meglio.
adesso provo lo sketch..

----edit---------
inizia a chiudere appena do gas e chiude del tutto.
però non vibra.
per me hai bisogno di una macchina 4ws, montarla, settarla e guidarla per capire il senso del progetto.

Ultima modifica di wrighizilla : 05 maggio 20 alle ore 18:28
wrighizilla non è collegato   Rispondi citando