Tu aimerais voir le côté backstage de mon projet de studios intelligents? Buckle up! Parce que j’ai tout un post pour toi. (2000 mots+)
Même s’il est long, je passe vite sur la majorité du contenu. Si tu as des questions sur certains éléments, lâche-toi lousse! Ça va me faire plaisir d’y répondre.
Si tu as des idées de choses que je pourrais implémenter, je serais vraiment reconnaissant du partage!
Bref, attache ta tuque avec des thight wrap, verse-toi un redbull bien froid et assied-toi, ça va brasser!
Les studios LesBunkers.com possèdent déjà une bonne dose d’automation, ce qui permet de simplifier les procédures au point de pouvoir facilement s’enregistrer seul et sans supervision.
Par contre, ces automations se limitent à ce qui est disponible sur le marché! Je peux ouvrir les portes, caméras, lumières & micros à l’aide d’un serveur d’automation (j’utilise Home Assistant), je peux créer et exécuter des scripts sur l’ordinateur à l’aide de IoTLink et je peux communiquer directement avec le logiciel de capture grâce à l’API de vMix.
Rendue-là, on atteint pas mal la limite de ce qui est possible avec les logiciels & appareils commercialement disponibles.
C’est “bien”, mais j’ai toujours eu une vision beaucoup plus grandiose pour mes studios! Je rêve d’un système où absolument TOUT est automatisé!
Puisque c’est un projet qui sort de l’ordinaire et qui me force à apprendre ÉNORMÉMENT de choses, je me suis dit que ce serait intéressant de documenter le tout ici! Qui sait, peut-être que ça va en inspirer un ou deux à sortir des sentiers battus pour innover et redéfinir les limites de ce qui est possible dans leur industrie.
Puisque mon projet est déjà bien avancé, je vais commencer par définir la situation actuelle, expliquer ma vision, faire un récapitulatif de mon parcours jusqu’à présent et vous parler des prochaines étapes sur ma liste!
La situation actuelle & pourquoi est-ce que j’aime autant les robots?
Présentement, je dois faire 2 séances d’onboarding avec les gens. Un appel avec le client pour apprendre à connaître ses besoins et lui présenter le portail & la documentation et une formation à distance où la personne utilise le studio de façon semi-supervisée.
Bien que les studios soient excessivement plus abordables que les alternatives, j’aimerais quand même continuer à réduire les prix & ouvrir de nouveaux studios. Pour ça, je dois minimiser la maintenance et simplifier les procédures pour accélérer la prise en main.
J’aimerais que ce soit possible pour un nouveau client de maîtriser le studio moins de 30 minutes.
Présentement, je passe environ 5 heures par client. Certes, ce n’est pas “tant que ça”. Par contre, c’est surtout au point de vue “expérience utilisateur” que ça accroche.
Ma méthode pour enseigner l’usage du studio fonctionne bien et la documentation est très complète.
Par contre, le problème auquel je fais face est que beaucoup n’aiment simplement pas apprendre.
Quand on arrive dans un univers complètement nouveau, c’est normal de se sentir incompétent et d’être submergé par les informations.
Personnellement, j’adore ce sentiment! Je prends ça comme un défi et ça me stimule et j’assume (souvent à tort) que mes clients vont avoir la même attitude que moi.
Plusieurs clients me font le commentaire lors de leurs premières visites que ça leur prend environ 30 minutes et plus faire le “setup” du studio. Personnellement, ça m’en prend moins de 5 alors je sais qu’il ne s’agit que d’une question d’habitude.
Après 4 ou 5 visites, les membres finissent par bien intégrer les procédures et je n’ai que des commentaires positifs par la suite.
Par contre, quelques membres se sont découragés après la 2 ou 3e fois et ont arrêté de venir!
Je crois qu’un changement majeur s’effectue au moment où la personne “accepte” qu’elle doive prendre le temps de lire la documentation et d’écouter les vidéos.
C’est comme quand monte un meuble Ikea tout en s’obstinant à ne pas suivre les instructions. Après quelques longues & douloureuses heures, la plupart des gens finissent par se faire à l’idée qu’ils devront ouvrir le foutu manuel. Quand ils font ça, 30 minutes plus tard, tout est terminé!
C’est facile de mettre la faute sur le client et je le sais très bien. C’est pour cette raison que je travaille constamment pour simplifier et améliorer les processus.
Cependant, dans un monde parfait, les gens devraient pouvoir prendre en main le studio de façon complètement intuitive (sans avoir besoin du manuel).
Le studio parfait…
Tu entres dans le studio et non seulement tout s’ouvre tout seul, mais l’angle, la hauteur et le zoom des caméras, la couleur et l’intensité de chaque lumière, la hauteur des bureaux et la configuration de vMix se changent automatiquement pour que le studio soit identique à ta dernière visite.
Tu peux utiliser l’application web pour contrôler chaque aspect individuellement (caméras, éclairage, bureaux, micros) et enregistrer la configuration.
Tu as accès à une liste de preset publics que j’ai fait pour toi, mais tu peux également créer les tiens.
L’application est intuitive et tu n’as pas besoin d’apprendre quoi que ce soit.
Il y a même une option pour que la caméra détecte ton visage et te suive d’elle-même!
Tout ce qu’il te reste à faire, c’est d’appuyer sur “enregistrer”.
Où j’en suis rendue avec cette utopie?
Avant de lire ce qui suit, c’est important de comprendre que je n’ai AUCUNE expérience en design & impression 3d ou encore en électronique.
Je suis débutant, mais je suis motivé et j’aime ça! Si un ingénieur lit ça, j’espère juste qu’il va trouver ça plus cute que cringe.
Je n’ai peut-être pas d’expérience, mais ça fait LOOOOONGTEMPS que je rêve de développer ces compétences.
Mon premier projet d’entrepreneuriat était un thermomètre de piscine intelligent!
J’avais dépensé un paquet d’argent pour les pièces! Par contre, mes efforts ont arrêté là! Je n’ai jamais passé près de le réaliser.
Ça ne m’a pas empêché de me faire n’approcher par nul autre que Oracle qui en voulait pour la gestion de leurs serveurs!
Bref, fastforward en 2020. Ma résolution de l’année était justement d’apprendre comment ces bébelles-là fonctionnent. Le 27 décembre 2019, j’achète donc ce kit arduino sur Amazon pour 40$:
Je me souviens quand j’ai reçu mon kit. @Sabrina était en train d’écouter la télé dans le salon. Quand j’ai enfin réussi à faire allumer une LED, j’ai crié:
“Regarde, regarde! C’est moi qui fais flasher la lumière!”
Le 26 janvier 2020, j’achète ma première imprimante 3D. Je prends le meilleur modèle pour me forcer à apprendre comment ça fonctionne.
J’étais tanné de ne voir aucun progrès alors je me suis dit que ça allait me donner la motivation d’apprendre!
Après tout, je pense qu’il vaut mieux s’équiper et apprendre sur le tas que de passer 4 ans sur les bancs d’école à accumuler des montagnes de dettes.
La journée même, j’ai créé mon compte Fusion360 pour commencer à apprendre la modélisation 3d.
À cette époque, j’étais vraiment débordé avec la refonte du site web et la création du premier studio de Trois-Rivières.
Sans projet concret et immédiat, je n’avais pas la motivation d’apprendre… Même après avoir dépensé près de 10 000$. Mon imprimante servait de décoration et je ne vous cacherai pas que ça me dérangeait “un brin”.
Le 22 avril 2020, je décide donc de créer ma tête de caméra intelligente. Après quelques recherches Google, je tombe sur ce produit que j’achète instantanément! (Un autre 600$ qui s’envole)
Maintenant que j’avais tout ce qu’il fallait pour partir, je n’avais plus d’excuses!
…
Ce qui explique pourquoi je n’ai rien fait pendant 2 ans!
Ce n’est qu’après être tombé sur la chaîne YouTube de Michael Reeves que je décide que j’en ai assez de la procrastination!
Si un p’tit kid asiatique plein d’acné est capable, moi aussi! Le 9 août, j’annonce mon projet sur Instagram et je commence à me mettre au travail…
J’achète un actuateur linéaire pour me permettre de contrôler la hauteur de la caméra et je design un socle pour me permette d’attacher ma tête de caméra et d’y fixer mon board arduino.
Après avoir passé quelques heures à essayer de comprendre comment Arduino fonctionne, je réussis à faire un petit script qui me permet de contrôler le tout!
J’étais complètement fou de joie. Je me sentais comme un ado dans un cours de robotique lol.
Malheureusement, ma célébration a été coupée court…
Je ne comprenais pas pourquoi, mais mes commandes ne me permettaient pas de contrôler la tête avec précision. Pour l’utiliser avec un joystick, c’était correct, mais pour répéter des mouvements précis, ça ne fonctionnait pas!
Après plusieurs heures de gossage, je découvre que le moteur utilisé dans la tête que j’ai acheté n’est tout simplement pas très précis. Normalement, les moteurs de type SERVO permettent un mouvement sur 180 degrés. Plus l’amplitude est élevée, moins c’est précis. Celui-là permettait de faire plus de 5 tours sur lui-même alors le moteur n’est pas capable de suivre la position du mécanisme avec précision.
Je l’ai donc mis de côté et je me suis résigné à créer ma propre tête. Elle va être moins cool, mais elle va fonctionner!
Le 24 août, j’achète 2 nouveaux moteurs.
Je les assemblent un sur l’autre pour me permettre d’obtenir mes 2 axes de rotation.
Je design un nouveau socle:
Et je créer une boîte pour y insérer les électroniques.
Après de NOMBREUX essais…
Je finis par avoir un premier design fonctionnel.
J’ai dû apprendre plusieurs choses pour réussir à faire fonctionner le tout!
Un sonar capte la hauteur de l’actuateur:
Pour contrôler l’actuateur, j’avais commencé par utiliser un relais:
Finalement, j’ai appris qu’il existe des contrôleur faits pour ça (L298N)!
Pour faire mes tests, ça me prenait une source de courant! Je me suis donc acheté un power supply ajustable.
Puisque le L298N permet de prendre du 12v et de sortir du 5v, je me suis dit que j’allais être correct!
Par contre, j’avais un paquet de bogues dont je ne comprenais ABSOLUMENT RIEN. Je me suis dit que c’était probablement causé par le manque d’ampérage du convertisseur alors j’ai acheté convertisseur à part pour transformer le circuit 12v requis pour l’actuateur en 5v requis pour les composantes électroniques.
Eurêka! C’était bien ça. J’ai ensuite remplacé mon power supply par un adaptateur 12v qu’on peut brancher directement dans le mur.
Et finalement le arduino que j’ai choisi contient une puce wifi qui va me permettre de lui envoyer des commandes.
Une fois que c’est en place, il me restait à créer mon circuit… Chose que je n’ai jamais faite!
Je me suis acheté [un petit fer à souder]…(Amazon.ca):
… et je me suis rendu compte que j’étais INCAPABLE de faire quoi que ce soit. J’ai donc acheté une petite station pour me simplifier la vie…
… et un paquet de fils, breadboard, aimants & autres accessoires.
Après quelques heures et un énorme mal de dos, je finis par réussir mon circuit.
Jusque là, tout fonctionne, mais j’utilise le petit joystick qui venait avec mon premier kit pour faire bouger la caméra. Il me reste à trouver un moyen fiable et robuste de communiquer avec mon invention sans fil.
J’ai essayé un paquet de choses… Il faut comprendre qu’Arduino n’est pas comme JavaScript, Python ou Php! Programmer sur cette plateforme n’est pas la même chose du tout. Le contenu de ton script s’exécute dans une “loop” où tu dois décoder chaque byte une à une.
J’aurais pensé que ça aurait été facile de faire un API REST où la tête “écoute” et “attends” les commandes.
Je n’ai pas été capable de faire fonctionner ça… J’ai donc essayé de faire en sorte que la tête effectue 2 requêtes par secondes à mon serveur qui va ensuite communiquer l’état désiré de l’appareil.
Ça a fonctionné pendant un certain temps, mais aussitôt que la connexion était perdue, le script plantait et la tête arrêtait de fonctionner.
Finalement, la solution aura été d’utiliser le protocole MQTT.
C’est similaire à une requête HTTP (de l’API REST), mais je n’ai pas besoin de spammer mon serveur ou mon appareil d’information. L’appareil “s’abonne” à un “sujet” sur le serveur et, dès que le sujet change, l’appareil reçoit l’information.
J’ai tweaké le code, créé un script qui s’assure de se reconnecter au WiFi en cas de déconnexion et de se reconnecter au serveur MQTT s’il se déconnecte. Je l’ai testé pendant une semaine et je n’ai eu aucun bogue!
Le script ressemble à ça:
#include <SPI.h>
#include <PubSubClient.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h>
#include <Servo.h>
#include "variables.h"
char ssid[] = SECRET_SSID; // Network SSID
char pass[] = SECRET_PASS; // Network password
char host[] = HOST; // MQTT HOST
char clientid[] = CLIENT_ID; // MQTT Client ID
char username[] = USERNAME; // MQTT Credentials
char password[] = PASSWORD; // MQTT Credentials
char outTopic[] = TOPIC; // MQTT Topic
int timer = 0; // To print out state
// Control variables
int pan = 70;
int tilt = 70;
int height = 0;
bool heightOk = true;
int panTarget = 70;
int tiltTarget = 70;
// Actuator, Sonar & Servo config
int motorPin1 = 4;
int motorPin2 = 5;
Servo Tilt;
Servo Pan;
long duration; // Variable for the duration of sound wave travel
int distance; // Variable for the distance measurement
//receive data
void callback(char* topic, byte* payload, unsigned int length) {
char str[length + 1];
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
int i = 0;
for (i = 0; i < length; i++) {
Serial.print((char)payload[i]);
str[i] = (char)payload[i];
}
str[i] = 0; // Null termination
Serial.println();
StaticJsonDocument<256> doc;
deserializeJson(doc, payload);
const char* sensor = doc["sensor"];
panTarget = doc["pan"];
tiltTarget = doc["tilt"];
height = doc["height"];
heightOk = false;
}
WiFiClient wifiClient;
PubSubClient client(host, 1883, callback, wifiClient);
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an OUTPUT
pinMode(echoPin, INPUT); // Sets the echoPin as an INPUT
// Linear Actuator
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
// Pan // Tilt
Tilt.attach(10);
Pan.attach(9);
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
connectToWifi();
connectToMqtt();
}
void connectToWifi(){
// attempt to connect to Wifi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("You're connected to the network");
Serial.println();
}
void connectToMqtt(){
if (client.connect(clientid, username, password)) {
Serial.print("Connected to ");
Serial.println(host);
Serial.println();
boolean r = client.subscribe(outTopic);
Serial.print("Subscribed to ");
Serial.println(outTopic);
Serial.println();
} else {
// connection failed
Serial.println("Connection failed ");
Serial.println(client.state());
Serial.println();
}
}
void loop() {
if(timer > 200){
timer = 0;
}
// Clears the trigPin condition
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin HIGH (ACTIVE) for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = duration * 0.034 / 2; // Speed of sound wave divided by 2 (go and back)
if (!heightOk){
if (distance > height) {
// Go down
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin1, LOW);
} else if (distance < height) {
// Go up
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, HIGH);
} else {
heightOk = true;
// Do nothing
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin1, LOW);
}
}
if (tilt > 0 && tilt > tiltTarget) {
tilt -= 1;
Tilt.write(tilt);
delay(1);
}
if (tilt < 80 && tilt < tiltTarget) {
tilt += 1;
Tilt.write(tilt);
delay(1);
}
if (pan > 0 && pan > panTarget) {
pan -= 1;
Pan.write(pan);
delay(1);
}
if (pan < 180 && pan < panTarget) {
pan += 1;
Pan.write(pan);
delay(1);
}
if(timer == 200){
// Print state
Serial.print("WiFi Status: "); Serial.print(WiFi.status()); Serial.print(" | Distance: "); Serial.print(distance); Serial.print(" | Height: "); Serial.print(height); Serial.print(" | Pan: "); Serial.print(pan); Serial.print(" | Tilt: "); Serial.println(tilt);
// If not connected to WiFi
if(WiFi.status() != 3){
connectToWifi();
}
// If not connected to MQTT
if(WiFi.status() == 3 && client.connected() != 1){
connectToMqtt();
}
}
timer += 1;
delay(5); // To slow down motors.
client.loop();
}
Il me restait donc à trouver un moyen simple de fixer les caméras aux murs. J’avais des “Varipole” de lousse alors je me suis dit que j’allais utiliser ça!
Je me design donc des supports qui vont permettre de faire glisser l’appareil le long du poteau…
Ce qui a donné le résultat suivant:
J’ai fait quelques tweaks sur ce modèle avant de juger que c’était suffisant! Je l’ai installé la semaine passée dans le studio de Sherbrooke.
Entre-temps, j’ai refait l’application web pour me permettre de contrôler la caméra. J’ai détaillé le processus ici:
Grosso-moddo, j’utilise Vue-MQTT pour permettre à un utilisateur de se connecter au serveur MQTT via WebSocket (MQTT n’est pas possible à travers un navigateur).
La semaine passée, j’ai installé cette première version ça dans mon studio de Sherbrooke et tout fonctionne très bien! Voici un petit aperçu du studio de Sherbrooke:
Je l’ai presque terminé, je vais vous envoyer des photos dès que c’est prêt!
Où j’en suis aujourd’hui?
Le design avec la grosse boîte est loin d’être esthétique ou efficace. La majorité des pièces que j’ai utilisées sont vieilles et trop grosses pour rien.
Je vais donc redésigner à partir de zéro pour que ce soit plus compact et professionnel! Voici la liste des nouvelles pièces:
VL53L0X (Le sensor de distance)
Je suis également en train de refaire la boîte pour les composantes à même le support qui tient la tête:
(J’ai conservé le vieux sensor de distance sur ce modèle)
Ce qui donne ça:
Bien sûr, je vais fermer la boîte! Mais il faut avouer que c’est vraiment plus “propre” comme résultat!
Je termine de faire ça le plus rapidement possible. J’aimerais énormément intégrer un module pour zoomer la lentille de la caméra. Pour faire ça, j’ai acheté ce “follow focus” cheapo sur Amazon.
vJe l’ai désassemblé et je vais pouvoir l’ajouter à ma tête. Je ne sais pas si je vais avoir le temps de le faire pour la version 2, mais c’est une priorité!
Ce n’est que le début!
Je ne fais que commencer à être à l’aise avec tout ça et j’ai énormément de choses à apprendre! Après les caméras, il va me rester 2 autres gros morceaux à automatiser:
-
Les lumières.
-
Les bureaux.
Les lumières.
Présentement, les lumières se contrôlent à partir d’une manette rouge qui est tout SAUF intuitive…
Tous les clients la détestent. C’est pourquoi ça va être important de trouver une solution qui va me permettre de contrôler les lumières à partir de l’application web.
Pour faire ça, je me suis assuré d’avoir des lumières avec des connecteurs DMX. Il s’agit du protocole utilisé pour contrôler les lumières de stage pendant les spectacles.
En prévision que j’allais avoir ce problème à régler, je me suis acheté des adaptateurs DMX/ARTNET.
ArtNet est un protocole qui permet de contrôler un réseau DMX par Internet.
Honnêtement, c’est absolument HORRIBLE comme expérience de développement. Il n’y a aucune documentation nulle part, mais j’ai fini par réussir à faire fonctionner une lumière, ce qui prouve le concept.
Par la suite, je vais devoir configurer un point MQTT/ARTNET. Heureusement pour moi, je ne semble pas avoir été al première personne a vouloir faire ça alors il y a quelques projets sur GitHub sur lesquels je vais pouvoir me baser.
Comment faire bouger les bureaux maintenant???
Dans mes studios de Sherbrooke, Montréal et Trois-Rivières, j’utilise des standing desk Ergonofis.
Initialement, mon idée avait été de m’intégrer directement avec le contrôleur. J’ai donc acheté un contrôleur de remplacement pour analyser comment il était fait.
Dès que je l’ai ouvert, j’ai réalisé que je n’avais pas les moyens de mes ambitions!
J’ai écrit au président d’Ergonofis. Je lui ai déjà parlé plusieurs fois alors je me suis dit qu’il serait réceptif à l’idée de m’aider. Malheureusement, il m’est revenu en me disant que c’était de la “propriété intellectuelle” et qu’il ne voulait pas me partager les protocoles de communications utilisées.
Pour décoder tout ça, j’aurais besoin d’apprendre à me servir d’un truc comme ça:
NO THANK YOU! Peut-être dans 2 ou 3 ans.
La solution que j’envisage est donc de créer une boîte par-dessus la boîte qui contrôle le bureau et d’utiliser des Solenoids pour appuyer sur les boutons et simuler un humain.
Je n’aurai qu’à prendre un sensor de distance pour indiquer à mon robot sur quel bouton appuyer.
Par contre, pour le studio de Sherbrooke, j’ai opté pour des bureaux UpLift.
La raison principale étant qu’ils offrent des standing desk à 4 pattes, ce qui est beaucoup plus robuste!
Les bureaux Ergonofis que j’ai montrent déjà des signes d’usage. Surtout celui de Montréal qui a été démonté/remonté plusieurs fois.
Bref, c’est tout un hasard, mais il semblerait que la communauté de HomeAssistant ait déjà créé un script qui permet de contrôler les bureaux UpLift!
Si je suis chanceux, ça devrait être * relativement * simple!
Je vais quand même devoir créer la solution pour les bureaux Ergonofis puisque je n’ai pas trop envie de changer 6 bureaux à ~2500$ chacun.
2 ans & 15 000$ plus tard…
Je sais que c’est super technique comme post et que ça n’intéressera pas tout le monde! Si vous avez lue jusqu’ici, félicitations! Voici une surprise:
Probablement que vous avez compris 10% de tout ce que j’ai dit et c’est correct comme ça. Dites-vous que je ne comprends pas plus moi-même!
Ça fait 2 ans que j’avance à pas de tortue. C’est frustrant par bout, mais je dois admettre que c’est incroyablement gratifiant! En ayant cette compétence, ça me donne une quantité phénoménale de nouvelles idées pour mes projets.
Avez-vous des questions? D’autres membres s’intéressent à ce genre de projet? Let me know!