project

Eerder schreef ik hier over jongleerkubussen. Maar kubussen zijn helemaal niet handig om mee te jongleren. Niet dat jongleurs zich daar wat van aantrekken: die jongleren ook met bijvoorbeeld fakkels, wijnglazen en/of kettingzagen, en niet omdat die nu zo ergonomisch gevormd zijn. Maar ik wilde toch iets dat wat minder vierkant was, om mee te jongleren.

Dat is gelukt, dus ik het kader van “result first”, hieronder een filmpje:

Na vangen veranderd de kleur. Dit kan in meerdere modi: in de slow-motion is het alleen rood, groen en blauw. In de “normale snelheid” doorloopt elke bal een vaste set mengkleuren.

Ik heb (beter) leren jongleren mede dankzij deze video van Matt Gray en Tom Scott, en door de supergoede en humoristische tutorials van Taylor Glenn. Zo goed als Taylor Glenn zal ik nooit worden, maar het is gewoon leuk om af en toe wat nieuws bij te leren.

In het filmpje lijkt “blauw” erg paars. Mijn camera verslikt zich in deze kleur blauwe LED. Hieronder een foto van een rode, groene en blauwe jongleerbal waarbij de kleuren zijn bewerkt om beter overeen te komen met de realiteit:

3 jongleerballen die licht geven, 1 rood, 1 groen, 1 blauw.

En dan nu de technische achtergrondinformatie:

De elektronica voor de jongleerballen is kleiner dan die voor de jongleerkubussen. Voor de jongleerkubussen had ik in software een step-up leddriver gemaakt. Dat is mooi en aardig, maar niet per se noodzakelijk om mee te gooien. Het kan compacter en simpeler.

De jongleerballen gebruiken dus simpelweg een step-up naar 5V, en serieweerstandjes voor de LED’s. Dat is compacter en simpeler. (Alle foto’s kunnen worden aangeklikt voor een groter formaat).

De kubussen konden worden opgeladen via de schroefjes. De jongleerballen hebben een USB-aansluiting om te laden.

De jongleerkubussen zijn geprint uit PETG. Dat is nogal hard en stug. Stevig, maar niet super comfortabel om te vangen, zeker niet als je misgrijpt en de kubus op het peesje tussen duim en wijsvinger land. De jongleerballen zijn geprint uit TPU. Er zit een PETG tussenring met schroefdraad in om beide helften te verbinden, en een klein PLA vulstukje dat eveneens uit PETG zou kunnen. Het ontwerp staat hier op thingiverse.

Ze zijn verassend goed valbestendig, al treed af en toe een reversibele spontane demontage op. (De helften springen los, maar de schroefdraad blijft heel, dus het is een kwestie van weer opnieuw vastdraaien). De printjes zitten aan de zijkant vastgeklemd in de flexibele jongleerbal, de batterij zit met een klein stukje foam tape vast in een eigen compartimentje.

Het schema van de elektronica vind je hier.

De printjes zijn gesoldeerd met behulp van hete lucht en bismuth-soldeerpasta, zonder gebruik te maken van een stencil. De pasta bevat een no-clean flux, hoeft niet in de koelkast bewaard te worden, en smelt bij 165 graden Celsius. Die laatste eigenschap maakt het ideaal om met hete lucht te verwerken (zonder b.v. de kunststof delen van connectoren onbedoeld te laten smelten).

Het eerste printontwerp bevatte een foutje omdat een footprint van een fabrikant niet klopte. Dit is inmiddels aangepast, zowel door de fabrikant als door een patch op de printjes. Hieronder een macrofoto van de patch op de print: 1 pootje van de spanningsregelaar is van de print gelift en met een draadje vastgezet waar het hoort. Ongeveer net zo ‘makkelijk’ als Mills Mess >:)

De software voor de jongleerballen is gebaseerd op die van de jongleerkubussen, en staat op github. Er zijn uiteraard nog vele uitbreidingen en verbeteringen mogelijk ;).

Op moment van schrijven kan de software het volgende:

Vangen wordt gedetecteerd door het einde van een vrije val te detecteren: De accelerometer doet intern “vrije val detectie”, wat dit makkelijk maakt.

Er zijn meerdere modi: Vast rood, groen of blauw of na een vangst van kleur veranderen tussen rood, groen en blauw, of mengkleuren. Er is een puzzelmodus waarbij de bal in de juiste hoek(en) gekanteld moet worden, dan een aantal maal opgegooid, om de puzzel op te lossen. Als dit lukt knippert de bal in diverse kleuren. Er kan van modus gewisseld worden door 3x op de bal te tikken.

Als de bal een tijdje stil ligt, zal deze in een energiezuinige slaapmodus vallen na langs alle kleuren te faden. Wakker maken kan met een “zwiep” beweging.

Mijn camera maakt nog steeds paars/roze van precies specifiek het blauw uit de LED’s die ik in deze jongleerballen heb toegepast. Op de foto hieronder is de jongleerbal eigenlijk net zo blauw als de andere blauwe LED’s, maar de camera ziet er roze / paars in.

RGB leds fotograferen blijft lastig. Tenzij ze uit staan.

Heb je na het lezen van deze blogpost een vraag over de jongleerballen? Laat een comment achter! (Of eventueel: stuur me een mailtje).

Lichtwekker is een lineaire klok, op basis van een WS2811 ledstrip en een koudwit / warmwit witte ledstrip die rug aan rug in een plexiglas buis zitten.

Op wektijd worden de kleurenled’s gebruikt om een simpel zonsopkomst-effect na te doen (1 voor 1 gaan de rode LED’ s van onder af naar boven toe aan, daarna wordt er groen bijgemengd zodat een soort geel ontstaat, ook weer 1 voor 1 van onderaf), waarna de warmwitte kant van de witte ledstrip wordt aangezet.

De tijd wordt weergegeven op de 60 LED’ s van de WS2811 ledstrip, er gaan toevalligerwijs ook 60 minuten in een uur en 60 seconden in een minuut, dus dat komt heel mooi uit: van onderaf schuift een rode led steeds 1 plekje op om de minuten en seconden weer te geven. Met blauwe LED’ s is een 5 / 15 minuten schaal aangebracht. De 24 uur in een dag worden van bovenaf weergegeven met groene LED’s.

11:14:03

Dit zorgt er voor dat de klok ook in het donker en zonder bril goed af te lezen is:

11:14:05

De LEDstrips zijn rug-aan-rug tegen elkaar geplakt (met papier ter isolatie ertussen), en ingebouwd in een plexiglas buis. De buis staat op een voetje waarin de electronica is weggewerkt en waarop 2 schakelaar zitten voor de bediening. Bovenaan de plexiglas buis zit een 3e schakelaar.

Naast het weergeven van de tijd en de functie als wekker, kan deze klok gebruikt worden als warmwitte / koudwitte lamp, de fastled showreel en fire2012 animaties tonen, en kun je er 1D pong op spelen.

De tijd wordt opgeslagen/bijgehouden in een DS3231 Real Time Clock IC, vandaar dat ik daar eerder mee zat te spelen. De chipjes op de goedkope modules wijken soms erg af, zo bleek, daarom heb ik een losse DS3231MZ+ gekocht.

Ik heb dit projectje in elkaar gezet op gaatjesprint. Er is geen schema, maar de software staat op github. De pin-out valt daar wel uit te destilleren, de hardware bestaat verder uit een 12V voeding voor de 12V warmwit / koudwit ledstrip, enkele fetjes om deze ledstrip te schakelen, een stepdown naar 5V voor de WS2811 ledstrip, de RTC, en de arduino die alles aandrijft.

Meer foto’ s van de constructie staan in een van de show-your-projects topics op circuitsonline.net.

Als je het nabouwt, of b.v. een variant maakt met een RGBW ledstrip, vind ik het leuk dat te horen 🙂 (Let er dan gelijk op dat de print niet aan de USB connector hangt)

MainsSensor is een klein printje dat gebruikt kan worden om te monitoren of iets nog “aan staat” , bedoeld om in de MakerSpace bij de deur een reminder te geven als je als laatste weg gaat en b.v. de compressor staat nog aan. (Of een van de andere apparaten die uit moeten, b.v. ook de ruime kilowatt aan verlichting).

Voor wie niet de hele zooi wil lezen, staat onderaan een demonstratiefilmpje.

Het printje bevat een attiny10 en een 433 MHz zendertje. (Vanwege die Attiny10 was ik vorige post dus met een usbasp bezig, de AVR dragon kan geen TPI).

Als het printje voeding krijgt, stuurt het via 433 MHz een bericht met een uniek ID en de status “aan”. Dit bericht wordt af en toe (elke 30 seconden) herhaalt: “ik ben er nog”. (Het HI-bericht).

Als de voeding wegvalt, wordt hetzelfde ID verzonden, met de status “uit”. (Het BYE-bericht). Dit BYE-bericht wordt direct enkele malen herhaald, tot de bufferelco leeg is.

Wat ik leuke aspecten van het mainssensorproject vond:

  • MainsSensor wordt rechtreeks uit het lichtnet gevoed*, via een seriecondensator. Voeding uit 12VDC is ook mogelijk.
  • MainsSensor moet een bericht versturen als de voeding nèt is weggevallen.
  • Het moet compact (Om er nog bij te passen in de bestaande behuizing van eender welk apparaat), dus:
    • de antenne voor de 433 MHz zender zit op de print ge-etst.
    • Spelen met een attiny10 in SOT23-5 (microcontroller, indeed! Dat ding is klein.)

Het schema en de software staan op github.

C1 is de seriecondensator, 47nF / 630VDC X7R in 1210 behuizing. Deze begrenst de stroom op ongeveer 3,2 mA. (Dergelijke ceramische SMD condensators in andere waarden worden ook toegepast als seriecondensator in ledlampen, lekker compact.) (In deze discussie op circuitsonline.net wordt over een dergelijke schakeling gefilosofeerd). R8 van 1k beperkt de inschakelstroom (en eventuele kortsluitstroom mocht C1 falen), en omdat dit een flameproof / fusible weerstand is fungeert deze ook als zekering.

Met die 3 mA wordt de bufferelco C2 geladen, waaruit de 433 MHz module wordt gevoed. Met een 12V zenerdiode D3  wordt de spanning begrenst op 12V. (De stroom verdeeld zich in de laadstroom voor de bufferelco, het gebruik van de schakeling, en de zenerdiode. Als de schakeling de 3 mA niet opmaakt, zal de bufferelco opladen tot de 12V bereikt is, daarboven gaat de zenerdiode geleiden). Via R6 en 5V zener D4 wordt 5V gemaakt voor de microcontroller.

Vòòr C2 zit D2, zodat vòòr D2 gemeten kan worden of de voeding wegvalt, zonder dat de bufferelco eerst leeg moet zijn om hier geen spanning meer te meten. Die buffer is immers nog nodig om de schakeling te voeden om een “uit”  bericht te sturen. C4 vlakt de te meten spanning af, R7 is hiervoor de belasting zodat C4 ontladen wordt als de voeding wegvalt. R3/R4 zijn een spanningsdeler.

C3 is 10 uF ceramisch, dicht bij de microcontroller als ontkoppeling, en tevens als buffer na R6. (Anders zou er een elcotje na R6 over D4 gestaan hebben, en 100nF ceramisch naast de micro – 10u ceramisch is compacter).

Voor het berekenen van de bufferelco is een schatting gemaakt: er is van uitgegaan dat het versturen van een bericht 1/40 s  duurt en 30 mA gebruikt. De bufferelco mag daarbij maximaal iets van 3 V dalen en moet dus minimaal I*dt/dV = 334  uF zijn. Om meerdere berichten te kunnen versturen en de tolerantie van een elco op te vangen is er 1000 uF geplaatst. In de praktijk voldoet dit uitstekend, ook al wijkt de daadwerkelijke tijdsduur en het stroomgebruik af van de inschatting, het goodbye-bericht kan ruim 2 seconden lang herhaalt verstuurd worden. (In het stadium van het project dat ik deze schatting maakte, noemde ik het nog MainsSpy en dacht ik nog Hamming(7,4) encoding toe te passen. Zie whiteboardfoto. Maar omdat het doel juist geen big-brother-robotnanny-spionage is maar een hulpje om dingen uit te zetten, heb ik het hernoemd naar MainsSensor. En forward error correction is hier niet nodig, dus geen Hamming(7,4). )

whiteboard-geklad uit een vroeg projectstadium, o.a. buffer elco inschatting
Buffer inschatting en andere projectnotities, uit een vroeg stadium van het project.

Dan de PCB antenne. Hiervoor heb ik me gebaseerd op een appnote van Murata (AN0036). Ik heb 2 PCB ontwerpen gemaakt, bij de eerste poging (rode printjes, V1.0) was de antenne veel te lang. Dat liet zich goed meten met de VNA (VNAart :)). Van de rode printjes met te lange antenne kan deze worden ingekort door het printspoor door te krassen, waarna opnieuw met de VNA gemeten kan worden wat de antenne-eigenschappen geworden zijn. De antenne van de gele printjes (v1.1) is ook iets te lang, maar minder dramatisch.

De meetresultaten variëren van exemplaar tot exemplaar, waarbij ook de veranderende eigenschappen van de veranderende meetopstelling meespelen, maar rekening houdend met dat voorbehoud: de antenne van de rode printjes resoneert op ongeveer 334 MHz, de SWR is daar ongeveer 3,9:1. Op 433 MHz is de SWR ongeveer 13:1. (meting 190609 153659). Met het inkorten van de PCB antenne op het rode printje wordt deze veel gevoeliger voor andere objecten in de buurt, maar kan deze bijvoorbeeld (meting 190609 155321) uitkomen op een resonantiefrequentie van 442 MHz met een SWR van 1,8:1 – de SWR op 433 MHz was ongeveer 2:1.

De nieuwe gele V1.1 printjes hebben (meting 190702 190935) een antenne met een resonantiefrequentie van 449 MHz, de SWR is daar ongeveer 2,5 :1. Op 434 MHz is de SWR ongeveer 4:1. Dat is dus stukken beter dan de 13:1 van een ongemodificeerd rood printje.

Verder bleek bij het schrijven van de software dat 32 bytes RAM toch wat weinig is. Het ID in ram werdt overschreven in de interrupt routine (ISR). Daardoor werdt ook dit aspect van het project interessanter dan voorheen gedacht.

Oorspronkelijk stond het ID hardcoded en was vrijwel alles al bekend bij compile time. Omdat de attiny10 zuinig moet zijn, loopt deze op een trage (128 kHz) klok. Tijdens het verzenden van een bericht beslissingen maken zou de timing verstoren, dus het te versturen bericht werdt tevoren in ram klaargezet. Er worden HI-berichten verstuurd zolang de sensor (en het apparaat) aan staat, en BYE-berichten als het apparaat (en de sensor) wordt uitgezet.

Later is een crc toegevoegd, waardoor er wat meer ram gebruikt wordt, hetgeen ertoe leidde dat de stack het ram in groeide bij de context switch bij de (pin change) interrupt die gebruikt wordt om te meten of de voeding is weggevallen, met dus als gevolg het overschrijven van de variabele met het uit-te-zenden bericht.

Omdat het niet erg is als de microcontroller reset en opnieuw begint bij het terugkomen van de spanning, heb ik ervoor gekozen de ISR zonder context save / restore uit te voeren (“naked” ISR). Om de microcontroller gegarandeerd te resetten, ook als de voeding terugkomt voordat de bufferelco leeg is, wordt bij het ingaan van de ISR de watchdog timer (WDT) op 2 seconden ingesteld. Zodoende wordt de microcontroller 2 seconden later gereset. Er is dus geen context restore en return from interrupt. Dit scheelt 13 bytes ram (van de 32).

De software aan de ontvangstkant is onder te verdelen in een aantal lagen:

  • De ontvangstlaag (datalinklaag)
  • De verwerkingslaag (Applicatielaag)
  • De presentatielaag

De ontvangslaag verwerkt de ontvangen bits tot berichten, die doorgegeven worden aan de verwerkingslaag. De verwerkingslaag slaat de ID’ s en de status van de ontvangen sensoren op. De presentatielaag haalt hier de naam van het apparaat bij en toont deze informatie.

De ontvangstlaag is een state-machine rond een timer-interrupt die de ingang polled om de startconditie van een bericht te detecteren. Eenmaal een startconditie gevonden, wordt een pin-change interrupt gebruikt om de rest van het bericht binnen te halen.

De verwerkingslaag slaat het ID op, en houdt bij welke apparaten nog aan staan d.m.v. een timestamp en de BYE-berichten. Als een apparaat zich niet afmeld met een BYE-bericht wordt het als “uit” beschouwd als er  enige tijd (anderhalve minuut) geen HI-berichten meer ontvangen zijn.

De presentatielaag geeft de informatie over wat er nog aan staat weer via een seriële verbinding en op een LCD. Op het LCD worden ook de ingestelde namen van apparaten getoond. De naam/ID koppeling wordt opgeslagen in het EEPROM van de atmega328.

De code van zowel de zenderkant als de ontvangstkant is ruimschoots voorzien van commentaar, dus bij verdere interesse in de werking: kijk op github.

Voor wie geïnteresseerd is in de berichtstructuur, is deze op de MakerSpace Wiki  gedocumenteerd. Ook alle andere documentatie staat daar.

Mocht het hierboven ingesloten filmpje niet laden is hier de link naar youtube.
En voor wie verder nog vragen of opmerkingen heeft, is onder deze blogpost een reactiemogelijkheid 🙂

*) De bijna verplichte waarschuwing: Let er dus op, mocht je dit nabouwen, dat de hele schakeling met het lichtnet verbonden is. De 5 VDC voor de microcontroller is dus, ten opzichte van aarde, nog steeds 230 VAC. Er is geen isolatie, en als je de “5V” zou aanraken, raak je 230 V aan. Niet doen dus. (Ditzelfde geldt voor de 12V).