Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Sagen Sie allen höflichen Fahrern Danke

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
SparkFun Bluetooth-Modem - BlueSMiRF Silber
× 1
Adafruit 4-Kanal I2C-sicherer bidirektionaler Logikpegelwandler - BSS138
× 1
Adafruit Flexible Adafruit DotStar Matrix 8x32 - 256 RGB-LED-Pixel
× 1
Adafruit 4-Pin JST SM Stecker + Buchsenkabelsatz
× 1
DC 2,1 mm Hohlstecker
× 1
Netzteil 5V @ 4A
× 1
Position des männlichen Headers 4 (0.1")
× 1
Breadboard (generisch)
× 1
Projektbox
Wählen Sie einen aus, der groß genug ist, um alle Sachen und die Höhe des Bluetooth aufzunehmen.
× 1
1/4" x 4,5" x 15" Baltisches Birkensperrholz
× 1
Holzbearbeitungsband, 1" x 50'
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)
Heißklebepistole (generisch)
Forestnerstückchen
Drill
Schleifpapier
120er Körnung zum Abschlagen der scharfen Kanten.

Apps und Onlinedienste

Arduino-IDE
Virtual Shield für Arduino
Adafruit DotStar

Über dieses Projekt

Seit ich Auto fahre, wollte ich mit den zufälligen Fahrern um mich herum auf sinnvollere Weise kommunizieren können. Mir schien, dass ein Blitzen der Lichter, eine Handbewegung, eine Geste, die weit mehr als eine Handbewegung beinhaltet, ein Hupen oder ein Vollbremsen, allesamt ein sehr grober Kommunikationsmechanismus waren.

Die Inspiration dafür war ein James-Bond-Film, in dem er in der Eröffnungsszene einen Text hatte, der im Heckfenster seines Austin Martin angezeigt wurde. Ich dachte, ich könnte dem Fahrer im anderen Fahrzeug wirklich genau sagen (nicht nur mit gewellten Händen ausdrücken), was ich dachte.

Hier ist eine Bank-Demo:

Und eine Quasi-Live-Action-Demo:

Hier ist die Konzeptskizze:

Dieses Projekt hatte eine zusätzliche Herausforderung, da das MKR1000 ein Pre-Release-Board ist und es keine formelle Dokumentation gibt. Es gibt einen sehr guten Ausgangspunkt auf Hackster:

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

Also zum ersten Schritt des Projekts: 

Lass den MKR1000 sprechen

Ich hatte das Glück, in das von http://arduino.cc gesponserte Forum zu gelangen, das ein privates Forum für uns Boardbesitzer pro Release hatte. Nach einem soliden Samstag habe ich es geschafft, das Board zu programmieren und alle Komponenten zum Laufen zu bringen.

Mein aktuelles Setup umfasst den stündlichen Build der Arduino IDE-Version 1.6.9. Wenn Sie wie ich sind, dann ist die Verwendung von "stündlichen" Builds in einem Projekt zumindest "unbequem".

Nachdem ich die IDE installiert hatte, habe ich die Treiber für das Board mit dem Board-Manager der IDE heruntergeladen. Ich habe auch die folgenden Bibliotheken mit dem IDE-Bibliotheksmanager geladen:Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson und Windows Virtual Shields for Arduino.

Wenn dieses Board offiziell veröffentlicht wird, wird der Prozess viel einfacher sein. Daher gehe ich hier nicht näher darauf ein. Am Ende des Artikels finden Sie einen Hinweis auf ein Projekt, das Ihnen dabei hilft.

Regel Nummer 1 der Bauelektronik:Lassen Sie niemals den magischen Rauch aus dem Stromkreis!

Das MKR100 ist ein 3v3-basiertes Board. Da ich nicht alle Unterlagen hatte, die ich gerne hätte, wusste ich nicht, ob sie 5 Volt tolerant waren. Nicht nur, dass einige der Komponenten wirklich 5 Volt zur Verfügung haben wollen, um die richtige Logik 1 und 0 herzustellen.

Dies machte die Notwendigkeit der bidirektionalen 4-Kanal-Pegelverschiebung von Adafruit deutlich. Sowohl die Bluetooth-Karte als auch vor allem die DotStar-Matrix mögen satte 5 Volt. Seien Sie also vorsichtig, wenn Sie diese Dinger anschließen.

Stellen Sie sicher, dass die Komponenten funktionieren

Bevor ich mir Sorgen machte, dass alles zusammenpasst, möchte ich sicherstellen, dass alle Komponenten funktionieren.

Ich begann mit der Adafruit 8x32 DotStar-Matrix. Ich fand, dass die Verbindungen, die ich hatte, ein bisschen flockig waren. Damit dies kein Problem darstellt, habe ich einige Header-Pins verwendet, die ich herumgelegt hatte, und sie einfach verlötet.

