Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bedankt aan alle hoffelijke chauffeurs

Componenten en benodigdheden

Arduino MKR1000
× 1
SparkFun Bluetooth-modem - BlueSMiRF Zilver
× 1
Adafruit 4-kanaals I2C-veilige bidirectionele logische niveauconverter - BSS138
× 1
Adafruit Flexible Adafruit DotStar Matrix 8x32 - 256 RGB LED Pixels
× 1
Adafruit 4-pins JST SM-stekker + contactdooskabelset
× 1
DC 2.1 mm barrel-connector
× 1
AC-stroomadapter 5V @ 4A
× 1
Mannelijke Header 4-positie (0,1")
× 1
Broodplank (algemeen)
× 1
Projectbox
Kies er een die groot genoeg is voor alle spullen plus de hoogte van de Bluetooth.
× 1
1/4" x 4.5" x 15" Baltisch berkenmultiplex
× 1
Houtbewerkingstape, 1" x 50'
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Hot lijmpistool (algemeen)
Forestner bits
Boor
Schuurpapier
120 Grit om de scherpe randen af ​​te kloppen.

Apps en online services

Arduino IDE
Virtueel schild voor Arduino
Adafruit DotStar

Over dit project

Al zolang ik autorijd, wilde ik op een meer zinvolle manier kunnen communiceren met de willekeurige chauffeurs om me heen. Het leek me dat een flits van de lichten, een handgebaar, een gebaar dat veel meer omvat dan een handgebaar, een toeter of een klap op de rem, uiteindelijk allemaal een heel primitief communicatiemechanisme werden.

De inspiratie hiervoor was een James Bond-film waarin hij in de openingsscène een tekst had die in de achterruit van zijn Austin Martin werd weergegeven. Ik dacht dat ik de bestuurder in het andere voertuig echt kon vertellen (niet alleen met golvende handen uitdrukken) wat ik dacht.

Hier is een bankdemo:

En een quasi-live actiedemo:

Hier is de conceptschets:

Dit project had een extra uitdaging omdat de MKR1000 een pre-release board is en er geen formele documentatie is. Er is een heel goed startpunt op Hackster:

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

Dus bij de eerste stap van het project: 

Breng de MKR1000 aan het praten

Ik had het geluk om op het forum te komen dat werd gesponsord door http://arduino.cc, dat een privéforum had voor ons per release-bordeigenaren. Na een stevige zaterdag slaagde ik erin om het bord te programmeren en alle componenten aan het werk te krijgen.

Mijn huidige setup omvat de Arduino IDE-versie 1.6.9 die elk uur wordt gebouwd. Als je op mij lijkt, dan maakt het gebruik van 'uurlijkse' builds in een project je op zijn minst 'ongemakkelijk'.

Toen ik de IDE eenmaal had geïnstalleerd, downloadde ik de stuurprogramma's voor het bord met de Boardmanager van de IDE. Ik heb ook de volgende bibliotheken geladen met behulp van de IDE-bibliotheekmanager:Adafruit DotStar, Adafruit DotStarMatrix, Adafruit GFX, ArduinoJson en Windows Virtual Shields voor Arduino.

Wanneer dit bord officieel wordt vrijgegeven, zal het proces veel eenvoudiger zijn. Ik ga het hier dus niet in detail beschrijven. Er is een verwijzing naar een project om u hierbij te helpen aan het einde van het artikel.

Regel nummer 1 van bouwelektronica:Laat de magie nooit uit het circuit roken!

De MKR100 is een op 3v3 gebaseerd bord. Omdat ik niet alle documentatie had die ik zou willen, wist ik niet of ze 5 volt tolerant waren. Niet alleen dat sommige componenten echt 5 volt beschikbaar willen hebben om de juiste logische 1 en 0 tot stand te brengen.

Dit bracht de noodzaak naar voren van de 4-kanaals bidirectionele niveauverschuiving door Adafruit. Zowel de bluetooth-kaart als vooral de DotStar-matrix houden erg van een volle 5 volt. Wees dus voorzichtig bij het aansluiten van deze dingen.

Zorg ervoor dat de componenten werken

Voordat ik me zorgen maakte om alles samen te laten werken, wil ik er zeker van zijn dat alle componenten werken.

Ik ben begonnen met de Adafruit 8x32 DotStar matrix. Ik ontdekte dat de connecties die ik had een beetje onbetrouwbaar waren. Om dit geen probleem te maken, heb ik een paar header-pinnen gebruikt die ik had liggen en heb ik ze gewoon gesoldeerd.

Met de header pinnen stevig bevestigd. Ik heb de Data en Clock In naar de SPI-pinnen gerouteerd die gemarkeerd zijn als SDA en SCL op de MKR1000.

Met de header pinnen stevig bevestigd. Ik heb de Data en Clock In naar de SPI-pinnen gerouteerd die gemarkeerd zijn als SDA en SCL op de MKR1000.

Ik heb de voorbeeldschets "Bestand> Voorbeelden> Adafruit DotStarMatric> matrixtest" in de IDE geladen. De DATAPIN aangepast naar 11 en CLOCKPIN naar 12 in de code. De oplossing gebouwd en geïmplementeerd. Na een beetje met optie voor de matrix eindigde ik met een werkend display.

De volgende stap was om het virtuele schild via de Bluetooth-adapter te laten werken. Het was echt rechttoe rechtaan. Ik volgde de instructies op de github-repository https://github.com/ms-iot/virtual-shields-arduino. De enige wijziging die ik moest aanbrengen waren de TX- en RX-pinnen. Dat zijn pinnen 14 en 13 zoals aangegeven op mijn bord.

Ik merk echter op dat ik in eerdere incarnaties de TX / RX-pinnen moest loskoppelen om nieuwe schetsen te uploaden. Ik ben blij te kunnen melden dat dit niet langer het geval is.

Doorloop de code

Nu alles werkt, zal ik even de tijd nemen om de specifieke code voor dit project door te nemen.

Om toegang te krijgen tot alle functies moet u het volgende opnemen:

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

De eerste 5 omvat moeten vrij verklarend zijn.

De VirtualShield.h bevat de basisfunctionaliteit voor communicatie via de bluetooth-adapter. Dit is vereist, ongeacht welke van de sensoren je wilt gebruiken.

Het Text.h-bestand krijgt uw betere tekst, d.w.z. String-afhandeling.

De Graphics.h, Recognition.h en Colors.h bevatten de functionaliteit die je nodig hebt om toegang te krijgen tot het virtuele scherm en de spraakherkenning in te schakelen. Hoewel ik voor deze uitdaging nog niet klaar ben, zal ik de spraakfuncties in de toekomst coderen.

Volgende in de lijst met belangrijke coderegels, het initialiseren van de DotStar-matrix en het initialiseren van het Shield-object:

Adafruit_DotStarMatrix matrix =Adafruit_DotStarMatrix( 32, 8, DATAPIN, CLOCKPIN, DS_MATRIX_TOP + DS_MATRIX_LEFT + DS_MATRIX_COLUMNS + DS_MATRIX_ZIGZAG, DOTSTAR_GBR); Kleur (0, 255, 0), matrix. Kleur (0, 0, 255), matrix. Kleur (255, 0, 255), matrix. Kleur (255, 0, 106), matrix. Kleur ( 255, 255, 255) };VirtualShield-schild;Grafisch scherm =Grafisch (schild); Herkenningsspraak =Erkenning (schild); 

De eerste regel vertelt de DotStar-bibliotheek de grootte en lay-out van de matrix. Raadpleeg het matrixtest-voorbeeld of het Adafruit_DotStarMatrix.h-bestand voor de verschillende opties.

De kleuren zijn voor de DotStar-bibliotheek.

De laatste 3 regels activeren het schild en initialiseren de objecten om met de sensoren in de telefoon te werken.

Vervolgens moeten we, net als alle Arduino-schetsen, de setup()-methode afhandelen

void setup() { matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(kleuren[0]); DisplayText("Initialiseren...", 4, 10); // virtuele schildgebeurtenissen instellen:shield.setOnRefresh (refresh); spraak.setOnEvent(onSpeech); scherm.setOnEvent(screenEvent); // begin de schildcommunicatie (ook refresh() aangeroepen). schild.begin(); // veronderstelt 115200 Bluetooth-baudrate DisplayText ("Initialiseren... voltooid", 3, 10);} 

De "matrix"-regels spreken voor zich en nu deze regels worden uitgevoerd, heb ik de mogelijkheid om nu enkele informatieve berichten naar de matrix te sturen.

De "shield"-lijnen stellen nu callback-methoden in. Deze methoden worden indien nodig aangeroepen wanneer gebeurtenissen plaatsvinden.

Nu voor de meest gecompliceerde methode van de hele schets

void loop() { // checkSensors() controleert op retourgebeurtenissen en handelt deze af (callbacks aanroepen). Dit is de single loop()-methode van VirtualShield. schild.checkSensors();} 

Ja, je snapt het. We controleren voortdurend of een van de sensoren is geactiveerd en of er iets is gebeurd dat moet worden aangepakt.

Oké, laten we nu echt een paar gebeurtenissen afhandelen. De eerste is de refresh() methode. Het zal worden gebeld wanneer een aantal verschillende evenementen plaatsvinden. De enige gebeurtenis waar we op dit moment om geven, is wanneer de bluetooth is verbonden. We hebben een gebeurtenis nodig zodat we het scherm opnieuw kunnen tekenen zodat het eruit ziet zoals het hoort.

void refresh(ShieldEvent* shieldEvent){ // plaats hier uw refresh-code // deze wordt uitgevoerd wanneer Bluetooth verbinding maakt, wanneer shield.begin() wordt uitgevoerd of de 'refresh'-knop in de app wordt ingedrukt:scherm.clear (ARGB(123,86,204)); scherm.drawAt(0,0, ""); thanksId =screen.addButton(10, 50, ". Bedankt ."); welkomId =screen.addButton(10, 100, ". Welkom."); turnLeftId =screen.addButton(10, 150, ". Links."); stoppenId =screen.addButton(175, 50, ". Stoppen."); startId =screen.addButton(175, 100, ". Starten."); turnRightId =screen.addButton(175, 150, ". Rechts."); backoffId =screen.addButton(10, 225, ". Terug uit."); bellen911Id =screen.addButton(10, 290, ". 911 bellen.");} 

Deze methode maakt het scherm leeg met een lichtpaarse achtergrond en gaat verder met het plaatsen van de verschillende knoppen op het scherm. Let op de spatiëring rond de woorden. Dit is een huidige beperking van de functionaliteit van het virtuele schild, omdat ik de dingen echt wilde centreren om ze er mooi uit te laten zien.

Dus wat gebeurt er als ik een van die knoppen aanraak? Een gebeurtenis wordt geactiveerd en wordt afgehandeld in het volgende stukje code.

void screenEvent(ShieldEvent* shieldEvent) { if(screen.isPressed(thanksId)) { DisplayText("Thank You", 5, 100); } if(screen.isPressed(welcomeId)) { DisplayText("Graag gedaan", 2, 100); } if(screen.isPressed(backoffId)) { DisplayText("Ga terug uit", 4, 100); } if(screen.isPressed(stoppingId)) { DisplayText("...stopping...", 0, 100); } if(screen.isPressed(startingId)) { DisplayText("...start...", 1, 100); } if(screen.isPressed(turnLeftId)) { DisplayText("Links draaien", 3, 100); } if(screen.isPressed(turnRightId)) { DisplayText("Rechts draaien", 3, 100); } if(screen.isPressed(calling911Id)) { DisplayText("Bellen 911", 0, 100); }} 

Er komt een gebeurtenis binnen, de code controleert welke knop wordt ingedrukt en we noemen de DisplayText-methode met de dingen die moeten worden weergegeven.

En tot slot, hoe komt de tekst in de matrix terecht? De DisplayText-methode zal dat voor u afhandelen.

void DisplayText(String message, int colorIndex, int currDelay){ int x =matrix.width(); int maxX =-1 * (bericht.lengte() * 5 + bericht.lengte()); matrix.setTextColor(kleuren[colorIndex]); while( x> maxX) { matrix.fillScreen(0); matrix.setCursor(x, 0); matrix.print(bericht); --x; matrix.show(); vertraging (currDelay); }} 

Deze methode komt erachter hoe breed deze string werkelijk is. We moeten het weten, zodat we ervoor kunnen zorgen dat de tekenreeks volledig in en uit het zicht wordt geschoven. De letters zijn 5 breed + 1 voor de ruimte tussen de letters.

Bouw de behuizing

De opbouw was redelijk rechttoe rechtaan. Ik vond een fatsoenlijk formaat doos die groter was dan de matrixvoetafdruk. Ik heb een stuk Baltische berk van 1/4" dat groter was dan ik nodig had en heb het op maat gesneden.  

Gebruik dezelfde techniek als de tafelzaag. Begin met het leggen van de matrix op het triplex. Nadat deze is geplaatst, markeert u de horizontale en verticale middelpunten van de aansluitingen (inclusief de hulpvoedingsaansluiting). Het enige dat u nu hoeft te doen, is de lijnen met elkaar verbinden om het midden van de gaten te vinden die u gaat boren.

Ja, ik zei 'boren', niet 'boren'. De laatste keer dat ik gaten in plastic aan het "boren" was, had ik een aantal echt onbevredigende resultaten. Deze keer gebruikte ik Forestner-bits . Ik heb hieronder een foto van ze. Merk op dat de rand is om te snijden en het midden heeft een schraper om het ongewenste hout eruit te scheppen. Maakt een veel mooier "gat". Ga nu naar 'saai' en je wilt waarschijnlijk doorgaan en de ophanggaten boren.

Pak een stuk schuurpapier met korrel 120 en schuur het hele stuk lichtjes. Zorg ervoor dat het 'gemak' van de randen van het bord alle gaten bevat die zojuist zijn gemaakt. Zorg ervoor dat je het bord afveegt, zodat er geen zaagsel van andere "dingen" op het bord komt.

Nu is het tijd om aan de plastic doos te werken.

Boor twee gaten aan beide uiteinden van de doos. Deze zijn voor de stroomaansluiting en de aansluiting op de matrix. Boor het gat voor de hulpvoeding van de matrix nog niet.

Breng nu een paar stroken dubbelzijdig plakband aan op de achterkant van de doos en bevestig de doos aan het triplex. Aangezien dit "herpositioneerbare" tape is, wilde ik echt dat dit voor altijd zou blijven plakken. Ik legde er een paar zware boeken op en liet het 24 uur staan. Waarom 24 uur? De tape-instructies zeggen dat niet te doen. Dat was voor mij een goede reden.

Tijd voor dat laatste gaatje. U zou nu een exacte positie moeten hebben voor het hulpstroomaansluitgat. Verveel je maar, geniet van je 'precies' ogende werk.

Zet de smarts in de doos

Het lijkt erop dat het breadboard precies de juiste maat had voor de doos, maar ik wilde de USB-connector van de MKR1000 kunnen aansluiten/loskoppelen. Dus moest ik het breadboard korter maken.

Ok na dat trauma, verwijder de achterkant van het breadboard en plak het vast. Zorg ervoor dat u het gat voor de hulpvoedingsaansluiting vermijdt.

Bevestig de matrix aan de voorkant van het triplex en rijg de verbindingen door de gaten. Zet de matrix vast met wat hete lijm.

Laten we praten over kracht

Ook al heb ik de helderheid ingesteld op 40%, de maximale stroomsterkte als ik alle 256 pixels aansteek, is ongeveer 7,5 ampère. Veel meer dan de MKR1000 zou kunnen bieden. Gelukkig voor mij is geen van de schermen statisch en licht ik niet in de buurt van de volledige matrix. De hulpstroomaansluiting komt te hulp. Ik lever tot 4A. Ik denk dat, aangezien het niet volgehouden en niet statisch is, de voeding goed zou moeten zijn.

Ik had ook een reserve muurwrat waarvan ik het uiteinde eraf gebruikte om de MKR1000 van stroom te voorzien wanneer deze in het voertuig werd ingeschakeld.

Ik zat te denken aan het inbouwen van een stroomomvormer in het project om 12V-autostroom te nemen en de 5V aan het project te leveren. Na veel nadenken was het in alle opzichten beter om een ​​5V 4A AC-adapter te kopen voor $ 5,00 en een AC-converter te gebruiken die ik al heb. Simpel is meestal beter als het op dit soort dingen aankomt.

Het bord ophangen

Ik was van plan om "Ball stretch cords" en enkele zuignappen te gebruiken om dit aan de achterruit te bevestigen. Laten we zeggen dat ik meer werk te doen heb in de omgeving.

Code

De Say Thanks-code
https://github.com/pulcher/mkr1000_challenge

Schema's

De MKR1000 is slechts een micro aangezien de echte MKR1000 nog niet is uitgebracht.

Productieproces

  1. UnifiedWater v1
  2. Mobiele stembus
  3. Arduino101 / tinyTILE BLE:Match-Making Zonnebril
  4. Whac-A-Mole (Button Edition)
  5. Moderne jukebox
  6. Arduino Apple Watch
  7. Zelfgemaakte Arduino, Si4730 All Band-ontvanger (LW, MW, SW, FM)
  8. Internet-verbonden infraroodreplicator
  9. Alles over PCB-afwerkingen, uitgelegd
  10. EDM Spark Erosion:waar gaat het allemaal over?
  11. Flenslagers uitgelegd in al hun varianten