Test du micro lidar vl6180x

J’avais acheté en février dernier une coupe de capteurs vl6180x dans l’optique éventuelle de faire une troisième version à mon robot écholocateur qui soit d’un autre ordre de grandeur de rapidité (rappelons que la limitation de la vitesse du robot était la fréquence d’acquisition des retours d’ultrasons qui sont limités par la vitesse du son, faire le tour des 5 capteurs consécutivement prenait une éternité).

Il sont essentiellement restés dans une boîte tout ce temps, mais j’en ai sorti un hier pour le tester. L’avantage de cette carte d’évaluation est qu’elle amène toutes les pins de la mini-puce à un terminal pouvant être facilement branché avec des câbles ordinaires. On peut trouver les spécifications sommaires ici.

Comme d’habitude, Adafruit a devancé tout le monde en créant sa propre carte et sa propre librairie arduino intégrant ce mini capteur. Je ne me souviens plus, mais je pense qu’il était back-ordered sur le magasin d’Adafruit lorsque je voulais me le procurer, mais de toute manière, je préfère la version de ST qui en donne deux pour approximativement le même prix. Et puis j’avais passé le tout dans une grosse commande chez mouser, qui n’avait pas la version d’Adafruit.

Le hic, c’est que la version de ST, joliment prénommée sans originalité « Satellites », n’a pas de convertisseurs de niveau logique, mais il a tout de même un régulateur 2.8V d’inclus (ce qui est vraiment d’une utilité limitée puisque les pin du I²C doivent aussi être dans cette logique de 2.8V). N’ayant pas de convertisseur logique à ma disposition (dans ma grande naïveté j’avais mis de côté un 74LVC245N sans trop regarder le datasheet, pour m’apercevoir que c’est une puce pas tant utile puisqu’elle est unidirectionnelle à direction variable, donc à la rigueur on pourrait l’utiliser dans un montage impliquant une communication asynchrone, mais pour du I²C c’est complètement inadapté). Donc j’ai regardé une coupe de schémas sur internet, en commençant par celui qu’Adafruit a publié pour sa carte. Cette utilisation des mosfets est vraiment créative, bon je sais qu’Adafruit n’en est pas l’inventeur, mais je n’étais jamais tombé sur ce genre de circuit auparavant.

J’ai donc fait ce petit convertisseur de logique avec des composants que j’avais heureusement sous la main : un LM350 pour réguler le 5V à 2,8V, deux mosfet MTP3055E (un pour chaque ligne de l’I²C), une coupe de résistances. C’est certainement une version de puissance des millions de fois overkill pour les courants impliqués ici, mais ça marche!

J’ai téléversé le code d’Adafruit dans mon arduino, et ça a marché tout seul, sans plus de tracas. Le capteur pouvait mesurer des distances jusqu’à environ 180 millimètres, en plus de la luminosité en lux sur une plage immense qui donne une foule de possibilités pour des utilisations dans des robots (je suis encore en train d’y penser). Le seul problème, c’est que la version démo d’Adafruit est terriblement lente, dans le style d’une quinzaine de mesures par secondes, ce qui ne va pas du tout pour mon application. Mais c’est juste le début, c’est certain que l’on peut crinquer la fréquence de plusieurs ordres de grandeur avec le bon programme et l’utilisation de la pin d’interrupt sur le vl6180x.

Prochains trucs à faire : mettre deux capteurs sur la même ligne d’I²C, trouver la façon pour reseter leurs adresses respectives (puisqu’elles ont la même par défaut) et récupérer les données provenant des deux! Heureusement, ST a publié une application note expliquant comment faire. En plongeant dans la documentation, je devrais aussi être capable de trouver comment augmenter la vitesse des données pour que la contrainte devienne la rapidité du microcontrôleur à les analyser.

Mesure de la concentration d’isopropanol dans l’eau avec mon réfractomètre laser