Mit den Kopfstiften fest angebracht. Ich habe die Daten und den Takteingang an die mit SDA und SCL gekennzeichneten SPI-Pins des MKR1000 geroutet.

Mit den Kopfstiften fest angebracht. Ich habe die Daten und den Takteingang an die mit SDA und SCL gekennzeichneten SPI-Pins des MKR1000 geroutet.

Ich habe die Beispielskizze "Datei> Beispiele> Adafruit DotStarMatric> Matrixtest" in die IDE geladen. DATAPIN auf 11 und CLOCKPIN auf 12 im Code angepasst. Die Lösung wurde erstellt und bereitgestellt. Nach ein bisschen mit Option für die Matrix landete ich mit einem funktionierenden Display.

Als nächstes musste das Virtual Shield über den Bluetooth-Adapter funktionieren. Es war wirklich direkt. Ich habe die Anweisungen im Github-Repository https://github.com/ms-iot/virtual-shields-arduino befolgt. Die einzige Änderung, die ich vornehmen musste, waren die TX- und RX-Pins. Das sind die Pins 14 und 13, wie auf meinem Board markiert.

Ich möchte jedoch anmerken, dass ich in früheren Inkarnationen die TX / RX-Pins trennen musste, um neue Skizzen hochzuladen. Ich freue mich, Ihnen mitteilen zu können, dass dies nicht mehr der Fall ist.

Gehen Sie den Code durch

Jetzt, wo alles funktioniert, werde ich mir einen Moment Zeit nehmen und den spezifischen Code für dieses Projekt durchgehen.

Um auf alle Funktionen zugreifen zu können, müssen Sie Folgendes einschließen:

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

Die ersten 5 beinhaltet sollten ziemlich erklärend sein.

Die VirtualShield.h enthält die Basisfunktionalität für die Kommunikation über den Bluetooth-Adapter. Dies ist unabhängig davon erforderlich, auf welchen der Sensoren Sie zugreifen möchten.

Die Datei Text.h bekommt Ihren besseren Text, d. h. String-Handling.

Graphics.h, Recognition.h und Colors.h enthalten die Funktionen, die Sie benötigen, um auf den virtuellen Bildschirm zuzugreifen und die Spracherkennung zu aktivieren. Obwohl ich für diese Herausforderung noch nicht fertig bin, werde ich die Sprachfunktionen in Zukunft codieren.

Als nächstes in der Liste der wichtigen Codezeilen, Initialisieren der DotStar-Matrix und Initialisieren des Shield-Objekts:

Adafruit_DotStarMatrix matrix =Adafruit_DotStarMatrix( 32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GBR);const uint ={_tFarben[] Farbe(0, 255, 0), Matrix.Farbe(0, 0, 255), Matrix.Farbe(255, 0, 255), Matrix.Farbe(255, 0, 106), Matrix.Farbe(255, 255, 255) };VirtualShield-Schild;Grafikbildschirm =Grafik(Schild);Erkennung Sprache =Erkennung(Schild); 

Die erste Zeile teilt der DotStar-Bibliothek die Größe und das Layout der Matrix mit. Die verschiedenen Optionen finden Sie im Matrixtest-Beispiel oder in der Datei Adafruit_DotStarMatrix.h.

Die Farben sind für die DotStar-Bibliothek.

Die letzten 3 Zeilen feuern den Schild an und initialisieren die Objekte, um mit den Sensoren im Telefon zu arbeiten.

Als nächstes müssen wir wie alle Arduino-Skizzen die setup()-Methode behandeln

