Tube dirigeable bio inspiré

IMT Atlantique 2024 – Groupe 3 : Rabab, Aymen, Adnane,Youenn

Pourquoi ?

L’un des objectifs de la robotique bio-inspirée est d’explorer de nouveaux paradigmes technologiques en reproduisant et en comprenant les mécanismes observés dans le règne vivant.

C’est ainsi qu’on s’est inspiré du mouvement des trompes d’éléphant et des tentacules de poulpe, et nous avons entrepris la conception d’un tube dirigeable, point de départ de la réalisation d’un bras flexible pouvant se plier et s’enrouler, dont les applications seront multiples notamment dans le domaine médical afin de doter les robots médicaux de sondes maniables qui s’infiltreront dans des parties délicates difficilement accessibles du corps humains et permettront de réaliser des mouvements souples dans plusieurs sens.

Exemples d’application:

  • Chirurgie
  • Industrie
  • Agriculture
  • Assistance à la personne

 

Comment ?

Avec un système de type marionnette, 3 fils de pêche positionnés autour du tube silicone que l’on connectera ensuite à 3 servomoteurs afin de mouvoir le tube silicone dans différents sens( plusieurs degrés de liberté). Les fils de pêche vont être insérés à l’intérieur de gaines thermo rétractables que l’on fixera sur le tube silicone.

En se renseignant sur internet, on constate que notre système peut s’apparenter au “Continuum arm”.

Au début, on s’est servi d’une seule gaine pour chaque fil de pêche, mais nous avons remarqué que si l’on divise la longueur de cette gaine en 3 positionnées de manière équidistante, cela augmentera la flexibilité du matériau.

Un seul tube tout le long avec de la colle chaude


C’est ainsi qu’on a essayé avec cette deuxième configuration.

Plusieurs petites gaines avec de la colle chaude

Néanmoins, ce deuxième essai a soulevé le problème de fixation des gaines thermo rétractables sur le tube silicone. La colle chaude ne maintient pas suffisamment et elle rigidifie beaucoup le tube.

Nous avons manipulé deux types de colles, mais le problème persistait toujours, c’est ainsi qu’on a pensé à couvrir la partie exploitable du tube silicone avec du scotch. On a remarqué alors que la texture du scotch utilisé a permis de mieux maintenir les gaines. Ce qui a abouti au résultat suivant satisfaisant en terme d’un premier prototype pour notre projet.

Plusieurs petites gaines le long du tube fixées sur du scotch


Le montage précédent consolidé et finalisé.

Nous avons jugé ce dernier montage suffisamment concluant pour la suite. Nous allons donc l’exploiter et l’insérer sur un support.

Toutefois, nous imaginons, dans un deuxième temps, solidifier notre prototype en utilisant un matériau en impression 3D qui comblera les imperfections du collage manuel.

Nous avons commencé à modéliser les pièces.

Gaines supérieurs et intermédiaires modélisés en 3D

D’autre part, nous avons aussi commencé à prendre en main la carte arduino pour imaginer un système de contrôle par servomoteurs.

Nous avons continué le développement de notre prototype en l’intégrant sur un support fait à partir de legos. Ensuite, nous avons relié les fils de pêche à des servomoteurs commandés par des potentiomètres afin de contrôler l’angle de rotation du moteur et par suite agir sur la déformation du tube silicone.

L’étape suivante de notre prototype était de commander tout notre système grâce à un joystick qui imitera le mouvement souhaité du tube sur l’échelle locale.

Joystick


Schéma du montage


Le support du tube dirigeable


L’installation finale


Schéma annoté

Au début, nous avions une zone morte où l’on ne pouvait pas diriger notre tube, mais l’on a pu surmonter cette contrainte en jouant sur le code arduino, particulièrement en changeant les référentiels du joystick (à travers le switch), afin que l’on puisse récupérer la détection de toutes les zones entourant le tube.

 

Vidéo de fonctionnement

 

 

 

 

Pistes d’amélioration ⇒ Support portatif

Code Arduino:

#include <Servo.h>  // on inclut la bibliothèque servo
Servo servoMoteur1;
Servo servoMoteur2;
Servo servoMoteur3;
// Arduino pin numbers
const int led = 7 ; // digital pin connected to led output
const int SW_pin = 8; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
int valeur1 = 0 ;
int valeur2 = 0 ;
int valeur3 = 0 ;
int valeur4 = 0 ;
boolean res = true ;
boolean etat = true ;
boolean etatPrev = true;

void setup() {
  Serial.begin(9600);
  pinMode(SW_pin, INPUT);
  pinMode(led,OUTPUT) ;
  digitalWrite(SW_pin, HIGH);
  servoMoteur1.attach(2);
  servoMoteur2.attach(3);
  servoMoteur3.attach(4);
  digitalWrite(led,HIGH);

}

void loop() {
  res= digitalRead(SW_pin);
  Serial.print(digitalRead(SW_pin));
  Serial.print(" | ");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print(" | ");
  Serial.print("Y-axis: ");
  Serial.print(analogRead(Y_pin));
  Serial.print(" | ");
  Serial.print("état: ");
  Serial.println(etat) ;

// Condition qui permet de basculler "etat" de vrais a faux
// Lors du clic sur le switch.
  if (etatPrev != res && etatPrev == 1){
    delay(5) ;
    etat = !etat ;
  }

// En fonction de l'état, on change l'ordre du contrôle des servomoteurs
// Permet d'éviter d'avoir une zone morte
  if (etat== true){
      digitalWrite(led, HIGH) ;
      servoMoteur1.attach(2);
      servoMoteur2.attach(3);
      servoMoteur3.attach(4);
      actionner() ;
  } else {
	  digitalWrite(led, LOW) ;
	  servoMoteur1.attach(3);
	  servoMoteur2.attach(4);
	  servoMoteur3.attach(2);
	  actionner1() ;

  }
  etatPrev = res;
}

void actionner(){
  valeur1 = analogRead(X_pin);
  valeur1 = map(valeur1, 540, 1023, 0, 180);
  servoMoteur1.write(valeur1);

  valeur2 = analogRead(Y_pin);
  valeur2 = map(valeur2, 560, 1023, 0, 180);
  servoMoteur2.write(180 - valeur2);

  valeur3 = analogRead(Y_pin);
  valeur3 = map(valeur3, 0, 450, 0, 180);
  servoMoteur3.write(180 - valeur3);

  delay(10);
}

void actionner1(){
  valeur1 = analogRead(X_pin);
  valeur1 = map(valeur1, 550, 1023, 0, 180);
  servoMoteur1.write(180 - valeur1);

  valeur2 = analogRead(Y_pin);
  valeur2 = map(valeur2, 560, 1023 , 0, 180);
  servoMoteur2.write(valeur2);

  valeur3 = analogRead(Y_pin);
  valeur3 = map(valeur3, 0, 450, 0, 180);
  servoMoteur3.write(180 - valeur3);

  delay(10);  

}

Références

1-Contnuum arm explanation : https://onlinelibrary.wiley.com/doi/full/10.1002/aisy.202200367

2-Trompe : https://www.francebleu.fr/emissions/vacances-a-beauval-les-insolites/le-chef-du-secteur-elephant-de-beauval-nous-invite-a-suivre-un-soin-aux-cotes-d-une-femelle-6551796

3-Tentacule : https://free3d.com/fr/3d-model/octopus-tentacle-rigged-8304.html