notes, tips, tricks, ideas and such

Voor mijn vader heb ik met een raspberry Pi een radio (stream) ontvanger in elkaar gezet. Ontvangst via de kabel is gestopt, via de ether valt niet veel te ontvangen, en streams luisteren via de mediabox of smartphone was niet erg praktisch.

Het is snel in elkaar geharkt op basis van een Raspberry Pi 2B (behuizing, voeding), een usb-geluidskaartje, een HD44780-compatible display en enkele drukknoppen. Deels spullen die ik nog had liggen, de rest links naar waar ik het kocht (niet gesponsord dus koop het gerust elders, of geheel niet, nabouwen is niet verplicht, en met een andere behuizing of geluidskaart werkt het vast ook wel).

De software heb ik gebaseerd op deze link, maar aangepast om de standaard in raspberry pi OS (Debian Bullseye) meegeleverde mediaspeler VLC te gebruiken. Ook gebruik ik gpiozero en in plaats van de piFace hat gebuik ik 3 drukknoppen en een LCD module. De aansturing van de LCD heb ik uit een handleiding van een uitbreidingsbordje en zit lompweg boven de rest van de code geplakt. Het display zelf zit met dubbelzijdig tape tegen de binnenkant van de behuizing. En alles zit met van die kleine pinheader-stekkertjes aan elkaar. Kortom: geharkt. Maar het werkt. Hier is mijn rammelende pythoncode. Daar is ook de pinout in te vinden.

Zenders wisselen gaat met de zwarte knoppen (volgende/vorige), pauzeren kan met de rode knop. Afsluiten en uitzetten kan door de rode knop lang ingedrukt te houden. De uitgang van de geluidskaart gaat naar de aux-input van de stereo-instalatie, en uiteraard heeft het een voedings- en netwerkaansluiting nodig. Meer is het niet – de volumeregeling zit in de versterker.

Met behulp van deze tutorial van sparkfun en systemd wordt het automatisch opgestart: dit is mijn unit file die je zelf nog moet aanpassen met je eigen gebruikersnaam. Het filesystem heb ik read-only ingesteld na alle andere dingen te hebben ingesteld (Met hulp van deze tutorial van Adafruit). Ook laat ik de raspberry pi opstarten naar terminal ipv naar de grafische desktop: er hangt toch geen scherm aan.

De USB geluidskaart gaf nog de verrassing dat na alsa te hebben ingesteld alles werkte, maar na het op readonly instellen van het OS het geluid uit m’n HDMI monitor kwam en niet uit de USB geluidskaart. Ik denk dat de card-nummers niet naar een uniek device wijzen, maar dat dit wisselt afhankelijk van de volgorde van aansluiten oid. Card 0 is intern geluid van de raspi, card 1 de usb geluidskaart en card 2 de monitor. Na instellen van het overlay-filesystem (readonly) is card 1 de monitor en card 2 de usb geluidskaart. Door alsa in te stellen op card 2 komt na het instellen van het overlay-filesystem het geluid uit de geluidskaart (en ervoor via hdmi), en werkt alles ook zonder monitor. Opnieuw: geharkt, maar zo werkt het wel binnen een dag.

Het HD44780 display heeft standaard een witte achtergrondverlichting, maar geel/oranje achtergrondverlichting geeft een warmer beeld en sluit beter aan bij ‘onze’ stereo-instalatie. Zodoende heb ik de LED van de achtergrondverlichting vervangen.

De streaming-links heb ik van https://hendrikjansen.nl/henk/streaming.html. Andere ‘zenders’ kunnen eenvoudig worden toegevoegd aan het pythonscript door hun URL in te voeren op dezelfde manier als de zenders die al in het script staan.

Bij de zweefmagneet gebruik ik een hallsensor om de afstand tot de magneet te meten. Deze sensor meet magnetische veldsterkte en is daarom eveneens gevoelig voor het veld van de elektromagneet, en niet alleen de permanente magneet waarvan de afstand gemeten moet worden. Op zich geeft dat geen probleem in de praktijk, maar het is een leuke aanleiding om eens te kijken of de afstand ook op een niet-magnetische manier gemeten kan worden. Dat is ook handig als het object waar de afstand naar gemeten wordt niet magnetisch is, bijvoorbeeld.