J’ai fait un test avec diverses concentrations d’isopropanol 99% dans l’eau. J’ai utilisé un cylindre gradué pour mesurer 100ml, ensuite je rajoutais 1ml d’isopropanol avec une pipette de 1ml. J’ai découvert qu’il fallait beaucoup brasser le tout afin d’avoir une mesure représentative.  Je place ensuite une goutte sur le prisme, puis je place la lamelle. Je suppose que les pertes à chaque fois sont d’environ 1ml, donc le volume total reste 100ml, la différence avec la vraie concentration reste dans l’incertitude.

Le graphique suivant a été produit : (incertitudes non montrées pour l’instant). C’est tout de même linéaire. Pour une concentration inconnue, l’incertitude est d’à peu près ±0,5%.

J’ai intégré cette équation empirique dans le code sur l’arduino, qui est maintenant capable de calculer l’indice de réfraction du milieu en se basant sur celui de l’eau. J’ai également mis le pourcentage estimé d’isopropanol selon cette courbe, ça restera à tester avec une autre suite de mesures. Un petit potentiomètre relié à une entrée analogique permet de faire le zéro lorsque l’on calibre le réfractomètre avec de l’eau. Le code associé est :

float calibration = analogRead(A0);
float pourcentiso = -0.1528*movavrg + 66 + calibration/100;
float n = 1.331 + (1.3812-1.331)*pourcentiso/100;

La variable movavrg est une moyenne en moving average sur une seconde avec 1000 lectures de la valeur de l’ADC, ce qui permet de retirer le bruit de haute fréquence de la mesure.

Néanmoins, il y a encore beaucoup de fluctuation dans la mesure à l’ADC, ce qui nuit à la précision du système. Il faudrait investiguer davantage pour savoir si la cause du bruit est optique ou électronique. Mon hypothèse est que c’est causé par le déplacement des franges d’interférence causée par les réflexions multiples entre les deux interfaces de verre. Ça serait difficile à enlever, puisque la lamelle de verre permet d’étendre uniformément la goutte sur toute la surface du prisme et d’offrir un assez bon beam dump pour conserver un bon contraste. Évidemment, un système mesurant directement la hauteur de la ligne sans passer par le ratio de luminosité serait bien plus précis, au désavantage d’être bien plus complexe. La bonne vieille photodiode donne tout de même des résultats époustouflants!

Résultats de la modélisation théorique du réfractomètre laser

Je vais publier ma démarche complète dans un article pdf prochainement, pour tirer avantage de LaTEX pour les équations mathématiques. Pour l’instant, je veux simplement publier les résultats de ma modélisation de mon réfractomètre.

Le graphique ci-contre présente l’indice de réfraction théorique selon la position mesurée de la ligne de contraste correspondant à l’angle de réflexion critique entre le prisme et le milieu posé sur celui-ci (en x, c’est la position par rapport à l’hypoténuse du prisme en millimètre, en y, l’indice de réfraction). On observe que la courbe est étonnamment linéaire sur toute la plage possible de mesure, ce qui est intéressant étant donné la quantité de détours mathématiques nécessaires pour obtenir la solution (incluant beaucoup de trigonométrie). C’est encore plus encourageant puisque la plage d’indice de réfraction que je souhaite mesurer reste aux alentours de celui de l’eau (environ 1,33) et ne variera pas tant que ça (peut-être maximum ±0,05), donc l’approximation linéaire donnera une faible erreur sur un aussi petit segment de la courbe.

Électronique du réfractomètre

Hier j’ai avancé principalement l’électronique de mon projet de réfractomètre. Je suis parti d’un arduino sur breadboard que j’avais déjà construit (en utilisant une puce ATMEGA328 que l’on programme avec un FTDI). J’ai rajouté un écran LCD, avec le programme hello world simplement pour vérifier qu’il fonctionne bien.

