Veel populaire sensoren en diverse randapparaten worden vandaag de dag aangesloten op de microcontroller via de I2C bus. Er zijn echter diverse verschillende stekkersystemen in gebruik die zeker niet allemaal onderling uitwisselbaar en aansluit-compatible zijn. Omdat ik net zo eenvoudig sensoren wilde kunnen aansluiten op de fischertechnik TXT4.0 Controller (met 6-polige flatcable aansluiting) als op de diverse ESP-32 en Arduino-boards die ik gebruik, ontwierp ik een universele I2C-hub uitwisseling tussen de aansluitsystemen vergroot en die direct de aangesloten sensor van voedingsspanning kan voorzien.
Terloops bleek dit project ook direct een goede aanleiding de verschillende I2C stekkersystemen eens in kaart te brengen, én mijn mogelijkheden zelf printplaten met SMD-componenten te bestukken uit te breiden. Daarover leest u verderop op deze pagina.
De fischertechnik ROBO TX Controller, die in 2009 werd uitgebracht, was reeds uitgerust met een I2C interface. Sindsdien werden door fischertechnik diverse sensoren op de markt gebracht die communiceren via de I2C-interface (EXT) van de controller. Deze I2C interface had, net als bij de huidige Arduino-boards, een 5 volt signaalniveau. De later uitgebrachte ROBOTICS TXT Controller, en de meest recente TXT4.0 Controller van fischertechnik volgende de moderne trend waarbij de I2C bus op 3.3 volt werkt. Deze twee modernste controllers van fischertechnik waren echter wel al fysiek incompatible omdat ze resp. een 10-polige en een 6-polige flatcable (DC3) boden als aansluitmogelijkheid. Omdat de signaalniveaus overeenstemmen kon hiervoor worden volstaan met een eenvoudige adapter. Handige knutselaars (waaronder ikzelf, zie mijn online catalogus als u hiernaar op zoek bent) maakten deze reeds zelf in verschillende varianten. De simpele printplaat-oplossing kan direct in de 10-polige fischertechnik sensor worden gestoken, terwijl met de kleine module-variant de overgang van 6 pins I2C naar 10 pins I2C met flatcables kan worden gemaakt.
Er zijn voor het aansluiten van de I2C bus diverse stekkersystemen in gebruik. Deze worden voornamelijk bepaald door de diverse fabrikanten van kleine sensor-modules en uitbreidings-boards. Een kleine inventarisatie:
Voor (sensor)boards die niet via de I2C-bus hoeven te communiceren (zoals drukknoppen, LDR’s of regelaars) komen veel van de genoemde aansluitsystemen ook voor in een 3-pins variant die we hier verder buiten beschouwing zullen laten. Ook met de 4-pins aansluitingen dient er te worden opgelet omdat bijvoorbeeld in het Grove stekkersysteem dezelfde vier pins stekkers soms gebruikt worden voor het doorgeven van analoge of digitale (bijvoorbeeld PWM) signalen. U dient zich er dus altijd voor het aansluiten van te vergewissen dat er daadwerkelijk een I2C bus met de karakteristieke SDA en SCL aders wordt aangesloten.
Daarnaast dient vanzelfsprekend de aangesloten module geschikt te zijn voor de via de stekker aangeboden voedingsspanning. Veel modules kunnen tegenwoordig gelukkig zowel op 3.3 als op 5 volt functioneren. De hier besproken I2C hub biedt beide voedingsspanningen op aparte Grove connectors aan, waardoor er voor de aansluiting richting de sensor in de praktijk geen enkel probleem zal zijn.
In onderstaande tabel heb ik geprobeerd een overzicht te geven van de meestgebruikte I2C aansluitsystemen en -methoden. Online is hier ook veel informatie over te vinden.
Merk op dat de stekkers van DFRobot’s Gravity systeem en Adafruit’s Stemma fysiek compatible zijn (JST-PH), maar dat echter de ader-volgorde verschilt en de volgorde ervan in bestaande aansluit- of verloopsnoeren dus goed zal moeten worden gecheckt en waar nodig moet worden aangepast.
In het algemeen kan worden opgemerkt dat het JST-PH Stemma stekkersysteem volledig pin-compatible is met de JST-HY 2.0 connectoren van het Grove systeem. Toch zijn, ondanks de overeenkomstige afmetingen en 2 mm pitch van de aansluitpennen, deze stekkers fysiek niet compleet uitwisselbaar. Een bijkomstigheid is bovendien dat de JST-HY stekkers vaak zijn voorzien van een vergrendel-lip waarvoor de uitsparing op de JST-PH connectoren ontbreekt.
De uitwisselbare Stemma QT en Qwiic aansluitsystemen gebruiken kleinere stekkers met slechts 1 mm pitch die onderling volledig compatible zijn maar wel van kleur kunnen verschillen. De Stemma QT- en de Qwiic-snoeren lijken daarom de enige te zijn die zonder problemen door elkaar gebruikt kunnen worden. De aan te sluiten modules verwachten doorgaans een voedingsspanning van 3.3 volt.
Samengevat kunnen we stellen dat de stekker-systemen waarmee de I2C bus wordt verbonden altijd vier pins zijn. Voor de plus en min wordt in alle gevallen resp. rood en zwart gebruikt. Voor het data- en clock-signaal van de I2C-bus wisselen de kleuren. De CLK is meestal een gele ader, maar soms blauw. Voor het kleurcoderen van de I2C-data komen groen, wit en blauw voor.
Het leek mij zinvol om bij het aansluiten van verschillende I2C-sensoren en randapparaten te kiezen voor één centraal connectorsysteem en te werken met maatwerk-verloopsnoeren indien nodig. Door de ader-kleuren en de duidelijk afwijkende vormfactor van de stekkers van de verschillende systemen leek me dit een minder foutgevoelige en universeler oplossing dan een arsenaal maatwerk flatcables met losgesneden en geruisde aders met telkens maar één specifieke toepassing op te bouwen. Dit houdt de opbouw overzichtelijk, vermindert mogelijke aansluit-fouten en maakt het eenvoudiger om verschillende componenten door elkaar te kunnen gebruiken in een project.
Omdat ik de soepele en gekleurde snoeren prettiger vind werken dan de soms lastig plooibare grijze flatcables, koos ik er voor om de Grove/Seeed stekkers een centrale rol te geven. Verloop- en verlengsnoeren van alle gangbare stekkersystemen (zie de tabel hierboven) naar Grove zijn kant-en-klaar verkrijgbaar.
Nog flexibeler is het natuurlijk om deze zelf op elke gewenste lengte te kunnen maken. De losse JST-stekkers kunnen met een goede JST-crimptang gemonteerd worden, en waar een 2x3 (of 2x5) gaatjes-header gewenst is, kan deze worden gesoldeerd. Zelf beschermde ik de solderingen met een stukje krimkous in kleur. Omdat ik het contradeel van dit type connector eigenlijk alleen in de op flatcable te persen DC3-variant kon vinden, ontwierp en printte een hulsje om de specifieke IDC-connector met de nok na te bootsen met een normale ‘female‘ Dupont pin-header (afbeelding hiernaast).
Voor de sensoren die zijn uitgerust met de kleine Qwiic connectoren, zijn verloopsnoeren naar Grove-stekker verkrijgbaar. In de afbeelding hiernaast is een board met de MMC5603 magnetometer/kompas uit fischertechniks ‘Kombisensor’ getoond.
Onderaan op deze foto de krachtige opvolger van de populaire BME680 (het hart van fischertechniks ‘Umweltsensor’): de Bosch BME688 die met zijn AI-functionaliteit getraind kan worden om specifieke gassen (zoals specifieke VOS'en, zwavelverbindingen en waterstof) te detecteren en te identificeren.
Dit is zeker een leuke sensor om in de toekomst nog eens meer aandacht aan te besteden en wat meer mee te experimenteren. Door hem te 'trainen' is het mogelijk hem, middels AI, specifieke geuren te laten onderscheiden.
Wie zich niet strikt beperkt tot de door fischertechnik aangeboden sensoren en mogelijkheden, verzamelt al snel diverse third-party sensoren en nuttige I2C-randapparatuur. Het telkens opnieuw uitzoeken van de juiste bedrading en het riskante handmatige aansluiten kan dan een tijdrovende frustratie worden. Een centrale, gebruiksvriendelijke oplossing om al deze verschillende componenten moeiteloos en zonder risico met de fischertechnik-controllers te kunnen verbinden zou dan uitkomst bieden. Het prettigst is het wanneer deze hub zelf de benodigde 5V- en 3.3V-voedingsspanningen kan invoeden en tegelijkertijd de logische levels van de I2C-bus bi-directioneel shift.
Omdat ik mijn wensen nog niet direct in de reeds bestaande oplossingen trof, stelde ik een lijstje met wensen op voor een dergelijke alles-in-één verdeler:
Dit leidde tot de I2C-Hub uit afbeelding 8. Het schakelschema, printplaat-ontwerp en 3D-bestanden voor het drukken van de behuizing zijn te vinden op mijn GitHub.
Alle SMD-componenten bevinden zich onzichtbaar aan de onderzijde van de printplaat. De ontwikkeling en bouw van de hub dienden voor mij als een oefenproject in het solderen van printplaten met SMD-componenten. Daarbij maakte ik gebruik van een zelf geprint soldeerpasta-stencil voor het aanbrengen van de soldeerpasta.
Voorheen had ik al eens met de hand alle kopereilanden voorzien van soldeerpasta uit een injectiespuit, maar ik pakte het nu iets anders aan. Ik printte een klein frame voor de printplaat en exporteerde de solderpaste-gerber als SVG-bestand vanuit KiCad. Nadat ik dit in Affinity Designer had geïmporteerd, maakte ik de kleinste pasta-eilandjes (van de BSS138 MOSFETs) iets groter en exporteerde dit eilandjes-patroon inclusief de omhullende printplaat-edge-cut ter referentie naar Blender.
In Blender maakte ik er een mesh van die ik extrueerde zodat het een dikte kreeg. Dit werd het boolean object om de juiste gaatjes in het deskel-flapje te snijden. Het resultaat viel me niet tegen en het lukte vrij eenvoudig om alle eilandjes van soldeerpasta te voorzien.
Daarnaast experimenteerde ik voor het eerst met een hot-plate voor het eigenlijke soldeerproces. De resultaten waren zeer bemoedigend. Van mijn bevindingen maakte ik de korte video hierboven.
Bij gebruik van een fischertechnik controller, volstaat een enkele 9 volt verbinding om alle Grove-connectoren van de juiste voedingsspanningen te voorzien. Daarnaast creeërde ik de variant van de behuizing die direct met een DC-adapter kan worden gevoed op de foto hiernaast. Deze variant heeft een handige aan/uit knop, lust de voedingsspanning naar het gebruikte Arduino-board door, en maakt deze tevens beschikbaar voor het aansluiten van snoeren met de bekende 2.5 mm fischertechnik stekkers.
Als proefproject voor de I2C-Hub met de TXT4.0 Controller besloot ik de informatie die via I2C wordt gelezen van een 3.3 volt bewegingssensor zichtbaar te maken op een 5 volt LCD display dat via dezelfde I2C bus wordt aangestuurd.
Zowel de 10-polige als de 6-polige variant van de fischertechnik Gestensensor (nr. 183267) uit de Robotics Add On: Competition maakt gebruik van de Avago/Broadcom APDS-9960 sensor. Dit is een digitale chip die de volgende functies combineert:
Het I2C adres van de APDS-9960 sensor van zowel het door mij gebruikte losse, online verkrijgbare, sensor-board (GY-9960), als de 10-pins en 6-pins versies van de fischertechnik ‘Gestensensor’ is standaard 0x39. Dus het uitlezen van deze sensor vormt geen enkel probleem.
Meer moeite vergte het om het 2004A LCD display op de TXT4.0 Controller aan de praat te krijgen! In de uitstekende I2cCode TXT4.0 library van ‘caliope’ kwam ik alleen de support voor de SparkFun Qwiic 20x4 SerLCD tegen. Dat display bevat een eigen microprocessor (ATmega328P). Het 2004A display heeft echter een veel eenvoudiger HD44780 controller en gebruikt voor de communicatie over I2C de gangbare PCF8574 I/O-expander.
Uiteindelijk lukte het een eenvoudige LCD-driver voor deze controller in ROBO Pro Coding te schrijven zodat het display uiteindelijk voor het experiment gebruikt kon worden om de meetwaarden van de bewegingssensor sensor weer te geven. Geïnteresseerde fischertechnik collega's kunnen deze LCD library onder de naam ‘LCD_2004A_over_I2C’ in de fischertechnik Cloud GitLab terugvinden.
Hoewel het schrijven naar het display relatief traag is, werkt deze ‘proof-of-concept’ uitstekend. Dit programma heb ik onder de naam ‘Gesture-LCD-2004A’ in de fischertechnik Cloud GitLab geplaatst.
De APDS-9960 sensor in de fischertechnik Gestensensor is al een vrij klassieke bewegingssensor, inmiddels zijn er intelligente sensoren met een camera en AI die ook handgebaren zonder beweging en gezichten enz. kunnen herkenen. Populair is de DFRobot SEN0626 Gravity AI Gesture & Face Detection Sensor.
Als (5 volt) display op de I2C bus, koos ik een z.g. ‘Led & Key’ board met TM1638 controller. Dit is een experimenteerboard met acht drukkknoppen, acht LEDS en acht 7-segment displays. Recent had ik juist de aansturing over I2C van dit board gebouwd.
Hoewel de voedingsbussen voor de fischertechnik-stekkers niet nodig waren, besloot ik de variant van de hub te gebruiken waaraan gemakkelijk een DC-adapter kan worden aangesloten. Voor het aansluiten van de gebarensensor op de 3.3 volt I2C bus gebruikte ik een Qwiic naar Grove verloopsnoertje. Het display-board sloot ik aan op de 5 volt I2C bus. Beide devices krijgen hun voedingsspanning uit de hub en belasten het microcontroller-board hiervoor niet.
Op de afbeeldingen hieronder is het resultaat te zien. De LEDs op het board geven aan op welke positie vanuit het midden de sensor een ‘schouder met hoofd’ detecteerde. Het overeenkomstige 7-segment display geeft het eventueel herkende gebaarnummer aan.