Omdat dit een hele kleine afstand is (een paar centimeter), zijn veel kant-en-klare sensoren niet geschikt, omdat ze bijvoorbeeld meters afstand meten met een resolutie van enkele cm, of tientallen centimeters met enkele mm. De afstandssensor die ik voor de zwevende magneet nodig heb, moet een centimeter of 3 tot 5 kunnen meten, waarbij het eigenlijk niet eens belangrijk is wat die afstand precies is, als kleine veranderingen (sub-mm) maar goed opgemerkt worden.

Met een LED en een lichtsensor valt reflectief te meten wat de afstand tot een reflecterend object is: Hoe meer licht terugkaatst, hoe dichter bij het object is. Uiteraard lijken ‘ beter reflecterende’ objecten dan dichter bij dan ‘minder goed reflecterende’, maar bij steeds hetzelfde uniform gekleurde object geeft dat niet. (De uitdaging om dit toe te passen bij een zwevende magneet zit er in dat ook de hoek invloed heeft op de hoeveelheid licht die naar de sensor weerkaatst: de magneet beweegt niet alleen op en neer maar kantelt ook.)

Ik gebruik een BPW40 fototransistor als lichtsensor, maar bijvoorbeeld een LDR of een fotodiode kan ook. Ik gebruik een infrarode led, maar gewoon zichtbaar rood werkt ook. Voor zichtbaar geel is de BPW40 duidelijk minder gevoelig. Ik gebruik een Atmega328p als microcontroller, maar alles met een ADC is bruikbaar.

Zo is heel makkelijk en met goedkope onderdelen een afstandssensor te maken, voor kleine afstanden.

De afstandssensor heeft geen last van omgevingslicht, omdat de fototransistor AC gekoppeld aangesloten is. Constant omgevingslicht geeft een DC offset en de koppelcondensator blokkeert die.

De LED moet uiteraard wel met AC worden aangestuurd, zodat het (gereflecteerde) licht ervan een AC signaal veroorzaakt dat wèl door de koppelcondensator heen komt. Dit kan daarna worden gelijkgericht en gemeten, of zelfs rechtstreeks de ADC van een microcontroller in. Als dezelfde microcontroller de LED aanstuurt, is het gemakkelijk om ‘synchrone detectie’ toe te passen: Er wordt een ADC sample genomen precies op het moment dat de LED aan staat.

Al bij al zijn het 5 componentjes en een paar regels code. Makkelijk uit te proberen met deze arduino-sketch.

En het werkt mooi:

Wie mijn oude site kent, herinnert zich misschien nog wel de zweefmagneet. Daarbij zweeft een magneet onder een elektromagneet. Het kan ook andersom: een magneet boven een aantal elektromagneten laten zweven.

Ik heb een bouwpakketje gekocht dat (na het in elkaar te knutselen) een magneet boven een stel elektromagneten laat zweven.

Het bouwpakketje komt aan als een set onderdelen, een materiaallijst, een schema, en een QR code.

De materiaallijst kan ik alleen de westerse teksten van lezen. De refdes en componentwaarde is op de print gedrukt, in een heel klein font. De zakjes zijn bedrukt met componentwaarden, behalve bij de condensatoren.

Van sommige componenten krijg je er een paar extra, die je niet nodig hebt. De QR code wijst naar dit filmpje. De markeringen met potlood op het schema zijn van mijn hand, en werden niet meegeleverd. Er is geen verdere documentatie of handleiding.

Kortom: Dit bouwpakket is niet geschikt voor mensen die al zenuwachtig worden van het in elkaar moeten zetten van ikea-meubels. Maar voor mij juist leuk.

Hoewel ik de meeste onderdelen snel op de print had, kwam ik bij de spoelen een verrassing tegen: er zijn maar 4 aansluitingen op de print: X1, X2, Y1 en Y2. (En de spoelen hebben er elk 2, dus in totaal 8). De spoelen moeten per 2 in serie, zodat je 4 draden overhoudt voor de 4 aansluitingen op de print.

Met een beetje spieken op internet blijken er verschillende varianten van het kitje te bestaan, waarbij de labeling van de spoelen soms anders is. Bij de vierkante print uit het bouwpakketje die ik kocht, moeten de spoelen als volgt worden aangesloten:

Dus van X1 naar het midden van de eerste spoel, van de buitenkant van die spoel naar de buitenkant van de andere spoel, en van die spoel moet de middelste aansluiting aan X2. De middelste aansluiting van de spoel zit dus aan de gelabelde aansluiting op de print.

Voor de Y-spoelen gelijkaardig: Midden naar Y1, andere midden naar Y2 en de buitenkanten aan elkaar.

(Met de aansluitdraden naar onderen, moeten dus de midden-aansluitingen van de spoelen aan elkaar en de buitenkanten naar de pcb-aansluitigen, maar ik ga uit van de situatie met de draden aan de bovenkant)

De X-spoelen staan dus in serie met elkaar. En de Y-spoelen staan in serie met elkaar. Maar wel zodanig, dat de stroom in de ene spoel precies tegengesteld gericht is aan in de andere.

Dat is anders dan ik verwachtte. Mijn (onjuiste!) verwachting berustte er op dat de spoelen alle 4 de magneet naar beneden en naar het midden trekken, waar de permanente magneten de magneet omhoog en naar het midden duwen. Dat is onjuist.

In plaats daarvan wordt de hoogte niet geregeld, maar juist alleen de positie in het platte vlak. De permanente magneten op de hoeken zorgen door afstoting voor de hoogte. (recht boven de hoekmagneten wordt de te-zweven magneet aangetrokken, maar midden ertussen wordt deze afgestoten). De omgebogen hallsensor wordt via de lm393 comparator gebruikt om de voeding van de regeling in te schakelen, maar niet om te regelen.

De andere 2 hallsensoren worden gebruikt om de positie van de magneet te meten. De X en Y regelingen werken gelijkaardig. Omdat de spoelen per paar (X of Y) in serie staan, is de stroom door zo’n seriepaar gelijk en daarmee ook de veldsterkte. Omdat de stroom tegengesteld gericht is, zal de ene spoel de magneet aantrekken en de andere de magneet wegduwen.

De regeling kan de stroom door zo’n spoelpaar omkeren en zo de magneet de andere richting uit trekken: als een positieve stroom door het X-spoelpaar ’naar links’ betekend, is een negatieve stroom ’naar rechts’. Het Y-spoelpaar regelt op gelijke wijze voor/achter. Zo wordt de magneet links/rechts en voor/achter gestuurd, en daarmee in het midden gehouden.

Het is makkelijker ‘ aan te voelen’ door tegen de magneet te duwen en te voelen hoe de regeling reageert, dan dat het is om de werking over te brengen in een tekst. Samengevat: De te zweven magneet ligt op een soort ‘magnetisch heuveltje’ doordat de andere permanente magneten ‘ m afstoten. De regeling houdt ‘ m door middel van de spoelen in het midden, op de top.

Mocht deze redenatie aanvulling behoeven, laat dan gerust een comment achter.

Nadat alles gebouwd is en werkt kan met de potmeters de print afgeregeld worden. Zet ze tijdens het bouwen zolang in middenstand (het zijn meerslagenpotmeters). Regel af op minimale stroom door de spoelen als de magneet stabiel in het midden zweeft. Dit kan door de stroomopname uit de voeding te meten of door de stroom door de afzonderlijke spoelparen (X en Y) te meten via de jumpers (jumper verwijderen en stroommeter daar aansluiten, de meter staat dan in serie met de spoel).

Als de zwevende magneet net geplaatst wordt is de stroomopname tijdelijk hoog (boven de 1.5 A). Dit zakt al snel onder de 0.2 A (in enkele seconden), en neemt langzaam verder af tot onder de 0.03 A. (De meter van mijn voeding is niet accuraat, zeker niet bij dergelijk kleine waarden.) De transistors blijven dan ook koel als de magneet eenmaal stabiel in het midden zweeft.

Kort samengevat, wat bouwtips:

  • plaats de onderdelen volgens aanduiding op de print (Dit is een erg beknopte samenvatting van wat een complete multo-map aan assemblage-instructie zou kunnen zijn, en wat toch minimaal een vellemankit-handleiding-achtig informatie A-4tje zou moeten zijn)
  • zorg dat de hallsensors en de spoelen juist geplaatst zijn, zie foto’s
  • regel af op minimale stroomafname uit de voeding. Dit kan ook afzonderlijk per spoelpaar gemeten worden.
  • Indien juist afgeregeld, neemt de opgenomen stroom af tot onder de 100 mA en blijven de transistors gewoon koel

Ik vond het een leuk avondje knutselen en middagje puzzelen, en hoop met deze blogpost te bereiken dat het voor anderen íets minder puzzelen is. Terzijde ben ik best benieuwd wie de fabrikant is van de chips met het lijkt-op-maar-is-niet-texas-instruments logo.