Pour l’alimentation du laser, j’utilise un bon vieux régulateur de courant LM350 avec une résistance de 100 ohms. J’ai détruit deux petits modules laser (bon ça vient du dollarama donc c’est pas si grave, mais quand même) : le premier en le laissant branché trop longtemps sur du 5V (il a une résistance pour limiter le courant, mais ce que j’ai découvert c’est qu’elle est faite pour du 4,5V, avec 5V la diode surchauffe et sa puissance de sortie diminue). Je ne m’en suis rendu compte que trop tard, alors que des dommages irréversibles étaient déjà faits. La deuxième diode, je l’ai brisée ce matin, alors qu’un petit peu de colle chaude est tombé directement sur le fil minuscule de l’anode (ou de la cathode, en tout cas), le brisant. Finalement, deux diodes brisées plus tard, tout fonctionne comme un charme.

J’ai modifié l’alimentation du breadboard pour récupérer le VIN du transformateur que l’on branche, et pas seulement le 5V du régulateur, pour pouvoir alimenter le LM350 directement. C’était avec le premier module, où il y avait encore la résistance en série avec la diode laser, ce qui provoquait une chute de voltage. Je ne pense plus que c’est nécessaire à présent, on pourrait utiliser directement le 5V, mais bon, pour l’instant je vais le laisser comme ça puisque ça fonctionne. Ça permet une légère économie d’énergie (mais on s’en fout pour l’instant puisque le système n’est pas à batterie).

Pour ce qui est de la partie de la photodiode, j’utilise un simple amplificateur transimpédance, avec la diode branchée en reverse bias sur le ground, l’entrée positive de l’amplificateur sur le 0V également pour avoir le maximum de sensibilité. Cela est possible car j’utilise un LM358 qui a la possibilité de se rendre jusqu’au ground, autant à l’entrée qu’à la sortie, et ce même en single supply (comme en ce moment dans mon circuit qui l’alimente en 5V). Le désavantage, c’est que son voltage de saturation à l’état haut est aux alentours de 3,7V pour une alimentation de 5V, ce qui n’est pas si grave puisque l’on peut ajuster la pin aref de l’arduino pour correspondre à ce voltage. La résistance de gain est encore à ajuster, mais pour l’instant, je sais qu’elle doit être quelque part entre 100kohms et 1Mohm. Le deuxième amplificateur sur la chip est utilisé comme un voltage follower qui isole l’entrée de l’ADC de l’arduino du circuit.

Le schéma sera publié prochainement!

Je suis en train d’imprimer un couvercle à la partie optique, pour empêcher la lumière ambiante d’interférer dans les mesures (c’est plus simple comme ça, quoi qu’on pourrait éventuellement utiliser un modulateur et un démodulateur à une certaine fréquence pour diminuer le bruit).

Support mécanique pour mon réfractomètre laser

J’ai terminé la conception du support pour mon réfractomètre laser. À droite, il y a un module laser pris à partir d’un pointeur laser du dollarama, une fois l’optique retirée, cela donne une source monochromatique hautement divergente ayant à peu près la forme d’une ligne. Je m’en sers pour illuminer l’hypoténuse du prisme avec un continuum d’angles. L’angle critique de réflexion totale interne change selon l’indice de réfraction du milieu placé directement sur l’hypoténuse du prisme. J’ai placé une photodiode à gauche pour capter la réflexion produite par le prisme. Il y a une bordure aux alentours de l’angle critique, ce qui fait que la quantité de lumière atteignant la photodiode change rapidement selon les petites variations d’angles de réflexion (plus d’explications à venir dans des prochaines publications).

J’ai placé le tout sur un rail composé de mes traditionnelles extrusions d’aluminium, ce qui va être très pratique pour la calibration. En effet, il faut pouvoir ajuster la position de la photodiode très précisément pour mesurer adéquatement l’angle critique de réflexion totale interne.

Bug dans mon extracteur de commentaires

Il y a des fois où on ne comprend vraiment pas ce qu’il se passe dans l’exécution d’un programme. Dans ma boucle principale, j’ai rajouté une section qui regarde s’il y a un problème avec le navigateur :

