Vidéo sur mon télescope à réalité augmentée

J’ai réalisé une vidéo sur mon projet de télescope à réalité augmentée. Je l’ai présenté en long et en large dans les articles précédents. L’ajout dont je n’ai pas parlé est l’arduino et le BMP085 (un capteur de température et de pression), permettant d’afficher sur l’écran LCD les données de température et d’altitude en temps réel. L’arduino envoie une commande par un port série à la carte Nextion, qui actualise les données affichées à l’écran. Le code arduino, basé sur les exemples de Nextion (je n’arrive plus à retrouver le lien) est le suivant :

#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>

SoftwareSerial mySerial(10, 11); /*Even though you can use the hardware serial port in this case I think it is better to
leave the hardware serial open for debugging purposes*/

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);

float temperature;

void setup() {

Serial.begin(57600); //open the hardware serial port
while (!Serial) { // wait for serial port to connect. Needed for native USB port only
;
}
/* Initialise the sensor */
if(!bmp.begin())
{
/* There was a problem detecting the BMP085 … check your connections */
Serial.print(« Ooops, no BMP085 detected … Check your wiring or I2C ADDR! »);
while(1);
}

Serial.println(« Serial On »); //Print this messages when the serial port is connected
mySerial.begin(9600); // set the data rate for the SoftwareSerial port
}

void loop() {
/* Get a new sensor event */
sensors_event_t event;
bmp.getEvent(&event);

/* Display the results (barometric pressure is measure in hPa) */
if (event.pressure)
{
/* Display atmospheric pressue in hPa */
Serial.print(« Pressure: « );
Serial.print(event.pressure);
Serial.println( » hPa »);

/* Calculating altitude with reasonable accuracy requires pressure *
* sea level pressure for your position at the moment the data is *
* converted, as well as the ambient temperature in degress *
* celcius. If you don’t have these values, a ‘generic’ value of *
* 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA *
* in sensors.h), but this isn’t ideal and will give variable *
* results from one day to the next. *
* *
* You can usually find the current SLP value by looking at weather *
* websites or from environmental information centers near any major *
* airport. *
* *
* For example, for Paris, France you can check the current mean *
* pressure and sea level at: http://bit.ly/16Au8ol */

/* First we get the current temperature from the BMP085 */
float temperature;
bmp.getTemperature(&temperature);
Serial.print(« Temperature: « );
Serial.print(temperature);
Serial.println( » C »);

/* Then convert the atmospheric pressure, SLP and temp to altitude */
/* Update this next line with the current SLP for better results */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
Serial.print(« Altitude: « );
float alt = bmp.pressureToAltitude(seaLevelPressure,
event.pressure,
temperature);
Serial.print(alt);
Serial.println( » m »);
Serial.println(«  »);
String sendThis = «  »; //Declare and initialise the string we will send

delay(300); //Probably unneccessary, but I give the screen some time to respond
sendThis = « n0.val= »; //Build the part of the string that we know
sendThis.concat(int(temperature)); //Add the variable we want to send
writeString(sendThis); /*Use a function to write the message character by character to the Nextion because
mySerial.write(sendThis) gives you an error due to a datatype mismatch*/
delay(300); //Probably unneccessary, but I give the screen some time to respond
sendThis = « n1.val= »; //Build the part of the string that we know
sendThis.concat(int(alt)); //Add the variable we want to send
writeString(sendThis); /*Use a function to write the message character by character to the Nextion because
mySerial.write(sendThis) gives you an error due to a datatype mismatch*/
}
else
{
Serial.println(« Sensor error »);
}

}

//NOTE: A great big thanks to: RamjetX for writing this function. You can find his/her post here: http://forum.arduino.cc/index.php?topic=89143.0. Please go give him/her some Karma!
void writeString(String stringData) { // Used to serially push out a String with Serial.write()

for (int i = 0; i < stringData.length(); i++)
{
mySerial.write(stringData[i]); // Push each char 1 by 1 on each loop pass
}

mySerial.write(0xff); //We need to write the 3 ending bits to the Nextion as well
mySerial.write(0xff); //it will tell the Nextion that this is the end of what we want to send.
mySerial.write(0xff);

}// end writeString function

Test du LCD sur le télescope LCD

