john deere 7930 bruder jumelé

Répondre
Avatar du membre
lapin29
Conducteur retraité ou la belle vie
Conducteur retraité ou la belle vie
Messages : 5403
Enregistré le : 23 août 2010, 20:19
Numéro de département : 56
Pays : F
Localisation : Lanester, dans le sud... Bretagne évidemment !
A remercié : 2 fois
A été remercié : 23 fois
Contact :

Re: john deere 7930 bruder jumelé

Message par lapin29 »

yep :up:
ImageImage

Pour : les piliers de bars !!
Contre : les piles de ponts !!
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

Re: john deere 7930 bruder jumelé

Message par thetux »

Bonjour,

gros déterrage, j'ai démonté le tracteur et repris pas mal de chose. Après avoir créé des moto réducteur brushless, j'ai voulu les placer dans le tracteur. Avant j'avais un seul thor15. Ici, j'ai besoin de 2 variateurs brushless. Comme la place est comptée dans le 7930, pas simple de faire tout rentrer...

Image

De plus, j'ai un peu modifié le système de relevage. Plutôt que d'utiliser un seul servo, j'en utilise deux, dont un inversé, ce qui devrait être plus stable :

Image

Et enfin, comme la Futaba n'a "que" 8 voies, et qu'il en faudrait 2 pour les controleurs brushless et 2 pour le relevage, ca ne laisserait plus beaucoup de voies (1 pour la direction, 1 pour les phares, 2 pour la motricité, 2 pour le relevage, reste 2 pour l'équipement à l'arrière...

Je vais donc ajouter un arduino nano au milieu de tout ça (si ça rentre...) pour diminuer les voies utilisées, et avoir un mix entre l'avance et la direction pour avoir un genre de différentiel électronique. A voir ce que cela va donner.
Avatar du membre
lapin29
Conducteur retraité ou la belle vie
Conducteur retraité ou la belle vie
Messages : 5403
Enregistré le : 23 août 2010, 20:19
Numéro de département : 56
Pays : F
Localisation : Lanester, dans le sud... Bretagne évidemment !
A remercié : 2 fois
A été remercié : 23 fois
Contact :

Re: john deere 7930 bruder jumelé

Message par lapin29 »

pourquoi 2 sur les varios? tu veux faire un diff électronique?
moi j'aurais mis un Y entre les 2 varios pour 1 voie, 1 voie direction, il y a des petits modules pour inverser un servo, donc 1 voie pour le relevage arrière, 1 pour les feux, reste 4 pour les accessoires arrières
ImageImage

Pour : les piliers de bars !!
Contre : les piles de ponts !!
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

Re: john deere 7930 bruder jumelé

Message par thetux »

Salut,

oui je voulais faire un diff électronique histoire qu'il ne tire pas tout le temps tout droit.
Pour les inverseurs de servos, je n'en ai pas sous la main, mais c'est effectivement une idée que j'avais envisagée.
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

Re: john deere 7930 bruder jumelé

Message par thetux »

J'ai réalisé le code pour l'arduino (dans mon cas un nano) et je l'ai testé avec des servos. Il reste à remonter le tout pour tester avec les variateurs. Concernant les fonctionalités, j'ai:
  • mis un délai sur la direction
  • piloté le relevage constirué de 2 servos en en inversant un
  • ajouté un délai sur le relevage
  • ajouté un genre de différentiel électronique
Niveau cablage, c'est un peu le foutoir:
jd7930_bb.png
Niveau code:

Code : Tout sélectionner

/*Copyright (C) 2015  Seinlet Nicolas

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>*/
 
#include <PinChangeInt.h>
#include <Servo.h> 

struct sig {
  volatile boolean isOn;
  volatile unsigned long start;
  volatile int len;
};
typedef struct sig Sig;
Sig signals[13] = {0};

struct serv {
  volatile int actualPWM;
  volatile int requiredPWM;
  volatile int pinIn;
  volatile boolean invert;
  volatile unsigned long tempo;
  volatile unsigned long lastMove;
  volatile boolean anglemode;
  Servo outservo;
};
typedef struct serv Serv;
Serv outputs[13] = {0};

void setup() {
  for(uint8_t pin=0; pin<13; pin++){
    outputs[pin].actualPWM=1500;
    outputs[pin].tempo=0;
    outputs[pin].invert=false;
    outputs[pin].pinIn=0;
    outputs[pin].anglemode=false;
  }
  PCintPort::attachInterrupt(2 , &computeInput, CHANGE); // motors
  PCintPort::attachInterrupt(3 , &computeInput, CHANGE); // rear lift
  PCintPort::attachInterrupt(4 , &computeInput, CHANGE); // steering
  
  outputs[5].pinIn=4;
  outputs[5].tempo=30;
  outputs[6].pinIn=2;
  outputs[6].tempo=0;
  outputs[9].pinIn=2;
  outputs[9].tempo=0;
  outputs[10].pinIn=3;
  outputs[10].tempo=50;
  outputs[10].anglemode=true;
  outputs[11].pinIn=3;
  outputs[11].tempo=50;
  outputs[11].invert=true;
  outputs[11].anglemode=true;
  
  for(uint8_t pin=0; pin<13; pin++){
    if (outputs[pin].pinIn!=0){
      outputs[pin].outservo.attach(pin);
      outputs[pin].outservo.writeMicroseconds(1500);
    };
    if (outputs[pin].tempo>500){
      outputs[pin].tempo=500;
    };
  };
}

//Read the signal
void computeInput(){
  int pin = PCintPort::arduinoPin;
  if(digitalRead(pin) == HIGH){
    signals[pin].start = micros();
  }else{
    if(signals[pin].start && (signals[pin].isOn == false)){
      if (abs(signals[pin].len - (int)(micros() - signals[pin].start))>20){
        signals[pin].len = (int)(micros() - signals[pin].start);
      };
      signals[pin].start = 0;
      signals[pin].isOn = true;
    } 
  }  
}

int invertPWM(int PWMsignal)
{
  return (-1)*(PWMsignal-1500)+1500;
};

int PWM2deg(int pwmsig)
{
  //Convert PWM signal to an angle in degrees
  //1000/1500/2000
  //->
  //0/90/180
  float tmp = pwmsig-1000.0;
  if (tmp<0){
    tmp=0;
  };
  if (tmp>1000){
    tmp=1000;
  };
  int res = (tmp/1000.0)*180.0;
  return res;
};

void electronicDiff(int steer, int leftMotor, int rightMotor)
{
  //ElectronicalDiff
  int steerAngle;
  float angle;
  steerAngle = outputs[steer].actualPWM;
  angle = (abs(1500-steerAngle)/1500.0) * (abs(1500-outputs[leftMotor].actualPWM)/1500.0);
  if ((steerAngle>1530 && outputs[leftMotor].actualPWM>1500) || (steerAngle<1470 && outputs[leftMotor].actualPWM<1500)) {
    outputs[leftMotor].actualPWM = outputs[leftMotor].requiredPWM + int(outputs[leftMotor].requiredPWM * angle);
    outputs[rightMotor].actualPWM = outputs[rightMotor].requiredPWM - int(outputs[rightMotor].requiredPWM * angle);
  };
  if ((steerAngle>1530 && outputs[leftMotor].actualPWM<1500) || (steerAngle<1470 && outputs[leftMotor].actualPWM>1500)){
    outputs[leftMotor].actualPWM = outputs[leftMotor].requiredPWM - int(outputs[leftMotor].requiredPWM * angle);
    outputs[rightMotor].actualPWM = outputs[rightMotor].requiredPWM + int(outputs[rightMotor].requiredPWM * angle);
  };
};

void loop(){
  int PWMmax;
  delay(10);
  //Check which values to set on output
  for(uint8_t pin=0; pin<13; pin++){
    if (outputs[pin].pinIn!=0){
      if (signals[outputs[pin].pinIn].isOn){
        outputs[pin].requiredPWM = signals[outputs[pin].pinIn].len;
        if (outputs[pin].invert){
          outputs[pin].requiredPWM = invertPWM(outputs[pin].requiredPWM);
        };
        if (! outputs[pin].tempo){
          outputs[pin].actualPWM = outputs[pin].requiredPWM;
        };
      };
    };
  };

  //Compute delayed outputs
  for(uint8_t pin=0; pin<13; pin++){
    if (outputs[pin].pinIn!=0){
      if (outputs[pin].tempo){
          PWMmax = int(((500) / outputs[pin].tempo));
          if (PWMmax>abs(outputs[pin].requiredPWM-outputs[pin].actualPWM)){
             PWMmax = abs(outputs[pin].requiredPWM-outputs[pin].actualPWM);
          };
          if (abs(outputs[pin].requiredPWM-outputs[pin].actualPWM)>30)
          {
            if (outputs[pin].requiredPWM>outputs[pin].actualPWM){
              outputs[pin].actualPWM = outputs[pin].actualPWM + PWMmax;
            } else {
              outputs[pin].actualPWM = outputs[pin].actualPWM - PWMmax;
            };
          };
      };
    };
  };

  electronicDiff(5, 6, 9);
  
  //Set output values
  for(uint8_t pin=0; pin<13; pin++){
    if (outputs[pin].pinIn!=0){
        if (outputs[pin].anglemode){
          outputs[pin].outservo.write(PWM2deg(outputs[pin].actualPWM));
        }else{
          outputs[pin].outservo.writeMicroseconds(outputs[pin].actualPWM);
        };
    };
  };
  
  //Reset values
  for(uint8_t pin=0; pin<13; pin++){
    if(signals[pin].isOn){
      signals[pin].isOn = false;
    }
  }
}

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Répondre

Retourner vers « Tracteurs »