Les robots

Les projets réalisés et encours.

Les idées germent doucement, … à voir
Comme beaucoup de projets, ceux-ci sont autonomes, j'en donnerai la consommation en mAh quand se sera nécessaire.
Cette partie me sert de bloc-note, si vous avez des idées n'hésitez pas.

Hexapode
HEXAPODES. La meilleure façon de marcher ne coule pas de source lorsque l'on a 6 pattes.
C'est pourtant le point commun entre les insectes et certains robots hexapodes, qui imitent la locomotion spécifique aux arthropodes du règne vivant, à savoir une marche asymétrique "en trépied", qui comprend à tout moment deux point d'appui d'un côté et un troisième support de l'autre.
Mais ce ne serait finalement pas le mode de locomotion le plus efficace... tout du moins dans un environnement en 2D.
C'est ce que révèle une étude de l'université de Lausanne et de l'École Polytechnique Fédérale de Lausanne (EPFL), à paraître dans Nature Communications.
Avec une méthodologie expérimentale qui recourt à des algorithmes évolutionnistes... mais aussi à de minuscules bottines pour limiter l'adhérence des pattes de drosophiles !

Il vas falloir faire très attention à l'adhérence au sol. Soit un groupe de trois est un trépied formé par les pattes avant et arrière d'une part, et la branche centrale du côté opposé.
Les trois branches constitutives de chaque trépied sont déplacées comme une unité.
Comme un trépied est levé, l'autre trépied pousse vers l'avant.
Dans cette démarche, il peut être utile de penser à chaque trépied comme un pied et le comparer à votre propre marche bipède où, comme un pied est levé l'autre pied pousse en avant.


A partir de 3 servomoteurs 90SG.

Avance de l'hexapode
 MilieugauchedroiteEn images
012012060 .
195+t8030
2145+t15090
195+t8030
2145+t15090
195+t8030
012012060
Rotation de l'hexapode
 MilieugauchedroiteEn images
012012060 .
195+t15030
2145+t8090
195+t15030
2145+t8090
195+t15030
012012060

+t avec tempo avant mouvement des bras d'environs 100ms

#include "Servo.h"

Servo lift;
Servo left;
Servo right;

//Variables
int diff_ldr=0;//difference in ldr reading
int dist_read=100;//distance reading

void setup()
{
  //Attach Servos
  lift.attach(10);
  left.attach(9);
  right.attach(11);
  
  //Servo Center positions
  startPos();
  delay(2000);
}

void loop()
{
   if(diff_ldr<200)//Check if being petted 
    {
      if(dist_read>30) {forward();}
      else {
      turn();
      //delay(1000); //délai pour mise en position
           }
    }
    else {petMode();}
}

void forward()
{
   firstHalf();
  delay(500);
  secondHalf();
  delay(500);
}
void turn()
{
  firstTurn();
  delay(200);
  secondTurn();
  delay(200);
}


void petMode()
{
  startPos();
  happyShake();
}

void firstHalf()
{
  lift.write(95);//right up
  delay(100);
  left.write(80);//left bk
  right.write(30);//right fwd
}

void secondHalf()
{
  lift.write(145);//left up
  delay(100);
  left.write(150);//left fwd
  right.write(90);//right bk
}

void autoShut()
{
  lift.detach();
  left.detach();
  right.detach();
 }

void firstTurn()
{
  lift.write(95);//right up
  delay(100);
  left.write(150);//fwd
  right.write(30);//fwd
}

void secondTurn()
{
  lift.write(145);//left up
  delay(100);
  left.write(80);//bk
  right.write(90);//bk
}

void startPos()
{
  lift.write(120);
  left.write(120);
  right.write(56);
}

void HappyShake()
{
  lift.write(60);//right up
  delay(200);
  lift.write(180);//left up
  delay(200);
}

Evolution vers la "simplicité"

Le moteur gauche et droit font mouvoir deux pieds, chaque pied avant est relier à un pied arrière grâce à une biellette.
Le moteur central quant à lui, permet de lever et baisser les pieds gauche et droite.

La carte "Otto tiny" de ma composition est sur la partie inférieure et la batterie 3.7V est montée sur la partie supérieure.
Le principe de fonctionnement avec 3 servos, un Attiny85 et le tout en assembleur.
Le programme du robot Otto permet l'utilisation de 5 servos moteurs simultanément et de plus la platine électronique et parfaite pour l'hexapode (compact et efficace).
Comme je n'ai que 3 servos-moteurs, il me reste 3 entrées/sorties sur l'attiny.
Chaque moteur à une rotation de ±30°, ce qui simplifie aussi les opérations.
La vitesse de déplacement sera connue lorsque l'ensemble sera monté.


Les paramètres du programme :
Le paramètre dans regC est le nombre de mouvements.

Dans le programme, la valeur angulaire du servomoteur vas de 0 à 180° ce qui représente une valeur entre 0 et 127 dans le programme.
Le dessin ci-dessous vous simplifie la programmation
. Le mouvement vas être décomposé de manière à pouvoir accélérer ou ralentir.
Le mouvement d'une moteur de 171 à 85 représente 43 positions entre chaqu'une de ces positons, La vitesse maximale d'un sevomoteur SG90 est de 180° soit 127 positions en 300.000μs, le temps minimum entre chaque position est de $\dfrac{300.000}{127}=2362\mu s$
Petite aparté sur la fonction de temps "Wait4xCycles", qui représente comme son nom l'indique 4 cycles d'horloge.
Un 4 cycles d'horloge par microseconde représente $\dfrac{F_{CPU}}{4000000}$.
#define C4PUS (F_CPU/4000000) ;/4 nombre de périodes par us attention aux approximation

;------------------------------------------------------------------------------
; Input : XH:XL - number of CPU cycles to wait (divided by four)
;------------------------------------------------------------------------------
Wait4xCycles:
    sbiw    XH:XL, 1        ; x-- (2 cycles)
    brne    Wait4xCycles    ; jump if not zero (2 cycles)
    ret                     ; 4 cycles 
    
;Pour lancer la fonction
    ldi     XH,high(C4PUS*1000) ;1000us soit 1ms
    ldi     XL,low(C4PUS*1000)
    rcall   Wait4xCycles
Revenons à nos 2362μs, temps pour attendre la vitesse maximale entre chaque position.
Je vais donc mettre un facteur de vitesse représenté par un octet, soit une valeur entre 0 et 255.
Pour un valeur de 255 le moteur mettra $2362\times 255=602.310\mu s$ pour changer de position, 180° represente 108.415,800ms soit 108 secondes.
Oups, c'est beaucoup trop!!!
Bon ok, je prends un pas de 0,125, je m'explique 0 représente $\dfrac{2362}{16}=148\mu s$, 1 représente 1,125 soit 2360μs, 2 représente 1,25 soit 2655μs, ...
Je vais pas tous vous les faires, mais vous voyer le principe, plus la valeur est grande plus je ralentis, à 255, 180° se réalise en 5s.
En gros, le calcul pour connaitre la durée entre chaque position en μs $Valeur=(Speed+16)\times 148$
Speed est le premier paramètre.

Pour le codage :
Les paramètres sont dans l'ordre suivant :
  1. Paramètre de temps entre 0 et 255, je viens tout juste de l'expliquer, c'est Speed, suivez!
  2. L'angle du moteur central entre 0 et 127 (ne tiens pas compte de la vitesse), vitesse maximale pour lui
  3. L'angle du moteur gauche entre 0 et 127
  4. L'angle du moteur droit entre 0 et 127
forward_move:
    ldi     regC,4                      ;nombre de mouvement
    ldi     speed,40
    ldi     ZL,low(forward<<1)    ;Z pointe tick
    ldi     ZH,high(forward<<1)   ;Z pointe tick
    rcall   NewMove
    ret
...
...
forward:
.db 42,78,78 , 42,49,49 ;right up   ;left backward, right forward
.db 85,49,49 , 85,78,78 ;left up    ;left forward, right backward
;60°=42=0x2A    90°=64=0x40     120°=85=0x55
;70°=49=0x31                    110°=78=0x4E

Montage d'un HC-SR04

Le capteur HC-SR04 utilise les ultrasons pour déterminer la distance d'un objet.
Il offre une excellente plage de détection sans contact, avec des mesures de haute précision et stables.
Je vais donc choisir les mouvements en fonction des différentes distance d'objets.
DistanceFonctionNombre de
répetitions
0Pas de détection (trop loin)
Avance rapide
2
≥ 35cmAvance rapide2
de ≥25 à <35cmAvance lente2
de ≥10 à <25 cmTourner à gauche2
de <10 cmRecul rapide2

Les branchements

Pour le branchement des servo-moteur SG90, c'est simple S(Signal) fil jaune, + fils rouge, Masse fil marron
Avec la batteries de 3700mAh l'autonomie avant recharge est d'environs 3 heures.
  • SRV1 : moteur du milieu
  • SRV2 : moteur de gauche
  • SRV3 : moteur de droite
  • SRV4 : TRIG du HC-SR04
  • PB4 : ECHO du HC-SR04
Si il y a une led à allumer en permanence la résistance fait 220Ω, en effet si la tension d'entrée est de 5V pour des tests par exemple.
Si il y a deux leds à allumer en permanence la résistance fait 50Ω avec 3.7V. (Je sais le branchement n'est pas conventionnel)

Le programme

Programme sans HC-SR04
Programme avec HC-SR04 - 726 octets/8192 (Cool non!)

C'est tout pour aujourd'hui

Hexapode Arduino D'après une idée de mon ami Fred, pour sa fille Talya, besoin d'un hexapode (Elle a aprèciées La version attiny), mais elle voudrai programmer elle-même, du moins les mouvements.
Elle n'a que 10 ans, alors on vas simplifier l'utilisation.

Robot otto
Tonneau tiny (En cours) En allant sur le net, j'ai trouvé l'idée rigolote.

Utilisation de moteur DC pour Fred