Après un bière et un programme qui ne compile pas, je me suis repatrié! J’ai repris ma tristesse envers mon code morbide afin de m’ouvrire une seconde bière.
“Quand l’alcool coule,
le code aussi!”
Vincent Houde 2019/03/05 23h32
Ça m’a pris 1 heure comprendre mon erreur :
Comme nous pouvons observer, je veux transformer le contenu de l’index 1 de mon tableau en float! 1 heure plus tard, j’ai réalisé que j’utilisais la mauvaise variable! Voici mon historique de recherche, vous pouvez rire de moi!
Suite à la correction de mon erreur je peux finalement dire que j’ai fini la partie graphique. Il reste seulement à tester mon graphique avec le casque en main propres.
J’ai aujouté une fonction qui parse le code serial qui est envoyé. Quand la ligne contiendra des données provenant de l’électroencephalogram il y aura #EEG au début de la ligne.
Dans mon programme, le niveau d’attention est graphiquement représenté avec une sphère qui grossit selon le niveau d’attention(0-100). J’ai séparé l’écran en deux afin de pouvoir représenter en parallèle un volant qui traitera les informations du gyroscope.
rayon++ à chaque itération.
Pour augmenter la grosseur de la sphère je modifie la valeur de son rayon. Par contre, en modifiant cette valeur, la sphère qui n’est pas centrée nous donne l’impression qu’elle glisse doucement vers la gauche(Video ci-dessus).
Afin de régler ce problème, j’ai dû faire recours à un peu des mathématiques. Vu qu’une sphère est un objet 3 dimensionnel, rendu à une certaine grosseur, le rayon de la sphère dépasse la caméra. Pour régler ce problème, je dois reculer la sphère sur son plan z en fonction du rayon de la sphère. Avec cette méthode, la sphère ne dépassera jamais la caméra puisqu’elle sera tout le temps à la même distance de celle-ci.
Pour régler le deuxième problème, nous devons comprendre la position (0,0) de notre sphère. Elle se situe à la position (500, 550, 0) de notre fenêtre(2000, 1000). Comme nous pouvons observer, la position X de notre sphère est au quart de la longueur totale de notre fenêtre(500/2000 == 1/4). À cet effet, si nous voulons donner l’impression que notre sphère garde son emplacement, nous devons la déplacer vers la gauche. Pour garder un effet centré, on doit la déplacer à gauche d’un quart de la distance ajouté au rayon minimal puisque le point d’origine de la sphère est un quart de la distance du point central de la fenêtre.
rayon++ à chaque itération.
Voici à quoi ressemble le code de la sphère avec toutes les modifications :
Le mpu-6050 est en fait un capteur UMI (unité de mesure interielle). Il existe beaucoup de capteurs UMI comme le mpu-6050, qui sont utilisés, par exemple, dans des robots auto-équilibrés, des téléphones intelligents ou encore des véhicules aériens sans pilote (drone). Ces types de capteur sont donc composés de 2 principales composantes : le gyroscope et l’accéléromètre, expliquées dans la recherche précédente, qui nous aider comprendre le fonctionnement général de cette appareil. Ces deux composantes permettent donc de recueillir des informations quant à la vitesse de l’appareil qui tourne selon un certain axe (gyroscope) et la force g exercée sur l’appareil par la planète terre. Il est important de noter que le capteur mpu-6050 est un capteur à 6 DDL (degrés de liberté), ce qui veut dire qu’il peut transmettre 6 données : 3 venant du gyroscope et 3 venant de l’accéléromètre. Ces informations recueillies permettent d’obtenir également la force magnétique et l’altitude à l’aide de calculs. De plus, le capteur mpu-6050 peut être associé et utilisé à l’aide d’un arduino.
Tout d’abord, pour pouvoir utiliser cette appareil, il faut avant tout qu’il fonctionne. Nous devons donc concevoir le circuit qui nous permettra d’utiliser le mpu-6050.
Le mpu-6050 communique avec le arduino à travers le protocole I2C (Inter-Integrated Circuit en anglais). De façon général, selon ce protocole, les informations sont envoyées en messages. Ces messages sont séparés en cadres de donnée, et chaque message a un cadre d’adresse qui contient l’adresse binaire de l’esclave (système maître/esclave), et un ou plusieurs autres cadre de données contenant les informations transmises
Selon le plan du circuit ci-dessus, on doit connecter le VCC au 5V du arduino. Ensuite, le GND (ground) du arduino doit être connecté au GND du mpu-6050. La pin INT doit être connecté à la pin digital 2. Pour finir, il faut créer un ligne pour le protocole I2C. Pour ce faire, on doit connecter la pin SDA du mpu-6050 sur la pin A4 (analog 4) du arduino, et la pin SCL sur la pin pin A5 (analog 5) du arduino.
Maintenant que le circuit est fait et que l’appareil est fonctionnel, il s’agit donc de trouver comment utiliser les informations que recueille le mpu-6050 pour contrôler la direction de l’automobile téléguidée, et ce à travers un code.
Aujourd’hui, j’ai appris comment un protocole de communication entre deux objets fonctionne. En effet, ce mode de communication sert à valider ou non un packet envoyé d’un objet à l’autre.
Vue qu’on envoie de l’information à travers un système sans-fil, la possibilité de corruption est trop haute puisqu’il peut y avoir de l’interférence avec d’autres signaux. C’est de cette problématique que s’élève les protocoles de communications complexes. Dans mon projet, ce protocole est utilisé afin d’envoyer l’information entre l’electroencephalogram et l’objet receveur (L’ordinateur dans mon cas). Il s’agit d’additionner toutes les bytes du packet ensemble et d’inverser les 8 bytes les plus bas. Si cette somme est égale à la somme envoyé dans ce même packet, alors le packet reçu n’est pas corrompu.
Le mpu-6050, que nous fixerons sur un gant, servira donc à orienter la direction de l’automobile téléguidée. De façon fondamentale, le mpu-6050 est composé d’un gyroscope et d’un accéléromètre. Voici brièvement comment fonctionne ces deux composantes de cette pièce :
Un accéléromètre fonctionne selon le principe de l’effet piézoélectrique. Imaginer une boite avec une petite balle à l’intérieur comme dans la photo ci-dessous. Les murs de cette boite sont fait de cristaux piézoélectriques. Lorsqu’on penche la boîte, la balle bouge dans la direction de l’inclinaison causée par la gravité et la balle entre donc en collision avec le mur et crée des petits courants piézoélectriques. Tout dépendant quel mur est touché, et donc quels courant sont activés, on peut déterminé la direction de l’inclinaison et son degré.
Le gyroscope, lui, fonctionne selon le principe de l’accélération de Coriolis. Imaginez qu’il y ait une structure ressemblant à la photo ci-dessous, l’objet gris est en constant mouvement d’en avant à en arrière. Le tout tient en place grâce à des cristaux piézoélectriques. Lorsque le gyroscope est penché sur un côté, les cristaux subissent une force dans la direction de l’inclinaison, qui est causée par l’inertie de l’objet gris en mouvement. Les cristaux produisent ainsi un courant selon l’effet piézoélectrique. Ce courant est ensuite amplifié, puis les valeurs sont traités par des microcontrôleurs.
Ainsi, les capteurs des gants seront initialement à un point (0,0,0), et lorsque, par exemple, l’angle de la main ayant le mpu-6050 fixé dessus changera, l’automobile téléguidée tournera .
Àprès avoir étudié la librairie Brain.h de notre ami Mika, je peux comprendre le message Serial qu’il envoie.:
Source : Brain.h //Eric Mika
Comme nous pouvons observer dans la capture d’écran ci-dessus, il y a toutes les informations en ordre du packet. J’ai décidé de prendre le language Processing puisqu’il y a plus d’options afin de créer un graphique en real time! Pour ce faire, je vais devoir apprendre comment la communication serial fonctionne en processing afin d’extraire l’information émis par le arduino. De plus, je vais devoir trouver un manière afin de représenter graphiquement mes informations. À premère vue, je crois que la manière la plus simple est de créer un Cercle et grandir sa grosseur (Radius) en fonction de la valeur attention ou méditation.
Voici à quoi va ressembler le graphique (Sketch de base):
Tout d’abord, on doit donner un très gros crédit à Eric Mika qui a fait tout le travail difficile de rendre simple l’information reçue par notre électroencéphalogramme. Eric est entré dans les documents de NeuroSky, la compagnie qui fait plusieurs headset EEG, dont le notre, pour venir lire les informations qui sont transmises par le headset. En regardant ces informations, il observe qu’il y a deux types de signaux qui sont envoyés par le headset. Le premier est le niveau de la qualité de la connexion entre le headset et le dispositif qu’il contrôle; c’est sur une échelle de 0 à 200. 0 signifie une connexion parfaite, 200 signifie une connexion interrompue. Le deuxième signal que l’électroencéphalogramme envoie est le niveau de concentration ou de méditation de l’individu. C’est sur ce signal que nous allons nous attarder d’avantage! Ce que nous recevons, c’est seulement un numéro sur une échelle de 0-100. Intuitivement, 100 signifie un niveau de concentration élevée et 0 un état mental de méditation. Le problème avec notre EEG c’est qu’il ne transmet pas la fréquence réelle qu’émet le cerveau. Par conséquent, ce que Eric a fait, c’est de donner sept zones qui correspondent chacune à des ondes qu’émet le cerveau.
Source : Eric Mika
Pour aller plus en profondeur, la librairie fonctionne comme une application qui vient extraire des informations d’un fichier texte. Dans Brain.cpp, la fonction update() extrait les informations prises par l’électroencéphalogramme dans tableau de type unsigned int 32 (uint32_t). Il est important de noter que la partie unsigned de la variable signifie qu’on ne peut pas prendre des données négatives (Range = 0 à 4,294,967,295 ).
Une fois que le packet est rempli (32 éléments dans le tableau) on viens confirmer que nous avons un nouveau packet. Par la suite, il y a la fonction parsePacket() qui va venir lire le nouveau packet et identifier de quel type de fréquence cérébrale il fait parti. Nous sommes chanceux puisque le fabriquant du EEG (Neurosky Mindset) nous a donné un protocole de communication fabriqué par eux.
Voici ce qui est enregistré dans le tableau packet. En observant de plus près, nous pouvons comprendre qu’il y 35 bytes qui sont tous reliés à des informations transmises par électroencéphalogramme. Les bytes de 7-30 indique les fréquences émises par le cerveau, pour un total de 8 zones possibles de fréquences contenant chacune 3 bytes. Les autres bytes servent à signifier la longueur :
Avant de parser, on doit vérifier si le packet est bon. D’après le PDF distribué par Neurosky, pour parser un packet, on doit lire tous les bytes jusqu’à la rencontre d’un byte SYNC. Si le byte qui le succède est aussi un SYNC, on continue la fonction. Ensuite, nous allons prendre la valeur du byte [PLENGTH] et s’assurer que [PLENGTH]<170 (C’est trop large comme packet si ça dépasse 170 de longueur). La prochaine étape est compliquée, mais cela assure qu’il n’y a pas de corruption dans le packet. À cet effet, le but est d’arriver au même nombre que dans le byte [CHKSUM]. Pour ce faire, on additionne tous les bytes dans un unsigned char puis on inverse les 8 bytes les plus bas(** Pourquoi??? **). Si le nombre que nous venons de calculer est égale à la valeur du byte [CHKSUM], le packet est alors valide et prêt à être utilisé.
Source : Brain.cpp //Eric Mika
Eric Mika a décidé de faire un switch qui parcourt le packet avec les valeurs de bytes qui l’intéressent. Il enregistre la qualité du signal [0x2], le niveau d’attention [0x4] et le niveau de méditation [0x5] dans des variables de type unsinged int de 8 bytes. De plus il enregistre le signal que nous allons utiliser d’avantage : [0x83], c’est la valeur des bytes qui correspond aux 8 zones que l’électroencéphalogramme peut capter (8 = fréquences Gamma && 0 = fréquences Delta). Enfin, toutes les informations ont été ressorties du packet et mises dans des variables, il est possible maintenant d’envoyer l’information recueillie par signal Serial, ou de l’utiliser comme on veut.
En premier lieu, il est important de noter notre source d’inspiration qui nous a poussé à concevoir un projet de cette envergure. Il s’agit d’une vidéo publiée par un youtubeur scientifique nommé Michael Reeves! Dans cette vidéo, ce dernier utilise un casque lui permettant de lire des fréquences émises par son propre cerveau. Il s’agit en fait d’un capteur d’ondes cérébrales. Les informations recueillies par ce capteur sont transférées à un ordinateur, qui utilise celles-ci afin d’activer ou désactiver un piston faisant avancer l’automobile. Drôle de concept, toute de même, mais très inspirant pour notre équipe!
“Il y a deux façons de faire la conception d’un logiciel. Une façon est de le rendre si simple qu’il n’y a selon toute apparence aucun défaut. Et l’autre est de le faire si compliqué qu’il n’y a pas de défaut apparent. “
Tony (C.A.R.) Hoare. Professeur d’informatique, a implementé Algol 60, chercheur à Microsoft Research.
Ainsi, nous nous sommes inspiré du concept de Michael Reeves pour créer notre propre projet, une automobile téléguidée pouvant être contrôlée par la pensée! En effet, nous avons décidé de contrôler la vitesse de notre automobile en captant les fréquences des ondes cérébrales émises par le cerveau humain.
Comme nous pouvons l’observer dans le tableau ci-dessus, depuis 1981, l’être humain s’intéresse beaucoup aux fréquences des ondes émises par le cerveau humain! Après toutes ses années de recherches, les scientifiques ont conclu que certaines fréquences de ces ondes correspondent à certains états de notre cerveau. Pour notre projet, nous nous intéresserons plus particulièrement aux fréquences Alpha et Bêta, puisque ce sont elles qui sont les plus fréquemment utilisées par notre cerveau lors de l’état d’éveil. Par conséquent, afin de déplacer notre automobile téléguidée, nous utiliserons les fréquences émises par le cerveau lorsque l’utilisateur est concentré, c’est-à-dire les fréquences Bêta, se situant entre 14 Hz et 30 Hz. Toutes autres fréquences émises par le cerveau n’aura aucun impact sur l’automobile.
Afin de diriger notre automobile, nous avons comme but de simuler la conduite à l’aide d’un volant invisible! Pour ce faire, nous créerons une paire de gants qui sera attachée à un Arduino, et sur ces gants, il y aura des capteurs de distance pour mesurer la distance entre le sol et les gants. Avec ces informations, nous pourrons ensuite comprendre l’intention de l’utilisateur et transmettre les informations à l’automobile téléguidée!