[Projet] Porte-outil à correction automatique de trajectoire

Piloter un aspirateur autonome ou une tondeuse baladeuse... Pourquoi pas avec un Raspberry Pi ?

Modérateur : Francois

Répondre
Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

[Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » jeu. 22 sept. 2016 22:55

Bonjour,
voila, vite faite, ma feuille de route :

L'idée est de créer une plateforme supportant un outil (un stylo pour commencer) l'utilisateur déplace cette plateforme et un mécanisme interne corrige la trajectoire de l'outil pour qu'il suive précisément un chemin prédéfini.
Ce principe est mis en œuvre dans la machine Shaper (1)
Sauf qu'ils ont bâti leur système sur ce qui me semble être une usine à gaz : une caméra qui détecte des motifs imprimés sur un scotch propriétaire dont il faut recouvrir la surface de travail.

1ère étape, les capteurs :
Je part dans l’expérimentation pour remplacer la caméra par des capteurs de souris optiques (2) branchés sur un arduino (3).
Il faut minimum 2 capteurs car il faut connaître la rotation de la plateforme.
Le câblage du capteur nécessite sa déconnexion d'avec le reste du circuit de la souris, comme je pense réutiliser les boutons et la roulette j'espère que ça ne va pas mettre le contrôleur en panique et qu'il va continuer à m'envoyer les clics par l'USB. (Sinon je recâblerais les boutons directement sur les GPIO)
J'ai fait le choix de l'arduino plutôt que l'utilisation des GPIO du Raspberry à cause de la latence, l'arduino gérera directement les capteurs et les moteurs en suivant des points de contrôle qui seront eux envoyés par le Raspberry (5).
A faire :
- le câblage
- le programme Arduino qui calcul le déplacement et la rotation relatifs

2éme étape : Le mécanisme.
Le système à came et manivelle de la machine Shaper (4) me plaît bien, ça a l'air plus solide et rigide que des glissières.
Il faut résoudre le problème géométrique des angles des moteurs en fonction de la position (x,y) de l'outil.
A faire :
- Dessiner le mécanisme
- Découper les pièces
- Acheter des moteurs et leur pilote
- Assembler
- Câbler sur l'arduino

3éme étape : le logiciel "temps réel".
Écrire le logiciel "temps réel" de l'arduino qui va repositionner l'outil en fonction des déplacements de l'utilisateur.
Il va recevoir en entrée la position à atteindre (l’extrémité du segment que l'on est en train de tracer).
Le calcul à effectuer : trouver le point du segment le plus proche de la position actuelle de l'outil et en déduire les angles que les moteurs doivent prendre.
L'arduino renvoi au raspberry la position utilisateur, de manière à ce que celui-ci puisse rectifier sa trajectoire par retour d'info sur l'écran.

4ème étape : l'interface utilisateur.
Utilisation des boutons d'une des souris comme actionneurs, soit directement les clic via USB, soit par les GPIO.
Affichage sur un petit écran. Il n'y aura pas de curseur souris, je ne veux pas d'écran tactile car ça sera à terme utilisé en atelier. Donc juste des menus avec roulette et clic central de la souris et valider/annuler avec les deux boutons.
A faire :
- Conception et réalisation du logiciel.
- Trouver l’écran qui va bien

5éme étape, Assemblage :
Intégration des cartes et de l’écran sur la plateforme.
Modifications de la plateforme pour avoir une ergonomie correcte.

6éme étape :
Réalisation d'un axe Z, remplacement du crayon par une défonceuse.

NB :
Réfléchir à la possibilité de créer les chemins directement avec la machine : on la déplace où on veut, on clic pour choisir ce point comme référence. On choisi une fonction dans un menu, par exemple un cercle, on valide et hop c'est parti. Il faudra peut être ajouter un pointeur laser pour positionner précisément.

Doc :
(1) Présentation de la machine Shaper par hackaday : http://hackaday.com/2016/08/25/hands-on ... -we-build/
(2) Hack du capteur A5020 de Avago, présent entre autre dans les souris Logitech RX250 : http://www.wildcircuits.com/2013/03/opt ... cking.html
(3) Bibliothèque pour récupérer les infos du capteur : https://penti.org/~alx/projects/ADNS-5020-EN/
(4) Animation du mécanisme de la machine Shaper : https://hackadaycom.files.wordpress.com ... =800&h=668
(5) Tuto sur la communication Arduino<->Raspberry http://electroniqueamateur.blogspot.fr/ ... berry.html
Modifié en dernier par Flachy Joe le mer. 18 janv. 2017 16:28, modifié 5 fois.

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » mar. 27 sept. 2016 23:20

Et voila c'est parti.
Les 2 souris sont câblés sur l'arduino.
J'ai tenté de couper les pistes entre le capteur et le microcontrôleur mais je ne peux pas couper l'alimentation à cause des LEDs, le capteur reste donc connecté à la carte de la souris. Comme je ne veux pas risquer de griller l'arduino j'ai supprimé l'alim de l'USB. Résultat : ça ne marche pas, l'USB n'est pas détecté par le PC.
Il faudra donc que j'isole les boutons du reste de la carte et que je les câble vers les GPIO du Raspberry.

Je posterai des photos et le code de test arduino quand j'aurai droit aux BBCodes...

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » dim. 2 oct. 2016 21:11

Voici le banc de test des capteurs, j'ai débité un bout de cornière alu pour relier les deux souris.
On aperçoit le câblage sur l'arduino, de gauche à droite l'alim 5V, les fils de données "enable", "data" et "clock" et la masse au bout à droite. J'ai soudé les fils sur des connecteurs de 2 rangées coudées
IMGP4660.jpg
IMGP4660.jpg (136.5 Kio) Vu 9142 fois
Le soudage se fait directement sur les pattes du capteur car le passage des câbles par dessous provoquerait un décalage de la lentille donc une mauvaise mise au point du capteur.
Le fil noir qui va vers la LED est une alim que j'ai recâblé après avoir coupé un peu trop de pistes. le fil rouge relie le pin "reset" à l'alim, l'initialisation est gérée en soft par la bibliothèque arduino.
IMGP4659.jpg
IMGP4659.jpg (129.56 Kio) Vu 9142 fois
Vu du dessous, lentille retirée. Le pin 1 est en haut à droite.
Les pistes 1, 3, 4, 7 et 8 sont grattées pour isoler le capteur du microcontroleur. Les autres sont conservées pour alimenter la LED.
IMGP4665.jpg
IMGP4665.jpg (151.49 Kio) Vu 9142 fois
Et voila le code de test arduino qui affiche la position en dixième de mm et la rotation en degrés relativement à la position de départ.
Mais je crois que j'ai une erreur quelque part, ça part en vrille...

Code : Tout sélectionner

#include <Vector.h>
#include <A5020.h>

//A5020::A5020 (_clock, _data, _enable)
A5020 mouse1(34,32,30);
A5020 mouse2(35,33,31);

Vector Ox(0,0),Oy(0,0);
Vector OA(0,0),OB(0,0);
Vector OP(0,0);
double alpha;

const double point_to_mm = 0.0254; 
const double ecart = 75./point_to_mm; //capteurs écartés de 75mm
const double pi = 4.*atan(1);

void setup(){
  Serial.begin(115200);
  Serial.println("______________");
  Serial.println("Initialisation");
  Serial.print("\tEcart :");
  Serial.println(ecart);

  mouse1.reset();
  mouse2.reset();
  Ox=Vector(1,0);
  Oy=Vector(0,1);
  OA=Vector(0,0);
  OB=Vector(ecart,0);
  OP=Vector(0,0);
  alpha=0;
}

void loop(){
  mouse1.read();
  mouse2.read();
  if (mouse1.motion || mouse2.motion) {
    //déplacement dans le repère mobile
    Vector dA_bm = Vector(mouse1.delta_x, mouse1.delta_y);
    Vector dB_bm = Vector(mouse2.delta_x, mouse2.delta_y);
    //déplacements dans le repère global
    Vector dA = dA_bm.rotate(alpha);
    Vector dB = dB_bm.rotate(alpha);
    //Position globale
    OA = OA.add(dA);
    OB = OB.add(dB);
    Vector AB = OB.add(OA.invert());

    //rotation
    alpha = atan2(AB.y,AB.x);


    Vector OQ = OA.add(AB.mult(1/2)); //Q centre de [AB]

    Serial.print((long)(OQ.x*point_to_mm*10),DEC);
    Serial.print(" "); 
    Serial.print((long)(OQ.y*point_to_mm*10),DEC);
    Serial.print(" ");
    Serial.println(alpha*180/pi,DEC);
  }
  if (Serial.available() > 0) {
    int incomingByte = Serial.read();
    if (incomingByte = 'R') {
      setup();
    }
  }
  delay(20);
}
Avec la bibliothèque Vector écrite pour l'occasion

Code : Tout sélectionner

// Vector.h
// 2D Vector library for arduino use

#ifndef Vector_h
#define Vector_h

class Vector {
public :
    Vector(double, double);
    double x;
    double y;
    double length();
    Vector add(Vector);
    Vector invert();
    double dot(Vector);
    Vector mult(double);
    Vector rotate(double);
};
#endif

Code : Tout sélectionner

// Vector.cpp
// 2D Vector library for arduino use


#include "Arduino.h"
#include <math.h>
#include "Vector.h"

Vector::Vector(double nx, double ny){
    x=nx;
    y=ny;
}

double Vector::length(){
    return sqrt(x*x+y*y);
}

Vector Vector::add(Vector v2){
    return Vector(x+v2.x,y+v2.y);
}

Vector Vector::invert(){
    return Vector(-x,-y);
}

double Vector::dot(Vector v2){
    return x*v2.x+y*v2.y;
}

Vector Vector::mult(double s){
    return Vector(x*s,y*s);
}

Vector Vector::rotate(double a){
    return Vector(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a));
}

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » lun. 10 oct. 2016 22:35

Voila le code Arduino fonctionnel

Code : Tout sélectionner

#include <Vector.h>
#include <A5020.h>

//A5020::A5020 (_clock, _data, _enable)
A5020 mouse1(34,32,30);
A5020 mouse2(35,33,31);

const double pi = 4.*atan(1);
const double point_to_mm = 0.0254; //1000dpi

double ecart;
Vector OQ;
double alpha;

boolean Debug=false;

void printPos(){
  Serial.print((long)(OQ.x*point_to_mm*10),DEC);
  Serial.print(" "); 
  Serial.print((long)(OQ.y*point_to_mm*10),DEC);
  Serial.print(" ");
  Serial.println(alpha*180/pi,DEC);
}

void printDelta(){
  Serial.print("Delta:");
  Serial.print(mouse1.delta_x);
  Serial.print(" "); 
  Serial.print(mouse1.delta_y);
  Serial.print(" "); 
  Serial.print(mouse2.delta_x);
  Serial.print(" "); 
  Serial.println(mouse2.delta_y);
}

void printEcart(){
    Serial.print("\tEcart :");
    Serial.println(ecart);
}

void setup(){  
  Serial.begin(115200);

  mouse1.reset();
  mouse2.reset();
  OQ=Vector(0,0);
  alpha=0;
  ecart = 75/point_to_mm; //capteurs écartés de 75mm
  
  if (Debug) {
    Serial.println("Initialisé");
    printEcart();
  }
}

void loop(){
  mouse1.read();
  mouse2.read();
  if (mouse1.motion || mouse2.motion) {
    //déplacement dans le repère mobile
    Vector dA_bm = Vector(-mouse1.delta_x, -mouse1.delta_y);
    Vector dB_bm = Vector(-mouse2.delta_x, -mouse2.delta_y);
    
    //Composante translation
    Vector T_bm = dA_bm.add(dB_bm).mult(0.5);

    //translation dans le repère global
    Vector T = T_bm.rotate(-alpha);
    
    //Position globale
    OQ = OQ.add(T);
    
    //Composante rotation
    Vector R_bm = dB_bm.add(dA_bm.invert());
    R_bm.x += ecart;
    
    //rotation
    alpha += 2*atan2(R_bm.y, R_bm.x);
    
    if (Debug) {
      printDelta();
    }
    
    printPos();
  }
  
  //Traitement de l'entrée
  if (Serial.available() > 0) {
    int incomingByte = Serial.read();
    if (incomingByte=='R') {
        setup();
    }else if ( incomingByte=='D'){
        Debug = !Debug;
        if (Debug){
          Serial.println("Debug actif");
        }
    }else if ( incomingByte=='S'){
      ecart = Serial.parseFloat()/point_to_mm;
      if (Debug){
        printEcart();
      }
    }else{
        printPos();
    }
  }
  
  delay(20);
}
Ça fonctionne mais la position dérive, ça va bien sur des petits mouvements mais dès que je déplace le système d'une dizaine de centimètres les coordonnées calculées ne correspondent plus à la réalité. En même temps ce n'est pas très étonnant vu le montage, le calcul est très sensible à la précision de l'écart entre les capteurs et leur parallélisme est important aussi.
Il faut donc que je fabrique un banc de test plus précis.

S'il faut, j'ai en stock un capteur 6 axes MPU6050 (gyroscopes et accéléromètres sur une puce qui communique en I2C) mais je ne sais pas quelle précision on peut attendre de ça...

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » ven. 14 oct. 2016 23:06

J'ai modélisé vite fait les PCB des souris pour préparer la découpe d'un support de test à la CNC. Voila un aperçu et le fichier FreeCAD (retirez .zip du nom de fichier).
Modélisation support.jpg
Modélisation support.jpg (49.78 Kio) Vu 9098 fois
Support.fcstd.zip
(90.07 Kio) Téléchargé 317 fois

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » dim. 4 déc. 2016 12:04

Changement d'idée à propos du support des circuits : je dessinerais un PCB pour intégrer directement les deux capteurs et leurs LED, ça sera plus propre.
En attendant j'ai théoriquement résolu le problème de la calibration de l'orientation des capteurs relativement au support : en déplaçant le support le long de son axe X et en effectuant le cumul des déplacements pour chaque capteur, on peut déduire du rapport y/x l'angle que font chacun.

Plus qu'à mettre ça en code arduino et à fixer un peu mieux les circuits dans les boîtiers des souris pour qu'ils arrêtent de gigoter. Faut juste prendre le temps de le faire...

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » mer. 18 janv. 2017 16:17

Salut tous,
il y a du monde qui suit le sujet au vu du compteur (vues : 324 aujourd'hui) mais personne pour m'encourager ? :'-(

J'ai pas énormément avancé depuis la dernière fois mais j'ai quand même dessiné un PCB avec KiCad.
C'est du double couches parce que je trouvais ça plus simple que de faire des ponts. "cdecde" c'est pour "ClockDataEnableClockDataEnable", pour se souvenir de l'ordre des fils de données.
Capture d’écran_2017-01-18_15-52-47.png
Capture d’écran_2017-01-18_15-52-47.png (23.69 Kio) Vu 8927 fois
Capture d’écran_2017-01-18_16-00-55.png
Capture d’écran_2017-01-18_16-00-55.png (16.79 Kio) Vu 8927 fois
Est-ce qu'il y a un maître es électronique qui voudrait bien y jeter un œil ? Dans ce cas je mettrais le fichier KiCad ou les GERBER.

J'hésite encore sur le design, ça serait peut-être mieux d'avoir les LED au milieu et les A5020 de part et d'autre : les capteurs serait plus éloignés donc la précision angulaire serait plus importante et il y aurait 2 fenêtres dans le support plutôt qu'une, ce serait plus résistant. Par contre ça agrandi le PCB.

J'ai aussi reçu un coup de main pour la résolution géométrique du mécanisme, je peux donc calculer la rotation à appliquer aux moteurs pour déplacer l'outil à l'endroit voulu.
Pour info, c'est des applications des formules d'Al Kashi (cad Pythagore généralisé aux triangles non rectangles) assez basique mais il faut penser à prendre les bons triangles.

A suivre au prochain épisode...

marcof
Messages : 1
Enregistré le : sam. 21 janv. 2017 07:11

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par marcof » sam. 21 janv. 2017 07:19

Ce message a été supprimé !!
Message Modérateur :
Nous sommes sur un forum Français, ce forum a été créé afin d'avoir un échange dans la communauté francophone, vous pouvez utiliser des traducteurs si besoin, mais merci de poster en français.
- domi

destroyedlolo
Raspinaute
Messages : 1583
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par destroyedlolo » sam. 21 janv. 2017 10:42

Même si je ne commente pas, je suis avec interet l'avancée de ton projet (qui pourrait m'inspirer sur d'autres trucs qui courent dans ma tête :P ) : j'espère donc que tu persévéreras à poster les avancées sur ce forum.

A+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: [Projet] Porte-outil à correction automatique de trajectoire

Message par Flachy Joe » dim. 22 janv. 2017 11:41

Salut destroyedlolo,
merci pour ton message.
Qu'est ce que tu as comme projet en cours ?

Répondre

Retourner vers « Robots and Co »