Table des matières:

Bras robotique : Jensen : 4 étapes
Bras robotique : Jensen : 4 étapes

Vidéo: Bras robotique : Jensen : 4 étapes

Vidéo: Bras robotique : Jensen : 4 étapes
Vidéo: Возведение перегородок санузла из блоков. Все этапы. #4 2024, Novembre
Anonim
Bras robotique: Jensen
Bras robotique: Jensen

Jensen est un bras robotique construit sur la plate-forme Arduino avec un accent sur la planification intuitive des mouvements, réalisé en tant que projet indépendant de 1 crédit sous le mentorat de Charles B. Malloch, PhD. Il peut reproduire une série de mouvements programmés en déplaçant manuellement le bras. J'ai eu l'inspiration pour le construire en voyant d'autres bras robotiques construits dans le makerspace UMass Amherst M5. De plus, je voulais apprendre à utiliser un logiciel de CAO et je voulais faire un projet Arduino avancé. J'ai vu cela comme une opportunité de faire toutes ces choses.

Étape 1: Conception originale et portée

Conception originale et portée
Conception originale et portée

Le logiciel de CAO que j'ai choisi d'apprendre pour ce projet était OnShape, et la première chose que j'ai modélisée était un servo analogique HiTec HS-422. J'ai choisi le servo parce qu'il m'était disponible localement et que c'était un prix raisonnable. Cela a également servi de bonne pratique pour apprendre OnShape avant de passer à la conception de mes propres pièces. À ce stade précoce du projet, j'avais une idée générale de ce dont je voulais que le bras soit capable. Je voulais qu'il ait une amplitude de mouvement décente et une pince pour ramasser les choses. Ces spécifications générales ont informé la conception alors que je continuais à la modéliser en CAO. Une autre contrainte de conception que j'avais à ce stade était la taille du lit d'impression sur mon imprimante 3D. C'est pourquoi la base que vous voyez sur la photo ci-dessus est un carré relativement primitif.

Au cours de cette étape du projet, je réfléchissais également à la façon dont je voulais contrôler le bras. Un bras robotique qui m'avait inspiré dans le makerspace utilisait un bras marionnette pour le contrôle. Un autre utilisait une méthode de programmation de trajectoire intuitive dans laquelle le bras était déplacé dans diverses positions par l'utilisateur. Le bras reviendrait ensuite dans ces positions.

Mon plan initial était de terminer la construction du bras, puis de mettre en œuvre ces deux méthodes de contrôle. Je voulais aussi faire une application informatique pour le contrôler à un moment donné par la suite. Comme vous pouvez probablement le constater, j'ai fini par réduire la portée de cet aspect du projet. Lorsque j'ai commencé à travailler sur ces deux premières méthodes de contrôle, j'ai rapidement découvert que la programmation intuitive des chemins était plus compliquée que je ne le pensais. C'est alors que j'ai décidé d'en faire mon objectif et de mettre les autres méthodes de contrôle en attente indéfinie.

Étape 2: Contrôle

Contrôler
Contrôler

La méthode de contrôle que j'ai choisie fonctionne comme ceci: vous déplacez le bras avec vos mains dans différentes positions et « enregistrez » ces positions. Chaque position a des informations sur l'angle entre chaque lien du bras. Une fois que vous avez terminé de sauvegarder les positions, vous appuyez sur un bouton de lecture et le bras revient à chacune de ces positions dans l'ordre.

Dans cette méthode de contrôle, il y avait beaucoup de choses à comprendre. Pour que chaque servo revienne à un angle enregistré, j'ai dû en quelque sorte "enregistrer" ces angles en premier lieu. Cela nécessitait que l'Arduino Uno que j'utilisais puisse recevoir l'angle actuel de chaque servo. Mon ami Jeremy Paradie, qui a fabriqué un bras robotique utilisant cette méthode de contrôle, m'a appris à utiliser le potentiomètre interne de chaque servomoteur. C'est le potentiomètre que le servo utilise lui-même pour coder son angle. J'ai choisi un servo de test, soudé un fil à la broche centrale du potentiomètre interne et percé un trou dans le boîtier pour alimenter le fil à l'extérieur.

