Idée : Faire un poisson (une nageoire)
IMT Atlantique 2024 – Groupe 1 : Ditsouga, Maxence, Quentin, Antoine
Vient de : https://robotics24.net/blog/soft-robotics-examples-research-and-applications/
Pourquoi ?
Les chercheurs en biologie marine rencontrent souvent des limites quand il s’agit d’observer la faune. En effet, pour éviter d’effrayer les autres poissons et la faune marine une équipe du MIT a développé un robot poisson équipé d’une caméra et basé sur le biomimétisme.
Dans ce projet nous tentons de reproduire le mouvement de la queue du poisson.
Comment ?
Utiliser 2 parties “muscles” rétractables en silicone qui se contractent en alternance pour tirer le bout de la queue du poisson d’un côté puis de l’autre. Contrôler le tout avec une seule pompe qui gonfle un muscle puis l’autre avec un circuit pneumatique fermé.
On utilise la pompe à eau 12v qui peut changer de sens d’aspiration.
Deuxième possibilité de type de muscles
- Muscles artificiels de type McKibben
Le principe de fonctionnement est le même que pour les muscles en silicone.
Plan :
- Faire 2 muscles artificiels (en silicone, ou de type McKibben)
- Faire un circuit de contrôle de la pompe (arduino) , avec éventuellement des capteurs de flexion sur la queue pour la commande.
- Contrôle du moteur : carte pont en H (https://wiki.dfrobot.com/MD1.3_2A_Dual_Motor_Controller_SKU_DRI0002) pour pouvoir inverser la polarité du moteur quand il faut.
*Impression en 3D de la nageoire caudale et du corps du poisson
Etape de la mise en place :
Réflexion sur le muscle à utiliser :
- Tout d’abord, on a pensé au muscle en silicone pour les mouvement de la queue mais le moule du modèle donné par le site (https://softroboticstoolkit.com/book/pneunets-downloads) ne nous a pas donné de résultat satisfaisant. En effet, a cause la présence de bulles d’air et de la plaque du dessous pas assez rigide , des trous laissaient s’échapper l’air et empêchaient le gonflement du muscle (nous avons changé d’approche car refaire un autre muscle était très long puisqu’il faut attendre qu’il sèche).
- On a donc décidé d’intégrer des muscles avec des gaines (type McKibben). Pour fabriquer nos muscles, on a enfilé un ballon dans la gaine : lorsque le ballon se gonfle, la gaine se rétracte et inversement. On a donc un muscle contrôlable avec une pompe.
-
-
- On a juste eu quelques problèmes quand le ballon était trop gonflé
-
Choix des pompes
- On a initialement pensé à utiliser une pompe à air classique (à piston), cela n’a pas marché car la pompe n’était pas réversible ce qui nous a empêché de remplir et vider successivement le muscle.
- Nous avons utilisé une pompe à galet qui est plus efficace avec de l’eau (mais reste efficace avec de l’air) pour remplir et vider le ballon
-
- Nous nous sommes rendus compte que le débit n’était pas suffisant, remplir le ballon prenait trop de temps et donc nous avons opter pour utiliser 2 pompes en parallèles marchant sur la même alimentation avec un pont en H. (https://wiki.dfrobot.com/MD1.3_2A_Dual_Motor_Controller_SKU_DRI0002)
- Les pompes se dégonflent puis se gonflent :
Capteur de flexion :
-
- Le capteur de flexion nous permet de savoir à quel moment la flexion de la nageoire est terminé et de passer à une nouvelle flexion (changement de sens de la nageoire). Il est nécessaire d’avoir 2 capteur parce qu’il sont sensible uniquement dans un sens de pliure.
- Ces capteurs sont des capteurs analogique relié comme ci dessous :
- Grâce à ce site, on a un exemple de programme qui fonctionne : https://www.gotronic.fr/blog/articles/controle-dune-main-robotique/.
- Ils sont attachés sur les muscles de cette manière :
- Le montage ensemble est le suivant, il fonctionne avec le code arduino :
Impression 3D :
Dans un premier temps, nous avons fait un modèle de nageoire étroite.
Cependant, les mouvements de la queue étant plutôt lents, nous avons à la place opté pour une nageoire moins réaliste mais plus large pour avoir une meilleure surface de contact avec l’eau (et donc permettre au poisson d’avancer).
L’impression du corps n’a pas été concluante à cause de mauvais réglages (parois trop fines).
Montage final avec la queue :
Schéma du montage électrique :
Code Arduino :
//Pompes
int E2 = 5;
int M2 = 4;
int tau = 1000; //Durée en ms entre chaque alternance gonflage/dégonflage en mode "normal"
//Commande
int Bouton = 3;
int Etat = 1; //0 = mode normal , 1 = mode remplissage , 2 = mode vidange
int etat_bouton = 0;
int timer = 0;
//Capteurs de flexion
const int Capteur_droit = A1;
const int Capteur_gauche = A0;
int sensorValueD = 0; // value read from the pot
int sensorValueG = 0; // value read from the pot
#include <Servo.h>
Servo index;
void setup()
{
pinMode(M2, OUTPUT);
pinMode(Bouton,INPUT);
Serial.begin(9600);
}
void loop()
{
etat_bouton = digitalRead(Bouton);
if (etat_bouton == LOW) {
//On arette la pompe le temps de connaitre le mode souhaité
digitalWrite(E2,LOW);
//Mesure temps d'appui sur le bouton
while (etat_bouton == LOW){
timer += 20;
delay(20);
etat_bouton = digitalRead(Bouton);
}
//Si appui long (plus de 2s) on change de mode entre normal(0) et remplissage(1)
if (timer>=2000){
Etat = (Etat==0);
}
// Sinon si on est en mode 1 ou 2 on change de mode entre 1 et 2
else {
if (Etat != 0){
Etat = 1*(Etat==2) + 2*(Etat==1);
}
}
timer = 0;
}
Serial.println(Etat);
// On fait tourner la pompe selon son mode de fonctionnement
rotation_pompe(Etat);
// On attend 20 ms avant une nouvelle boucle
delay(20);
}
// Déclenche les pompes avec le bouton selon le sens de rotation/ mode souhaité
void rotation_pompe(int nouvel_etat) {
//Modes pour vider/remplir le ballon
if (nouvel_etat==1){
digitalWrite(E2,HIGH);
digitalWrite(M2,LOW);//gonfler
}
else {
if (nouvel_etat==2){
digitalWrite(E2,HIGH);
digitalWrite(M2,HIGH);//dégonfler
}
else{
//Mode normal alternance
digitalWrite(E2,HIGH);
digitalWrite(M2,HIGH);
delay(tau);
digitalWrite(M2,LOW);
delay(tau);
// //Mode normal avec capteurs de flexion (décommentez ci-dessous et commentez le mode normal au dessus)
// // read the analog in value:
// sensorValueD = analogRead(Capteur_droit);
// sensorValueG = analogRead(Capteur_gauche);
// digitalWrite(E2,HIGH);
// if (sensorValueD > 820) { // 820 correspond au seuil à partir la flexion du capteur est suffisante pour changer de sens
// digitalWrite(M2,HIGH);
// }
// if (sensorValueG > 820) {
// digitalWrite(M2,LOW);
// }
}
}
}
Pistes d’amélioration :
- Refaire une structure en impression 3D pour le corps du poisson et intégrer les pompes
- Faire une nageoire dorsale orientable pour contrôler le poisson
- Ajouter un “ballast” qui empêche le poisson de couler
- Mieux étanchéifier , utiliser des pompes plus puissantes ou des muscles moins larges.
Voici une version du capteur étanchéifiée avec du silicone que nous n’avons pas eu le temps de tester.
Etude en parallèle
L’idée était d’automatiser un mouvement d’accordéon, de propulsion.
const int springPin1 = A1; // Broche de contrôle du relais pour le premier ressort
const int springPin2 = A2; // Broche de contrôle du relais pour le deuxième ressort
void setup() {
pinMode(springPin1, OUTPUT);
pinMode(springPin2, OUTPUT);
}
void loop() {
// Activer le courant sur le premier ressort
digitalWrite(springPin1, HIGH);
delay(2000);
// Attendre 2 secondes
// Désactiver le courant sur le premier ressort
digitalWrite(springPin1, LOW);
delay(10000);
// Activer le courant sur le deuxième ressort
digitalWrite(springPin2, HIGH);
delay(2000); // Attendre 2 secondes
// Désactiver le courant sur le deuxième ressort
digitalWrite(springPin2, LOW);
delay(10000);
}
Problèmes rencontrés :
_ Définition du temps de latence adéquat pour laisser le ressort à mémoire de forme refroidir pour permettre le mouvement inverse.
_ Elongation dans un seul sens
Potentielles solutions :
_ Essayer de changer le générateur avec un meilleur calibrage
_ Installer un bouton qui va permettre d’ouvrir et de fermer le passage du courant sur chacun des ressorts à mémoire de forme.
Ce que j’ai appris :
_ Bases de Arduino, en passant par le codage et le montage
_ Ouverture d’esprit sur sur les métiers