Table des matières:

Scanner de points XYZ utilisant des encodeurs rotatifs récupérés : 5 étapes
Scanner de points XYZ utilisant des encodeurs rotatifs récupérés : 5 étapes

Vidéo: Scanner de points XYZ utilisant des encodeurs rotatifs récupérés : 5 étapes

Vidéo: Scanner de points XYZ utilisant des encodeurs rotatifs récupérés : 5 étapes
Vidéo: (3B) Introduction à la robotique mobile : Capteur III (Tactiles, sonar, lidar et radar) 2024, Novembre
Anonim
Scanner de points XYZ utilisant des encodeurs rotatifs récupérés
Scanner de points XYZ utilisant des encodeurs rotatifs récupérés

Ayant acquis un assez grand nombre d'encodeurs optiques rotatifs mis au rebut sur mon lieu de travail, j'ai finalement décidé de faire quelque chose d'amusant/utile avec eux.

J'ai récemment acheté une nouvelle imprimante 3D pour ma maison et quoi de mieux qu'un scanner 3D ! Ce projet m'a également fourni l'opportunité parfaite d'utiliser mon imprimante 3D pour fabriquer les pièces requises.

Fournitures

Codeurs optiques et capteurs optiques correspondants

Arduino UNO

bouclier de prototypage en option

rails en acier

accès à une imprimante 3D

Étape 1: Les encodeurs optiques

Les encodeurs optiques
Les encodeurs optiques
Les encodeurs optiques
Les encodeurs optiques
Les encodeurs optiques
Les encodeurs optiques

Presque n'importe quel encodeur rotatif peut être utilisé pour ce projet, à condition qu'il vous fournisse un nombre relativement élevé de « clics » par mm. De toute évidence, différents codeurs nécessiteront une solution de montage appropriée.

J'ai utilisé un compteur de continuité pour tracer le schéma de câblage des photo-capteurs.

Étape 2: Pièces imprimées en 3D

Pièces imprimées en 3D
Pièces imprimées en 3D
Pièces imprimées en 3D
Pièces imprimées en 3D

Ces pièces abritent les codeurs rotatifs et fournissent une glissière pour le rail. Le boîtier d'encodeur unique a deux trous à l'arrière pour le montage des rails transversaux. Le boîtier de l'encodeur double est simplement composé de deux boîtiers simples fusionnés à angle droit.

J'ai conçu ces supports sur fusion360 en fonction de mon choix d'encodeurs et de rails, l'arbre de l'encodeur a un petit morceau de gaine en caoutchouc fronde, pour l'aider à mieux saisir l'arbre en acier inoxydable.

Vous voulez que l'arbre glisse librement et tombe à travers le boîtier lorsqu'il est maintenu verticalement, mais il doit exercer une pression suffisante sur le codeur pour ne pas glisser. Ce qui a fonctionné pour moi, c'est de permettre à la glissière de l'arbre de chevaucher l'arbre du codeur de 0,5 mm. Le caoutchouc de la fronde est suffisamment souple pour se déformer de cette quantité et offrir une bonne traction.

Étape 3: Schéma de câblage

Schéma de câblage
Schéma de câblage

Le circuit est très simple. Les opto-capteurs nécessitent un peu de courant pour les diodes émettrices IR, une masse et des résistances de rappel pour les photodiodes.

J'ai opté pour 5mA pour les diodes émettrices en série, dans cet encodeur particulier, la chute de tension aux bornes des diodes est de 3,65V. J'utilise une alimentation 5V de l'Arduino, qui laisse 1,35V pour la résistance, à 5mA, cela équivaut à 270 ohms.

10k ohms ont été sélectionnés pour les pull-ups car les photodiodes ne peuvent absorber qu'un faible courant, 10k ohms ont également été utilisés pour le bouton-poussoir. Il y a un bouton disponible pour une utilisation sur la carte prototype déjà connectée à la terre, il suffit de lui fournir une résistance de rappel et de la câbler à la broche d'entrée souhaitée.

Étape 4: Code Arduino

Code Arduino
Code Arduino
Code Arduino
Code Arduino
Code Arduino
Code Arduino

Le code a besoin d'une petite explication car son fonctionnement n'est peut-être pas immédiatement évident, pourtant il a dû être optimisé de cette manière pour pouvoir traiter 3 encodeurs assez rapidement.

Tout d'abord, nous voulons uniquement traiter les données de direction S'il y a eu un changement de position du codeur.

change = new_value ^ valeur stockée;

Afin d'obtenir plus de résolution de mes encodeurs, j'ai dû traiter à la fois les fronts montants et descendants.