void setup() { matrix.begin(); matrix.setTextWrap(false); matrix.setHelligkeit(40); matrix.setTextColor(colors[0]); DisplayText("Initialisierung...", 4, 10); // virtuelle Schildereignisse einrichten:shield.setOnRefresh(refresh); Speech.setOnEvent(onSpeech); screen.setOnEvent(screenEvent); // Beginnen Sie mit der Schildkommunikation (ruft auch refresh() auf). schild.begin(); // nimmt eine Bluetooth-Baudrate von 115200 an DisplayText("Initializing...finished", 3, 10);} 

Die "Matrix"-Zeilen sind ziemlich selbsterklärend und da diese Zeilen ausgeführt werden, kann ich jetzt einige Informationsnachrichten an die Matrix senden.

Die Zeilen "shield" richten jetzt Callback-Methoden ein. Diese Methoden werden nach Bedarf aufgerufen, wenn Ereignisse eintreten.

Nun zur kompliziertesten Methode der gesamten Skizze

void loop() { // checkSensors() prüft auf Rückgabeereignisse und verarbeitet diese (Aufrufe von Callbacks). Dies ist die Single-Loop()-Methode von VirtualShield. Shield.checkSensors();} 

Ja, du hast es verstanden. Wir überprüfen ständig, ob einer der Sensoren ausgelöst hat und ob ein Ereignis behoben werden muss.

Okay, lassen Sie uns einige Ereignisse wirklich behandeln. Das erste ist die Methode refresh(). Es wird aufgerufen, wenn verschiedene Ereignisse eintreten. Das einzige Ereignis, das uns im Moment wichtig ist, ist die Bluetooth-Verbindung. Wir brauchen ein Ereignis, damit wir den Bildschirm neu zeichnen können, damit er so aussieht, wie er sollte.

void refresh(ShieldEvent*shieldEvent){ // Geben Sie Ihren Aktualisierungscode hier ein // dies wird ausgeführt, wenn eine Bluetooth-Verbindung hergestellt wird, wann immer shield.begin() ausgeführt wird oder die Schaltfläche "Refresh" in der App gedrückt wird:screen.clear(ARGB(123,86,204)); screen.drawAt(0,0, ""); dankeId =screen.addButton(10, 50, ". Danke."); welcomeId =screen.addButton(10, 100, ". Welcome ."); turnLeftId =screen.addButton(10, 150, ". Left ."); stopId =screen.addButton(175, 50, ". Stopping ."); StartingId =screen.addButton(175, 100, ". Starting ."); turnRightId =screen.addButton(175, 150, ". Right ."); backoffId =screen.addButton(10, 225, ". Back Off."); calling911Id =screen.addButton(10, 290, ". Calling 911 .");} 

Diese Methode löscht den Bildschirm mit einem hellvioletten Hintergrund und fährt fort, die verschiedenen Schaltflächen auf dem Bildschirm zu platzieren. Beachten Sie den Abstand zwischen den Wörtern. Dies ist eine aktuelle Einschränkung der virtuellen Schildfunktionalität, da ich die Dinge wirklich zentrieren wollte, damit sie schön aussehen.

Was passiert also, wenn ich eine dieser Tasten berühre? Ein Ereignis wird ausgelöst und im folgenden Codestück behandelt.

void screenEvent(ShieldEvent*shieldEvent) { if(screen.isPressed(thanksId)) { DisplayText("Danke", 5, 100); } if(screen.isPressed(welcomeId)) { DisplayText("Gern geschehen", 2, 100); } if(screen.isPressed(backoffId)) { DisplayText("Bitte zurückziehen", 4, 100); } if(screen.isPressed(stoppingId)) { DisplayText("...stopping...", 0, 100); } if(screen.isPressed(startingId)) { DisplayText("...starting...", 1, 100); } if(screen.isPressed(turnLeftId)) { DisplayText("links abbiegen", 3, 100); } if(screen.isPressed(turnRightId)) { DisplayText("rechts abbiegen", 3, 100); } if(screen.isPressed(calling911Id)) { DisplayText("Calling 911", 0, 100); }} 

Es kommt ein Ereignis, der Code überprüft, welche Schaltfläche gedrückt wird, und wir rufen die DisplayText-Methode mit dem anzuzeigenden Zeug auf.

Und wie kommt der Text schließlich in die Matrix? Die Methode DisplayText übernimmt das für Sie.

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

Diese Methode ermittelt, wie breit diese Zeichenfolge wirklich ist. Wir müssen es wissen, damit wir sicherstellen können, dass die Zeichenfolge vollständig ein- und ausgeblendet wird. Die Buchstaben sind 5 breit + 1 für den Abstand zwischen den Buchstaben.

Baue das Gehäuse

Der Aufbau war ziemlich geradlinig. Ich fand eine anständige Box, die größer war als die Grundfläche der Matrix. Ich habe ein Stück 1/4" baltischer Birke, das größer war, als ich brauchte, und es zurechtgeschnitten.  

Mit der gleichen Technik wie die Tischkreissäge. Beginnen Sie damit, die Matrix auf das Sperrholz zu legen. Markieren Sie nach der Positionierung die horizontale und vertikale Mitte der Anschlüsse (einschließlich des Hilfsstromanschlusses). Jetzt müssen Sie nur noch die Linien verbinden, um die Mitte der Löcher zu finden, die Sie bohren möchten.

Ja, ich sagte 'langweilen', nicht 'bohren'. Das letzte Mal, als ich Löcher in Plastik "bohrte", hatte ich einige wirklich unbefriedigende Ergebnisse. Dieses Mal habe ich Forestner-Stückchen verwendet . Ich habe unten ein Bild von ihnen. Beachten Sie, dass die Kante zum Schneiden ist und die Mitte einen Schaber hat, um das unerwünschte Holz herauszuschaufeln. Macht ein viel schöneres "Loch". Kommen Sie jetzt zu "langweilig" und Sie möchten wahrscheinlich weitermachen und die Aufhängungslöcher bohren.

Holen Sie sich ein Stück 120er Schleifpapier und schleifen Sie das gesamte Stück leicht ab. Stellen Sie sicher, dass die "Leichtigkeit" der Kanten des Bretts alle Löcher enthält, die gerade gemacht wurden. Achten Sie darauf, das Brett abzuwischen, damit sich kein Sägestaub oder andere "Zeug" auf dem Brett befindet.

Jetzt ist es Zeit an der Plastikbox zu arbeiten.

Bohren Sie zwei Löcher an beiden Enden der Box. Diese sind für den Stromanschluss und den Anschluss an die Matrix. Bohren Sie noch nicht das Loch für die Hilfsstromversorgung der Matrix.

Tragen Sie nun ein paar Streifen des doppelseitigen Klebebands auf die Rückseite der Schachtel auf und befestigen Sie die Schachtel am Sperrholz. Da dies ein "repositionierbares" Band ist, wollte ich wirklich, dass es für immer klebt. Ich legte einige schwere Bücher darauf und ließ es 24 Stunden lang stehen. Warum 24 Stunden? Die Bandanweisungen sagen, es nicht zu tun. Das war für mich Grund genug.

Zeit für das letzte Loch. Sie sollten jetzt eine genaue Position für das Hilfsstromanschlussloch haben. Langweilen Sie das, genießen Sie Ihre 'präzise' aussehende Arbeit.

Bring die Klugheit in die Kiste

Scheint, dass das Steckbrett genau die richtige Größe für die Box hatte, aber ich wollte den USB-Anschluss vom MKR1000 ein- und ausstecken können. Also musste ich das Steckbrett kürzer machen.

Okay, nach diesem Trauma, schälen Sie die Rückseite des Steckbretts ab und kleben Sie es fest. Achten Sie darauf, das Loch für den Hilfsstromanschluss zu vermeiden.

Befestigen Sie die Matrize an der Vorderseite des Sperrholzes, indem Sie die Verbindungen durch die Löcher fädeln. Befestigen Sie die Matrize mit etwas Heißkleber.

Lass uns über Macht reden

Obwohl ich die Helligkeit auf 40% eingestellt habe, beträgt der maximale Strom, wenn ich alle 256 Pixel beleuchte, ungefähr 7,5 Ampere. Weit mehr, als der MKR1000 bieten könnte. Zum Glück für mich ist keines der Displays statisch und ich beleuchte nicht annähernd die volle Matrix. Abhilfe schafft der Hilfsstromanschluss. Ich liefere bis zu 4A. Ich denke, da es nicht dauerhaft und nicht statisch ist, sollte die Stromversorgung gut sein.

Ich hatte auch eine Ersatzwandwarze, die ich am Ende benutzte, um den MKR1000 mit Strom zu versorgen, wenn er im Fahrzeug eingeschaltet war.

Ich dachte darüber nach, einen Stromwandler in das Projekt einzubauen, um 12-V-Autostrom zu nehmen und die 5V an das Projekt zu liefern. Nach langem Überlegen war es in jeder Hinsicht besser, ein 5V 4A-Netzteil für 5,00 $ zu bekommen und einen Wechselstromwandler zu verwenden, den ich bereits habe. Einfach ist normalerweise besser, wenn es um diese Dinge geht.

Das Schild aufhängen

Ich hatte geplant, "Ball Stretch Cords" und einige Saugnäpfe zu verwenden, um dies an der Heckscheibe zu befestigen. Sagen wir einfach, ich habe in der Gegend noch mehr zu tun.

Code

Der Say Thanks-Code
https://github.com/pulcher/mkr1000_challenge

Schaltpläne

Der MKR1000 ist nur ein Mikro, da der echte MKR1000 noch nicht veröffentlicht wurde.

Herstellungsprozess

  1. UnifiedWater v1
  2. Mobile Abstimmungsbox
  3. Arduino101 / tinyTILE BLE:Match-Making-Sonnenbrille
  4. Whac-A-Mole (Button Edition)
  5. Moderne Jukebox
  6. Arduino Apple Watch
  7. Selbstgemachter Arduino , Si4730 Allband-Empfänger (LW, MW, SW, FM)
  8. Alles über PCB-Oberflächen, erklärt
  9. EDM-Funkenerosion:Worum geht es?
  10. Flanschlager in all ihren Varianten erklärt