Je pouvais maintenant recevoir l'angle actuel en lisant la tension sur la broche centrale du potentiomètre. Cependant, il y avait deux nouveaux problèmes. Premièrement, il y avait du bruit sous la forme de pointes de tension sur le signal provenant de la broche du milieu. Ce problème est devenu un vrai problème plus tard. Deuxièmement, la plage de valeurs pour envoyer un angle et recevoir un angle était différente.

Dire aux servomoteurs amateurs de se déplacer à un certain angle entre 0 et 180 degrés implique de lui envoyer un signal PWM avec un temps élevé correspondant à l'angle. Au contraire, l'utilisation d'une broche d'entrée analogique de l'Arduino pour lire la tension sur la broche centrale du potentiomètre tout en déplaçant le palonnier entre 0 et 180 degrés renvoie une plage de valeurs distincte. Par conséquent, des calculs ont été nécessaires pour traduire une valeur d'entrée enregistrée en la valeur de sortie PWM correspondante nécessaire pour ramener le servo au même angle.

Ma première pensée a été d'utiliser une simple carte de plage pour trouver le PWM de sortie correspondant pour chaque angle enregistré. Cela a fonctionné, mais ce n'était pas très précis. Dans le cas de mon projet, la plage de valeurs de temps élevé PWM correspondant à une plage d'angles de 180 degrés était beaucoup plus large que la plage de valeurs d'entrée analogique. De plus, ces deux plages n'étaient pas continues et composées uniquement d'entiers. Par conséquent, lorsque j'ai mappé une valeur d'entrée enregistrée sur une valeur de sortie, la précision a été perdue. C'est à ce moment-là que j'ai pensé que j'avais besoin d'une boucle de contrôle pour amener mes servos là où ils devaient être.

J'ai écrit du code pour une boucle de contrôle PID dans laquelle l'entrée était la tension de la broche centrale et la sortie était la sortie PWM, mais j'ai rapidement découvert que je n'avais besoin que d'un contrôle intégral. Dans ce scénario, la sortie et l'entrée représentaient toutes deux des angles, donc l'ajout d'un contrôle proportionnel et dérivé avait tendance à le faire dépasser ou à avoir un comportement indésirable. Après avoir réglé le contrôle intégral, il y avait encore deux problèmes. Premièrement, si l'erreur initiale entre l'angle actuel et l'angle souhaité était importante, le servo accélérerait trop rapidement. Je pouvais réduire la constante pour le contrôle intégral, mais cela rendait le mouvement global trop lent. Deuxièmement, la motion était nerveuse. C'était le résultat du bruit sur le signal d'entrée analogique. La boucle de contrôle lisait en permanence ce signal, de sorte que les pics de tension provoquaient un mouvement nerveux. (À ce stade, je suis également passé de mon seul servo de test à l'assemblage illustré ci-dessus. J'ai également créé un objet de boucle de contrôle pour chaque servo dans le logiciel.)

J'ai résolu le problème de l'accélération trop rapide en mettant un filtre de moyenne mobile à pondération exponentielle (EWMA) sur la sortie. En faisant la moyenne de la sortie, les grandes pointes de mouvement ont été réduites (y compris la gigue du bruit). Cependant, le bruit sur le signal d'entrée était toujours un problème, donc la prochaine étape de mon projet essayait de résoudre ce problème.

Étape 3: Le bruit

Bruit
Bruit

Sur la photo ci-dessus

En rouge: signal d'entrée d'origine

En bleu: signal d'entrée après traitement

La première étape pour réduire le bruit sur le signal d'entrée consistait à comprendre sa cause. Sonder le signal sur un oscilloscope a révélé que les pics de tension se produisaient à une fréquence de 50 Hz. Je savais que le signal PWM envoyé aux servos était également à une fréquence de 50 Hz, alors j'ai supposé que les pics de tension avaient quelque chose à voir avec cela. J'ai émis l'hypothèse que le mouvement des servos provoquait en quelque sorte des pics de tension sur la broche V + des potentiomètres, ce qui à son tour gâchait la lecture sur la broche du milieu.

C'est ici que j'ai fait ma première tentative pour réduire le bruit. J'ai ouvert à nouveau chaque servo et ajouté un fil provenant de la broche V + du potentiomètre. J'avais besoin de plus d'entrées analogiques pour les lire que l'Arduino Uno n'en avait, donc je suis également passé à un Arduino Mega à ce stade. Dans mon code, j'ai changé l'entrée d'angle d'une lecture analogique de la tension sur la broche du milieu à un rapport entre la tension sur la broche du milieu et la tension sur la broche V+. J'espérais que s'il y avait un pic de tension sur les broches, cela s'annulerait dans le rapport.