J’ai testé l’écran LCD de mon télescope LCD hier. Après moult essais, je ne suis pas parvenu à afficher quoi que ce soit dessus. Tout semblait pourtant fonctionner, je n’avais pas de message d’erreur dans le logiciel. Je me suis rendu compte en fait que je l’avais brisé en l’insérant dans ma monture, comme en témoigne la photo ci-dessous.

C’est bien plus fragile que je le pensais en fait, les bords supportent peu les stress mécaniques.

Je me suis donc rabattu sur mon autre écran LCD modifié, celui qui est branché sur une carte Nextion que j’avais utilisé comme preuve de concept au tout début du projet. Sa conception mécanique est un peu différente, ce qui fait que j’avais gardé la monture métallique qui fait la bordure du verre, lui donnant tout de même une bonne résistance au stress mécanique lors de l’insertion dans ma monture. En fait, je pense que c’est le poids du raspberry pi qui a joué, fissurant le verre et les connecteurs internes.

Cela donne donc les résultats suivants, ce qui est très satisfaisant, et ça l’est encore plus lorsque l’on place un oeil face à l’oculaire au lieu de l’objectif d’une caméra.

Les lentilles de champ permettent d’avoir une bonne luminosité de l’image malgré l’atténuation du LCD lorsque l’oeil est bien aligné avec l’optique. Le vignettage que l’on peut observer sur les images est dû à l’aperture stop de la caméra, pour l’oeil, on voit surtout des aberrations sur les bords de l’image.

Mais tout fonctionne bien, les images réelles et virtuelles se combinent à merveille dans mon système, et tout est à l’endroit!

Monture optique du télescope LCD

L’ensemble des pièces utilisées pour la conception de mon télescope LCD : en haut à gauche, un raspberry pi avec un shield d’écran LCD, en haut à droite, les 4 lentilles (lentille érectrice, oculaire ainsi que 2 field lenses), à droite, un objectif à focale variable et en bas en noir, toutes les pièces imprimées en 3D pour obtenir un télescope fonctionnel : 4 tubes exactement de la bonne longueur pour correspondre aux distances focales des lentilles, et 4 paires de demi-montures circulaires pour fixer et centrer les lentilles aux bons endroits.

J’y suis allé fort avec mon imprimante 3D cette semaine, passant environ 500g de plastique noir afin de créer toutes les pièces nécessaires à la monture mécanique de l’optique de mon télescope LCD. J’y suis peut-être allé un peu fort avec mon 3mm d’épaisseur, mais je voulais être sûr de la robustesse de l’ensemble.

La première pièce a été intéressante à faire, puisque j’ai copié l’attache de mon objectif à focale variable, qui tenait avec 4 petites vis déjà présentes, à même des filets déjà faits dans l’objectif. J’ai donc imprimé une pièce de test pour voir si mes dimensions fonctionnaient, avant d’imprimer ma vraie pièce comprenant un tube de 150mm (ce fut sans nul doute l’impression la plus haute que j’ai réalisé à ce jour, mon imprimante se rendant à 180mm maximum en z). Ça a été tout juste pour le diamètre interne du tube, parce que je voulais pouvoir le visser par l’extérieur tout en laissant suffisamment de place à l’intérieur pour les rayons et la lentille de champ.

 Parlant de lentille de champ, la voici, positionnée à la première image produite dans mon système. Elle est fixée à l’aide d’un anneau imprimé en deux parties, verticalement, qui permet de maintenir la lentille en place par simple pression, sans avoir besoin de colle, de vis, ou d’ajustement en position. Je suppose qu’elle est placée au centre de l’axe optique, et malgré les tolérances assez élevées que j’ai dû mettre pour tenir en compte des défauts d’impression (surtout dans la partie supérieure de l’arche du cercle), je pense que c’est la méthode la plus précise à ma disposition pour monter une lentille dans un tube.

Je place ensuite un second tube du même diamètre avec une hauteur calculée pour correspondre à ma distance objet de ma seconde lentille (lentille érectrice). Le même principe de monture est utilisé, sauf que cette fois-ci se rajoute un adaptateur de diamètre de tuyau, d’un côté, il y a le petit diamètre, et de l’autre, le plus gros diamètre.

 

Ensuite, je place un des deux gros tubes de 100mm de haut, afin de placer mon système d’écran LCD. Celui-ci est composé de mon classique écran LCD modifié (voir ma vidéo CrystalCam pour plus d’informations) et d’une seconde lentille de champ plano-convexe du plus gros diamètre que j’ai pu trouver à cette courte focale (D=45mm, f=50mm).

 

 

Pour imprimer la monture en 3D, j’ai dû faire une fente juste assez grande pour y insérer l’écran LCD, tout en donnant le plus strict espace pour donner une petite pression sur la lentille pour la maintenir en place. Le côté plat de la lentille aide beaucoup à la positionner directement en contact avec l’écran, sauf que l’autre côté, très bombé, provoque des aberrations importantes qui ne sont pas corrigées par mon système. Je n’ai pas le choix de placer la lentille uniquement de ce côté, puisque je veux pouvoir observer l’écran LCD directement avec mon oculaire de l’autre.

Pour l’oculaire, j’ai continué avec ma méthode super efficace des moitiés de montures centrées retenant la lentille. On peut en voir les détails sur la photo ci-contre. Deux petites bandes de plastique permettent de retenir la lentille en z, tandis qu’elle est confinée dans un cylindre qui fait un cheveu de plus que sa dimension (un cheveu en tolérance de ma vieille prusa i3, soit 1mm au total sur le diamètre). J’ai rajouté un petit cache-oeil de 6mm avec un diamètre légèrement plus gros afin d’être confortable pour visionner l’écran et de s’assurer que peu de lumière externe entre par l’oculaire dans le système. Puisque l’écran LCD atténue beaucoup la lumière provenant du télescope, c’est important si l’on veut voir quelque chose.

Voici le résultat, une fois monté sur le second tube de 100mm. Bien que la majorité des pièces tenaient simplement par contact, j’ai rajouté de la colle chaude entre toutes les pièces. La pièce critique est l’adaptateur entre les deux diamètre de tuyau, il fallait absolument le coller et en essayant de lui donner un angle nul par rapport à l’axe optique (pas facile). Je n’ai pas pris de chance et j’ai mis de la colle chaude partout, ce qui fait que la monture est extrêmement solide. Afin d’éviter toute intrusion de lumière dans le montage, j’ai rajouté du duct tape noir pour boucher les mini-fentes (surtout celles entre les deux moitiés de monture de lentille). Le tout est un petit peu overkill, mais je me disais que ce ne serait pas un vrai montage d’ingénierie physique sans quelques bâtons de colle chaude et quelques longueurs de duct tape.

Le résultat final est surprenamment beau et aligné, pour des pièces imprimées en 3D. Le télescope est à peine plus long qu’une longue vue standard, à cause de l’ajout de l’étage du LCD et de l’érecteur pour avoir une image à l’endroit. Il fait environ 400cm, ce qui reste très maniable avec les bras. L’ajustement du focus se fait avec la rotation de l’embout de l’objectif, qui déplace l’une des deux lentilles à l’intérieur, modifiant la longueur focale du premier système d’imagerie.

La présence des lentilles de champ dans le système fait toute la différence pour un télescope aussi long et ayant autant de transformations optiques. On peut voir un aperçu du résultat ci-contre, bien que cette photo ait été prise rapidement avec ma caméra sans retirer l’oculaire. À l’oeil, c’est franchement plus impressionnant. L’image arrive directement sur l’écran LCD, à l’endroit et bien nette (lorsque l’on ajuste le focus). Elle occupe approximativement 23 degrés du champ de vue, ce qui est très satisfaisant sans être exceptionnel, mais d’autres contraintes ont eu préséance dans la conception du système. La principale aberration est la courbure de champ, elle est vraiment très forte dans les coins de l’image. Les autres aberrations sont sans doute masquées par la présence de l’écran LCD qui induit lui-même quelques modifications à l’image, entre autres une atténuation forte ainsi que l’ajout du micro-grillage des pixels. Une étude plus formelle des aberrations produites par les lentilles serait nécessaire pour identifier des solutions. Mais comme d’habitude, tout est affaire de compromis, puisque sans lentille de champ pour imager l’ensemble des rayons sur les autres lentilles, on ne verrait tout simplement rien à cause de l’atténuation trop importante du système.

On se laisse sur cette merveilleuse photo de moi-même en train d’utiliser de manière ludique ce télescope :