Afgelopen weekend heb ik de tijd genomen om uitgebreid aan de slag te gaan met een product waarvan ik vooraf alleen wist dat het een “Dot Matrix Module” heet. Je ziet hiernaast een afbeelding van de module. Op basis van die naam en de afbeelding ben ik daarom op zoek gegaan. Zo kwam ik er al snel achter dat de module gebruik maakt van een MAX7219 van Maxim. En dan niet één, maar vier die aan elkaar gekoppeld zijn. De module heeft echter maar één aansluiting bestaande uit vijf pinnen waarmee je dus alle vier de modules tegelijkertijd aan kunt sturen.
Je kunt de module in principe rechtstreeks aansluiten op een Arduino of vergelijkbare kloon. Omdat ik ook met een ESP8266 en een WeMos d1 mini (ook op basis van een ESP8266) aan de slag wilde (zie de foto’s hiernaast), was een aparte 5V voeding noodzakelijk. Dat doe ik op basis van een oude USB-kabel waar de stekker aan een kant afgeknipt is met in plaats daarvan aan de zwarte en rode kabel een dupont stekker die ik in een breadboard kan prikken. Wel belangrijk is om dan de ground van die externe voeding ook aan de Arduino of ESP8266 aan te sluiten!
Om meteen even bij het eindresultaat te beginnen, het filmpje hieronder laat een aantal opties zien:
Mocht je vinden dat de matrix niet erg fel is, dat is een combinatie van de hoeveelheid daglicht, de gebruikte camera én het feit dat ik de instellingen meestal redelijk laag heb staan omdat ik anders gek werd van het felle licht. In de demo zit een stukje waarbij verschillende lichtsterktes getoond worden, daar kun je zien dat hij tamelijk fel gezet kan worden.
Je ziet een stand-alone Arduino Uno, dus zonder netwerkverbinding die een van de standaard bij een library bijgeleverde demo van mogelijkheden doorloopt. Daarna zie je de ESP8266 eerst stand-alone, zonder gebruik van het netwerk en daarna de WeMos d1 mét gebruik van het netwerk. In dat geval gebruik de WeMos een wifi-verbinding om via een NTP-server de actuele datum en tijd op te vragen en laat die dan op het scherm zien. Zoals je op het einde kunt zien, kan de WeMos ook gewoon via de pinnen voorzien worden van 5V, dus je zou dit geheel in een behuizing kunnen stoppen en dan heb je met één kabel naar een USB-stekker het geheel aan het draaien (is een project voor een ander weekend).
Toch ging het niet allemaal zo eenvoudig als het hierboven nou lijkt. Wil je het zelf ook gaan doen, lees dan even verder.
Aansluiten van de module
De vijf pinnen van de module hebben de volgende functies:
- VCC = 5V
- GND = ground
- CLK = clock pulse source
- DIN = data in
- CS = chip select
Er wordt een kabel bijgeleverd die aan beide kanten een “female” aansluiting heeft. Prima voor wat betreft de module, daar zitten namelijk vijf pinnen op, gewoon de aansluitingen voorzichtig naast elkaar aansluiten. De andere kant is wat onhandiger. Er wordt een losse hoekverbinding meegeleverd, maar die is aan één kant te kort voor bv gebruik in combinatie met een breadboard.
In mijn geval heb ik het opgelost door een kabel met twee “male” aansluitingen te nemen die ik dan aan de ene kant van de bijgeleverde kabel aansloot. Zo kreeg ik een wat langere “female-male” kabel die geschikt was voor direct gebruik op de Arduino of op een breadboard.
De zoektocht naar de juiste bibliotheek
Het meeste tijd ben ik kwijt geweest met het vinden van de juiste bibliotheek (library) voor de module. Dat is voor Arduino / ESP8266 vergelijkbaar met het vinden van de juiste driver voor een stuk hardware in Windows. Er zijn er namelijk een aantal verschillende. Maar ze zijn zeker niet allemaal even geschikt voor deze module. Veel mensen kopen blijkbaar een losse MAX7219 en koppelen die dan zelf aan elkaar. Daardoor kunnen ze de volgorde van de modules en de richting precies zelf bepalen. Ik kwam erachter dat de volgorde van coderen in deze module niet overeen kwam met de veronderstelde volgorde van een aantal modules die er zijn. Dat had tot gevolg dat ik meestal met wat moeite wel tekst op het scherm kreeg, maar dan liep die de verkeerde richting op (boven naar onderen ipv links naar rechts).
Gelukkig vond ik uiteindelijk de MD_MAX72xx library tegen op Codeplex.com. Je moet die library downloaden en uitpakken in de library map van de Arduino IDE. Na het opnieuw opstarten van de IDE zie je dan ook een aantal voorbeelden in het menu verschijnen. En voor de Arduino Uno en de Arduino Leonardo kloon die ik had bleek die te werken. Tenminste als ik 2 wijzigingen doorvoerde:
- In het bestand MD_MAX72xx_lib.h (in de library src map) moest ik bovenaan toevoegen
#define USE_FC16_HW 1
. Dit zorgde ervoor dat de tekst de juiste richting op ging lopen. - Daarnaast stond in alle voorbeelden standaard
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);
als initialisatiecode met daaronderMD_MAX72XX mx = MD_MAX72XX(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
en alleen die variant werkt!
Om het je iets gemakkelijker te maken heb ik een aangepaste MD_MAX72xx_Test.ino als bestand in Bitbucket gezet, de aanpassing in het library bestand moet je wél nog even zelf maken!
Het uitvogelen van welke connector waar moest was ook niet meteen duidelijk, maar op basis van dit voorbeeldbestand wil je gaan voor:
- 5V => VCC op de Module
- GND => GND van de module
- GPIO D13 => naar CLK
- GPIO D11 => naar DIN
- GPIO D10 => naar CS
En dan zou je dus een mooi overzicht van mogelijkheden van de mogelijkheden van de module moeten krijgen zodra je de sketch uitvoert.
One size does not fit all
Helaas was het aansluiten van de ESP8266 niet slechts een kwestie van het omzetten van kabeltjes. Sowieso was dat omzetten weer even zoeken, maar vervelender was dat de code niet wilde compileren zodra ik de ESP8266 als board selecteerde. Ik heb verhalen gelezen van mensen die schreven dat het in de laatste versie van de library opgelost zou zijn, het is mij niet gelukt.
Er zat niets anders op dan het vinden van nóg een library die de module ondersteunde én ook de ESP8266 aankon. Die bleek gelukkig te bestaan. Je kunt/moet de Max72xxPanel.h library hier downloaden. Let op, die library gaat uit van de Adafruit-GFX library die je ook moet downloaden.
Was bij de Arduino library het “rechtzetten” van de 4 modules een kwestie van 1 regel in een library-bestand, hier was het wat omslachtiger. In elk script heb ik de volgende code nodig om het geheel goed te laten werken:
// Adjust to your own needs
matrix.setPosition(0, 3, 0); // The first display is at <0, 0>
matrix.setPosition(1, 2, 0); // The second display is at <1, 0>
matrix.setPosition(2, 1, 0); // The third display is at <2, 0>
matrix.setPosition(3, 0, 0); // And the last display is at <3, 0>
// ...
matrix.setRotation(0, 3); // The first display is position upside down
matrix.setRotation(1, 3); // The same hold for the last display
matrix.setRotation(2, 3); // The same hold for the last display
matrix.setRotation(3, 3); // The same hold for the last display
Ook nu heb ik een voorbeeldbestand klaar gezet aan de hand waarvan je zelf kunt experimenteren (en waarmee ik het later zelf ook weer terug kan vinden). Een stand-alone optie staat hier.
Natuurlijk wilde ik niet zomaar met die ESP8266 aan de slag. Hét sterke punt van die bordjes is, naast de lage prijs, ook de bijgeleverde Wifi-chip. Als je dat als uitbreiding voor een standaard Arduino wilt aanschaffen, dan ben je veel meer geld kwijt.
Dus heb ik ook een demo gemaakt waarbij dat aspect van de ESP8266 gebruikt werd: een Wifi-klok die gebruik maakt van NTP. Daarbij maakt de ESP8266 eerst verbinding met het Wifi-netwerk (je moet netwerknaam en wachtwoord even zelf in de code aanpassen) en stuurt daarna een verzoek naar een online NTP-server. De ESP8266 krijgt dan een datum en tijd terug. Die geeft hij weer op de dot matrix module. Van tijd tot tijd checkt de code zelf of de klok nog goed loopt en past hem zo nodig aan.
Het mooie van de WeMos d1 mini is dat het écht mini is. Het kost dus geen enkele moeite om die achter de matrix module weg te werken in een behuizing.
De code die ik gebruikt heb kun je hier downloaden.
Uiteraard waren ook de aansluitingen van de kabels niet zomaar een-op-een hetzelfde, hieronder zie je de aansluitingen voor de ESP8266 en voor de WeMos
Op de foto’s gebruik ik de micro-usb aansluiting voor de voeding van de ESP, in het filmpje zie je al een voorbeeld van waarbij ik dezelfde externe 5V aansluiting die ik voor de matrix module gebruik, ook voor de ESP gebruik. De aansluitingen waren even zoeken, maar moeten als volgt:
Voor de ESP:
- externe 5V => VCC op de Matrix Module
- externe GND => GND van de Matrix Module
- externe GND => GND van de ESP (de gele kabel in de afbeelding)
- (externe 5V => 5V van de ESP – optioneel)
- D5 => naar CLK
- D7 => naar DIN
- D8 => naar CS
In de sketch staat namelijk:
int pinCS = 15; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
Als ik de pin-layout van de ESP erbij pak:
Dan kan ik opzoeken dat GPIO 15 op D8 zit. In de code staat dat DIN aangesloten moet worden op MOSI en die (HMOSI – in het groen) zit op D8. De clock pulse source (CLK) van de matrix module moet worden aangesloten op SCK of HSCLK in ons geval. En dat is D5.
Voor de WeMos ziet het er eigenlijk hetzelfde uit:
- externe 5V => VCC op de Matrix Module
- externe GND => GND van de Matrix Module
- externe GND => GND van de WeMos (de gele kabel in de afbeelding)
- (externe 5V => 5V van de WeMos – optioneel)
- D5 => naar CLK
- D7 => naar DIN
- D8 => naar CS
Het enige verschil is dat de connectoren aan de andere kant zitten in vergelijking met de ESP. Ook hier kan het bij de hand hebben van een schema helpen:
Zoals gezegd, bij beide bordjes kun je de 5V input (ze hebben geen 5V output zoals de Arduino) gebruiken om ook het bordje zelf van stroom te voorzien. Je hebt dan de USB-kabel naar de computer niet meer nodig en kunt met 1 stroombron (in mijn geval een omgebouwde USB-kabel aan een 5V adapter die in het stopcontact zit) voldoende om zowel de ESP8266 als de Dot Matrix Module van stroom te voorzien.
Conclusie
Teruglezend lijkt het eigenlijk allemaal niet eens zo ingewikkeld. Als dat zo is, dan heb ik het in dit bericht duidelijk genoeg opgeschreven.
De producten die ik de komende weekenden ga testen komen met in de verpakking met ongeveer evenveel documentatie, dus ook dan zal mijn uitdaging weer worden om te kijken wat ik er in dat weekend mee gerealiseerd krijg. Dat hangt ook nu weer af van het gemak waarmee ik online informatie kan vinden.
En natuurlijk is ook met de Matrix Module nog veel meer te doen. Zo loopt de klok in mijn klok in de demo steeds rondjes. Het zou handig zijn als hij bv even stopt na de datum en na de tijd. Of naar wens helemaal stil staat en afwisselend datum/tijd toont. Hij heeft nog geen ondersteuning voor zomer- en wintertijd, kan automatisch of handmatig via een in te bouwen webinterface. De felheid van de klok kan gekoppeld worden aan een LDR-weerstand die aan de ESP8266 gekoppeld kan worden zodat hij overdag feller is dan ’s nachts…kortom, teveel om op te noemen.
Disclosure
Dit bericht is onderdeel van een serie berichten die ik maak op basis van componenten / producten die gratis aan mij beschikbaar gesteld worden door de prototype-shop.nl.
Ik heb zelf de keuze gehad welke producten ik test. Voor mij staat hierbij hetzelfde uitgangspunt centraal als wanneer ik ze wél zelf koop: ik moet het interessant vinden om ermee aan de slag te gaan, het moet niet iets zijn dat al door iedereen anders ook al getest is, ik moet er wel nog iets aan toe kunnen voegen.
Behalve de afspraak dat ik bij deze berichten een link opneem naar de prototype-shop.nl, zijn er geen andere afspraken gemaakt, de inhoud van deze berichten komt volledig voor mijn rekening.
Het volgende bericht in deze serie kun je volgende week maandag verwachten.