Sur ma configuration, ma résolution est de 24 clics par 1 cm.

Cela nous laisse quelques scénarios.

S1 est constant 0 et S2 basculé de 0 à 1

S1 est constant 0 et S2 basculé de 1 à 0

S1 est constant 1 et S2 bascule de 0 à 1

S1 est constant 1 et S2 bascule de 1 à 0

S2 est constant 0 et S1 basculé de 0 à 1

S2 est constant 0 et S1 basculé de 1 à 0

S2 est constant 1 et S1 bascule de 0 à 1

S2 est constant 1 et S1 bascule de 1 à 0

Ces conditions sont mieux comprises dans les tables de vérité ci-dessus, chaque condition donne également une "direction", arbitrairement nommée 0 ou 1.

Les graphiques nous donnent deux indices essentiels:

1) un graphique est l'inverse complet de l'autre, donc si nous en avons un, nous pouvons facilement calculer l'autre en inversant simplement la sortie. Nous inversons la sortie uniquement si une broche change et pas l'autre, nous pouvons en choisir une arbitrairement.

2) le graphique lui-même est simplement le XOR des signaux S1 et S2. (l'autre graphique est le PAS de cela).

Maintenant, comprendre le code est simple.

// lire dans PORT en parallèle // rappelez-vous que les paires adjacentes appartiennent au même état du codeur = PINB & 0x3f; // quelles broches ont changé s'il y en a diff = hold ^ state; // OU exclusif des signaux S1 et S2 adjacents pour obtenir la table de vérité // le moyen le plus simple est de faire une copie de l'état actuel // et de le décaler vers la droite d'un bit lookup = state >> 1; // maintenant les bits sont alignés pour XOR dir = lookup ^ state; // rappelez-vous, la table doit être inversée si l'une // des entrées est restée constante, nous n'avons pas besoin d'une instruction IF // pour cela. Actuellement, le bit de direction souhaité // est le bit de droite de chaque paire dans la variable 'dir' // le bit de gauche n'a pas de sens // la variable 'diff' a le bit qui a changé 'set' // donc nous avons soit '01' ou '10' // XOR ceci avec l'octet 'dir' // inversera ou non le bit significatif. dir ^= diff; // maintenant mettre à jour la variable hold hold = state; // si l'un des bits a changé pour cet encodeur if(diff & 0x03) { // déterminer la direction if(dir & 0x01) { // basé sur votre logiciel et votre câblage ++ ou -- --z; } else { ++z; } } // idem pour le reste if(diff & 0x0c) { if(dir & 0x04) { ++y; } else { --y; } } if(diff & 0x30) { if(dir & 0x10) { --x; } else { ++x; } }

Lorsque le bouton est enfoncé, nous envoyons la valeur XYZ actuelle à un programme de terminal.

Les données série sont lentes, mais pendant le fonctionnement normal, les positions des encodeurs ne changeront de toute façon pas pendant ce temps.

Les données sont envoyées sous forme de comptes bruts. Vous pouvez faire le calcul et envoyer les données en mm ou en pouces, etc. Je trouve que les valeurs brutes sont tout aussi bonnes car nous pouvons mettre l'objet à l'échelle plus tard dans le logiciel.

Étape 5: Première numérisation

Première analyse
Première analyse
Première analyse
Première analyse
Première analyse
Première analyse
Première analyse
Première analyse

La collecte des points est un processus lent, je pose la sonde dans le coin supérieur gauche et réinitialise l'Arduino.

Cela met à zéro la position de domicile.

Ensuite, déplacez la sonde vers l'emplacement sur la cible, maintenez-la stable et appuyez sur le bouton « instantané ».

Pour cet échantillon assez grand, je n'ai pris que ~140 points, donc les détails ne sont pas très bons sur le produit final.

Enregistrez les données dans un fichier. PCD et ajoutez l'en-tête

#. PCD v.7 - Format de fichier de données de nuages de pointsVERSION.7 CHAMPS x y z TAILLE 4 4 4 TYPE F F F COMPTAGE 1 1 1 LARGEUR (votre nombre de points) HAUTEUR 1 POINT DE VUE 0 0 0 1 0 0 0 POINTS (votre nombre de points)

Mettez votre nombre de points dans l'en-tête, c'est facile pour tout éditeur qui vous fournit des numéros de ligne.

Au-dessus des points peuvent être vus dans freeCad, ils sont ensuite exportés de freeCad sous forme de fichier. PLY.

Ouvrez le. PLY sur MeshLab et faites surfacer l'objet. Terminé!!

Conseillé: