Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Dites merci à tous les chauffeurs courtois

Composants et fournitures

Arduino MKR1000
× 1
Modem Bluetooth SparkFun - BlueSMiRF Silver
× 1
Convertisseur de niveau logique bidirectionnel Adafruit 4 canaux I2C-safe - BSS138
× 1
Adafruit Flexible Adafruit DotStar Matrix 8x32 - 256 pixels LED RVB
× 1
Adafruit 4 broches JST SM ensemble de câbles + prise de courant
× 1
Connecteur cylindrique DC 2,1 mm
× 1
Adaptateur secteur 5V @ 4A
× 1
En-tête mâle 4 position (0,1")
× 1
Planche à pain (générique)
× 1
Boîte de projet
Choisissez-en un assez grand pour contenir tout le matériel plus la hauteur du Bluetooth.
× 1
1/4" x 4,5" x 15" Contreplaqué de bouleau de la Baltique
× 1
Ruban à bois, 1" x 50'
× 1

Outils et machines nécessaires

Fer à souder (générique)
Pistolet à colle chaude (générique)
Bits forestiers
Perceuse
Papier de verre
120 Grit pour faire tomber les arêtes vives.

Applications et services en ligne

Arduino IDE
Bouclier virtuel pour Arduino
Adafruit DotStar

À propos de ce projet

Depuis que je conduis, je veux pouvoir communiquer de manière plus significative avec les conducteurs aléatoires autour de moi. Il m'a semblé qu'un éclair de lumière, un geste de la main, un geste impliquant bien plus qu'un geste de la main, un klaxon ou un claquement sur les freins ont fini par être des mécanismes de communication très grossiers.

L'inspiration pour cela était un film de James Bond où, dans la scène d'ouverture, il avait un texte qui était affiché dans la fenêtre arrière de son Austin Martin. Je pensais que je pouvais vraiment dire (pas seulement exprimer avec des mains ondulées) le conducteur de l'autre véhicule exactement ce que je pensais.

Voici une démo de banc :

Et une démo d'action quasi-live :

Voici l'esquisse du concept :

Ce projet présentait un défi supplémentaire car la MKR1000 est une carte de pré-version et il n'y a pas de documentation formelle. Il existe un très bon point de départ sur Hackster :

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

Alors pour la première étape du projet : 

Faites parler le MKR1000

J'ai eu la chance d'entrer dans le forum sponsorisé par http://arduino.cc, qui avait un forum privé pour nous, propriétaires de cartes par version. Après un samedi solide, j'ai réussi à programmer la carte et à faire fonctionner tous les composants.

Ma configuration actuelle implique la construction horaire Arduino IDE version 1.6.9. Si vous êtes comme moi, alors utiliser des builds « toutes les heures » dans un projet vous rend pour le moins « mal à l'aise ».

Une fois l'IDE installé, j'ai téléchargé les pilotes de la carte avec le gestionnaire de cartes de l'IDE. J'ai également chargé les bibliothèques suivantes à l'aide du gestionnaire de bibliothèques IDE :Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson et Windows Virtual Shields pour Arduino.

Lorsque ce forum sera officiellement publié, le processus sera beaucoup plus simple. Je ne vais donc pas le détailler ici. Il y a une référence à un projet pour vous aider à le faire à la fin de l'article.

Règle numéro 1 de l'électronique de construction :Ne laissez jamais la fumée magique sortir du circuit !

Le MKR100 est une carte basée sur 3v3. N'ayant pas toute la documentation que je voudrais, je ne savais pas s'ils étaient tolérants au 5 volts. Non seulement certains des composants veulent vraiment avoir 5 volts disponibles pour établir une logique appropriée 1 et 0.

Cela a fait ressortir le besoin du changement de niveau bidirectionnel à 4 canaux par Adafruit. La carte Bluetooth et la matrice DotStar en particulier aiment vraiment un 5 volts complet. Alors, soyez prudent lorsque vous branchez ces choses.

Assurez-vous que les composants fonctionnent

Avant de m'inquiéter de tout faire fonctionner ensemble, je veux m'assurer que tous les composants fonctionnent.

J'ai commencé avec la matrice Adafruit 8x32 DotStar. J'ai trouvé que les connexions que j'avais étaient un peu floconneuses. Pour que cela ne pose pas de problème, j'ai utilisé quelques broches d'en-tête que j'avais posées et je les ai simplement soudées.

Avec les broches d'en-tête fermement attachées. J'ai acheminé les données et l'horloge vers les broches SPI marquées SDA et SCL sur le MKR1000.

Avec les broches d'en-tête fermement attachées. J'ai acheminé les données et l'horloge vers les broches SPI marquées SDA et SCL sur le MKR1000.

J'ai chargé l'exemple d'esquisse "Fichier> Exemples> Adafruit DotStarMatric> matrixtest" dans l'IDE. Ajustement du DATAPIN à 11 et du CLOCKPIN à 12 dans le code. Construction et déploiement de la solution. Après un peu d'option pour la matrice, je me suis retrouvé avec un affichage fonctionnel.

La prochaine étape consistait à faire fonctionner le Virtual Shield via l'adaptateur Bluetooth. C'était vraiment simple. J'ai suivi les instructions mentionnées sur le référentiel github https://github.com/ms-iot/virtual-shields-arduino. Le seul changement que j'ai dû faire était les broches TX et RX. Ce sont les broches 14 et 13 comme indiqué sur mon tableau.

Je noterais cependant que dans les incarnations précédentes, je devais déconnecter les broches TX/RX pour télécharger de nouveaux croquis. Je suis heureux d'annoncer que ce n'est plus le cas.

Parcourez le code

Maintenant que tout fonctionne, je vais prendre un moment pour parcourir le code spécifique à ce projet.

Pour accéder à toutes les fonctions, vous devez inclure les éléments suivants :

#include #include #include #include #include #include #include #include #include #include  

Les 5 premiers inclus devraient être assez explicatifs.

Le VirtualShield.h contient la fonctionnalité de base pour la communication via l'adaptateur Bluetooth. Ceci est nécessaire quel que soit le capteur auquel vous souhaitez accéder.

Le fichier Text.h obtient votre meilleur texte, c'est-à-dire la gestion des chaînes.

Graphics.h, Recognition.h et Colors.h contiennent les fonctionnalités dont vous avez besoin pour accéder à l'écran virtuel et activer la reconnaissance vocale. Bien que, pas fini pour ce défi, je coderai les fonctionnalités vocales à l'avenir.

Ensuite, dans la liste des lignes de code importantes, en initialisant la matrice DotStar et en initialisant l'objet Shield :

Matrice Adafruit_DotStarMatrix =Adafruit_DotStarMatrix( 32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GBR), (matrice 0.255, 0, matrice 0 =16_t couleurs[] Couleur(0, 255, 0), matrice.Couleur(0, 0, 255), matrice.Couleur(255, 0, 255), matrice.Couleur(255, 0, 106), matrice.Couleur( 255, 255, 255) } Bouclier VirtualShield ;Écran graphique = Graphiques (bouclier);Discours de reconnaissance = Reconnaissance (bouclier); 

La première ligne indique à la bibliothèque DotStar la taille et la disposition de la matrice. Reportez-vous à l'exemple matrixtest ou au fichier Adafruit_DotStarMatrix.h pour les différentes options.

Les couleurs sont pour la bibliothèque DotStar.

Les 3 dernières lignes déclenchent le bouclier et initialisent les objets afin de fonctionner avec les capteurs du téléphone.

Ensuite, comme tous les croquis Arduino, nous devons gérer la méthode setup()

void setup() { matrix.begin(); matrice.setTextWrap(false); matrice.setBrightness(40); matrice.setTextColor(couleurs[0]); DisplayText("Initialisation...", 4, 10); // configurer les événements de bouclier virtuel :shield.setOnRefresh(refresh); discours.setOnEvent(onSpeech); screen.setOnEvent(screenEvent); // commence la communication avec le bouclier (appelle également refresh()). bouclier.begin(); // suppose 115200 baudrate Bluetooth DisplayText("Initializing...finished", 3, 10);} 

Les lignes « matrice » sont assez explicites et, avec ces lignes exécutées, cela me donne maintenant la possibilité d'envoyer des messages d'information à la matrice.

Les lignes "shield" configurent maintenant les méthodes de rappel. Ces méthodes seront appelées au besoin lorsque des événements se produisent.

Maintenant pour la méthode la plus compliquée de l'ensemble du croquis

void loop() { // checkSensors() vérifie les événements de retour et les gère (appel des rappels). Il s'agit de la méthode single loop() de VirtualShield. shield.checkSensors();} 

Oui, vous l'avez compris. Nous vérifions en permanence si l'un des capteurs s'est déclenché et si un événement doit être traité.

Ok maintenant, gérons vraiment certains événements. La première est la méthode refresh(). Il sera appelé lorsqu'un certain nombre d'événements différents se produisent. Le seul événement qui nous intéresse en ce moment est la connexion Bluetooth. Nous avons besoin d'un événement pour pouvoir redessiner l'écran afin qu'il ressemble à ce qu'il devrait.

void refresh(ShieldEvent* shieldEvent){ // mettez votre code d'actualisation ici // cela s'exécute chaque fois que Bluetooth se connecte, chaque fois que shield.begin() s'exécute ou que le bouton 'refresh' est enfoncé dans l'application :screen.clear(ARGB(123,86,204)); screen.drawAt(0,0, ""); thanksId =screen.addButton (10, 50, ". Merci ."); welcomeId =screen.addButton(10, 100, ". Bienvenue ."); turnLeftId =screen.addButton(10, 150, ". Left ."); stopId =screen.addButton(175, 50, ". Stopping ."); startId =screen.addButton(175, 100, ". Démarrage ."); turnRightId =screen.addButton(175, 150, ". Right ."); backoffId =screen.addButton(10, 225, ". Back Off ."); call911Id =screen.addButton(10, 290, ". Appeler le 911 .");} 

Cette méthode efface l'écran avec un fond violet clair et met les différents boutons sur l'écran. Remarquez l'espacement autour des mots. Il s'agit d'une limitation actuelle de la fonctionnalité du bouclier virtuel car je voulais vraiment centrer les choses pour les rendre belles.

Alors, que se passe-t-il lorsque je touche l'un de ces boutons ? Un événement est déclenché et il est géré dans le bit de code suivant.

void screenEvent(ShieldEvent* shieldEvent) { if(screen.isPressed(thanksId)) { DisplayText("Merci", 5, 100); } if(screen.isPressed(welcomeId)) { DisplayText("De rien", 2, 100); } if(screen.isPressed(backoffId)) { DisplayText("Veuillez reculer", 4, 100); } if(screen.isPressed(stoppingId)) { DisplayText("...stopping...", 0, 100); } if(screen.isPressed(startingId)) { DisplayText("...starting...", 1, 100); } if(screen.isPressed(turnLeftId)) { DisplayText("Tourner à GAUCHE", 3, 100); } if(screen.isPressed(turnRightId)) { DisplayText("Tourner à DROITE", 3, 100); } if(screen.isPressed(calling911Id)) { DisplayText("Appel du 911", 0, 100); }} 

Un événement arrive, le code vérifie quel bouton est enfoncé et nous appelons la méthode DisplayText avec les éléments à afficher.

Et enfin, comment le texte parvient-il à la matrice ? La méthode DisplayText s'en chargera pour vous.

void DisplayText(String message, int colorIndex, int currDelay){ int x =matrix.width(); int maxX =-1 * (message.length() * 5 + message.length()); matrice.setTextColor(colors[colorIndex]); while( x> maxX) { matrice.fillScreen(0); matrice.setCursor(x, 0); matrice.print(message); --X; matrice.show(); delay(currDelay); }} 

Cette méthode détermine la largeur réelle de cette chaîne. Nous avons besoin de savoir, afin que nous puissions nous assurer que la chaîne défile complètement dans et hors de vue. Les lettres font 5 de large + 1 pour l'espace entre les lettres.

Construire l'enceinte

La construction était assez simple. J'ai trouvé une boîte de taille décente qui était plus grande que l'empreinte de la matrice. J'ai obtenu un morceau de bouleau baltique 1/4" qui était plus grand que ce dont j'avais besoin et je l'ai coupé à la bonne taille.

En utilisant la même technique que la scie à table. Commencez par poser la matrice sur le contreplaqué. Après son positionnement, marquez les centres horizontaux et verticaux des connexions (y compris la connexion d'alimentation auxiliaire). Il ne vous reste plus qu'à connecter les lignes pour trouver le centre des trous que vous êtes sur le point de percer.

Oui, j'ai dit "alésage", pas "forage". La dernière fois que j'ai "percé" des trous dans du plastique, j'ai eu des résultats vraiment insatisfaisants. Cette fois-ci, j'ai utilisé des bits Forestner . J'ai une photo d'eux ci-dessous. Remarquez que le bord est destiné à la coupe et que le centre a un grattoir pour retirer le bois indésirable. Fait un "trou" beaucoup plus agréable. Maintenant, passez à « ennuyeux » et vous voudrez probablement continuer et percer les trous de suspension.

Procurez-vous un morceau de papier de verre grain 120 et poncez légèrement toute la pièce. Assurez-vous que la « facilité » des bords de la planche comprend tous les trous qui viennent d’être faits. Assurez-vous d'essuyer le tableau pour qu'il n'y ait pas de sciure de bois ou d'autres « trucs » sur le tableau.

Il est maintenant temps de travailler sur la boîte en plastique.

Percez deux trous à chaque extrémité de la boîte. Ils sont destinés au connecteur d'alimentation et à la connexion à la matrice. Ne percez pas encore le trou d'alimentation auxiliaire de la matrice.

Maintenant, appliquez quelques bandes de ruban adhésif double face à l'arrière de la boîte et fixez la boîte au contreplaqué. Puisqu'il s'agit d'un ruban "repositionnable", je voulais vraiment que cela colle pour de bon. J'ai posé des livres lourds dessus et je l'ai laissé pendant 24 heures. Pourquoi 24 heures ? Les instructions de la bande disent de ne pas le faire. C'était une raison suffisante pour moi.

Il est temps pour ce dernier trou. Vous devriez maintenant avoir une position exacte pour le trou de connexion de l'alimentation auxiliaire. Percez cela, profitez de votre travail d'apparence «précise».

Mettez l'intelligence dans la boîte

Il semble que la planche à pain était juste de la bonne taille pour la boîte, mais je voulais pouvoir brancher/débrancher le connecteur USB du MKR1000. J'ai donc dû raccourcir la planche à pain.

Ok après ce traumatisme, décollez le dos de la planche à pain et collez-le. Assurez-vous d'éviter le trou de connexion de l'alimentation auxiliaire.

Fixez la matrice à l'avant du contreplaqué en enfilant les connexions à travers les trous. Fixez la matrice avec de la colle chaude.

Parlons pouvoir

Même si la luminosité est réglée sur 40%, le courant maximum si j'allume les 256 pixels est d'environ 7,5 ampères. Bien plus que ce que le MKR1000 pourrait fournir. Heureusement pour moi, aucun des écrans n'est statique et je n'éclaire pas du tout près de la matrice complète. La connexion d'alimentation auxiliaire vient à la rescousse. Je fournis jusqu'à 4A. Je pense qu'il n'est pas soutenu et non statique, l'alimentation doit être bonne.

J'avais également une verrue murale de rechange dont j'ai utilisé l'extrémité pour alimenter le MKR1000 lorsqu'il était allumé dans le véhicule.

Je pensais intégrer un convertisseur de puissance au projet pour alimenter la voiture en 12 V et fournir le 5 V au projet. Après beaucoup de réflexion, il était préférable à tous égards d'obtenir un adaptateur secteur 5V 4A pour 5,00 $ et d'utiliser un convertisseur secteur que j'ai déjà. Simple est généralement mieux quand il s'agit de ce genre de choses.

Suspendre le signe

J'avais prévu d'utiliser des "cordons extensibles à billes" et des ventouses pour le fixer au pare-brise arrière. Disons simplement que j'ai encore du travail à faire dans la région.

Code

Le code de remerciement
https://github.com/pulcher/mkr1000_challenge

Schémas

Le MKR1000 n'est qu'un micro car le vrai MKR1000 n'est pas encore sorti.

Processus de fabrication

  1. UnifiedWater v1
  2. Boîte de vote mobile
  3. Arduino101 / tinyTILE BLE :lunettes de soleil assorties
  4. Whac-A-Mole (édition bouton)
  5. Jukebox moderne
  6. Apple Watch Arduino
  7. Tout sur les finitions des PCB, expliqué
  8. EDM Spark Erosion :de quoi s'agit-il ?
  9. Roulements à bride expliqués dans toutes leurs variétés