J'ai tout remonté et testé, mais les pics se produisaient toujours. Ce que j'aurais dû faire à ce stade, c'était sonder mon terrain. Au lieu de cela, mon idée suivante était de mettre les potentiomètres sur une alimentation séparée entièrement. J'ai déconnecté les fils V + des entrées analogiques de l'Arduino et les ai branchés à une alimentation séparée. J'avais déjà sondé les broches, donc je savais à quelle tension les alimenter. J'ai également coupé la connexion entre la carte de commande et la broche V + dans chaque servo. J'ai tout remonté, j'ai rétabli le code d'entrée d'angle comme avant, puis je l'ai testé. Comme prévu, il n'y avait plus de pics de tension sur la broche d'entrée. Cependant, il y avait un nouveau problème - mettre les potentiomètres sur une alimentation séparée avait complètement gâché les boucles de contrôle internes des servos. Même si les broches V+ recevaient la même tension qu'auparavant, le mouvement des servos était erratique et instable.

Je ne comprenais pas pourquoi cela se produisait, alors j'ai finalement sondé ma connexion à la terre dans les servos. Il y avait une chute de tension moyenne d'environ 0,3 volts à travers le sol, et elle augmentait encore plus lorsque les servos tiraient du courant. Il était alors clair pour moi que ces broches ne pouvaient plus être considérées comme "terrestres" et pourraient mieux être décrites comme des broches "de référence". Les cartes de commande des servos ont dû mesurer la tension sur la broche centrale du potentiomètre par rapport à la fois à la tension sur les broches V+ et de référence. L'alimentation séparée des potentiomètres a gâché cette mesure relative car maintenant, au lieu d'un pic de tension sur toutes les broches, cela ne s'est produit que sur la broche de référence.

Mon mentor, le Dr Malloch, m'a aidé à déboguer tout cela et m'a suggéré de mesurer également la tension sur la broche du milieu par rapport aux autres broches. C'est ce que j'ai fait pour ma troisième et dernière tentative de réduction du bruit de l'entrée d'angle. J'ai ouvert chaque servo, reconnecté le fil que j'avais coupé et ajouté un troisième fil provenant de la broche de référence sur le potentiomètre. Dans mon code, j'ai rendu l'entrée d'angle équivalente à l'expression suivante: (broche du milieu - broche de référence) / (V+pin - broche de référence). Je l'ai testé et il a réussi à réduire les effets des pics de tension. De plus, j'ai également mis un filtre EWMA sur cette entrée. Ce signal traité et le signal d'origine sont illustrés ci-dessus.

Étape 4: Envelopper les choses

Envelopper les choses
Envelopper les choses

Le problème du bruit étant résolu au mieux de mes capacités, je me suis mis à réparer et à réaliser les dernières parties de la conception. Le bras mettait trop de poids sur le servo dans la base, j'ai donc fabriqué une nouvelle base qui supporte le poids du bras à l'aide d'un grand roulement. J'ai également imprimé la pince et l'ai poncée un peu pour la faire fonctionner.

Je suis très content du résultat final. La planification intuitive des mouvements fonctionne de manière cohérente et le mouvement est fluide et précis, compte tenu de tout. Si quelqu'un d'autre voulait faire ce projet, je l'encouragerais d'abord fortement à en faire une version plus simple. Avec le recul, faire quelque chose comme ça en utilisant des servomoteurs de loisir était très naïf, et la difficulté que j'ai eue à le faire fonctionner le montre bien. Je considère comme un miracle que le bras fonctionne aussi bien. Je veux toujours créer un bras robotique qui puisse s'interfacer avec un ordinateur, exécuter des programmes plus complexes et se déplacer avec une plus grande précision, donc pour mon prochain projet, je le ferai. J'utiliserai des servos de robotique numérique de haute qualité, et j'espère que cela me permettra d'éviter bon nombre des problèmes que j'ai rencontrés dans ce projet.

Document CAO:

cad.onshape.com/documents/818ea878dda7ca2f…

Conseillé: