30 juli 2015

Arduino project 7: wachten en problemen met ledstrips

In de voortgang van het Arduino project zit een beetje de klad, de laatste week. Dit heeft een aantal oorzaken: de gestage stroom van Ebay-pakjes uit China stopte plotseling op raadselachtige wijze. Mogelijk kwam dit door de acties van de pakketbezorgers van PostNL, of door acties elders in de wereld. Sinds begin deze week is de stroom weer op gang gekomen, dus kan ik weer aan het werk.

De tweede kink in de kabel waren de vreemde problemen die ik had met de ledstrips. Ik gebruik hiervoor de library van Fastled (versie 3.0.3). Het vreemde aan het probleem was dat wanneer ik meer dan vier ledstrips tegelijkertijd aanstuurde, deze niet meer uit wilden gaan, maar allemaal groen bleven branden. Nadat ik dagenlang heb zitten klooien aan de Arduino code en de draadjes van de aansturing, had ik het probleem nog steeds niet gevonden. Ik stond op het punt om de spreekwoordelijke pijp aan de even spreekwoordelijke Maarten te geven, toen ik dacht aan het forum van Fastled. Nadat ik mijn probleem daar gedumpt had, kreeg ik binnen vijf minuten antwoord van de beheerder. De oplossing zou zijn om een nieuwere versie van de library te downloaden, die zich nog ergens in bèta versie op de website moest bevinden. En voilà ! Het probleem was verholpen !

De derde kink werd wederom veroorzaakt door de ledstrips, en was eigenlijk mijn eigen stomme fout. De kleur van de leds veranderde wanneer er meer stroken brandden. Wit lukte niet meer; dit werd geel/oranje. En oranje werd rood. Hier ook weer een tijd naar de oorzaak lopen zoeken. De oorzaak lag in de voeding van de leds. Ik had een 10A step down voeding van 12 naar 5V aangesloten. Nu geven mijn accu's normaal gesproken ongeveer 11.7V, maar als deze wat leger raken, dan zakt dit naar ca 10.5 V. De step down voeding kon daar niet goed mee overweg, waardoor de leds minder spanning kregen. Een WS2812 ledje in een ledstrip bestaat uit drie hele kleine leds met de kleuren blauw, groen en rood. Blauwe en groene leds geven er bij lagere spanning eerder de brui aan dan rode leds, vandaar de kleurverschuiving naar rood die ik waarnam. Dit had ik natuurlijk veel eerder kunnen bedenken, soms is de oorzaak van een probleem zo simpel dat je er gewoon overheen kijkt.

Deze voeding is dus (voor mij) waardeloos. Ik heb andere voedingen voor de ledstrips nodig. Tien Ampère step down voedingen zijn nogal groot en lomp, dus heb ik op Ebay een aantal kleinere converters besteld, die ik wat makkelijker kwijt kan. Dus dat wordt weer even wachten op Tante Pos. Wordt vervolgt.

In: 4.5-23V, uit: 1-17V. 1.8A

In: 4-30V, uit: 1.3-36V. 5A

In: 4.5-28V, uit: 1.3-17V. 2A





18 juli 2015

Arduino project 6: Temperatuur en Amperes

Om wat meer inzicht te krijgen in de hoeveelheid stroom die ik verstook als ik alle toeters en bellen op de fiets aan heb staan, ga ik een stroommeter inbouwen. Hiervoor zijn voor de Arduino een aantal kleine modules te koop. Voor de Arduino kwam ik uit op de ACS712. Deze zijn te koop in verschillende smaken; van 5A, 20A en 30A. Ik ga er even vanuit dat 20A voor mij genoeg moet zijn. En op Ebay kost deze $1.82, dus daar ga ik mij geen buil aan vallen. Een ACS712 werkt volgens het principe dat er een millivolt signaal wordt uitgestuurd bij oplopende stroomsterkte. Op de datasheet van de chip lees ik dat bij het 20A exemplaar dat ik gekocht heb, 100mV per ampère wordt gegeven. Door die millivolts nu aan een analoge poort van de Arduino aan te sluiten kan ik eenvoudig berekenen hoeveel ampère ik verbruik.

De ampère module moet als volgt op de Arduino aangesloten worden:


De module heeft aan 5V genoeg. Aan de linkerkant komen de draadjes voor de ampère meting binnen (één in, één uit). De blauwe draad is het mV/data signaal. In de Arduino moet ik hiermee aan de gang, zodat ik de verbruikte ampères mooi op het LCD scherm kan laten zien. Na wat programmeer werk ziet dat er dan als volgt uit:


De spanning wordt berekend door de spanningsdeler die ik eerder gebouwd heb. Dit ziet er allemaal nog een beetje spartaans uit, maar het gaat mij nu even om het idee. Nu verder met het volgende hoofdstuk, de temperatuurmeter.


De temperatuurmeter die ik inbouw is van het type db18b20. Dit is eigenlijk geen 'klassieke' elektronische temperatuur meter maar een kleine IC. De IC communiceert met één pin met de Arduino. Ik had er nog een paar van overgehouden van mijn aquarium project. Er zitten drie pinnetjes aan: twee voor de 5 volt voeding, en een voor de data communicatie. Dit datapinnetje heeft een eigen uniek adres, waardoor het mogelijk is op (in principe) tientallen temperatuurmeters via een draadje met de Arduino te laten communiceren. Dit is natuurlijk leuk, maar in een velomobiel niet zo nuttig. Aan de buitentemperatuur heb ik genoeg. Ik zou natuurlijk twee van die dingen aan de trommelremmen kunnen hangen om te kijken hoe warm die dingen worden. Maar dat is alleen interessant als je in de bergen woont, lijkt mij. Dus houd ik het maar op een voelertje. Deze wordt als volgt aangesloten:


Verder moet ik achterhalen wat het 'adres' van de db18b20 is, anders kan ik niet met 'm babbelen. Hiervoor had ik op internet een programmatje opgeduikeld. Nu is het een kwestie van adres in m'n C++ code zetten, de temperatuur uitlezen en een fijn plekje op m'n display geven.

Het enige nadeel aan een db18b20 temperatuur voeler is de uitlees snelheid. Dit duurt ongeveer een halve seconde. Nu lijkt dit niets, maar het programma wordt er een stuk trager door. En daar komt ook nog bij dat de richting aanwijzers erg onregelmatig beginnen te knipperen. Daarom heb ik de zooi zó geprogrammeerd dat de temperatuur één keer in de tien seconden wordt uitgelezen, en verder wordt er niet uitgelezen als de richting aanwijzer aanstaat.


Hier nog even een plaatje. Inderdaad, het was warm die dag :-)

13 juli 2015

Arduino project 5. Snelheids meting en cadans meting

Omdat het eigenlijk vrij simpel is om gelijk met de ledstrips ook andere dingen door de Arduino uit te laten voeren, heb ik besloten ook maar een snelheids meter en cadansmeter in mijn project in te bouwen. Nu had ik de keuze uit twee typen sensoren: een reed contact of een Hall sensor. Reed contacten zijn hele kleine glazen buisjes met daarin twee metalen staafjes. Wanneer deze staafjes door een magneetveld gaan zullen de staafjes contact met elkaar maken. Reed contacten kunnen echter makkelijk beschadigen. De tweede keus is een Hall sensor. Hierin zit een stukje elektronica ook weer reageert op een magneetveld. Er zijn nogal wat verschillende soorten Hall sensoren te vinden, en het is dus even oppassen met bestellen. Uiteindelijk kom ik via-via uit op een Hall sensor van het type A3144. Op Ebay kosten ze $1.19 per 10 stuks. Na enkele weken wachten komt het kleine zakje met nog kleinere sensoren binnen en kan ik aan de slag.




Een A3144 hall sensor heeft een voeding nodig van 5 Volt, en er moet een weerstandje op aangesloten worden zoals hierboven.


Bovenstaand het schema zoals ik de sensoren op mijn Arduino heb aangesloten.


Plaatje van een Hall sensor, met alle drie de pootjes netjes gesoldeerd en gekrompen. Dit is een priegel werkje, omdat zo'n sensor erg klein is. Net zoals de rotary encoder maken Hall sensoren weer gebruik van interrupts. Dit houdt in dat dat programma dat draait op de Arduino onderbroken wordt als er een interrupt signaal binnenkomt (in dit geval dus van een Hall sensor). Aan de hand van het tijdsverschil tussen de interrupts en de straal van het wiel kan dan de snelheid berekend worden.

Dit houdt dus ook weer in dat ik twee poortjes op de Arduino moet toewijzen die deze functie hebben (niet alle poorten kan je gebruiken voor interrupts).  Nu heeft een Arduino Mega 2560 er zes, dus ik kan nog even vooruit. Op het LCD scherm maak ik een aparte pagina waarin ik de straal van het wiel kan instellen, met behulp van de rotary encoder.

Terwijl ik aan het programmeren ben, bedenk ik mij dat het erg lastig is om de straal van een Quest-wiel goed te meten zonder het wiel los te moeten halen. Makkelijker is het om de omtrek te meten: een plakbandje op het wiel, een plakbandje op de grond, fiets vooruit- cq achteruit rollen en meten. Na wat kleine aanpassingen aan het programma weet ik het zo te regelen dat ik tegelijkertijd zowel de straal als de omtrek van het wiel kan veranderen.

Hieronder een filmpje met het instel scherm en de beide sensoren in aktie (buiten beeld weliswaar, maar dat mag de pret niet drukken):






07 juli 2015

Arduino Project 4. De accumeter

Mijn fiets heb ik tien jaar geleden uitgerust met twee LiPo accu's, destijds gekocht bij Batteryspace in Amerika. Ze hebben een capaciteit van 5500 mAh en 6850mAh. Ze zijn alletwee standaard voorzien met elektronica om overbelading te voorkomen, en schakelen netjes uit wanneer de spanning onder een bepaalde waarde komt. Deze accu's voldoen na tien jaar eigenlijk uitstekend en ik heb dan ook geen reden om ze te vervangen. Dus het nog prima vonkende duo krijgt gewoon een plaatje in m'n nieuwe project.

Wanneer een LiPo accu vol geladen is, heeft deze een spanning van 12.5 V, de accu schakelt zichzelf uit bij 10.6 V. De bedoeling is dat ik de lading van de accu middels een status bar op het LCD scherm laat zien.

schema spanningsdeler
Een Arduino is standaard voorzien van een aantal analoge poorten, die ik kan gebruiken om de spanning op een accu te meten. Het maximale voltage dat een Arduino op zo'n poort kan hebben is echter 5 V,  dus zal ik iets moeten doen om de spanning op een accu om te zetten naar een waarde waar de Arduino wat aan heeft. Zoiets kan met een spanningsdeler. Zo'n spanningsdeler bestaat uit twee weerstanden die, wanneer juist gekozen, de spanning verlagen van zeg maar 12 V (V-in) naar pak 'em beet 5 V (V-out). De Arduino kan aan de hand van de waarde van de gebruikte weerstanden uitrekenen wat dan de werkelijke spanning op de accu's is. Dit gebeurt dan volgens onderstaande formule. Nu zijn er op internet een aantal sites die je eenvoudig de waarden van de beide weerstanden (R1 en R2) laat berekenen. Hier is de link waarmee ik het gedaan heb.



Aan de hand van bovenstaande formule kwam ik uit op een waarde voor R1 van 100 kΩ , en R2 wordt 47 kΩ. Het schema voor het aansluiten van de accu's op de Arduino ziet er nu als volgt uit.



Nu moet ik de Arduino zo programmeren dat met bovenstaande formule het juiste voltage berekend wordt. Daarna moet het beladings-percentage berekend worden, en moet er een grafiek van beide accu's op het LCD scherm komen. Na wat puzzelwerk met de library van de aansturing van het scherm (U8glib) kom ik tot iets dat wel presentabel is...


Het 128x64 scherm


De twee balken representeren de twee accu's, en de pijl daartussen geeft aan welke van de twee accu's in gebruik is. Dit kan ik door middel van een schakelaartje omzetten. Ik zit er stiekem nog aan te denken om de Arduino zelf te laten omschakelen naar een andere accu wanneer de spanning naar een te laag niveau daalt. Maar misschien komt dit later nog. Voorlopig doe ik het even zo. Eerst maar even door naar het volgende hoofdstuk van het project: de hall sensoren voor de snelheidsmeter en de cadansmeting.

Nog even wat toelichting op het scherm hierboven: rechtsboven dus de snelheid, daaronder de cadansmeting en de temperatuur (jawel, het was warm). Die lege vakjes daaronder worden straks gevuld door de icoontjes voor de richting aanwijzer, de zijlichten en de hoofdverlichting,

05 juli 2015

Arduino Project 3. De ledstrips op de Quest

De ledstrips waarmee ik de zijkant van mijn Velomobiel wil gaan versieren moeten van kleur kunnen wisselen. Deze zijn rood aan de achterkant en wit aan de voorkant. Verder moeten ze oranje kunnen knipperen als ik ze als richting aanwijzer gebruik. Na een niet zo lange zoektocht op internet bleek dat de leds die luisteren naar het typenummer WS2812B hiervoor het best geschikt zijn. Deze zijn van het laatste type, en ik ga van de redelijk simpele theorie uit dat nieuw beter is. Vandaar dus.

RGB ledstrips zijn te verkrijgen in drie verschillende uitvoeringen: 30, 60 of 144 leds per meter. Voor de veiligheid koop ik de uitvoering van 144 leds per meter, dan heb ik altijd voldoende licht. Op Ebay vind ik een aanbieder die strookjes van 5 cm levert. Dit is handig voor de eerste testopstelling, en ik koop er vier strookjes van.


Voor de besturing van de strips maak ik gebruik van de library van FastLed. Ik was eerst begonnen met de library van Adafruit, maar deze was nodeloos ingewikkeld en de documentatie was bij lange na niet zo uitgebreid als die van FastLed. De library van FastLed heeft een nadeel; niet alle poorten op een Arduino Mega zijn te gebruiken.

Voor het aansluiten van van een ledstrip zijn drie pinnetjes nodig, twee voor de 5V voeding en één voor de dataverbinding met de Arduino. Op internet lees ik tegenstrijdige berichten over het gebruik van weerstanden en condensatoren, maar al vrij snel merk ik dat deze nodig zijn, omdat ik de eerste chip op de ledstrip opblaas door deze componenten achterwege te laten. Dus, even voor de goede orde: de 1000µF condensator en de 470Ω weerstand is toch echt nodig. Deze moeten dan als volgt worden aangesloten, waarbij de condensator (hier niet bijgetekend) over de +5V en de gnd- polen geplaatst moet worden.


Ik word hierbij goed op weg geholpen door een mooie Netherlands-talige website, te vinden in bijgaande link. De zijlichten worden, rekening houdend met de voor de Mega beschikbare pinnetjes, in mijn project als volgt aangesloten:


Dit ziet er dan in de werkelijkheid als volgt uit:


En dan nu aangesloten op de Arduino, met de rotary encoder en de achterkant van het lcd scherm op de achtergrond.


Nu volgt nog het programmeerwerk voor de knipper- en zijlicht functie van de ledstroken, maar daar is het (eigenlijk) nog te warm voor.... ;-)

01 juli 2015

Arduino Project 2. De Rotary Encoder

Om zo meteen de snelheid te kunnen meten, moet de straal van het voorwiel bekend zijn. Nu kan ik dit  handmatig in de Arduino code invoeren wanneer ik van banden maat wissel, maar het is natuurlijk makkelijker om dit via het paneeltje te doen. En daarvoor heb ik een zogenaamde Rotary Encoder besteld.


Rotrary encoder - $ 1.29

Wanneer er aan een Rotary Encoder gedraaid wordt, worden er pulsjes afgegeven waarmee vervolgens weer 'iets' gedaan kan worden. Je voelt klikjes als je aan zo'n encoder draait. Verder kan bovenstaande encoder ook nog een signaal geven als er op gedrukt wordt. Ik heb mijn encoder als volgt aan de Arduino aangesloten:


De Rotary Encoder op de Arduino Mega

Normaal gesproken wordt een Arduino code stap voor stap uitgevoerd. Nu gaan die stappen vrij snel, maar als het programma een hoop te doen heeft, is dat toch merkbaar. Zo duurt het uitlezen van een DS18B20 temperatuur sensor al gauw een seconde. En als je toevallig dan net aan de draaiknop van de encoder zit te friemelen merkt de software daar niets van.

Nu is een Arduino standaard uitgerust met een paar speciale interrupt poorten. Wanneer deze poorten geactiveerd zijn worden deze gemonitored, en als er iets verandert aan de status van de poort, kan  het programma onderbroken worden om een bepaalde actie uit te voeren, en dat is in mijn geval het veranderen van de wiel straal.

Een Arduino Mega heeft 6 interrupts, genummerd van 0 tot 5. Ik sluit mijn encoder aan op interrupt 0 en 1 (respectievelijk pin 2 en 3). Poort 4 wordt gebruikt voor het indrukken van de encoder knop. 

Nu moet de hele zooi ook nog geprogrammeerd worden. In bijgaande link vond ik de juiste instructies, die ik na wat aanpassingen geschikt maakte voor mijn programma. Nu moet ik dit nog op een zinnige manier op het scherm tonen, maar dat komt later.

Een andere uitdaging die ik had was het opslaan van de wijzigingen. Als een Arduino wordt uit gezet, verliest deze al zijn variabelen. Nu is er gelukkig een kleine geheugen ruimte gereserveerd om wat variabelen op te kunnen opslaan. Via weer een andere link vond ik ook een instructie voor deze uitdaging. De data wordt opgeslagen in het EEPROM geheugen zodra er wat verandert wordt, en wordt weer uitgelezen als ik de Arduino opstart. Op deze manier kan ik de veranderde wielmaten  opslaan als ik die verandert heb.