Problème de bras articulé

Bonjour a tous, tous d'abord je tiens a vous remercier pour tous ce que j'ai pus trouver pour avancer dans mon projet.

Mon projet est un bras articuler monter sur chenille en mode FPV via une télécommande DX6i
le pilotage de la camera ce fait via arduino nano et nrf24l01 qui fonctionne parfaitement et le pilotage du bras via une nano également connecté au récepteur rc


pour le pilotage du bras j'utilise un code assez basic qui fonctionne mais me cause des tremblement a cause des variations de signal du mon récepteur rc

je tien a préciser que j'utilise une alimentation externe que l'arduino (5V 10A largement suffisante pour mes servo) j'utilise l'arduino car dans mon projet j'ai besoin d'une rotation de 180 degré.
le servo na pas de problémé de tremblement si il est connecter en direct sur le récepteur mais une rotation de 120 degré max ne me convient pas ici.

je suis archi nul en programmation et j'ai juste compris la base entrée et sortie pour modifier légèrement les codes que je trouve .
ci dessous voici le code que j'utilise pour le bras

// Commande de 2 servo rotation 180 degre avec commande RC DSMX

#include <Servo.h>  // Libraries file  |  Kütüphane dosyası
Servo servoMotor1; // Servo nesnesi oluşturuluyor
int RCinput1;
int RCinput2;
int RXPin1 = 3; // Receiver pin  A4
int kontrol1 = 1400; // Alıcıdan gelen kontrol değeri
Servo servoMotor2; // Servo nesnesi oluşturuluyor
int RXPin2 = 2; // Receiver pin  A5
int kontrol2 = 1400; // Alıcıdan gelen kontrol değeri
int ch1, ch2; // Lecture signal RC CH1 CH2



void setup() {
  servoMotor1.attach(10); // Servo Pin 5
  pinMode(RXPin1, INPUT); // Receiver pin input  
  servoMotor2.attach(9); // Servo Pin 9
  pinMode(RXPin2, INPUT); // Receiver pin input  
  //TIMSK0=0;
}
void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal  
   kontrol1 = map(kontrol1, 1115, 1930, 180, 0);
   //kontrol1 = map(kontrol1, 1000, 2000, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    kontrol2 = map(kontrol2, 1115, 1930, 180, 0);
    //kontrol2 = map(kontrol2, 1000, 2000, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

ma question est il y a t'il moyen de lisser le signal envoyer par le récepteur pour arrêter le tremblement et si oui est ce que une âme charitable pourrais m'aider a modifier le code.

merci d'avance pour votre aide .

Bonjour;

J'ai testé une astuce un peu particulière sur une de mes applications, j'obtiens des résultats dont les 2 derniers chiffres évoluent par pas de 10 (... 1480, 1490, 1500) c'est beaucoup plus stable et simple à tester avant de l'adopter ou non.

J'explique:
Ta mesure évolue de +/- 8 pts environ entre 2 positions stables de tes joystick.
Ta mesure est en nombre entier (sans virgule) admettons que tu veuille faire des pas de +/-10 pts pour éviter les variations du type 1508 - 15015 - 1509 - ...
En pas de 10, cette variations serais respectivement 1500 - 1501 - 1500, c'est beaucoup plus stable.

Comment faire?

kontrol1 = pulseIn(RXPin1, HIGH);
kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10

Comme écris plus haut, ça marche sur une de mes appli avec un esp32.

Les pro du code ne se priveront pas de faire des remarques sur ma proposition, et bien entendu, c'est une solution parmis 100.

A suivre

PS:

int Kontrol1 = 1009
int kontrol1/10 = 100
int kontrol1*10 = 1000

Mesure d'aprés

int Kontrol1 = 1002
int kontrol1/10 = 100
int kontrol1*10 = 1000

Salut, bah pour commencé c'est deja syper sympa de me répondre si vite, je teste cela après manger, personnellement la méthode pour y arriver je m'en bats les cacahuète tant que ca fonctionne. Je suis ouverts a toute solutions mon projets date de quelque année je suis plus a ca pour des solution bizarres lol, j'ai teter des résistance, condensateur, anti parasite rien a fais .

La chose dont je suis sur c'est cette foutue fluctuations de mon recepteur rc.

Apres si certaines personne veulent les codes et composants du projets pas de soucis je partage avec plaisirs

Quel est le modèle de ce récepteur?

bon j'ai tester comme ceci

void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal 
   //kontrol1 = map(kontrol1, 1515, 1918, 180, 0); 
   kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   //kontrol1 = map(kontrol1, 1000, 2000, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    //kontrol2 = map(kontrol2, 1515, 1918, 180, 0);
    kontrol2 = kontrol2/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
    kontrol2 = kontrol2*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
    //kontrol2 = map(kontrol2, 1000, 2000, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

ca fonctionne super presque pas de tremblement et vraiment pas dérangent par contre je perd ma rotation de 180 degré on est plus sur du 90 maintenant si je rajoute le map du stick ca par en sucette lol

Celui ci, merci de t'intéresser a mon cas

Bonsoir jph_vda

Parce que le sujet est intéressant :wink:

Puisque ton récepteur a une sortie PPM:


Pourquoi ne pas utiliser une bibliothèque pour décoder ton signal comme celle ci:

Son auteur est une référence.

Il y a pas mal d'autres qui traitent du PPM, dans l'IDE, fais cette recherche:

Bonne soirée
Cordialement
jpbbricole

woaw ca va changer la donne cela , déjà comment faire ma recherche , câblage ect...
modifier des bout de code, changer entrée et sortie ca va, la faut changer la conception du bidule , je vais voir si j'arrive a comprendre la subtilité merci pour l'info

est ce que 1 seul sortie me permet de piloter 2 servo ?

Avec un décodeur PPM, tu peux commander les 6 servaux de ton récepteur.
Le mieux est que tu suives un des exemple d'une bibliothèque.

Installes PPM.h


et fais l'exemple SERVO_PPM.
Pour cet exemple, connectes le GND du récepteur au GND de l'Arduino, la borne du PPM à la broche A0 de l'Arduino.
Cette demo commande 4 servo sur les broches 3, 5, 6, 9.

A+
jpbbricole.

je vais un peut illustrer suite au info déjà reçue

fonctionnement du robot pour ceux que ca intéresse en video:

fonctionnement du bras avec mon code:

void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal 
   kontrol1 = map(kontrol1, 1115, 1918, 180, 0); 
   //kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   //kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   //kontrol1 = map(kontrol1, 1000, 2000, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    kontrol2 = map(kontrol2, 1115, 1918, 180, 0);
   // kontrol2 = kontrol2/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   // kontrol2 = kontrol2*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
    //kontrol2 = map(kontrol2, 1000, 2000, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

fonctionnement avec la modif de jef59 :

void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal 
   //kontrol1 = map(kontrol1, 1115, 1918, 180, 0); 
   kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   //kontrol1 = map(kontrol1, 1000, 2000, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    //kontrol2 = map(kontrol2, 1115, 1918, 180, 0);
    kontrol2 = kontrol2/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
    kontrol2 = kontrol2*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
    //kontrol2 = map(kontrol2, 1000, 2000, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

bien plus stable mais je perd en amplitude 90 degré pas fous fou, même résultat connecter en direct sur le récepteur

code de jef59 plus le map du joystick :

void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal 
   kontrol1 = map(kontrol1, 1115, 1918, 180, 0); 
   kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   //kontrol1 = map(kontrol1, 1000, 2000, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    kontrol2 = map(kontrol2, 1115, 1918, 180, 0);
    kontrol2 = kontrol2/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
    kontrol2 = kontrol2*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
    //kontrol2 = map(kontrol2, 1000, 2000, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

plus stable que l'original mais en fonction des position ca par en sucette

je vais explorer la piste de jpbbricole pour la sortie ppm et vous tiens au courant des avancée :sweat_smile:

Bonsoir;

"leger" mal entendu, il ne faut surtout pas supprimer le mapping sinon ça foire.

void loop() {



   kontrol1 = pulseIn(RXPin1, HIGH); // Reading the receiver signal 
   //kontrol1 = map(kontrol1, 1515, 1918, 180, 0); 
   kontrol1 = kontrol1/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
   kontrol1 = kontrol1*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   kontrol1 = map(kontrol1, 1515, 1930, 0, 180);  // Other side  
   servoMotor1.write(kontrol1); // Servo motor kontrol değeri atanıyor
   //delay(10);

    kontrol2 = pulseIn(RXPin2, HIGH); // Reading the receiver signal  
    //kontrol2 = map(kontrol2, 1515, 1930, 180, 0);
    kontrol2 = kontrol2/10; // comme kpntrol1 est un int, il donne un résultat entier  (sans chiffre aprés la virgule
    kontrol2 = kontrol2*10;// je remets kontrol1 à son echelle d'origine, mais avec une évolution par pas de 10
   kontrol2 = map(kontrol2, 1515, 1930, 0, 180);  // Other side  
   servoMotor2.write(kontrol2); // Servo motor kontrol değeri atanıyor
   //delay(30);

  
}

Bon, moi je propose une bidouille, mais ça ne vaudra pas la proposition de jpbb qui si connait 100 fois mieux que moi en RC.

Pas de soucis c'est cool d'avoir proposer la bidouille a quand même donner une amélioration :wink:

Question bête... tu as mis des condos pour lisser la tension ?

J'ai fais il a quelques mois aussi un bras articulé monté sur chenilles. Sans camera et avec une radio commande beaucoup plus basique.

J'ai supprimé mon message qui était redondant.

Bien entendu, on ne peux pas filtrer physiquement avec des condos des signaux impulsionnels de largeur variables +/- courtes sous peine de pertes d'impulsions.

Au moins de mettre un filtre sur les joysticks de l'émetteur, pour "stabiliser" la lecture et les variations de positions du levier des joysticks.

Au vu des tes vidéos, je dirais qu'il y a sans doute un probléme de traitement de données.

A priori tu fais un asservissement de position, peut être que avec un asservissement de vitesse tu aurais un meilleur rendu?

(levier légèrement descendu, ton bras descend lentement, tu relâche le levier, il s'arrête, tu le remonte à fond, ton bras remonte vite ...)

Oui j'ai mis un gros 3300 micro car j'avais des problème au debut quand je contrôlais les moteur avec une arduino uno monter avec un l298n, il reculait tous seul quand j'utilisais la pince :rofl:, j'ai remplacé la uno par un mddrc10 au dessus de 6v j'avais que des problèmes de direction des chenilles et c'était un peut lent a 6v

C'est exactement ce qu'il ce passe pour piloter la pince sauf au repos on dirais qui traite aussi toute les fluctuations de données de l'émetteur

Avec ton code sans le mapping les fluctuations sont presque imperceptible mais je perd trop en amplitude

Comment je peut l'asservissement des vitesses ?

Ca j'ai du le faire sur le joystick qui piloter la camera , un petit anti parasite entre la borne de l'axe x et y

Je ne vais pas m'avancer davantage, le mieux est l'avis des experts en servo du forum, explore par exemple (avec son aide) la piste de @jpbbricole, desolé.

je planche dessus :rofl:

/* Test pince via PPM
 */

// Include the PPM library
#include "ppm.h"

// Include the Servo library
#include <Servo.h>

// create servo object to control a servo
Servo servo_1;
Servo servo_2;
//Servo servo_3;
//Servo servo_4;

// PPM channel layout (update for your situation)
#define THROTTLE        3
#define ROLL            1
//#define PITCH           2
//#define YAW             4

// Loop interval time
const long interval = 50;
unsigned long previousMillis = 0;

void setup()
{
  // Start the serial port to display data 
  Serial.begin(115200);

  // Start the PPM function on PIN A0
  ppm.begin(A0, false);

  // attaches the servo on pins to the servo objects
  servo_1.attach(3);
  servo_2.attach(5); 
  //servo_3.attach(6); 
  //servo_4.attach(9);   
}

void loop()
{
  // Interval at which the PPM is updated
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    short throttle  =   ppm.read_channel(THROTTLE);
    short roll      =   ppm.read_channel(ROLL);
    //short pitch     =   ppm.read_channel(PITCH);
    //short yaw       =   ppm.read_channel(YAW);
    servo_1.writeMicroseconds(throttle);
    servo_2.writeMicroseconds(roll);
    //servo_3.writeMicroseconds(pitch);
    //servo_4.writeMicroseconds(yaw);
  }
}

faut que je modifie la platine du récepteur, j'avais pas prévu d'utiliser la borne PPM

Bonjour

Pour supprimer les oscillations une fonction de lissage est tres efficace.

Elle supprimerai presque totalement la variation de signal vue au post 1.

Ensuite utiliser des seuils successif de deplacement comme dit plus haut supprime le reste