john deere 7930 bruder jumelé
- thetux
- 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é
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...
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 :
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.
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...
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 :
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.
- lapin29
- 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é
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
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
- thetux
- 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é
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.
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.
- thetux
- 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é
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
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.