while 1:
    next_url = PageScraper(current_url)
    current_url = next_url
    if not current_url:
        driver.close()
        driver = webdriver.Firefox()
        current_url = [‘https://www.youtube.com/watch?v=…’]
        print « Le crawler est reparti! »

Or, ce qu’il s’est passé, c’est que cette partie du code s’est exécutée avant qu’il y ait une exception dans ma fonction PageScraper (autrement dit, alors que tout devait encore fonctionner). Qu’est-ce qui a bien pu se produire pour que curent_url soit nul? C’est vraiment complètement mystérieux.

Pour l’instant, je pense que je vais abandonner cette magie noire et simplement faire un bash script pour redémarrer l’ordi ainsi que mon programme automatiquement à un certain intervalle donné de temps, afin de permettre à la mémoire vive de se reposer un peu.

Pour rajouter de la robustesse, il faudrait aussi que j’essaie de faire en sorte que mon programme puisse détecter la version de YouTube (ancienne ou nouvelle) et qu’au lieu d’essayer de faire quoi que ce soit lorsque le navigateur bogue, qu’il redémarre tout au complet, en itérant le fichier de sortie.

J’ai rajouté un serveur VNC aussi (en suivant les instruction ici), pour pouvoir voir ce qui se passe à distance sans avoir à brancher un écran! Ça peut toujours être pratique, et probablement que je vais en avoir besoin de toute manière pour pouvoir faire marcher firefox sans écran physique connecté à l’ordi.

Hack du module optique d’une imprimante laser

Ceci va être un long article, puisque c’est la première entrée sur le sujet et que je suis rendu pas pire avancé. J’avais déjà démonté, dans ma tendre adolescence, une imprimante laser. Le module optique n’y avait pas échappé, malheureusement, je n’avais alors pas assez de connaissances en optique pour bien saisir l’importance de tous les petits miroirs et lentilles de plastique aux formes étranges que l’on y retrouve, si bien qu’il ne me reste en ce moment de ce lointain carnage que le polygone à miroirs, que j’avais réussi à hacker et à faire fonctionner avec un petit circuit il y quelques années.

Avec mes stages au Centre de neurophotonique et à Laserax, j’ai compris l’importance d’avoir une optique qui corrige le focus du faisceau laser selon la différence de parcours optique, afin d’avoir un balayage sur un même plan qui soit toujours au maximum de l’intensité du faisceau. Il s’avère que ce genre de patente est généralement énormément dispendieux et compliqué à construire par soi-même. Heureusement, il y a une solution (comme d’habitude) lorsque l’on se tourne vers la technologie de masse et que l’on fait preuve d’assez de débrouillardise pour détourner les produits à notre avantage.

J’ai acheté cet été un module optique d’imprimante laser pour la modique somme de 23$US sur ebay (ce modèle-ci pour être précis), qui contient : un laser infrarouge d’une coupe de mW (pas encore testé) un polygone à miroirs, des miroirs et des lentilles. Et ce qui vaut vraiment tout l’or du monde, c’est que tout est déjà aligné, ce qui m’a évité ainsi des jours de plaisir.

Remplacement du laser

À droite, la carte laser extirpée du module, à gauche, une pièce imprimée en 3D pour imiter le support de la diode laser afin de placer mon propre laser.

Pour l’instant, j’aimerais voir ce que je fais (i.e. utiliser un laser visible), et je vais commencer par un projet de harpe laser. Mon but final est de pouvoir placer le faisceau laser à une position voulue et contrôlée sur la ligne d’impression. Pour cela, j’ai dû remplacer le laser de l’imprimante par un module laser vert de 5mW. J’ai donc soudé l’alimentation à deux fils pour pouvoir les sortir du boîtier, puis j’ai soudé le bouton poussoir afin qu’il soit constamment allumé. Je l’alimente avec une source d’alimentation variable de 6W avec le voltage placé à 3V.

J’ai fabriqué avec mon imprimante 3D une petite pièce qui tient exactement dans l’espace du module laser afin de conserver l’alignement qui a déjà été fait pour le reste de l’optique. Je m’y suis repris à 3 fois pour avoir une pièce parfaite.

J’ai donc pu insérer mon module laser vert à la place, et le faisceau frappe les miroirs du polygone exactement de la bonne manière. J’ai dû replier un peu la carte de contrôle du laser afin qu’elle rentre dans l’espace étroit du boîtier.

Tout rentre en place, et on peut replacer le couvercle du boîtier pour s’assurer d’une petite sécurité laser de plus (oui oui, je porte des lunettes quand même, soyez sans crainte).

Hack du contrôle du polygone

J’avais déjà réussi à hacker un polygone à miroir d’un autre modèle, donc j’étais quand même très bien parti. Le connecteur a 5 broches. Je savais déjà qu’il y avait 4 broches d’utiles (la dernière, je n’ai jamais compris à quoi elle sert) : VCC, GND, CLK et EN. Autrement dit, une alimentation, une vitesse définie par un signal d’horloge et une broche qui sert à allumer ou éteindre la rotation.

J’ai rapidement remarqué un gros condensateur polarisé, il doit (et il l’est effectivement) être relié aux deux bornes d’alimentation. En partant de la droite vue du dessus (#5 dans mon ordre d’identification), la première broche est VCC, ensuite la deuxième (#4) est le Ground (elle est aussi reliée à la grosse trace de la carte, c’est toujours un bon indice). Par la suite, j’ai eu beaucoup de misère à identifier les autres broches. Un court-circuit a emporté mon générateur de fonction sur mon mini-oscillo (pas tant utile puisqu’on pouvait juste avoir quelques fréquences, mais ça va me faire chier à le réparer), j’ai donc dû à la va-vite générer un signal d’horloge avec mon arduino. Heureusement, le code est ridiculement simple puisque je suis à très basse fréquence et que pour l’instant, c’est un test préliminaire et que je m’en fous de la légère imprécision de cette méthode :

void setup() {
// put your setup code here, to run once:
pinMode(3,OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
digitalWrite(3,HIGH);
delay(1);
digitalWrite(3,LOW);
delay(1);
}

Ce qui donne une fréquence d’à peu près 500 Hz.

Pour la source d’alimentation du polygone, je me suis rendu compte que ça prend plus de 7V et qu’elle doit fournir un bon courant. En ce moment, j’utilise une alimentation d’ordinateur portable, qui donne 15V et 5A, c’est vraiment overkill mais ça fonctionne comme un charme, on peut faire tourner le polygone à une vitesse qui donne froid dans le dos (il va falloir que je la mesure un de ces jours).

Donc après avoir gossé un peu j’ai trouvé que la première broche en partant de la gauche (#1) est l’entrée de l’horloge (CLK) et que la troisième (celle du milieu, #3) est la broche d’enclenchement (ENABLE) qui doit être reliée en permanence au ground (elle est donc ENABLE LOW) pour que le moteur du polygone se mette à tourner.

Un petit test lorsque tout est en marche et on voit que le faisceau laser se promène le long de la ligne de sortie du module de l’imprimante laser!

Impression 3D avec mon nouveau plastique noir

Ah, les joies de l’impression 3D… Avec ma vieille version de Prusa i3, c’est toujours un peu une aventure à chaque fois que je change de sorte de plastique. C’est la première fois que j’utilise du PLA noir, j’ai découvert un plastique fait au Québec : Materio3D! Après plusieurs essais où je montais sans cesse la température du lit chauffant et où la pièce décollait toujours (ce LEGO est dans les pièces les plus difficiles à imprimer d’un point de vue de l’adhésion de la base). En mettant la première couche à 70 degrés et les autres à 50 degrés, ça a finalement tenu bon! Comme quoi, il faut vraiment que l’extrusion refroidisse exactement à la bonne vitesse à la sortie de la buse, sinon ça ne colle pas! (À gauche, mes nombreux essais, à droite, le résultat final) Alors tout est fin prêt pour que je commence mes montures d’optique, j’ai un réfractomètre et un télescope à imprimer!