Académique Documents
Professionnel Documents
Culture Documents
Журавский Д. Ю. - ЭЛб-1401 fr
Журавский Д. Ю. - ЭЛб-1401 fr
MÉMOIRE DE LICENCE
" " 20 г.
Togliatti 2018
Annotation
2
Résumé
liste de références.
Le mémoire de licence se compose d'une note explicative de 48 pages, comprenant 41
dessins, la partie graphique de 6 affiches de format A1, et une liste de 25 références.
3
Contenu
Introduction ..........................................................................................................................5
1. Statut de la question........................................................................................................10
1.1. Formuler le but et les objectifs du projet ..................................................................10
1.2. Analyse des données de base et des solutions connues ............................................10
2. Section du projet.............................................................................................................13
2.1. Conception du circuit et sélection des composants nécessaires...................................13
2.2. Développement de la conception des dispositifs ......................................................18
2.3. Fabrication pratique du dispositif .............................................................................19
3. Partie du programme ......................................................................................................23
3.1. Description de l'algorithme du dispositif..................................................................23
3.2. Développer la partie logicielle de l'appareil .............................................................28
4. Partie expérimentale .......................................................................................................40
4.1. Instructions pour l'utilisation de l'appareil................................................................40
4.2. Vérification et débogage de la partie logicielle de l'appareil....................................42
5. Un dispositif sûr et respectueux de l'environnement.......................................................43
6. Volet économique...........................................................................................................45
Conclusion..........................................................................................................................46
Liste des sources utilisées...................................................................................................47
Annexe A............................................................................................................................50
Annexe B............................................................................................................................53
4
Introduction
L'homme moderne du XXIe siècle a grand besoin de ces "aides" indispensables dans
de nombreux domaines d'activité, tels que l'industrie, la médecine, la construction, la
recherche, la maison, etc.
des robots. C'est pourquoi la robotique s'est tellement développée ces dernières années. De
nombreux types de dispositifs robotiques ont été mis au point pour faciliter au maximum
l'exécution de certaines tâches,
améliorer de manière significative la qualité du travail effectué et réduire au minimum les
risques d'accidents.
la possibilité de blessures liées au travail, pouvant aller jusqu'à la mort. Un exemple d'un
tel dispositif est un bras robotisé.
Un bras robotisé est un dispositif qui imite des mouvements similaires à des
mouvements humains humain,conçu pour la mise en
œuvre
Il existe un large éventail de tâches, allant du simple déplacement d'objets dans l'espace à
5
la réalisation d'interventions chirurgicales complexes. Il existe de nombreux types de
manipulateurs qui
6
Ils se distinguent par le nombre de degrés de mobilité, les actionneurs utilisés, la capacité
de charge, la méthode de contrôle, la méthode d'installation, la capacité à être déplacé et
donc la méthode de déplacement. Toutes ces
les critères sont choisis en fonction de l'objectif du manipulateur. Ci-dessous
Les principaux types de manipulateurs, qui diffèrent par leur conception, sont énumérés :
7
Les bras articulés sont des liens multiples qui forment un système de coordonnées
polaires. Ce type de manipulateur est très flexible, ce qui lui permet d'adopter n'importe
quelle position dans la zone de travail. Les bras articulés sont utilisés dans de nombreuses
applications : soudage, chirurgie mini-invasive, etc.
Manipulateurs à tige parallèle. Les plus courants sont constitués de plusieurs circuits
cinématiques formant un parallélogramme. Ces dispositifs ont une grande précision, une
capacité de vitesse élevée et un énorme degré de liberté. Les manipulateurs de ce type sont
principalement utilisés pour le tri et l'emballage de produits finis.
8
Figure 4 - Manipulateur de type parallèle
Cependant, tous les types de manipulateurs décrits ci-dessus constituent une chaîne
ouverte de maillons interconnectés, qui ont leurs propres noms, semblables aux noms des
parties du bras humain (épaule, avant-bras, coude),
main, doigts, articulation, etc.)
9
Les bras articulés sont particulièrement demandés aujourd'hui dans l'industrie, où les
capacités de levage élevées sont une exigence clé. Les manipulateurs pneumatiques et
hydrauliques sont bien adaptés à cette tâche. Parallèlement, les manipulateurs sont
également nécessaires pour d'autres applications où la capacité de levage est moins
importante, mais où une précision, une flexibilité et un contrôle élevés sont requis. Les
manipulateurs servo-motorisés, moins connus que leurs homologues hydrauliques et
pneumatiques, sont mieux adaptés à ce type d'applications. Ce type de manipulateur
commence tout juste à gagner en popularité et il n'existe pas beaucoup de solutions prêtes
à l'emploi qui répondent à toutes les exigences. Dans notre projet, nous utiliserons un bras
servo articulé, que nous examinerons en détail.
10
1. État de la question
Objectif : Créer une carte de démonstration de bras robotique basée sur des
servomoteurs, concevoir et mettre en œuvre un moyen de contrôler le bras robotique.
Objectifs :
1. Analyser tout le matériel lié d'une manière ou d'une autre à notre sujet de diplôme.
2. Mettre en évidence tous les avantages et les inconvénients des solutions existantes.
3. Fabrication du dispositif.
4. Développement et débogage de la partie logicielle du dispositif.
Il existe actuellement très peu de solutions prêtes à l'emploi pour les manipulateurs à
servomoteur. Toutes les implémentations que j'ai examinées ont de nombreux points
communs : une conception à peu près identique utilisant des matériaux différents qui
influent sur le poids total de l'appareil, une conception similaire de l'appareil, une
11
popularité
12
Les robots industriels sont demandés en raison de l'absence de concurrents dans leur gamme
de prix, alors que les robots industriels coûtent des dizaines de fois plus cher.
Outre uArm, il existe plusieurs autres options de manipulateurs sur le marché qui sont
inférieures à la solution ci-dessus pour une raison ou une autre, mais qui méritent tout de
même l'attention : le projet Dobot, qui a un penchant pour l'impression 3D, le projet Ctrl,
qui ressemble à un manipulateur industriel, réduit de plusieurs fois. Ces deux projets
présentent toutefois un inconvénient de taille pour
des appareils destinés principalement à un usage domestique, leur prix :
13
Dobot ($1400), Ctrl ($800). Il existe également un projet très bon marché appelé LittleArm
(60 $) 2C, qui consiste essentiellement à
petit manipulateur, visant à à l'enseignement enfants
les bases de la programmation et de la robotique.
Après avoir analysé toutes les solutions évoquées ci-dessus, nous avons conclu que,
pour notre projet, nous devions utiliser des composants peu coûteux, facilement
disponibles et pouvant être rapidement et facilement modifiés en cas de besoin, et nous
avons choisi pour la commande, également utilisée dans le projet uArm, la méthode de la
souris et du manipulateur de clavier, parce qu'elle
offre une très large gamme de paramètres configurables, ce qui permet de réaliser un
système de contrôle très flexible.
14
2. Section du projet
Pour créer le projet prévu, la première chose à faire est d'établir un schéma
fonctionnel afin d'avoir une idée aussi détaillée que possible des composants dont vous
avez besoin. Schéma fonctionnel
de l'appareil est illustré ci-dessous à la figure 11. La conception du diagramme a été réalisée
en
Le système de conception assistée par ordinateur KOMPAS-3D.
Tout d'abord, nous devons décider comment nous allons faire fonctionner notre
15
manipulateur. Puisque nous voulons créer une cabine de démonstration,
16
qui peut être utilisé par tout le monde sans problème de recherche
Nous avons choisi d'utiliser une souris et un clavier pour contrôler le microcontrôleur via
un ordinateur, puisque nous n'avons pas besoin de piles pour le déplacer. Comme notre
carte de démonstration n'est pas mobile et n'a pas besoin de piles pour se déplacer, nous
avons choisi une alimentation pour ordinateur qui est idéale pour alimenter à la fois les
servos et le microcontrôleur. Pour la carte microcontrôleur, nous avons opté pour
l'Arduino Mega 2560, qui est entièrement compatible avec toutes les cartes
d'alimentation.
nécessaires à notre projet. Ce modèle peut être alimenté non
Cette carte est équipée d'un microcontrôleur ATmega2560 avec 256kB de mémoire pour
stocker le code du programme. Cette carte est équipée d'un microcontrôleur
ATmega2560 qui dispose de 256kB de mémoire pour stocker le code du programme.
Nous disposons également d'un grand nombre de broches d'E/S (16 analogiques et 54
numériques), d'un port USB et d'un UART. Il supporte la plupart des cartes d'extension, y
compris le Multiservo Shield qui peut également être utilisé dans notre banc d'essai. L'un
des principaux avantages de ce
L'environnement de programmation intégré Arduino IDE, mondialement connu, est la
plateforme. Il utilise un langage de programmation C/C++ simplifié, bénéficie d'un très
bon soutien de la part des développeurs et dispose d'une grande autonomie.
un grand nombre de bibliothèques qui sont constamment mises à jour.
17
Figure 9 - Arduino Mega 2560
18
L'un des éléments les plus importants de notre unité est le servomoteur. Afin de
choisir le meilleur rapport prix/performance, nous avons examiné de nombreuses options.
Les principaux critères de sélection étaient les suivants : le type de mécanisme de retour
d'information, dans notre cas, le mécanisme de retour d'information, dans notre cas, le
mécanisme de retour d'information.
Dans ce cas, nous avons opté pour un servo numérique, un mécanisme métallique, un
couple élevé, une protection contre les chocs, une grande précision de positionnement, une
faible zone morte, un grand angle de rotation. Le servomoteur Tower Pro MG996R nous
a semblé le mieux adapté, car il présente un bon rapport qualité/prix.
caractéristiques à un prix relativement bas : poids 55g, couple 9,4 kgf-cm
(kilo-force par centimètre) à 4,8 V, 11 kgf-cm à 6 V, tension de fonctionnement : 5 - 7,3
V, vitesse de fonctionnement : 0,17 s/60º (5 V), 0,14 s/60º (6 V), mouvement mécanique,
un angle de rotation de 120 degrés. Pour notre projet, 5 de ces actionneurs sont nécessaires.
19
Le schéma de câblage complet, ainsi que la liste des composants utilisés, sont
présentés dans la figure 11 ci-dessous. La disposition du schéma a été
Le projet a été réalisé avec le système de CAO KOMPAS-3D.
20
Figure 11 - Schéma de circuit avec liste des composants
21
2.2. Développement de la conception des dispositifs
Notre objectif premier étant de créer une carte de démonstration à utiliser pour
l'apprentissage pratique de la programmation de manipulateurs, cela implique une
connexion rapide du dispositif, la possibilité de changer la configuration de l'équipement à
connecter,
La décision a été prise de construire une cabine entièrement ouverte, où le manipulateur et
tous les éléments qui l'accompagnent - alimentation électrique, tableau de connexion - se
trouveraient sur la même plate-forme,
carte de contrôle à microcontrôleur. Dans Compass 3D, vous avez créé une carte de contrôle à
microcontrôleur d'une valeur approximative de 1,5 million d'euros.
Le plan de notre stand, sur la base duquel l'appareil sera fabriqué.
22
2.3. Fabrication pratique du dispositif
Commençons donc à assembler l'appareil. Nous avons choisi une plaque de fibre de
verre comme plateforme pour notre stand, sur laquelle toutes les pièces seront placées,
jusqu'à l'alimentation. Pour alimenter notre manipulateur et notre carte de microcontrôleur,
nous avons pris une alimentation d'ordinateur ordinaire.
Nous nous sommes débarrassés des fils inutiles, ne laissant que quelques fils GND,
5V pour tous les servos et 12V qui pourrait être nécessaire dans de futurs projets où une
alimentation externe pour la carte arduino pourrait être nécessaire. Nous avons également
fabriqué un bouton d'alimentation pour faciliter la mise en marche et l'arrêt. Montage de
l'alimentation sur la plaque pré-peinte en noir. Directement
Pour l'assemblage du manipulateur lui-même, nous avons utilisé des pièces préfabriquées
en aluminium provenant du kit de construction en raison de leur légèreté et des trous de
fixation déjà réalisés.
23
Figure 14 - Parties du cadre du manipulateur
Nous avons également trouvé une solution de préhension standard compatible avec
notre servomoteur, capable de saisir des objets de taille relativement importante et peu
coûteuse, ce qui facilite son remplacement en cas de défaillance.
24
Avec toutes les pièces en aluminium, le servo et la poignée assemblés
manipulateur. A l'origine, le manipulateur a été construit avec 6 servos, mais comme le
servo le plus bas, qui tient le reste de la structure, ne pouvait pas supporter le poids, il a été
décidé d'enlever un servo, responsable de la deuxième courbure supérieure du
manipulateur. Il a également été nécessaire de rallonger les fils des servos et du capteur
afin de les rendre suffisamment longs pour qu'ils puissent se déplacer librement le long de
la trajectoire du manipulateur. Vérification du bon fonctionnement de chaque servo.
Ensuite, il a été décidé de créer une carte séparée qui serait responsable de
l'alimentation commune et de la mise à la terre des servos. Nous avons également ajouté
des broches communes à la carte pour connecter les fils de signal des servos aux broches
d'entrée de la carte du microcontrôleur.
25
Placez le manipulateur assemblé, la carte de connexion et la carte de
microcontrôleur sur une plaque de carton de verre et regroupez tous les fils des servos en
un seul faisceau commun, en marquant chaque fil avec le numéro de servo correspondant,
afin de ne pas vous embrouiller avec le grand nombre de fils. Nous avons connecté tous les
fils aux connecteurs appropriés. Il a également été décidé d'ajouter un télémètre à ultrasons
à notre dispositif afin de pouvoir l'utiliser dans de futurs projets avec notre stand pour
contrôler la prise du manipulateur. L'assemblage du stand de démonstration est terminé.
Ci-dessous, une photo de l'appareil terminé.
26
3. Partie logicielle
27
Figure 18 - Conception du servomoteur
L'une des principales pièces du servomoteur est le potentiomètre, qui comporte trois
broches, dont les deux broches latérales sont alimentées, et entre chaque broche se trouve
une substance résistive qui permet au curseur de se déplacer,
connectée à la broche centrale à partir de laquelle la valeur de la tension est prise.
29
Figure 20 - Diagramme des impulsions de commande du servomoteur
30
Nous décrirons également brièvement le principe de fonctionnement du télémètre à
ultrasons HC-SR04, dont nous pourrions avoir besoin dans des projets futurs avec notre
appareil. Le télémètre à ultrasons utilise le principe du
l'écholocation, comme chez les chauves-souris. La carte du télémètre comporte deux
transducteurs piézoélectriques, l'un fonctionnant comme émetteur (haut-parleur) et l'autre
comme récepteur (microphone). Quatre broches sont utilisées pour connecter le capteur :
VCC - 5 volts
(DC), GND - terre, Trig - déclenchement (INPUT), Echo - écho (OUTPUT). Interface
La communication fonctionne comme suit : une brève impulsion de 10-15 microsecondes
est générée sur la broche Trig, après quoi un certain nombre de signaux de 40 kilohertz
sont générés à la sortie, qui seront envoyés vers un obstacle au moyen du haut-parleur. En
même temps, une unité logique de haut niveau de 150 microsecondes à 25 microsecondes
est générée sur la sortie Echo.
millisecondes. Dès que l'onde réfléchie par l'obstacle atteint le récepteur, un zéro logique
apparaît sur la sortie Echo. La distance de l'objet est directement proportionnelle à la
largeur du signal Echo. En d'autres termes, connaissant le temps pendant lequel l'unité
logique de haut niveau est présente sur la broche Echo, nous pouvons déterminer
la distance par rapport à un objet, à l'aide d'une formule spéciale.
31
3.2. Développement de la partie logicielle du dispositif
32
Figure 21 - Algorithme du programme de la carte de contrôle Examinez les
voir l'annexe A.
Étant donné qu'un grand nombre de données seront impliquées dans la transmission
et la lecture du port série, nous devrions utiliser des tableaux de données. Un tableau de
données est une sorte de zone de mémoire divisée en un certain nombre de cellules
élémentaires, chacune ayant son propre numéro de séquence. Pour accéder à l'information
stockée dans une cellule donnée, il suffit de connaître son numéro. Dans notre cas, nous
avons besoin de deux tableaux de données unidimensionnels.
un tableau de type int. Le type de données int est utilisé pour stocker des données
numériques.
occupe 2 octets de mémoire. Chaque tableau est nommé data et value, et la taille de ces
tableaux est également indiquée. Le tableau de données a une taille de 9 éléments et le
tableau de valeurs a 4 éléments, ce qui indique au compilateur d'allouer 9*2=18 octets
pour les données et 4*2=8 octets pour les valeurs, c'est-à-dire que 2 octets sont alloués
pour chaque élément du tableau.
33
Figure 23 - Fragment du code de programme de la carte de contrôle
34
Nous avons créé un objet de type Servo. Ce type d'objet a ses propres propriétés, qui
ont déjà été décrites pour nous dans la bibliothèque Servo.h incluse.
Nous définissons des constantes, qui seront en lecture seule, c'est-à-dire que nous ne
pouvons pas modifier la valeur des variables. Entre define et const int, nous avons choisi
cette dernière, car pour travailler avec des tableaux, nous devons utiliser const pour
plusieurs raisons principales : le compilateur signalera une erreur, en cas de
Lors de l'utilisation d'une constante d'un type différent, les mêmes règles de portée
s'appliquent aux constantes par opposition à define. Pour chaque servomoteur, 3
constantes sont définies, chacune d'entre elles se voyant attribuer une valeur responsable
de
l'angle de position maximale, minimale et de départ des actionneurs.
35
Figure 25 - Fragment du code de programme de la carte de contrôle
Comparer toutes les valeurs du port série avec les constantes, si toutes les
conditions sont remplies, la valeur correspondante de la valeur est écrite sur le port
correspondant.
Compare la valeur value[3] avec les constantes povorotzahvataMax et
povorotzahvataMin, si les conditions sont remplies, la valeur est écrite dans le port
Povorotzahvata (value[3].
36
Figure 27 - Fragment du code de programme de la carte de contrôle
Compare data[8] avec 0x01, data[8] avec 0x10 (en référence au registre du
microprocesseur arduino qui stocke un entier) et compare zahvat avec zahvatMax et
zahvatMin, si toutes les conditions sont remplies, les valeurs des variables sont écrites sur
le port Zahvat, en ajoutant un dans le premier cas et en soustrayant un dans le second.
37
Série (sur le port série à partir du programme de terminal, le paquet envoyé contient 11
octets). Si les données sont lues, le fragment de code suivant est exécuté. Le premier octet
est toujours 0xFF, le deuxième octet est toujours 0xAA. Ensuite, les 10 membres du
tableau provenant du port série sont remplis un par un.
Les valeurs des données sont normalisées : 1) soustraire les valeurs du quatrième
terme de la constante naklonnizhniiNormal, 2) ajouter la constante osnovaNormal à la
différence entre le premier et le deuxième terme, 3) ajouter la constante
naklonverhniiNormal à la différence entre le cinquième et le sixième terme, 4) ajouter la
constante povorotzahvataNormal à la différence entre le septième et le huitième terme.
En résumé, le code peut être décrit comme suit : les valeurs sont lues à partir du port
COM, normalisées et comparées aux constantes.
38
Programme terminal.
39
Figure 31 - Fragment du code du programme du terminal
40
Gestionnaire d'événements pour le déplacement du curseur de la souris. Ramène le
curseur au centre du formulaire.
41
Dans le code source du programme de terminal présenté à l'annexe B, il existe un
certain nombre d'autres gestionnaires d'événements en plus de ceux mentionnés ci-dessus :
pression et relâchement des boutons gauche et droit de la souris, pression de la touche
Esc, expansion de la liste des ports disponibles, clic sur le bouton
le bouton "Exit", en appuyant sur le bouton " ?", etc.
Cette méthode convertit le message d'une chaîne à un octet et écrit ensuite le message
reçu sur le port série.
42
Figure 37 - Fragment de code de programme du terminal
Cette méthode prépare les messages à écrire sur le port série. La méthode
SendAsHex est appelée pour écrire les messages préparés sur le port série.
La solution assemblée est un programme composé de deux fenêtres.
43
Figure 39 - Première fenêtre du programme du terminal
44
4. Partie expérimentale
1. Inspectez le support avant de l'utiliser pour vérifier qu'il n'est pas endommagé.
45
12.Pour mettre fin à l'utilisation de l'appareil, vous devez également appuyer sur le
bouton marche/arrêt du bloc d'alimentation.
13.Une fois les travaux terminés, vérifiez que le support n'est pas endommagé. Si des
dommages sont constatés, il est interdit de continuer à utiliser l'appareil jusqu'à ce
que le défaut ait été corrigé.
46
4.2. Vérification et débogage de la partie logicielle de l'unité
47
5. Dispositif sûr et respectueux de l'environnement
48
la ventilation, les niveaux d'humidité doivent être maintenus dans des limites acceptables.
Un bon éclairage répondant aux exigences du SNiP est particulièrement nécessaire pour
49
6. Volet économique
Une estimation du coût des composants utilisés pour assembler ce projet est présentée
ci-dessous.
50
Conclusion
Lors de la mise en œuvre du travail de qualification finale, une étude de toutes les
solutions existantes liées au thème de notre projet a été réalisée. Après avoir analysé tous les
avantages et inconvénients de chaque solution,
les options les plus prometteuses pour nous ont été sélectionnées. Sur la base des choix
effectués
La conception du banc d'essai a ensuite été développée et l'ensemble du processus
d'assemblage a été décrit. Ensuite, un schéma de la conception du banc a été élaboré et
l'ensemble du processus d'assemblage a été décrit. Le principe de fonctionnement de tous les
principaux composants impliqués dans l'appareil en question a été montré. Créé
le programme du terminal pour contrôler le manipulateur et le programme de la carte complète
Le code de base de ces programmes est décrit. Le code développé a été testé sur le modèle de
manipulateur construit et affiné par la suite. Un manuel détaillé pour le fonctionnement de la
cabine développée a été rédigé. Une évaluation de la sécurité et de l'environnement a
également été réalisée. Une estimation a été faite pour tous les composants impliqués dans
l'assemblage de l'appareil. Le travail de qualification final a permis d'obtenir de bons résultats
en ce qui concerne le contrôle du manipulateur. Le principal avantage est que le programme
développé peut être appliqué à d'autres dispositifs avec différentes variations dans la
conception et les composants utilisés. Toutefois, il convient de noter que le
des mouvements saccadés de la structure de la rampe, ceci est dû à la nature de la rampe.
des servomoteurs sélectionnés. Le manipulateur développé peut être utilisé efficacement
comme banc de démonstration pour étudier la cinématique, la dynamique et la
programmation des robots.
51
Liste des sources utilisées
52
12. Manuel langage de programmation langage de programmation Arduino
[Ressource électronique]. Mode d'accès : http://arduino.ru/Reference
20. Travailler avec le port série Arduino [Ressource électronique] : article. Mode
d'accès : http://www.customelectronics.ru/arduino-rabota-s-com-portom
22. Paula Useche Murillo , Robinson Jimenez Moreno, Oscar F Avilés S. Individual
Robotic Arms Manipulator Control Employing Electromyographic Signals Acquired by Myo
Armbands // International Journal of Applied Engineering Research Volume 11, Number 23,
53
2016. URL : https://www.researchgate.net/publication/314079352
54
23. Pieter Dijkshoorn. Concevoir a générique générique générique
pour les manipulateurs ARW manipulators // Université de Twente,
Enschede, Pays-Bas, novembre 2016. URL :
https://www.ram.ewi.utwente.nl/calendar/details/designing -a-generic-software-architecture-
for-arw-manipulators.html
24. Mohd Ashiq Kamaril Yusoffa, Reza Ezuan Saminb , Babul Salam Kader
Ibrahimc. Wireless Mobile Robotic Arm // Faculty of Electrical and Electronics Engineering,
Universiti Tun Hussein Onn Malaysia, Batu Pahat, Johor, Malaysia, 2012. URL :
https://www.researchgate.net/publication/271890997
25. Mohd Aliffa, Shujiro Dohtaa , Tetsuya Akagia, Hui Lia . Développement
d'un bras robotique pneumatique à structure simple et son contrôle à l'aide d'un contrôleur
embarqué à faible coût // Université des sciences d'Okayama 1 -1 Ridai-cho, Kita-Ku,
Okayama, Japon, 2012. URL : https://www.sciencedirect.com/science/artic
le/pii/S1877705812025398
55
Annexe A
#include <Servo.h>
void readSerial(void) ;
void dataToNormal(void) ;
int data[9]
; int
value[4] ;
Servo Osnova ;
Servo Naklonnizhnii ;
Servo Naklonverhnii
; Servo
Povorotzahvata ;
Servo Zahvat ;
56
int zahvat = zahvatNormal ;
void setup(){
57
Osnova.attach(2) ;
Naklonnizhnii.attach(3)
;
Naklonverhnii.attach(4)
;
Povorotzahvata.attach(5)
; Zahvat.attach(6) ;
Zahvat.write(zahvatNormal) ;
Serial.begin(9600) ;
}
void loop(){
readSerial() ;
dataToNormal() ;
58
}
59
void readSerial(){
if (Serial.available() == 11)
if (Serial.read() == 0xFF)
if (Serial.read() == 0xAA){
data[0] = Serial.read() ;
data[1] = Serial.read() ;
data[2] = Serial.read() ;
data[3] = Serial.read() ;
data[4] = Serial.read() ;
data[5] = Serial.read() ;
data[6] = Serial.read() ;
data[7] = Serial.read() ;
data[8] = Serial.read() ;
data[9] = Serial.read() ;
}
}
void dataToNormal(){
// naklonnizhnii
value[0] = naklonnizhniiNormal - data[3] ;
//osnova
valeur[1] = données[0] - données[1] + osnovaNormal ;
//naklonverhnii
value[2] = data[4] - data[5] + naklonverhniiNormal ;
//povorotzahvata
value[3] = data[6] - data[7] + povorotzahvataNormal ;
}
60
Annexe B
Formulaire 1
en utilisant System ;
using
System.Collections.Generic ;
using System.ComponentModel
; using System.Data ;
using System.Drawing ;
using System.Text ;
using System.Windows.Forms ;
using System.IO.Ports ;
namespace MouseControl
{
public partial class Form1 : Form
{
bool IsReceiving = false ; // Créer une variable de type logique
public Form1 ()
{
InitializeComponent() ; // Appelle la méthode responsable de l'affichage du formulaire
}
private string DelSpace(string str) // Cette méthode supprime les espaces du message.
La variable TempStr comporte toujours un nombre pair de caractères.
{
string TempStr = string.Empty ;
int Len = str.Length ;
for (int i = 0 ; i < Len ; i++)
{
if (str[i] != ' ')
TempStr += str[i] ;
}
Len = TempStr.Length ;
si (Len % 2 != 0)
TempStr = '0' + TempStr ;
return TempStr ;
61
}
62
private void ReOpenPort() // Méthode de réouverture du port série
{
essayer
{
btClose_Click(null, null) ;
if (!serialPort1 .IsOpen)
btOpen_Click(null, null) ;
}
catch (Exception Err)
{
controlPanel .Close() ;
MessageBox.Show(Err.Message, "Contrôle du manipulateur") ;
}
}
private void Form1_Load (object sender, EventArgs e) // Cette méthode permet de récupérer les
noms de tous les ports maritimes disponibles.
{
essayer
{
foreach (string com in System.IO.Ports. SerialPort .GetPortNames())
this.cmPort.Items.Add(com) ;
cmPort.SelectedIndex = 0 ;
}
attraper
{
controlPanel .Close() ;
MessageBox.Show("No serial port found !", "Manipulator control") ;
}
}
63
serialPort1 .Close() ;
public static Form2 controlPanel = null ; // Créer une instance de la classe Form2
si (controlPanel == null)
{
controlPanel = new Form2 (this) ;
controlPanel .Show() ;
}
autre
{
controlPanel .Activate() ;
}
}
}
catch (Exception er)
{
ClosePort() ;
MessageBox.Show("Failed to open port !" + er.Message, "Manipulator control") ;
}
}
64
}
}
public void sendData(string input) // Cette méthode prépare les messages à écrire sur le port série.
{
essayer
{
65
if (!serialPort1 .IsOpen)
btOpen_Click(null, null) ;
66
" + Environment.NewLine +
"4. " + "Rotation de la poignée : Z & X" +
Environment.NewLine + " " + Environment.NewLine +
"5. " + "Grip : LCM & PCM" + Environment.NewLine + "") ;
}
}
}
}
Formulaire 2
en utilisant System ;
using
System.Collections.Generic ;
using System.ComponentModel
; using System.Data ;
using System.Drawing ;
using System.Linq ;
using System.Text ;
using System.Windows.Forms ;
namespace MouseControl
{
public partial class Form2 : Form
{
int xCount = 0 ; // initialiser la variable de type int et lui affecter un littéral décimal.
int yCount = 0
; int zCount = 0
; int rCount = 0
;
int xCount_lst = 0 ;
int yCount_lst = 0
; int zCount_lst = 0
; int rCount_lst = 0
; int speed = 44 ;
int centre = 100 ;
yte buttonData = 0x00 ; // initialiser la variable byte et lui
assigner un littéral hexadécimal //H->L 4:Xbutton2(+) 3:Xbutton1( -) 2:Droite 1:Milieu 0:Gauche
octet keyData = 0x00 ; // H->L 5 :- 4:+ 3:D 2:A 1:S 0:W
octet buttonData_lst = 0x00 ;
bool release_flag = true ; // vérifie les conditions logiques
67
int rCountMin = -110 ;
68
public Form1 parent ;
public Form2 (Form1 parent) // Constructeur pour initialiser les composants du formulaire et créer des
gestionnaires d'événements
{
InitializeComponent() ;
this.parent = parent ;
this.MouseMove += new System.Windows.Forms.MouseEventHandler( Form2_MouseMove )
; this.MouseDown += new System.Windows.Forms.MouseEventHandler( Form2_MouseDown)
; this.MouseUp += new System.Windows.Forms.MouseEventHandler( Form2_MouseUp) ;
this.KeyDown += new System.Windows.Forms.KeyEventHandler( Form2_KeyDown) ;
this.KeyUp += new System.Windows.Forms.KeyEventHandler( Form2_KeyUp ) ;
}
if (e.Button == MouseButtons.Left)
{
buttonData &= 0xfd ;
buttonData |= 0x01 ;
}
if (e.Button == MouseButtons.Left && e.Clicks == 2)
{
buttonData &= 0xfe ;
buttonData |= 0x02 ;
}
if (e.Button == MouseButtons.Middle)
{
buttonData |= 0x04 ;
}
69
if (e.Button == MouseButtons.Middle && e.Clic ks == 2)
{
70
buttonData |= 0x08 ;
}
if(e.Button == MouseButtons.Right)
{
buttonData |= 0x10
; r_label.Text = "*" ;
}
if (e.Button == MouseButtons.Right && e.Clicks == 2)
{
buttonData |= 0x20 ;
}
if (e.Button == MouseButtons.XButton1)
{
speed = --speed < 1 ? 1 : speed ;
label11.Text = Convert.ToString(speed)
;
}
if (e.Button == MouseButtons.XButton2)
{
speed = ++ speed > 50 ? 50 : speed ;
label11.Text = Convert.ToString(speed)
;
}
}
}
if (e.Button == MouseButtons.Right)
{
buttonData &= 0xcf ;
r_label.Text = " " ;
}
}
private void Form2_Load(object sender, EventArgs e) // Positionner le curseur à l'endroit souhaité sur
le formulaire
{
Cursor .Clip = new Rectangle(this.Location.X + 33, this.Location.Y + 53, 130, 130) ;
}
71
Form1.controlPanel = null ;
Cursor .Clip = Rectangle.Empty ;
72
this.parent.btClose_Click(null, null) ;
this.Close() ;
}
private void sendData() // Cette méthode génère des messages à écrire sur le port série.
{
this.parent.sendData("ff") ;
this.parent.sendData("aa") ;
this.parent.sendData((((xCount >> 8) & 0x00FF ).ToString("x")) ;
this.parent.sendData((xCount & 0x00FF ).ToString("x")) ;
this.parent.sendData((((yCount >> 8) & 0x00FF ).ToString("x")) ;
this.parent.sendData((yCount & 0x00FF ).ToString("x")) ;
this.parent.sendData((((zCount >> 8) & 0x00FF ).ToString("x")) ;
this.parent.sendData((zCount & 0x00FF ).ToString("x")) ;
this.parent.sendData(((rCount >> 8) & 0x00FF ).ToString("x"))
; this.parent.sendData((rCount & 0x00FF ).ToString("x")) ;
this.parent.sendData(buttonData.ToString("x") ;
}
label4.Text = Convert.ToString(xCount)
; label5.Text =
Convert.ToString(yCount) ; label1.Text
= Convert.ToString(zCount) ;
73
label20.Text = Convert.ToString(rCount) ;
sendData() ;
xCount_lst = xCount ;
yCount_lst = yCount ;
zCount_lst = zCount ;
rCount_lst = rCount ;
buttonData_lst = buttonData ;
}
}
catch (Exception Err)
{
MessageBox.Show("Timing errors !" + Err.Message, "MouseControl" ) ;
timer1.Enabled = false ;
Form2Closing() ;
}
}
74
cas Keys.E : // haut Naklonnizhnii
75
buttonData &= 0xbf
; buttonData |=
0x80 ; zCount += 1 ;
pause ;
}
}
si (e.KeyData == Keys.W)
{
keyData &= 0xfe ;
}
si (e.KeyData == Keys.S)
{
keyData &= 0xfd ;
}
si (e.KeyData == Keys.D)
{
keyData &= 0xf7 ;
}
si (e.KeyData == Keys.A)
{
keyData &= 0xfb ;
}
}
76
private void Form2_FormClosing (object sender, FormClosingEventArgs
e) // Méthode privée pour fermer le formulaire
{
timer1.Enabled = false ;
Form1.controlPanel = null ;
Cursor .Clip = Rectangle.Empty ;
this.parent.btClose_Click(null, null) ;
}
}
}
}
77
78