Ingenieursvaardigheden Design en prototyping ing. Y. Verbelen
Vrije Universiteit Brussel Bachelor Industri¨ele Wetenschappen Nijverheidskaai 170, B-1070 Anderlecht
[email protected]
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/.
v1.2
Voorwoord
Dat de meest elementaire wetten van de elektriciteit en mechanica al eeuwenlang gekend zijn, is toe te schrijven aan hun elegante eenvoud. Al in 1827 ontdekte de Duitse fysicus Georg Simon Ohm dat er een eenvoudig lineair verband bestaat tussen de spanning over een weerstand en de stroom erdoor, nl. de resistiviteit van de weerstand zelf. Een simpel maar krachtig concept, nu gekend als de Wet van Ohm, dat dagelijks door talloze elektronici wordt toegepast. Kirchhoff ontdekte soortgelijke, eenvoudige verbanden tussen spanningen en stromen in schakelingen, en deze fundamentele wetten hoefden de laatste 200 jaar niet meer herzien te worden. De realiteit is helaas iets ingewikkelder. De reden waarom vergelijkingen in elektronicahandboeken er zo eenvoudig uitzien, is dat ideale componenten in ideale omstandigheden worden verondersteld: draden die componenten verbinden hebben geen weerstand, de temperatuur blijft steeds constant en interferentie met andere elektromagnetische systemen is onbestaande. In een re¨ele schakeling hebben draden of breadboards echter w´el een bepaalde weerstand, de capaciteit van condensators hangt af van de spanning erover en hun levensduur, de contacten van schakelaars trillen en oxideren aan de lucht en elk onge¨ısoleerd metalen object in de schakeling werkt als een antenne die ruis van omringende apparaten of verlichting oppikken, enzovoort. Helaas zijn de meeste van deze factoren onbekend en is het dus moeilijk om ze mee te nemen in berekeneningen of simulaties. Gelukkig is de invloed van deze onbekende factoren doorgaans te minimaliseren door schakelingen goed te ontwerpen, maar zelfs dan nog is er slechts e´ e´ n manier om zeker te weten of een schakeling werkt zoals je in gedachten hebt: een prototype bouwen en uittesten in het lab. Totdat je voldoende ervaring hebt opgedaan om schakelingen te kunnen ontwerpen die van de eerste keer werken, zal je eerst v´ee´ l schakelingen op breadboard moeten bouwen, uittesten, en je ontwerpen aanpassen. Praktische elektronica neemt nu eenmaal flink wat tijd in beslag om onder de knie te krijgen. Maar eens je de basisvaardigheden van prototyping beheerst, heb je toegang tot een wereld met quasi ongelimiteerde mogelijkheden. Beschouw deze nota’s eerder als een bundel tips en technieken dan als een syllabus. Laat het geen naslagwerk zijn dat op een stoffige zolder terechtkomt, maar een gids die je actief consulteert als je zelf aan de slag gaat in het lab. Deze nota’s zijn enkel tot stand kunnen komen dankzij de constructieve feedback en inzichten van Ann Peeters, Lieven Standaert en Laurent Segers, waarvoor dank. Het staat eenieder vrij om deze syllabus geheel of gedeeltelijk te repliceren en te verspreiden voor niet-commerci¨ele doeleinden zoals vastgelegd in de Creative Commons BY-NC-SA 4.0 International licentie. Vrije toegang tot informatie behoort een basisrecht te zijn voor iedereen. Anderlecht, augustus 2015 Y. Verbelen
Inhoudstafel
Voorwoord
i
1
. . . . . . . .
1 1 1 1 2 2 2 3 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 5 5 6 6 7 7 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 14 14 15 16
2
Inleiding 1.1 Project . . . . . . . . . . . . 1.1.1 Specificaties . . . . 1.2 Situering . . . . . . . . . . . 1.3 Materiaal . . . . . . . . . . 1.3.1 Recuperatiemateriaal 1.3.2 Webshops . . . . . . 1.3.3 Uitrusting . . . . . . 1.4 Vorm en evaluatie . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
Elektronica 2.1 Modulair ontwerp . . . . . . . . . . 2.2 Het display . . . . . . . . . . . . . 2.2.1 Zevensegmentendisplays . . 2.2.2 LCD/TFT-displays . . . . . 2.2.3 LED-displays . . . . . . . . 2.2.4 Vacu¨umfluorescentiedisplays 2.2.5 Nixiebuizen . . . . . . . . . 2.2.6 Aansturing . . . . . . . . . 2.2.6.1 Multiplexing . . . 2.2.6.2 Shiftregisters . . . 2.2.6.3 Charlieplexing . . 2.3 Het bedieningspaneel . . . . . . . . 2.3.1 Drukknoppen . . . . . . . . 2.3.2 Draaischakelaars . . . . . . 2.3.3 Joysticks . . . . . . . . . . 2.3.4 Touchscreens . . . . . . . . 2.3.5 Potentiometers . . . . . . . 2.3.6 Debouncing . . . . . . . . . 2.4 De klok . . . . . . . . . . . . . . . 2.4.1 Real Time Clock . . . . . . 2.4.2 Microcontroller . . . . . . . 2.4.3 Synchronisatie . . . . . . . 2.5 De buzzer . . . . . . . . . . . . . . 2.5.1 Pi¨ezobuzzers . . . . . . . . 2.5.2 Luidsprekers . . . . . . . . 2.6 De voeding . . . . . . . . . . . . . 2.6.1 Batterijen . . . . . . . . . . 2.6.2 Netadapter . . . . . . . . . 2.6.3 Netvoeding . . . . . . . . . 2.6.4 Spanningsregulators . . . . 2.7 De logica . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
4
5
Microcontrollers programmeren 3.1 De Arduino Uno . . . . . . . 3.1.1 De voeding . . . . . . 3.1.2 Randapparatuur . . . . 3.2 De toolchain . . . . . . . . . . 3.2.1 C/C++ . . . . . . . . . 3.2.2 Shields en bibliotheken 3.3 Programmastructuur . . . . . 3.3.1 Declaraties . . . . . . 3.3.2 Initialisaties . . . . . . 3.3.3 Hoofdroutine . . . . . 3.4 Hardwarecomponenten . . . . 3.4.1 Digitale pinnen . . . . 3.4.2 Analoge pinnen . . . . 3.4.3 Pulsbreedtemodulators 3.4.4 Seri¨ele communicatie . 3.4.5 Interrupts . . . . . . . 3.4.6 Timers . . . . . . . . 3.5 Documentatie . . . . . . . . . 3.5.1 Commentaar . . . . . 3.5.2 Header . . . . . . . . 3.6 Ontwerpcyclus . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
19 19 21 21 22 22 23 23 23 25 26 27 27 28 29 30 33 35 36 36 37 37
PCB-ontwerp 4.1 Inleiding . . . . . . 4.2 CircuitMaker . . . 4.2.1 Installatie . 4.2.2 De “cloud” 4.3 Schema’s tekenen . 4.4 De PCB . . . . . . 4.5 Productie . . . . . 4.5.1 Gerbers . . 4.5.2 3D-model . 4.6 Gevorderd design .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
39 39 40 40 41 42 48 52 52 52 53
Bekabeling 5.1 Inleiding . . . . . . . . . . . 5.2 Kabels . . . . . . . . . . . . 5.2.1 Structuur . . . . . . 5.2.2 Isolatie . . . . . . . 5.2.3 Dikte . . . . . . . . 5.3 Kabeltypes . . . . . . . . . 5.3.1 Bandkabel . . . . . 5.3.2 Coaxkabel . . . . . 5.3.3 UTP-kabel . . . . . 5.3.4 Bundels . . . . . . . 5.4 Connectors . . . . . . . . . 5.4.1 Terminologie . . . . 5.4.1.1 Geslacht . 5.4.1.2 Pinafstand 5.4.1.3 Type . . . 5.4.1.4 Ori¨entatie 5.4.2 Printkroonstenen . . 5.4.3 JST-connectors . . . 5.4.4 Waferconnectors . . 5.4.5 Headers . . . . . . . 5.4.5.1 Arduino . 5.4.5.2 Stacking . 5.4.6 D-sub-connectors . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
55 55 55 55 56 56 57 57 58 58 58 58 59 59 59 59 60 60 61 61 62 63 63 64
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
65 66 66 67 67 67 68 68
Solderen 6.1 Inleiding . . . . . . . . . . . 6.2 Soldeerbout . . . . . . . . . 6.3 Soldeerverbindingen maken 6.4 Desolderen . . . . . . . . . 6.4.1 De tang . . . . . . . 6.4.2 Desoldeerpomp . . . 6.4.3 Litze . . . . . . . . 6.5 Oververhitting . . . . . . . . 6.6 Veiligheid . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
71 71 71 72 74 74 74 74 75 75
Behuizing 7.1 Inleiding . . . . . . . . . . . . 7.2 Ontwerpvolgorde . . . . . . . 7.3 Mechanisch ontwerp . . . . . 7.3.1 3D CAD software . . 7.3.2 Rapid prototyping . . 7.3.2.1 Lasercutters 7.3.2.2 Templates . 7.3.2.3 3D-printers . 7.3.3 Bereikbaarheid . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
77 77 77 77 78 78 78 79 80 80
5.5
5.6 6
7
5.4.7 IDC-connectors 5.4.8 Standaarden . . Kabels maken . . . . . 5.5.1 Strippen . . . . 5.5.2 Krimpen . . . 5.5.3 Isoleren . . . . 5.5.4 Kabelbomen . Bekabelingstechnieken
. . . . . . . .
. . . . . . . .
1
Inleiding Things get worse under pressure. Murphy’s Law of Thermodynamics
1.1
Project
E´en van de onderdelen van het studiedeel Ingenieursvaardigheden is zelfstandig een project uitwerken waarin je je kennis en vaardigheden inzake elektronica, informatica en mechanica zal moeten toepassen. Het doel van deze opdracht is een wekker te ontwerpen en te bouwen, met alle functionaliteiten die je van een wekker redelijkerwijze kan verwachten. We willen je echter ook de mogelijkheid geven creatief te zijn, in de mate dat de beschikbare tijd en budget dit toelaat.
1.1.1
Specificaties
De opdracht voor het project, en meteen ook de minimumvereiste, luidt als volgt: Ontwerp een elektronische wekker die de correcte tijd weergeeft op een manier die in het donker zichtbaar is. Via een wekkerfunctie moet een tijdstip kunnen ingesteld worden waarop de wekker moet “aflopen”, en deze gebeurtenis moet met een duidelijk hoorbaar audiosignaal gesignaleerd worden aan de gebruiker. Er moet ook een “snooze”-functie voorzien zijn waarmee het aflopen van de wekker onderbroken en met 10 minuten verlaat wordt. De wekker moet visueel aangeven of het alarm op staat of niet. Uiteraard ben je vrij om naar eigen smaak extra functionaliteit toe te voegen.
1.2
Situering
Het project situeert zich als een opdracht die complementair is bij de WPO’s Basiselektronica. In de WPO’s Basiselektronica wordt de focus gelegd op de individuele componenten en hun eigenschappen, terwijl je ze in dit project zal moeten toepassen in concrete schakelingen. Daarnaast maak je ook kennis met microcontrollers als intelligente digitale bouwstenen in moderne elektronische schakelingen. Hiervoor wordt de Arduino Uno ge¨ıntroduceerd als low cost, gebruiksvriendelijk ontwikkelbordje, de ATmega328p als eerste microcontroller, en de taal C als programmeer-
D ESIGN EN PROTOTYPING
2
ing. Y. Verbelen
taal voor microcontrollers. In de volgende hoofdstukken komen deze onderwerpen aan bod: • basiscomponenten van een wekker; • ontwerpidee¨en voor je eigen wekker; • een introductie tot C/C++ als programmeer taal voor het Arduinoplatform; • printplaatontwerp in CircuitMaker; • connectors en bekabeling; • soldeer- en desoldeertechnieken.
1.3
Materiaal
De mogelijke manieren om een wekker te ontwerpen zijn eindeloos, en hoewel het labo Elektronica een ruime selectie aan componenten beschikbaar heeft, is dat slechts een fractie van het gigantische assortiment aan componenten dat commercieel beschikbaar is. Zo zijn er bijvoorbeeld enkele types LED-displays in voorraad, maar de meeste zal je extern moeten gaan zoeken.
1.3.1
Recuperatiemateriaal
Afgedankte toestellen zoals printers, scanners, elektronisch speelgoed en gadgets, laptops, microgolfovens enz. zijn een dankbare bron van de ietwat exotischere componenten die je niet in de voorraad van het labo Elektronica zal aantreffen. Besef dat in een elektronische schakeling e´ e´ n of een klein aantal defecte componenten ertoe leidt dat een apparaat niet meer naar behoren werkt, en in het containerpark wordt gedumpt. Veruit de meeste onderdelen werken echter nog perfect en kan je dus hergebruiken in je eigen schakelingen. In het laatste hoofdstuk worden enkele tips aangereikt om elektronische componenten van bestaande printplaten af te solderen. In zowel het labo Elektronica als in het fablab vind je bakken met recuperatieprintplaten, waar je naar believen componenten uit kan vissen. Het fablab huisvest daarnaast nog een extra rek afgedankte apparaten die je eveneens kan open schroeven om er componenten uit te hergebruiken. De enige voorwaarde is dat alles nadien terug wordt opgeruimd. Elektronica hergebruiken is goedkoper e´ n ecologischer dan recycleren, en je kan dus op een hogere score rekenen als je op een verantwoorde manier onderdelen van bestaande toestellen nuttig hergebruikt in je wekker.
1.3.2
Webshops
Als je op zoek bent naar elektronische componenten die je niet in de voorraad van het labo Elektronica vindt, en ook niet de berg recuperatiemateriaal, dan kan je terecht bij Elak (Fabrieksstraat 29 in Brussel). Zij houden eveneens een ruim assortiment componenten op voorraad, en zijn per Villo gemakkelijk te bereiken door de Nijverheidskaai te volgen richting Ninoofsepoort (ca. 5 - 10 min). Bij Elak ben je dus snel geholpen, maar ze zijn relatief duur. De grootste keuze aan elektronica vind je natuurlijk online. Als je nog niet vertrouwd bent met webshops dan is het wekkerproject daar de ideale gelegenheid voor. Online vind je immers materiaal dat offline moeilijk verkrijgbaar is, zoals Arduino’s bijvoorbeeld. Enkele interessante aanknopingspunten: • https://www.amazon.com: wereldwijd actieve webwinkel met ruim assortiment en snelle levering, maar relatief duur. 2
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
3
• http://www.aliexpress.com: e´ e´ n van de grootste webwinkels, gevestigd in China. Gigantisch assortiment aan onklopbare prijzen, maar reken 3 weken levertijd. • http://www.ebay.com: kleine broertje van AliExpress, voornamelijk tweedehandsmateriaal. Gedecentraliseerd, leveringstermijn afhankelijk van locatie. Soms bedenkelijke kwaliteit. • http://www.taydaelectronics.com: gespecialiseerd in elektronische componenten voor de hobbymarkt, uitstekende kwaliteit, levertermijn ca. 2 - 3 weken, maar beperkt assortiment. • https://www.sparkfun.com: focust zich op hacker/maker community, gespecialiseerd in kits en ontwikkelbordjes, maar aan de prijzige kant. • https://www.adafruit.com: innovatieve elektronica-ontwikkelaar, zelfde marktsegment als Sparkfun. Zeer duur. • http://www.polulu.com: kabels en connectors, hoge verzendingskosten. Naast bovenstaande internationale leveranciers zijn er ook lokalere alternatieven die sneller kunnen leveren en waar je zelf langs kunt gaan als je iets e´ cht dringend nodig hebt. • http://cotubex.be: ruim assortiment elektronische onderdelen op wandelafstand van campus Etterbeek. • http://www.electroshopdendermonde.be: gereedschap en onderdelen voor zelfbouwelektronica in de hacker en maker community. • http://floris.cc: Nederlandse verdeler van Sparkfun en Adafruit.
1.3.3
Uitrusting
Zelfs in een era van CNC-gestuurde machines zoals lasercutters en 3D-printers wordt de effici¨entie van ingenieurs grotendeels nog steeds mee bepaald door de vaardigheden die gepaard gaan met het gebruik van essentieel gereedschap zoals multimeters en breadboards. De beperkte tijd die je in het labo doorbrengt is niet voldoende om de ervaring op te doen die nodig is om dit gereedschap e´ cht vlot te leren gebruiken. Voor een elektronisch ingenieur is een multimeter een verlengstuk van zijn lichaam, een zesde zintuig, en het gebruik ervan moet zo vlot gaan dat het intu¨ıtief verloopt. Om die reden kan je niet anders dan het belangrijkste materiaal zelf aan te kopen zodat je er ook thuis mee kan oefenen. Dit materiaal breng je dan ook mee naar de campus voor gebruik tijdens de WPO’s: met je eigen gereedschap werken is altijd gemakkelijker en prettiger dan met “vreemd” materiaal. Voorzie het volgende materiaal en gereedschap: • 2 breadboards; • enkele sets breadboardkabeltjes; • een digitale multimeter (voor advies m.b.t. het aankopen van een multimeter: zie labonota’s Basiselektronica); • een striptang; • een kniptang; • een set precisieschroevendraaiers; • een laptop met wifi; • een Arduino Uno; • een USB A naar USB B kabel (het type dat je gebruikt om pc’s met printers of scanners te verbinden). Om praktische en logistieke redenen wordt dit materiaal dus ook niet voorzien door de docenten tijdens de WPO’s. Als je je eigen materiaal dus niet meeneemt, dan zal je niet aan de WPO’s kunnen deelnemen. 3
D ESIGN EN PROTOTYPING
4
1.4
ing. Y. Verbelen
Vorm en evaluatie
Als zelfstandig project is het de bedoeling dat je het ontwerp en de implementatie van de wekker autonoom uitvoert. Via practicumsessies krijg je alle nodige praktische vaardigheden aangeleerd, die je meteen ook zelf kan toepassen. Het is vanzelfsprekend aanbevolen om ook met je medestudenten te discussi¨eren over het ontwerp van je wekker en daarbij van elkaar te leren. Het project wordt ge¨evalueerd in de vorm van een mondelinge presentatie/verdediging. Hierbij zal gepolst worden naar je inzichten in de elektronica- , informatica- en mechanica-aspecten van je ontwerp. Je moet je ontwerpkeuzes dus kunnen motiveren, en bijvoorbeeld kunnen uitleggen wat de functie is van een component in je schakeling of van een bepaalde lijn code in je software. Je mag je dus best laten inspireren op ontwerpen van medestudenten, zolang je begrijpt hoe hun ontwerp in elkaar zit en het ook kan uitleggen.
4
2
Elektronica Oooh, ahhh, thats how it always starts. Then later there is running and screaming. Ian Malcolm
2.1
Modulair ontwerp
Complexe elektronische systemen kunnen opgesplitst worden in kleinere bouwstenen die e´ e´ n specifieke taak verrichten. Dat is ook het geval voor je wekker. De voornaamste elektronische bouwblokken zijn: • het display waarop de tijd zal aangegeven worden; • het bedieningspaneel waarmee de wekker kan bediend worden; • de interne klok waarmee de tijd wordt bijgehouden; • de buzzer waarmee het audiosignaal wordt geproduceerd; • de voeding die de wekker van de juiste spanning(en) voorziet; • de logica die de besturing van de wekker verzorgt. Het opsplitsen van een ingewikkeld elektronisch probleem in kleinere blokken biedt twee belangrijke voordelen: enerzijds is het gemakkelijker om een klein probleem op te lossen dan een ingewikkeld probleem, en anderzijds kunnen de individuele blokken later hergebruikt worden in andere soortgelijke projecten. Het is dus aangewezen dat je elk blokje afzonderlijk uitwerkt. Hieronder geven we enkele aanwijzingen om je met de verschillende blokjes op weg te helpen.
2.2
Het display
De taak van het display is om de tijd weer te geven. In principe kan het display zowel elektronisch (met cijfers) als mechanisch (met wijzers) zijn. Een wijzerplaat vergt echter heel nauwkeurige miniatuurmechanica, en die is erg moeilijk te implementeren. Vandaar dat de scope in dit project beperkt wordt tot elektronische dispays.
D ESIGN EN PROTOTYPING
6
2.2.1
ing. Y. Verbelen
Zevensegmentendisplays
De gemakkelijkste manier om een getal weer te geven is via een zevensegmentendisplay (eng. seven segment display). Zo’n display bestaat uit 7 segmenten die in de vorm van een 8 zijn vormgegeven. Elk segment heeft een afzonderlijke stuurpin waarmee het segment kan aan- of uitgeschakeld worden. Figuur 2.1 toont een voorbeeld van een zevensegmentdisplay.
Figuur 2.1: Voor- en achterkant van een losse zevensegmentdisplay (links) en module met 4 zevensegmentdisplays uit een videorecorder.
Intern zijn deze displays opgebouwd uit 7 LED’s, en je stuurt elke pin dus ook aan alsof je een LED zou sturen. Om het aantal pinnen te beperken, worden de 7 kathodes van de LED’s meestal aan elkaar gehangen en via e´ e´ n pin naar buiten gebracht. Zulke configuratie heet dan een common cathode display. Het omgekeerde heet een common anode display waarbij ale anodes aan elkaar hangen. Zevensegmentdisplays bestaan in alle vormen en maten. Sommige versies hebben nog een achtste segment dat een decimaal punt vormt. Net zoals LED’s zijn ook zevensegmentdisplays beschikbaar in allerlei kleuren, waarbij groen, rood en blauw de meest voorkomende kleuren zijn.
2.2.2
LCD/TFT-displays
Als de segmenten van een zevensegmentdisplay sterk worden verkleind en een volledig oppervlak ermee wordt gevuld, dan ontstaat een display waarop willekeurige karakters kunnen weergegeven worden. De meest voorkomende varianten zijn LCD-displays (eng. liquid crystal display) en TFT-displays (eng. thin film transistor display). Ze zijn de afgelopen jaren sterk in prijs gedaald omdat ze op grote schaal worden gebruikt voor smartphones, tablets en soortgelijke gadgets.
Figuur 2.2: LCD-display van een digitale camera (links) en 7 inch TFT touch display voor smartphone (rechts).
Bij LCD- en TFT-displays is het aantal segmenten zodanig groot dat het niet meer praktisch is om elk segment individueel naar buiten te brengen op een afzonderlijke pin. In plaats daarvan worden de meeste displays gestuurd via digitale signalen, waarbij elk segment (“pixel”) een uniek adres krijgt. Door een logische ‘1’ naar dit adres te schrijven wordt de pixel geactiveerd en licht op, met een logische 6
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
7
‘0’ kan de pixel weer uitgeschakeld worden. Er bestaan zowel monochrome dispays (met pixels in e´ e´ n kleur), bichrome displays (met 2 segmenten per pixel, elk met een andere kleur) en tot slot RGB-displays (met 3 segmenten per pixel: rood, groen en blauw). Hoe meer functies en kleurtjes een display heeft, hoe duurder het meestal wordt. Buiten LCD en TFT-displays bestaan er nog talloze andere variaties met andere werkingsprincipes, en dus ook andere karakteristieken. Denk bijvoorbeeld aan OLED-displays (organische LED’s), e-inkdisplays, plasmadisplays, enzovoort.
2.2.3
LED-displays
Je kan natuurlijk ook met afzonderlijke LED’s werken om de tijd weer te geven. Het voordeel bij deze aanpak is dat je je eigen display kan samenstellen, en dus volledig vrij bent om je creativiteit optimaal te benutten. Denk er wel aan dat je een groot aantal LED’s afzonderlijk bestuurbaar zult moeten kunnen maken. Een mogelijke oplossing hiervoor is om shiftregisters toe te passen. Displays met afzonderlijk stuurbare LED’s worden ook dot matrix displays genoemd (letterlijk: een matrix van aanstuurbare lichtpunten). Net zoals zevensegmentdisplays zijn ze verkrijgbaar in zowat alle mogelijke vormen, afmetingen en kleuren.
2.2.4
¨ Vacuumfluorescentiedisplays
Vacu¨umfluorescentiedisplays (afgekort VFD’s) zijn de voorlopers van moderne LCD-displays, en maken gebruik van gloeiende segmenten in een glazen vacu¨umkamer. Het voordeel van VFD’s is dat ze zelf licht uitstralen zonder dat daar een backlight voor nodig is zoals bij LCD- of TFT-displays. Door deze eigenschap hebben VFD’s een hoog contrast en worden ze dus toegepast in situaties waar er veel omgevingslicht aanwezig is, bijvoorbeeld in microgolfovens die in een fel verlichte keuken ook leesbaar moeten zijn. Je komt ze ook tegen in videorecorders, DVD-spelers en soortgelijke consumentenelektronica.
Figuur 2.3: Numeriek vacu¨umfluorescentiedisplay met 4 digits uit een videorecorder. Let op de glazen “tuit” in de linkerbovenhoek die tijdens productie werd gebruikt om het display vacu¨um te zuigen.
VFD’s hebben een lange levensduur ten opzichte van LCD- of TFT-displays, en onderscheiden zich van LCD’s doordat ze ook bij lage temperaturen nog blijven werken terwijl LCD-displays bevriezen. Bij VFD’s met een groot aantal segmenten is de controlelogica steeds ingebouwd waardoor je ze gemakkelijk digitaal kan sturen. 7
D ESIGN EN PROTOTYPING
8
2.2.5
ing. Y. Verbelen
Nixiebuizen
Een laatste optie is gebruik te maken van nixiebuizen (eng. nixie tube). Nixiebuizen stammen uit de tijd dat LEDs nog niet gangbaar waren in elektronica (de eerste LED werd pas in 1962 ge¨ıntroduceerd), en waren dus zowat de eerste component waarmee getallen konden weergegeven worden. Van ca. 1950 tot halverwege de jaren ’90 werden nixiebuizen in grote aantallen geproduceerd. Ze zijn momenteel nog steeds verkrijgbaar, maar omdat ze zeldzamer worden stijgt de prijs met de jaren. Online zijn ze echter nog goed verkrijgbaar, bv. via Ebay, AliExpress, SilkRoad etc. E´en van de voordelen van nixiebuizen, afgezien van hun prettig oranje gloed, is de lange levensduur: de beste buizen kunnen tot ca. 200 000 uren meegaan.
Figuur 2.4: Links twee losse NL5441 nixiebuizen (foto: Kirk Cline, public domain) en rechts een volledige klok opgebouwd met nixiebuizen (foto: Jeff Keyzer, CC BY-SA 2.0)
Net zoals zevensegmentdisplays hebben nixietubes een aansluiting voor elk segment. Alle cijfers van 0 tot 9 worden weergegeven door afzonderlijke segmenten, en nixiebuizen hebben daardoor 10 aansluitingen (´ee´ n voor elk getal) aangevuld met voedingsspanningen. Vervelend aan nixiebuizen is dat ze een speciale voet (eng. socket) nodig hebbem om in een breadboard of PCB te passen. Om een nixiebuis te activeren is er, naar moderne standaarden, een erg hoge voedingsspanning nodig (> 200 V DC). Met een eenvoudige transformator of step-up converter is dit gemakkelijk te realiseren. Neem uiteraard de nodige veiligheidsmaatregelen in acht als je met dergelijke hoge spanningen werkt, een schok van 200 V voelt niet prettig aan!
2.2.6
Aansturing
Tenzij je een displaytype met ingebouwde controller kiest, blijken alle displaytypes een groot aantal controlesignalen te hebben. Dat resulteert in ingewikkelde printplaatonwerpen en controllers die ook veel (digitale) IO-pinnen nodig hebben. Als je een microcontroller gebruikt, waar op het einde van dit hoofdstuk dieper op ingegaan wordt, dan zal je door het aansturen van het display alleen al te weinig IO-pinnen hebben. Het display is immers niet de enige functionaliteit van de wekker. De oplossing voor dit probleem is effici¨enter gebruik te maken van de bestaande controllerpinnen. 2.2.6.1
Multiplexing
Het menselijk oog is niet in staat om snelle veranderingen waar te nemen. Van deze traagheid wordt handig gebruik gemaakt in display designs omdat niet alle segmenten of pixels gelijktijdig hoeven aangestuurd te worden om toch die perceptie te wekken. Het scherm van je laptop wordt bijvoorbeeld tussen 60 en 100 keer per seconde hertekend (eng. refresh rate) en toch neem je die sequentieel veranderende pixels waar als e´ e´ n beeld. Zolang de refresh rate maar hoog genoeg is maakt het dus niet uit of alle segmenten of pixels parallel of sequentieel worden aangestuurd. Je kan dit principe zelf toepassen als je je display aanstuurt. Vooral 8
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
9
bij displays met verschillende identieke digits, zoals bijvoorbeeld zevensegmentdisplays, nixiebuizen of vacu¨umfluorescentiedisplays verloopt dit transparant omdat elke digit beurtelings wordt geadresseerd. Bij een display met bv. 5 digits wordt elk digit dan weliswaar slechts 20 % van de tijd aangestuurd, maar toch zal het lijken alsof alle digits permanent geactiveerd zijn. Multiplexing op deze manier heeft ook 2 nadelen. Enerzijds zullen digits minder fel oplichten omdat er geen continue stroom door loopt, wat grenzen stelt aan het aantal verschillende digits dat je op die manier nog zichtbaar kan aansturen. Anderzijds moet de refresh rate ook voldoende hoog zijn om te verhinderen dat de sequenti¨ele sturing voor de gebruiker zichtbaar wordt. Snelle bewegingen of vibraties kunnen bij te lage refresh rate tot discontinu¨ıteiten leiden, een fenomeen dat bekend staat als display break up. 2.2.6.2
Shiftregisters
Bij een groot aantal digits is het niet langer praktisch om ze via multiplexing elk om beurt aan te sturen omdat de vereiste klokfrequentie steeds hoger moet worden om een voldoende hoge refresh rate te halen, en omdat de duty cycle zo klein zal worden dat de tekst op de displays nauwelijks nog leesbaar is. Een gemakkelijke oplossing hiervoor is gebruik te maken van shiftregisters. Shiftregisters bestaan uit een reeks geheugencellen die parallel naar buiten gebracht worden, maar die serieel ingesteld worden. Op die manier kan een groot aantal extra pinnen gecre¨eerd worden met e´ e´ n enkele IO-pin van de microcontroller. Een typisch shiftregister is bijvoorbeeld de 74164, een IC uit de 74-reeks.
2.2.6.3
Charlieplexing
Een laatste mogelijkheid is gebruik te maken van Charlieplexing. Deze techniek maakt gebruik van de eigenschap van microcontrollerpinnen dat ze zowel als ingang als output kunnen dienen. Elke pin kan dus niet alleen actief logisch hoog of laag zijn, maar ook hoogimpedant zijn als de pin als ingang wordt geconfigureerd. Op die manier heeft een digitale pin dus 3 staten: hoog, laag of inactief. Charlieplexing is vooral voordelig in situaties waar je elementen met een (bijna) identieke drempelspanning wilt aansturen die maar in e´ e´ n richting geleiden zoals LED’s. Met 3 IO-pinnen kan je bijvoorbeeld 6 LED’s sturen. Voor hogere aantallen pinnen loopt dit aantal snel op: via Charlieplexing kan je met 4 pinnen al 12 LED’s sturen en met 5 pinnen 20 LED’s. Met n pinnen kan je n2 − n LED’s sturen. Charlieplexing heeft ook enkele nadelen. Het ontwerp van de schakeling, de software en de printplaat worden veel ingewikkelder, en nadien ook moeilijker te debuggen dan bij meer conventionele multiplexingtechnieken. Bovendien vereist Charlieplexing dat de configuratie van de segmenten (LED’s) vrij kan gekozen worden, waardoor deze techniek onbruikbaar is voor displays met vooraf vastgelegde segmentconfiguraties zoals zevensegmentdislays die ofwel common anode of common cathode zijn.
2.3
Het bedieningspaneel
Met het bedieningspaneel kan je de (alarm)tijd instellen, en uiteraard moet er een grote “snooze” knop voorzien zijn voor maandagochtend.
2.3.1
Drukknoppen
Drukknoppen zijn de simpelste manier om elektronica te besturen. Als ze worden ingedrukt dan maakt de knop intern contact tussen 2 geleidende plaatjes en gedraagt de knop zich elektrisch als een kortsluiting. Als ze niet ingedrukt wordt, dan is het elektrisch equivalent een open keten. Als je bv. een LED in serie zet met een drukknop, dan zal de LED oplichten als de knop wordt ingedrukt. Een drukknop is dus de perfecte keuze voor de snooze knop! 9
D ESIGN EN PROTOTYPING
10
ing. Y. Verbelen
Figuur 2.5: Het meest gebruikte type drukknop (tactile switch) in elektronica (links), een bedieningspaneel met 5 drukknoppen uit een inktjetprinter (midden) en een keypadmodule (rechts).
2.3.2
Draaischakelaars
Een alternatieve besturingstechniek is gebruik te maken van draaischakelaars. Als eraan gedraaid wordt dan geeft de schakelaar een aantal “ticks” dat evenredig is met de hoek waarover gedraaid wordt. Bij de meeste draaischakelaars voelt de gebruiker ook hoeveel posities hij/zij verdraaid heeft. Sommige draaischakelaars hebben een discreet aantal posities, denk bv. aan het type dat in je multimeter zit. Er bestaan ook continue draaischakelaars, die je oneindig ver in beide richtingen kan blijven daaien (zoals de draaischakelaars die op het bedieningspaneel van oscilloscopen worden gebruikt). Draaischakelaars worden courant gecombineerd met een drukknop, zodat je zowel kan draaien als drukken, bv. de draaiknop van de Ultimaker 3D-printers.
2.3.3
Joysticks
Joysticks bestaan in zowel een digitale als een analoge variant. Digitale joysticks zijn opgebouwd uit 4 of 5 drukknoppen die in een ruitvorm zijn geconfigureerd. Als de stick in e´ e´ n van deze richtingen wordt geduwd, dan worden de corresponderende drukknoppen ingeduwd. Dergelijke joysticks kan je dus gebruiken in plaats van meerdere drukknoppen. De Replicator 3D-printers werken volgens dit principe. Analoge joysticks zijn mechanisch ingewikkelder omdat ze in zowel een x-richting als een y-richting kunnen draaien, en elke riching is uitgerust met een potentiometer. In rust staan beide potentiometers in het midden. Als de stick naar een bepaalde richting wordt geduwd, worden de potentiometers verdraaid. Afhankelijk van de weerstandswaarde kan zo de positie van de stick bepaald worden.
2.3.4
Touchscreens
Wie opteert voor een LCD-display of TFT-display kan meteen kiezen voor een aanraakscherm (eng. touch screen). Dergelijke displays bieden een extra interface waarmee de co¨ordinaten van een eventuele vinger (of meerdere vingers) kunnen worden uitgelezen. Uiteraard is dit enkel zinvol als er op het scherm ook iets te zien is dat kan “aangewezen” worden. Hou er rekening mee dat touchscreens de duurste oplossing zijn (reken ca. 30 EUR voor een scherm van ca. 15 x 10 cm).
2.3.5
Potentiometers
Tot slot kunnen ook potentiometers gebruikt worden als bedieningselementen. Door aan potentiometers te draaien kan hun impedantie (weerstandswaarde) gewijzigd worden, en uit de impedantie kan je dus de positie afleiden. Het grootste nadeel aan potentiometers in vergelijking met draaischakelaars is dat het aantal omwentelingen (eng. turns) beperkt is tot een klein aantal. Er bestaan wel tientoerenpotentiometers die 10 volle toeren kunnen draaien voordat ze tegen hun limiet aanbotsen (zoals gebruikt in bv. voedingen om de spanning te regelen of in je stereo-installatie voor de volumeregeling), maar die zijn duur en niet 10
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
11
zo gemakkelijk verkrijgbaar. Voor sommige applicaties, bijvoorbeeld het instellen van het contrast op het display, is een potentiometer perfect geschikt. Om de tijd in te stellen gebruik je echter beter een draaischakelaar met een ongelimiteerd aantal toeren.
2.3.6
Debouncing
Alle mechanische schakelaars zijn gebaseerd op hetzelfde principe: 2 metalen contacten die al dan niet tegen elkaar gedrukt worden. Wanneer een drukknop wordt ingedrukt dan lijkt het alsof die onmiddellijk contact maakt, maar in de praktijk is dat niet zo. Wanneer de metalen contacten elkaar raken dan zullen ze kortstondig trillen, waardoor de verbinding heel snel aan- en uitgeschakeld wordt. Dit is weliswaar een overgangsverschijnsel dat slechts een fractie van een seconde duurt, maar als je een drukknop zou gebruiken als ingang van een teller (eng. counter) dan zou je merken dat er meer dan e´ e´ n puls geteld wordt omdat de counter ook alle trillingen “ziet”. Dergelijke trillende schakelaars en knoppen zijn een gekend probleem in de elektronica dat bouncing (letterlijk: op en neer springen) heet. Om de trillingen weg te werken, het zogenaamde debouncing, bestaat er een waaier aan technieken. De simpelste oplossing is een kleine laagdoorlaatfilter (eng. low pass filter, LPF) toe te voegen. Dergelijk filters bestaan uit e´ e´ n condensator en e´ e´ n weerstand, en zullen de trillingen volledig wegwerken. De exacte waarden van deze weerstand en condensator zijn niet kritisch. Als steile flanken noodzakelijk zijn, omdat een zuiver digitaal signaal gewenst is, dan kan je een comparator of schmitttrigger toevoegen na de filter. In de meeste gevallen is dit echter niet nodig. Als je gebruik maakt van een microcontroller dan kan je de debouncing ook in software uitvoeren door een lopend gemiddelde (eng. moving average) te nemen van het ingangssignaal. Als de periode waarover je het gemiddelde berekent lang genoeg is, dan zal bij een druk op de knop het gemiddelde continu toenemen. De software kan dan een bewerking of actie uitvoeren als het gemiddelde een bepaalde drempelwaarde die je zelf kiest overschrijdt.
2.4
De klok
Met een digitale klok hou je intern de tijd bij.
2.4.1
Real Time Clock
Een real time clock (RTC) heeft als taak om de tijd bij te houden. RTC’s zijn verkrijgbaar als ge¨ıntegreerde schakelingen waarop je een kwartskristal moet aansluiten om een stabiel kloksignaal te genereren. Interessanter dan de losse chips zijn RTC-modules, waar vaak ook nog een batterijtje op zit dat de tijd kan bijhouden ook als je wekker niet op de netspanning is aangesloten, of als er bv. ’s nachts een stroompanne optreedt. Een courant toegepaste RTC chip is de DS1307, die je digitaal via het standaardprotocol I2 C (interchipcommunicatie) kan uitlezen. Ze zijn gemakkelijk online verkrijgbaar.
2.4.2
Microcontroller
Microcontrollers zijn ook uitgerust met een kwartskristal, en ze zijn dus ook in staat om de tijd bij te houden door clock ticks te tellen in software. Op Arduino geeft de functie millis() het aantal milliseconden sinds de processor gestart werd, dat je kan gebruiken om de tijd bij te houden. De tijd bijhouden in een microcontroller heeft als voornaamste nadeel in vergelijking met een RTC dat de tijd wordt gereset als de spanning uitvalt, tenzij je de volledige microcontroller voedt van een extra backupbatterijtje. De voedingsschakeling wordt dan wel een stuk complexer. 11
D ESIGN EN PROTOTYPING
12
2.4.3
ing. Y. Verbelen
Synchronisatie
In Frankfurt staat een krachtige zender die op een frequentie van 77.5 kHz draadloos een tijd- en datumsignaal uitstuurt dat quasi overal in West-Europa te ontvangen is. De zender is aangesloten op een nauwkeurige cesiumklok, en het uitgestuurde signaal bevat o.a. informatie over de tijd (uren, minuten, seconden) en de datum (jaar, maand, dag, dag van de week). Om dit signaal te ontvangen heb je een kortegolfantenne nodig en een stukje logica om het signaal te decoderen. DCF77 ontvangers zijn ook verkrijgbaar als kant-en-klare modules die je rechtstreeks in je wekker kan integreren. Je kan online talloze schakelingen vinden om zelf zo’n ontvanger te bouwen, en in Elektor worden er ook regelmatig implementaties gepubliceerd. Het ontvangen van het DCF77-signaal is, net zoals gewone radio, gratis. Het voornaamste voordeel is dat je de tijd niet meer manueel hoeft in te stellen, en dat je wekker automatisch overschakelt van zomeruur op winteruur en vice versa, rekening houdt met schrikkeljaren etc.
2.5
De buzzer
De belangrijkste taak van een wekker is uiteraard om een zodanig ergerlijk lawaai te produceren dat men ervan wakker wordt, en niet meer terug in slaap kan vallen. Het produceren van dit geluid is de taak van de buzzer.
2.5.1
Pi¨ezobuzzers
Pi¨ezobuzzers zijn de gemakkelijkste manier om geluid te produceren. Ze bestaan uit 2 of meerdere laagjes pi¨ezo-elektrisch materiaal. Dit materiaal heeft als bijzondere eigenschap dat het mechanisch vervormt als er een spanning over wordt aangelegd. Door deze mechanische vervorming worden trillingen geproduceerd, die zich door de lucht voortplanten onder de vorm van hoorbaar geluid. Een eenmalige spanning aanleggen (DC) zal leiden tot een eenmalige vervorming, en dus een heel korte “klik” van de buzzer. Wil je een een continu geluid, dan moet je de buzzer dus ook aan een continu veranderende spanning (AC) onderwerpen. De frequentie van dit signaal bepaalt de snelheid waarmee het materiaal gaat trillen, en dus ook de frequentie van het geluid. Deze frequenties zijn wel enigszins beperkt in bandbreedte: heel lage frequenties (bassen) kan je er niet mee produceren. Omdat pi¨ezobuzzers elektrostatisch werken, verbruiken ze maar heel weinig energie. Je kan ze dus rechtstreeks voeden uit een eenvoudige transistorversterker, of digitaal aansturen met een MOSFET.
Figuur 2.6: Enkele pi¨ezobuzzers (links) en subwoofer met tweeter (rechts).
2.5.2
Luidsprekers
Luidsprekers verschillen van pi¨ezobuzzers doordat ze elektromagnetisch werken in plaats van elektrostatisch. Ze bestaan uit een permanente magneet die in een elektromagneet is opgehangen (of omgekeerd). 12
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
13
Een stroom door de elektromagneet zal ervoor zorgen dat de magneet in of uit de elektromagneet beweegt, en daarbij ook trillingen veroorzaakt. De bewegingsrichting is dus afhankelijk van de stroomzin. Net zoals een pi¨ezobuzzer stuur je een luidspreker aan met een AC-signaal. De frequentie van dit signaal bepaalt de frequentie en toonhoogte van het geproduceerde geluid. Het voornaamste voordeel van luidsprekers is dat ze ook lage frequenties (bassen) goed kunnen produceren, wat pi¨ezobuzzers niet kunnen. Het volume kan ook veel groter zijn. Het nadeel is wel dat er een merkbare stroom door de elektromagneet moet lopen, en een luidspreker heeft dus een versterkerschakeling nodig. Afhankelijk van het vermogen van de luidspreker zijn er verschillende versterkerschakelingen mogelijk. De gemakkelijkste manier is om met een vermogenversterker zoals de TDA2003 te werken, die behoorlijk wat lawaai kan produceren zelfs als je op een 9 V batterijtje werkt!
2.6
De voeding
De taak van de voeding is om alle componenten in je schakeling van de juiste voedingsspanning te voorzien. De complexiteit van de voedingsschakeling hangt dus sterk af van de andere blokken in je schakeling: hoe meer verschillende voedingsspanningen je nodig hebt (bv. 3.3 V, 5 V, 12 V etc.) hoe ingewikkelder de voedingsschakeling zal worden.
2.6.1
Batterijen
De simpelste manier om je wekker te voeden, en ook de meest ineffici¨ente, is door gebruik te maken van batterijen. Batterijen gedragen zich als spanningsbronnen waarvan de spanning afneemt naarmate ze “leeg” geraken. Courant gebruikte batterijen zijn alkaline (1.5 V), NiMH (1.2 V), lithium-ion (3.6 V), lithium-polymeer (3.7 V) en loodgel (12 V). De batterijkeuze hangt af van welke spanning(en) je nodig hebt. De meeste hedendaagse batterijen zijn herlaadbaar (secundaire cellen), maar ook niet herlaadbare alkalinebatterijen zijn nog steeds in de handel verkrijgbaar. Deze moet je dus vervangen als ze leeg zijn. Ontwerp de behuizing zodanig dat je gemakkelijk aan de batterijen kan zonder de volledige wekker te moeten demonteren!
Figuur 2.7: Van links naar rechts: 9 V herlaadbare NiMH batterij, 3.7 V 300 mAh Li-Ion batterij, 3.6 V 2.2 Ah Li-Ion batterij (18650 formaat zoals gebruikt in laptop battery packs), 11.1 V 2.2 Ah LiPo batterij voor quadcopters, en 12 V loodgel batterij als backup voor alarmsystemen.
Herlaadbare batterijen kan je terug opladen in speciale batterijladers, of je kan de schakeling om de batterij te herladen ook direct integreren in je wekker. Dat spaart de gebruiker de moeite van de constante batterijwissels uit. Voor zowat alle batterijtypes zijn er speciale chips (IC’s) verkrijgbaar die de volledige laadcyclus controleren, maar de meeste batterijen laten zich ook gewoon laden met een constante laadstroom (zie toepassing stroombronnen in WPO Basiselektronica).
13
D ESIGN EN PROTOTYPING
14
ing. Y. Verbelen
Lithiumbatterijen (zoals gebruikt in laptops of quadcopters) kunnen een fikse stroom leveren, en mogen dus in geen geval kortgesloten worden. Ontwerp je schakeling zodanig dat kortsluiting onmogelijk is, en voeg een zekering toe in serie met de batterij(en)!
2.6.2
Netadapter
In compacte toepassingen is er vaak niet genoeg ruimte om een voedingsschakeling te integreren, en dus wordt gebruik gemaakt van een netadapter. Je herkent ze als hermetisch gesloten zwarte doosjes waar aan de ene kant een netstekker (230 V AC) binnenkomt en langs de andere kant een veel lagere DCspanning kan afgenomen worden. Netadapters voor elektronische toestellen geven gewoonlijk 3.6 V of 5 V voor gadgets zoals GSM’s, mp3-spelers en navi’s, 9 V of 12 V voor speelgoed (zoals modeltreinen etc.) en 19 V of 21 V voor laptops.
Figuur 2.8: Schakelende voeding van een netwerkswitch (links) en 750 W voeding van een gaming pc (rechts).
Netadapters blijven vaak over nadat de toestellen waarvoor ze oorspronkelijk bedoeld waren al lang kapot of in onbruik geraakt zijn. Je hebt thuis in e´ e´ n of andere schuif zeker nog netadapters van vorige printers, scanners, GSM’s, fototoestellen e.d. liggen die perfect kunnen gebruikt worden om je wekker van stroom te voorzien. Als de spanning van de netadapter niet precies overeenkomt met de vereisten in jouw schakeling, dan moet je gebruik maken van een spanningsregulator of DC/DC converter om de spanning te verlagen.
2.6.3
Netvoeding
Je kan natuurlijk ook zelf de schakeling bouwen die in netadapters zit, of toch e´ e´ n die er sterk op lijkt. Moderne netadapters werken met geschakelde voedingen (eng. switched mode power supply) die erg zuinig zijn maar ook zeer ingewikkeld om te bouwen en te debuggen. Een eenvoudige lineaire voeding kan je daarentegen gemakkelijk zelf bouwen met een handvol componenten. Met behulp van een transformator verlaag je de 230 V AC naar een lagere AC spanning, die je vervolgens met diodes gelijkricht om er een DC van te maken. Dan alleen nog een filter of spanningsregulator erachter om de ruis te reduceren, en je eigen voeding is klaar! Online vind je talloze schakelingen van netvoedingen voor allerlei spanningen. Let op bij het aansluiten van de transformator: transformators werken namelijk in twee richtingen! Als je een transformator met 15:1 ratio gebruikt om de spanning te verlagen dan kom je ca. 15 V uit aan de secundaire zijde, die perfect is voor elektronica. Maar als je hem verkeerd aansluit dan wordt de 230 V netspanning opgetransformeerd tot 3.5 kV wat potentieel levensgevaarlijke situaties oplevert! Vraag dus steeds aan e´ e´ n van de toezichthoudende docenten om je schakeling te checken alvorens je ze aansluit op het stopcontact. 14
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
15
Figuur 2.9: Links een netadapter voor een laptop van 19 V. Rechts: een lineaire netvoeding. De grote zwarte component is de transformator, gevolgd door de bruggelijkrichter (zwart blokje aan de linkerkant), en een oranje afvlakcondensator. De lineair spanningsregulator is vastgeklemd op een koelvin (eng. heat sink).
2.6.4
Spanningsregulators
Stel dat je wekker een voedingsspanning van 6 V nodig zou hebben. Een netadapter met die specifieke spanning ga je niet gemakkelijk vinden, en een USB-adapter van 5 V is te weinig. Je kan natuurlijk 4 1.5 V alkalinebatterijen in serie zetten, maar dat is verre van praktisch. De oplossing voor dit probleem is te vertrekken van een hogere spanning, en gebruik te maken van een zogenaamde spanningsregulator (eng. voltage regulator). Spanningsregulators zijn elektronische componenten die een DC voedingsspanning omzetten in een andere, lagere DC voedingsspanning naar keuze. Ze zijn verkrijgbaar in uitvoering met constante uitgangsspanning voor veel voorkomende waarden, bv. 3.3 V, 5 V en 12 V. Positieve regulators krijgen de prefix “78”. Een spanningsregulator voor 5 V wordt dan aangeduid met typenummer “7805”, een regulator voor 24 V met typenummer “7824” enzovoort. Er bestaan ook versies waarmee je zelf de spanning kan kiezen, zoals bv. de LM317. Spanningsregulators zijn heel gemakkelijk in gebruik, de enige externe componenten die je nodig hebt om ze aan te sluiten zijn een condensator op de ingang (als buffer) en een andere condensator op de uitgang (als filter). Deze spanningsregulators zijn vooral interessant als de spanning die je wilt overbruggen niet te groot is, en je ook niet teveel stroom nodig hebt (max. ca. 200 - 400 mA).
Figuur 2.10: Enkele spanningsregulators (van links naar rechts): een 7833 in TO-92 package, een 7805 in TO-220 package, een LM317 regelbare spanningsregulator in TO-3 package. De meest rechtse regulators zijn schakelend (DC/DC): een MC34063 in DIP-8 package en een LM2596 in TO-220-5 package.
Het probleem met lineaire spanningsregulators zoals de 7805 en 7812 is dat het spanningsverschil bij een bepaalde stroom wordt omgezet in warmte. Stel bv. je gebruikt een 7805 lineaire regulator om een voedingsspanning van 12 V om te zetten naar 5 V. Bij een stroom van 100 mA is het vermogen dat gedissipeerd wordt in de regulator P = (12 − 5) · 0.1 = 700 mW. De regulator zal dus behoorlijk heet worden. In de meeste re¨ele situaties zullen deze regulators dus opbranden lang vooraleer je de maximale stroom die in hun datasheets vermeld staat bereikt! 15
D ESIGN EN PROTOTYPING
16
ing. Y. Verbelen
De oplossing voor dit probleem is gebruik te maken van geschakelde regulators (eng. switched mode regulators). Deze regulators maken gebruik van een externe spoel (inductor) om de spanning op de uitgang constant te houden, en hebben in vergelijking met lineaire regulators een hoog rendement. Netadapters voor laptops werken bijvoorbeeld met dit principe omdat het verschil tussen ingangsspanning en uitgangsspanning behoorlijk groot is, en de adapter een flinke stroom moet kunnen leveren tijdens games. Het nadeel aan geschakelde regulators is, zoals eerder vermeld, dat de schakeling iets ingewikkelder is. Je hebt een externe spoel nodig, een flybackdiode en minstens 2 condensators. Afhankelijk van het type regulator kunnen daar nog eens weerstanden bijkomen. Een gangbaar type geschakelde regulator is de LM2596, die een stroom van 3 A kan leveren bij ingangsspanningen tot ca. 30 V. Je kan de gewenste uitgangsspanning instellen met een spanningsdeler op de uitgang van de regulator.
2.7
De logica
Je merkt aan de vorige blokken dat je in je wekker deelschakelingen zult moeten laten samenwerken die sterk van elkaar verschillen. Als de blokken zuiver digitaal zijn en de interfaces min of meer gelijk, dan kunnen enkele logische poortjes vaak volstaan. Dit heet “glue logic” en werd vroeger vaak discreet ge¨ımplementeerd met 74xx of 40xx serie IC’s of “chips” (eng. integrated circuit), maar tegenwoordig meestal in e´ e´ n CPLD of FPGA (eng. Field Programmable Gate Array). Een FPGA kan je beschouwen als een “lege” digitale chip waarin je zelf de gewenste digitale logica zoals AND, OR, XOR etc. poorten kan defini¨eren. Hoewel FPGA’s heel krachtig zijn, is het gebruik ervan nogal omslachtig: ze hebben een groot aantal verschillende voedingsspanningen nodig die elk eigen ontkoppelcondensators vereisen, en het grote aantal pinnen maakt het lastig om ze aan te sluiten. Bovendien zijn ze niet verkrijgbaar in een package dat breadboardcompatibel is, wat het ontwikkelen van prototypes veel moeizamer maakt. Bovendien zijn FPGA’s zuiver digitale systemen, dus als je verbinding wilt maken met de analoge wereld, bijvoorbeeld om een licht- of temperatuursensor uit te lezen, dan moet je nog extra chips toevoegen om de analoge signalen te converteren naar digitale signalen die de FPGA kan verwerken. Dat is dus een omslachtige procedure. Een alternatieve methode om informatie te verwerken en je wekker aan te sturen is door gebruik te maken van software. Software wordt traditioneel uitgevoerd door een microprocessor. Microprocessors zoals je die in je laptop zitten zijn echter gespecialiseerd in het uitvoeren van instructies, en hebben nog een hoop extra chips nodig om bijvoorbeeld hun instructies in te bewaren (flashgeheugen), hun data in op te slaan (RAM-geheugen) enzovoort. Vanwege de grote verzameling benodigde elektronica is een microprocessor dus ook niet erg praktisch voor eenvoudige toepassingen zoals deze wekker. Een goed compromis is de geavanceerde functionaliteiten van moderne microprocessors te schrappen, en een sterk vereenvoudigde processor samen met een stukje RAM-geheugen en een stukje flashgeheugen te integreren in e´ e´ n enkele chip. Dit heet een microcontroller. Moderne microcontrollers bevatten naast een processorkern, flashgeheugen en RAM-geheugen ook nog een hoop extra logica: via een analoog naar digitaal converter (ADC) kunnen ze meteen analoge signalen inlezen, en ze bevatten extra kernen voor seri¨ele communicatie. High end microcontrollers zoals die in bijvoorbeeld scanners of printers gebruikt worden, kunnen zelfs een ge¨ıntegreerde USB-controller of motorsturing bezitten, zodat je rechtstreeks met een pc kan communiceren via USB! De voornaamste fabrikanten van microcontrollers zijn momenteel Microchip (de PIC serie), Texas Instruments (MSP430 en CC serie), NXP (de LPC serie), Atmel (AT serie) en ST Microelectronics (STM serie). Elke microcontroller heeft zijn eigen functionaliteiten, geheugengrootte, maximale kloksnelheid enzovoort. De juiste microcontroller kiezen voor een bepaalde toepassing is dus geen gemakkelijke opgave, die ook voor ervaren elektronici heel wat tijd in beslag kan nemen. Een te krachtige microcontroller kiezen is immers onnodig duur, en met een te zwakke zal het niet mogelijk zijn om de applicatie te realiseren. Microcontrollers hebben een hoop pinnen, voor in- en uitvoer van data maar ook voor voeding, aan16
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
17
sluiting met de programmer enzovoort. Om die reden worden er regelmatig nieuwe ontwikkelbordjes op de markt gebracht. Dit zijn printplaatjes (PCB’s, eng. printed circuit boards) waarop een microcontroller is gesoldeerd samen met alle logica die hij nodig heeft om ermee aan de slag te kunnen. Typische componenten die je op deze ontwikkelbordjes terugvindt zijn bijvoorbeeld een USB-connector, een voedingsconnector, spanningsregulators, een klokgenerator, connectors voor analoge en digitale signalen, enzovoort. Initieel werden deze bordjes ontwikkeld door de microcontrollerfabrikanten zelf onder de naam “evaluation boards” maar tegenwoordig worden de meeste bordjes ontwikkeld door de elektronica “community” die bestaat uit hobbyisten en studenten. Crowdfunding is hierbij een belangrijke drijvende kracht, en als je rondkijkt op crowdfundingsites zoals Kickstarter of Indiegogo zal je talloze dergelijke bordjes tegenkomen. Veruit het meest gebruikte ontwikkelbord op dit moment is de Arduino Uno. Dit ontwikkelbord van Italiaanse origine bestaat uit een ATmega328p microcontroller van Atmel, een 16 MHz klokgenerator, een USB-controller en USB-connector voor verbinding met je laptop, een spanningsregulator voor 5 V en voor 3.3 V, enkele LED’s, en 4 female board to board connectors om digitale of analoge signalen aan te sluiten op het bord. De Arduino Uno is erg gemakkelijk in gebruik omdat er talloze codevoorbeelden voor te vinden zijn op het internet. De ondersteuning (eng. support) voor een ontwikkelbord bepaalt in belangrijke mate hoe snel je er een applicatie mee zal kunnen prototypen. Als je nog geen eigen Arduino Uno hebt, dan is het wekkerproject de gepaste gelegenheid om enkele exemplaren aan te schaffen. Je kan Arduino’s online vinden, alweer op AliExpress, vanaf ca. 3 EUR per stuk. De programmatuur (software) is zodanig belangrijk dat er een volledig hoofdstuk aan wordt gewijd.
17
18
18
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
3
Microcontrollers programmeren If we knew what it was we were doing, it would not be called research, would it? Albert Einstein
3.1
De Arduino Uno
Het Arduino Uno ontwikkelbord heeft de grootte van een betaalkaart en is daarmee behoorlijk compact. Laat je echter niet verrassen, de mogelijkheden van dit bord zijn erg uitgebreid! Figuur 3.1 toont een schematische weergave van de Arduino Uno met de voornaamste componenten erop.
2
1
0 RX0
3
TX0
4
5
ICSP
1
7
6 7 8 9
digitale IO-pinnen voedingspinnen analoge pinnen ATmega328p microcontroller
A5
A4
ANALOG IN A2
POWER GND
GND
5V
9 3V3
4
6
7
8
9
10
11
13
12
5
3
DC-jack
ON
TM
Arduino
A1
TX RX
A0
2
)
L
VIN
1
spanningsregulators
UART LED's
DIGITAL (PWM=
ICSP2
A3
RESET
RESET
USB-UART converter
AREF
USB-connector
IOREF
1 2 3 4 5
GND
6
8
Figuur 3.1: Arduino Uno ontwikkelbord met aanduiding van de voornaamste componenten en connectors (schema Arduino Uno: Nevit Dilmen, CC BY-SA 3.0).
De Arduino Uno heeft 8 connectors: een USB-B connector voor verbinding met de pc, een DC “barrel” jack voor aansluiting van een DC-voeding, en 2 dual row 6 pin headers die als ICSP-connectors voor respectievelijk de USB-UART-converter en de ATmega328p zelf. De belangrijkste connectors zijn echter de 4 female board to board headers die toelaten om het bord te verbinden met de buitenwereld. De pinnen op de digitale headers en de analoge header zijn rechtstreeks verbonden met de ATmega328p microcontroller. Figuur 3.2 toont de functies van deze pinnen.
20
20
D ESIGN EN PROTOTYPING ing. Y. Verbelen
Figuur 3.2: Pinout van de Arduino Uno, met aanduiding van de functies van de verschillende pinnen en connectors. (diagram: Romano dEzzelino, CC BY-SA 3.0)
ing. Y. Verbelen
3.1.1
D ESIGN EN PROTOTYPING
21
De voeding
Net zoals elke andere elektronische schakeling moet ook een Arduino gevoed worden met een geschikte DC-spanning. Omdat de ATmega328p op een spanning van 5 V werkt, moet deze spanning minstens 5 V bedragen. Er zijn 3 manieren om je Arduino te voeden: via de USB-connector, de DC-jack en de Vin pin. Tijdens de eerste fase van de softwareontwikkeling heb je zelden behoefte aan extra elektronica rond je Arduino, en is het ontwikkelbord alleen voldoende om van start te gaan. De Arduino kan dan perfect gevoed worden via USB (connector 1 in figuur 3.1), die tot 500 mA uit een USB 2.0 en zelfs 5 A uit een USB 3.0 poort kan leveren. Het enige wat je hiervoor hoeft te doen is de Arduino via USB te verbinden met een host device zoals een pc. Van zodra je de kabel inplugt, start de Arduino automatisch op. Op de Arduino zit een zekering van 500 mA die verhindert dat de USB-hub van de pc overbelast geraakt als je teveel stroom door de USB-kabel probeert te trekken. Deze zekering beveiligt echter niet tegen hoge spanningen, sluit nooit een spanning aan op de USB-connector die hoger of lager is dan 5 V ± 0.25 V. Eens je software (quasi) af is en je wilt je schakeling testen, dan is het lastig om de pc steeds verbonden te houden omdat de USB-kabel dan op e´ e´ n of andere manier uit de behuizing moet, en altijd te kort blijkt te zijn. Voor deze situaties is er een DC-jack (connector 4 in figuur 3.1) voorzien waar je een netvoeding in kunt pluggen, zoals in het vorige hoofdstuk werd besproken. Deze “barrel” jack is center positive wat betekent dat de positieve spanning wordt gedragen door de middelste pin, en de buitenste cilinder errond op grondpotentiaal is. De DC-jack verdraagt ingangsspanningen tot 25 V DC omdat deze ingangsspanning door een lineaire spanningsregulator ( 3 in figuur 3.1) wordt gevoerd die ze verlaagt tot de 5 V die nodig is om de ATmega328p te voeden. Opdat de lineaire regulator correct kan werken, moet de ingangsspanning steeds minstens 500 mV hoger zijn dan de uitgangsspanning. Bijgevolg moet je op de DC-jack een spanning van ca. 7 V of hoger aanleggen, omdat er tussen DC-jack en spanningsregulators nog een diode zit als ompoolbeveiliging. Let op: hoe hoger de ingangsspanning, hoe minder stroom de lineaire regulator zal kunnen leveren doordat het vermogen (= warmte) die kan gedissipeerd worden beperkt is! Tot slot is er nog de Vin -pin op de power header van de Arduino, connector 7 in figuur 3.1. De eerste pin is daar gelabeled als Vin , en kan net zoals de DC-jack gebruikt worden om de Arduino te voeden met een DC-spanning van 6 V of hoger. De DC-jack en de Vin -pin zijn onderling verbonden met een diode, die tussen de DC-jack en de Vin -pin voorwaarts is gepolariseerd. Als je dus zelf geen spanning aanlegt op de Vin -pin dan zal deze diode geleiden als je een spanning op de DC-jack inplugt, waardoor op de Vin -pin dezelfde spanning minus de spanningsval over de diode komt te staan. Omgekeerd gaat niet omdat de diode dan spert. In geen geval mag je op de DC-jack een hogere spanning inpluggen dan een spanning die je op de Vin -pin aanlegt! In dat geval zal de diode namelijk gaan geleiden, en beide voedingen kortsluiten. Maak er dus een goede gewoonte van om o´ f de DC-jack o´ f de Vin -pin te gebruiken, maar nooit beide.
3.1.2
Randapparatuur
Omdat de ATmega328p en de USB-controller rechtstreeks met de 5 V power rail van de Arduino zijn verbonden, is de Arduino gevoelig voor fluctuaties van deze voedingsspanning. Een te grote stroom afnemen via de 5 V-pin op de power header van de Arduino zal ertoe leiden dat deze spanning in elkaar klapt, waardoor de microcontroller reset en het programma weer vanaf het begin wordt herstart. Te lage spanningen (minder dan 0) of te hoge spanningen (meer dan 5 V) kunnen de ATmega328p zelfs onherstelbaar beschadigen. Dit kan ertoe leiden dat de ATmega328p niet meer kan geprogrammeerd worden, en de Arduino dus definitief onbruikbaar is. Het risico op dergelijke beschadigingen kan drastisch gereduceerd worden door de 5 V van de Arduino zo weinig mogelijk te belasten door externe randapparatuur. Grote verbruikers zoals lange LEDstrips, servomotors, DC-motors, relais, stappenmotors enzovoort mag je dus niet voeden via de Arduino, 21
D ESIGN EN PROTOTYPING
22
ing. Y. Verbelen
zelfs als ze ook net 5 V nodig hebben (zoals o.a. het geval is bij servomotors). Voor deze belastingen moet je steeds een afzonderlijke voeding voorzien die gescheiden is van de andere elektronica en waarop fluctuaties toegelaten zijn. In talrijke schakelingen die je op het Internet aantreft wordt gezondigd tegen deze regel voor gescheiden voedingen, dus laat je er niet toe verleiden deze fouten over te nemen in je eigen ontwerp.
3.2
De toolchain
Als je de Arduino Uno uit zijn verpakking haalt dan is de microcontroller in feite leeg. Er is enkel een klein stukje software aanwezig dat verantwoordelijk is voor het inladen van nieuwe programma’s, de zogenaamde bootloader. Als je de Arduino Uno inplugt in je laptop via een gewone USB-kabel dan wordt de microcontroller gevoed via de USB-poort en start meteen op. Maar er gebeurt natuurlijk niks omdat er nog geen software in zit! Mogelijk lichten er wel e´ e´ n of meerdere LED’s op om aan te geven dat het bord gevoed wordt en klaar is voor actie. Hoe krijg je dan je eigen programma in de microcontroller gedownload? Daarvoor heb je een stukje software nodig op de pc, waarin je de instructies kan invoeren. Deze software is afhankelijk van het type ontwikkelbord dat je gebruikt, en voor Arduino heet deze software Arduino IDE (eng. integrated development environment). Ze is gratis te downloaden van de Arduino website1 en beschikbaar voor Windows en Linux. Download en installeer de Arduino IDE als je dit nog niet gedaan hebt. Naast een tekstverwerker waar je je programmacode in kan typen, biedt de Arduino IDE nog enkele extra functies. Er zit o.a. een seri¨ele monitor in, een funtie waarmee je data die de Arduino naar de pc stuurt kan inlezen en weergeven als tekst op het scherm. Nog belangrijker is echter de compiler toolchain. De compiler is verantwoordelijk voor het omvormen van je programmacode naar instructies die de ATmega328p op de Arduino kan begrijpen en uitvoeren. Hier komen heel wat ingewikkelde tussenstappen bij kijken, maar gelukkig hoef je die niet te kennen om een Arduino te kunnen programmeren omdat de compiler achter de schermen wordt aangeroepen door de Arduino IDE. Nadat je programma gecompileerd is, zal de Arduino IDE de downloader aanroepen die het programma dan naar de Arduino downloadt en in de ATmega328p microcontroller programmeert. De Arduino IDE vereenvoudigt al deze handelingen via enkele knoppen bovenaan het venster, waarmee je respectievelijk de syntaxis kan controleren of kan compileren en downloaden in e´ e´ n stap.
3.2.1
C/C++
De ATmega328p beschikt over 32 kilobytes (kB) flashgeheugen en 2 kB RAM-geheugen (= werkgeheugen). Dit is voldoende om duizenden instructies in op te slaan en uit te voeren, maar niet genoeg om het volledige .NET Framework dat je voor C# nodig hebt te bewaren. Bijgevolg kan je Arduino’s dus helaas niet programmeren in C# maar is er een andere taal nodig die eenvoudiger is en dichter bij de hardware staat. Deze taal heet C. In feite is C# afgeleid van C, en de basissyntaxis van C# komt dus grotendeels overeen met C. De enige verschillen zijn de afwezigheid van alle .NET bibliotheken en de meeste objectge¨ori¨enteerde functionaliteit (events, controls etc.) in C. De enige uitzondering hierop zijn klassen en structuren, die je wel kan gebruiken. Declaratie van variabelen, functies, beslissingsstructuren en lussen is echter grotendeels identiek. Momenteel is C de standaardtaal voor het programmeren van microcontrollers. Eens je het principe onder de knie hebt, kan je eigenlijk alle microcontrollers van alle fabrikanten programmeren. Je hoeft dan enkel de specifieke toolchains voor die microcontrolles te installeren op je pc. Microcontrollers programmeren kan je dus vergelijken met fietsen: er zijn wel wat verschillen tussen een stadsfiets en een mountainbike, maar wie kan fietsen kan beide besturen, en je zal er behoorlijk snel aan wennen. Je kan dan je printer, mp3-speler of elk ander toestel met een microcontroller erin programmeren net zoals je je Arduino Uno programmeert! 1 https://www.arduino.cc/en/Main/Software
22
ing. Y. Verbelen
3.2.2
D ESIGN EN PROTOTYPING
23
Shields en bibliotheken
Doordat er zoveel elektronici bezig zijn met Arduino, zowel hobbyisten als professionals, bestaan er talloze uitbreidingsmodules die op het Arduino Uno ontwikkelbord kunnen ingeplugd worden. Deze modules heten in de Arduinowereld shields. Er bestaan shields die je Arduino toelaten om stappenmotors aan te sturen, verbinding te maken met Ethernet, uitrusten met accelerometers en gyroscopen, enzovoort. Veel van deze shields zijn bovendien open source zodat je ze zelf kan namaken. Shields zijn uitgerust met male headers die in de female board to board headers op de Arduino Uno passen. Bij shields hoort meestal ook een codebibliotheek die ontwikkelaars helpt om de shields aan te sturen in software. Het doel van deze bibliotheken is om het gebruik van de shields transparant te maken voor de programmeur zodat die zich niet hoeft bezig te houden met het uitpluizen van schema’s om pinnummers op te zoeken, of met het doorgronden van datasheets. Bibliotheken vind je online, in repositories zoals Sourceforge of Github, of via webshops die shields verkopen zoals Sparkfun of Adafruit. Bibliotheken installeren doe je eenvoudigweg door de code te downloaden naar je pc en in de libraries folder van je Arduino IDE bij te plaatsen. Je kan ze dan vervolgens toevoegen aan je codeprojecten via include en vervolgens gebruiken. Buiten specifieke bibliotheken die bij shields horen, zijn er ook ontelbare bibliotheken beschikbaar die het programmeren van Arduino gemakkelijker maken door te helpen bij het aansturen van interrupts (het equivalent van events op microcontrollers), het reguleren van delays, het berekenen van wiskundige functies enzovoort.
3.3
Programmastructuur
Een Arduinoprogramma bestaat uit 3 structurele elementen die steeds verplicht zijn, aangevuld met optionele functies en procedures. De 3 verplichte elementen zijn de declaraties (eng. declarations), initialisaties (eng. initialization of setup) en hoofdroutine (eng. main loop).
3.3.1
Declaraties
Helemaal bovenaan je programma komen de declaraties. Dit zijn directieven voor de compiler, waarmee je aangeeft welke bibliotheken je wenst te gebruiken, hoe je de pinnen van je Arduino benoemt, en welke variabelen je zal gebruiken in de rest van je programma. Een eerste type delcaraties zijn includes. Hiermee kan je bibliotheken die je wenst te gebruiken toevoegen aan je programma. Om de bibliotheek voor wiskundige functies math toe te gebruiken in je programma, voeg je dan volgende code toe: Listing 3.1: Een bibliotheek toevoegen aan het programma 1 2
// onderstaande regel voegt de bibliotheek math.h toe aan het programma: #include <math.h>
Je kan zoveel bibliotheken toevoegen als je wenst, maar denk eraan dat het beschikbare geheugen op een Arduino beperkt is! Als je dus onnodige bibliotheken meecompileert, dan zal je Arduino snel “vol” zitten. Een tweede type declaraties zijn definities. Met definities kan je getallen een betekenis geven. De pinnen van een Arduino hebben allemaal een naam, de digitale pinnen zijn genummerd van 0 tot 13 en de analoge pinnen van A0 tot A5. Om de LED die op pin 13 staat te kunnen aansturen, declareer je pin 13 dus als LED als volgt: Listing 3.2: Een pindeclaratie 1 2
// onderstaande regel declareert pin 13 als LED: #define LED 13
23
24
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
Let op: achter definities volgt geen puntkomma! Op dezelfde manier kan je een potentiometer voor volumeregeling op pin A0 declareren, of een tekst HELLO die de waarde “hello world” bevat: Listing 3.3: Enkele declaraties 1 2 3 4
// declaraties: #define LED 13 #define VOLUME A0 #define HELLO "hello world"
Definities kennen geen type omdat het preprocessordirectieven zijn. In het geval van de LED zal de preprocessor overal in je code de identifier LED vervangen door het getal 13 of eender welke andere waarde die je aan LED hebt toegewezen. De compiler “ziet” deze definities dus niet omdat ze daarvoor al door de preprocessor vervangen zijn door hun effectieve waarde. Een alternatief is met constanten te werken. Een constante declareren gebeurt als volgt: Listing 3.4: Een constantedeclaratie 1 2 3
// constanten van type double en string delcareren: static const double euler = 2.71828; static const char welcomeMsg[] = "Ready for world domination.";
Omdat declaraties van constanten door de compiler worden uitgevoerd en niet door de preprocessor moet elke declaratie afgesloten worden met een puntkomma. Waar definities enkel kunnen gebruikt worden om een naam te geven aan primitieven zoals getallen, karakters of tekst, kan om het even welk object als constante gedeclareerd worden. Het nadeel aan constanten is dan weer dat hun zichtbaarheid beperkt is tot het bestand waarin ze gedeclareerd zijn. De functie van static wordt hieronder verklaard. Een laatste type declaraties zijn variabelen. Net zoals in C# bewaren variabelen de staat van je programma net zolang het loopt. Variabelen worden dus gewist telkens je de Arduino reset, door op de resetknop te drukken of de USB-kabel uit te trekken en weer in te steken. Een variabeledeclaratie reserveert een bepaalde reeks bytes in het geheugen voor toekomstig gebruik in je programma. Let erop dat je elke variabele initialiseert (een bepaalde waarde toewijst of op 0 zet). De meeste variabeletypes die je in C# kent, bestaan ook in C: int, float, char, byte etc. Variabelen die je bovenaan declareert zijn beschikbaar in alle functies en procedures in je programma. Het is echter best mogelijk dat veel voorkomende namen zoals LED, delay, counter etc. ook in bibliotheken worden gebruikt, wat conflicten oplevert. Om dit te verhinderen, declareer je je variabelen best als static. Daardoor zijn ze alleen bekend in het huidige bestand, wat geen conflicten kan opleveren met bibliotheken vermits die in andere bestanden zitten. Het meest gebruikte variabeletype op microcontrollers is ongetwijfeld de integer, die gehele getallen kan bevatten. Integers zijn standaard bedoeld voor zowel positieve als negatieve gehele getallen. Weet je op voorhand dat je geen negatieve getallen nodig zal hebben, dan declareer je ze als unsigned (geen minteken) met de identifier uint waarbij de u staat voor unsigned. “Gewone” integers zijn dan signed en worden aangeduid met int. In C is de standaardgroote van een integer afhankelijk van het platform. Op een 32-bit pc is een integer dus standaard 32 bits lang. Dit is echter niet zo op microcontrollers, die ook 8-bit of 16-bit kunnen zijn. Op een Arduino Uno is een integer bijvoorbeeld 16 bits, maar op een Arduino Due (een ander type Arduinobord) is het 32 bits! Dit leidt dus gemakkelijk tot verwarring. Op de pc kan je gerust elke integer 32 bits lang maken, want je hebt toch een zee van ruimte! Op een totaal van 4 GB of meer RAM-geheugen maken enkele bytes meer of minder geen verschil. Op microcontrollers heb je echter niet zoveel geheugen beschikbaar, dus als je op voorhand weet dat je in een lus van 0 tot 50 moet tellen dan heb je geen 32 bits integer nodig, maar kom je met een 8-bit integer ook toe (want 28 = 256 dus je kan tot 255 tellen). Enkele voorbeelden: Listing 3.5: Delcaratie van variabelen op Arduino
24
ing. Y. Verbelen
1 2 3 4 5 6 7 8 9 10 11
D ESIGN EN PROTOTYPING
25
// declaraties: // een unsigned 8 bit integer (byte) met bereik 0 tot 255 static uint8_t counter = 0; // een signed 16 bit integer (short) met bereik -32 768 tot 32 767 static int16_t bias = -12; // een unsigned 32 bit integer (long) met bereik 0 tot 4 294 967 295 static uint32_t time = 0; // een float (kommagetal) dat divider heet static float divider = 0.0; // een string die str heet en de waarde hello krijgt static char str[] = "hello";
Voor meerdere variabelen van hetzelfde type kan je de declaraties ook combineren als volgt: Listing 3.6: Gecombineerde variabeledeclaraties 1 2
// beginwaarden voor de PID-regelaar: static float Kp = 12.0f, Ki = 0.53f, Kd = 0.04f;
3.3.2
Initialisaties
Na de declaraties komt de initialisatie van de microcontroller. In deze sectie wordt de hardware geconfigureerd met initi¨ele waarden. Afhankelijk van welke bibliotheken en shields je gebruikt, zullen er dus extra declaraties vereist zijn. De initialisatie hoort thuis in een speciale procedure die setup heet. Deze procedure retourneert geen waarde, en accepteert ook geen argumenten. De declaratie is als volgt: Listing 3.7: void setup doet de initialisaties 1 2 3 4 5
// initialisatie: void setup() { // hier komen alle instructies voor initialisatie }
Er zijn 2 declaraties die steeds terugkomen, nl. het configueren van de seri¨ele poort die toelaat om met de pc te communiceren, en het instellen van de pinnen als inputs (ingangen) of outputs (uitgangen). Om de seri¨ele poort te configureren heb je maar e´ e´ n lijntje code nodig waarmee je de seri¨ele controller (UART, eng. universal asynchronous receiver and transmitter) vertelt aan welke frequentie er data moet verzonden worden. Deze intialisatie gebeurt als volgt: Listing 3.8: Initialisatie van de seri¨ele verbinding (UART) 1 2 3 4 5
void setup() { // initialisatie van UART met een frequentie van 9600 Hz: Serial.begin(9600); }
Na deze intialisatie kan je data naar de pc sturen, of kan je ook commando’s van de pc inlezen! Om de pc te laten weten dat je Arduino actief is, kan je bijvoorbeeld volgende code schrijven: Listing 3.9: Het eerste programma in elke programmeertaal: Hello world! 1 2 3 4 5 6 7
void setup() { // initialisatie van UART: Serial.begin(9600); // schrijf de tekst "hello world!" naar de pc:: Serial.println("hello world!"); }
Alle tekst en variabelen die je met de functies Serial.print() en Serial.println() naar de pc stuurt, komen daar op het scherm van de seri¨ele monitor terecht. Dit is dus een interessante manier 25
D ESIGN EN PROTOTYPING
26
ing. Y. Verbelen
om te debuggen door de waarden van variabelen naar de pc te schrijven. Eveneens belangrijk is het instellen van de pinnen als inputs of outputs. Dit gebeurt met behulp van de functie pinMode(). Een pin kan ingesteld worden als input (om een spanning in te lezen) of output (om een logische ‘1’ of ‘0’ op de uitgang te kunnen zetten). Alle digitale pinnen kunnen ingesteld worden om zowel digitale spanningen te lezen of te sturen, de 6 analoge pinnen kunnen ook analoge spanningen inlezen. In het volgende voorbeeld wordt een drukknop ingesteld als digitale input, een potmeter als analoge input, en een LED als digitale output: Listing 3.10: Initialisatie van de pinnen 1 2 3
#define BUTTON 2 // drukknop op digitale pin 2 #define POT A0 // potmeter op analoge pin A0 #define LED 13 // LED op digitale pin 13
4 5 6 7 8
void setup() { // initialisatie van UART: Serial.begin(9600);
9
// richting van de gebruikte pinnen instellen: pinMode(BUTTON, INPUT); // digitale input pinMode(POT, INPUT); // analoge input pinMode(LED, OUTPUT); // digitale output
10 11 12 13 14
Serial.println("initalisatie voltooid!");
15 16
}
De precieze betekenis van analoog en digitaal komt verderop nog aan bod.
3.3.3
Hoofdroutine
Na de initialisaties kan je programma pas echt starten. Net zoals de initialisaties thuishoren in hun specifieke void setup wordt de code voor de hoofdroutine, het eigenlijke programma, geschreven in de void loop: Listing 3.11: Declaratie van de hoofdroutine 1 2 3 4 5
// hierna volgt de hoofdroutine void loop() { // eigenlijke code voor het programma }
Wat gebeurt er als de laatste instructie in de hoofdroutine loop wordt bereikt? In je C# programma’s sluit het programma dan gewoon af, en wordt de besturing terug overgedragen aan het besturingssysteem van je pc, zoals Linux of Windows. Op de Arduino draait echter geen besturingssysteem waaraan de controle kan overgedragen worden! De microcontroller zou dan voor eeuwig blokkeren totdat hij wordt gereset. Bij toestellen zoals je GSM of mp3-speler betekent dit dat je de batterij er zou moeten uithalen, en dat is verre van praktisch. Om dit te vermijden wordt de code in microcontrollers in een lus uitgevoerd, in Arduino heet dit dus void loop. Als het einde van void loop wordt bereikt, dan springt de uitvoering terug naar het begin ervan. Alle initalisaties staan echter in void setup en worden dus niet opnieuw uitgevoerd. Bekijk onderstaand voorbeeld. In dit programma wordt een LED op digitale pin 13 gedeclareerd als OUTPUT. Meteen bij de start van de void loop wordt de uitgang van de LED digitaal “hoog” gemaakt. Er komt dus 5 V op deze uitgang te staan, waardoor de LED die is aangesloten zal oplichten. Vervolgens wordt met delay() 1 seconde gewacht, waarna de spanning weer 0 wordt gemaakt om de LED uit te schakelen, en er weer 1 seconde wordt gewacht. Listing 3.12: Blink
26
ing. Y. Verbelen
1
D ESIGN EN PROTOTYPING
27
#define LED 13
2 3 4 5 6
void setup() { // initialisatie van de seriele verbinding Serial.begin(9600);
7
// configureer LED als output pinMode(LED, OUTPUT);
8 9 10
}
11 12 13 14 15 16 17
void loop() { // doe de LED aan: digitalWrite(LED, HIGH); Serial.println("LED is nu aan!");
18
// wacht 1 seconde = 1000 ms delay(1000);
19 20 21
// doe de LED weer uit digitalWrite(LED, LOW); Serial.println("LED is nu uit!");
22 23 24 25
// wacht weer 1 seconde delay(1000);
26 27 28
}
Je zou kunnen denken dat de LED dus slechts e´ e´ n keer oplicht, en daarna steeds gedoofd blijft. Maar doordat de code in void loop staat, springt de uitvoering van het programma na de laatste delay weer naar de eerste instructie van void loop. Daardoor wordt de LED weer aangeschakeld en begint de cyclus opnieuw. Als je dit programma uitvoert, dan merk je dat de LED op je Arduino eeuwig aan en uit blijft knipperen. Je kan zoveel code toevoegen als je wil aan void loop, maar denk eraan dat de uitvoering dan ook langer zal duren. Als je programma snel moet reageren, bijvoorbeeld als er op een knop wordt gedrukt, dan moet je trachten de void loop zo kort mogelijk te houden. Hierbij kunnen interrupts helpen, het microcontrollerequivalent van events in C#.
3.4
Hardwarecomponenten
Online zijn er talloze codevoorbeelden (eng. code snippets) te vinden waarmee je snel aan de slag kunt. Het is ook niet de bedoeling van deze handouts om een handboek “Arduino’s programmeren” te imiteren. Het is wel nuttig om enkele vaak gebruikte hardwarefuncties te vermelden en te beschrijven.
3.4.1
Digitale pinnen
De Arduino beschikt over 14 digitale pinnen, genummerd van 0 tot 13. Pinnen 0 en 1 zijn gereserveerd voor de seri¨ele verbinding (UART) en gebruik je dus best niet voor andere toepassingen. Digitale pinnen kan je gebruiken als input of als output, respectievelijk. Listing 3.13: Digitale pinnen 1 2
#define BUTTON 12 #define LED 13
3 4 5 6
void setup() { Serial.begin(9600);
7
27
D ESIGN EN PROTOTYPING
28
pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT);
8 9 10
ing. Y. Verbelen
}
11 12 13 14 15
void loop() { // toestand van de knop inlezen in variabele uint8_t buttonState = digitalRead(BUTTON);
16
// doe de LED aan als de knop wordt ingedrukt: digitalWrite(LED, buttonState);
17 18 19
}
Op een digitale pin die logisch “1” (HIGH) wordt gezet komt een spanning van ca. 5 V te staan, op een pin die logisch “0” (LOW) is een spanning van 0 V. Omgekeerd levert een digitalRead() van 5 V een logische “1” op en een digitalRead() van 0 V een logische “0”. Praktisch zullen spanningen hoger dan ca. 3.5 V als “1” worden gelezen, en alles wat lager is als “0”. De stroom die een digitale pin kan leveren (eng. current sourcing) of kan opnemen (eng. current sinking) is gelimiteerd tot ca. 20 mA per pin zoals ook in figuur 3.2 is aangegeven. De volledige ATmega328p kan maximaal 200 mA leveren, gespreid over alle pinnen. Kleine belastingen zoals LED’s en digitale sturingen van sensors of displays vormen dus geen probleem, maar grotere belastingen zoals een DC-motor of stappenmotor kan de ATmega328p zeker niet aan. Hiervoor heb je dus driverelektronica zoals transistors nodig.
3.4.2
Analoge pinnen
De Arduino beschikt ook over 6 analoge pinnen, genummerd van A0 tot A5, zie figuur 3.2. Analoge pinnen zijn intern verbonden met een hardwareblok dat analoge signalen kan converteren naar digitale signalen, de ADC (eng. analog to digital converter). De ADC converteert een spanning tussen 0 V en 5 V naar een getal tussen 0 en 1023. Een spanning van 0 V resulteert dus in 0, 2.5 V resulteert in ca. 512 en 5 V resulteert in 1023 enzovoort. De ADC van een Arduino heeft dus een resolutie van 10 bits, vermits het resultaat van de conversie 210 = 1024 verschillende getallen kan zijn. Om de ADC te gebruiken moet je de respectievelijke analoge pin als INPUT initialiseren. Je kan de ADC activeren met de functie analogRead(). Merk op dat je de 6 analoge pinnen ook even goed digitaal kan inlezen met digitalRead() als je dat wenst. Je krijgt dan uiteraard een digitale waarde (HIGH of LOW) terug. Listing 3.14: Analoge pinnen 1
#define TEMP A0 // temperatuursensor op analoge pin A0
2 3 4 5
void setup() { Serial.begin(9600);
6
pinMode(TEMP, INPUT);
7 8
}
9 10 11 12 13
void loop() { // temperatuur inlezen in een 16 bits unsigned integer: uint16_t temp = analogRead(TEMP);
14
if (temp < 300) Serial.println("it’s too cold here!"); else if (temp > 800) Serial.println("it’s too hot here!");
15 16 17 18 19
28
}
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
29
De ADC is erg gevoelig voor overspanningen, dus ontwerp je schakeling zodanig dat er in geen enkele situatie een spanning hoger dan 5 V op de ingangen kan terecht komen! Figuur 3.2 toont de limitaties op deze pinnen.
3.4.3
Pulsbreedtemodulators
Het omgekeerde van een analoog-digitaalconverter (ADC) bestaat ook en heet een digitaal-analoogconverter (DAC). Helaas beschikt de ATmega328p niet over een eigen DAC, maar dit kan opgelost worden via een kleine omweg. De ATmega328p heeft namelijk w´el pulsbreedtemodulators aan boord (eng. pulse width modulation, PWM). De digitale pinnen waarop een PWM-signaal kan gegenereerd worden, zijn aangeduid in figuur 3.2. Een PWM-generator produceert een continue reeks pulsen waarvan de breedte kan ingesteld worden. In figuur 3.3 zie je enkele voorbeelden van PWM-signalen. De verhouding tussen de pulsbreedte en de periode van het signaal heet de duty cycle en wordt uitgedrukt in procenten. Een PWM-signaal met duty cycle 0 % is dus constant logisch “0”, met duty cycle 50 % half “1” en half “0”, en met duty cycle 100 % constant logisch “1”.
PWM analoog signaal
V 1
0 80%
50%
20%
50%
80%
duty cycle
Figuur 3.3: Een PWM-signaal, met aanduiding van de duty cycle in procenten op de x-as. In stippenlijn het resulterende analoge signaal na een laagdoorlaatfilter. (figuur: Cyril Buttay, CC BY-SA 3.0)
Je kan een PWM-signaal zonder probleem direct naar een LED sturen, waarmee je hem kan dimmen. Dit doe je door de functie analogWrite() op te roepen op pinnen die aan de PWM-generator van de ATmega328p hangen. De functie analogWrite() verwacht e´ e´ n byte (= 8-bit integer). Deze pinnen zijn op het Arduinobord gemarkeerd met een tilde. In onderstaand voorbeeld wordt de LED op de Arduino gedimd met de waarde van een potentiometer. Listing 3.15: PWM-genenerator 1 2
#define POT A0 // potentiometer #define LED 13 // LED
3 4 5 6
void setup() { Serial.begin(9600);
7
pinMode(POT, INPUT); pinMode(LED, OUTPUT);
8 9 10
}
11 12 13 14 15
void loop() { // 10 bit waarde van potentiometer inlezen in een 16 bit integer: uint16_t brightness = analogRead(POT);
16 17 18
// helderheid schalen van 0-1023 naar 0-255 met een logische shift: uint8_t pwm = (brightness >> 2);
19 20
// PWM-generator gebruiken om de LED te dimmen:
29
D ESIGN EN PROTOTYPING
30
analogWrite(LED, pwm);
21 22
ing. Y. Verbelen
}
De shiftoperatie wordt hier gebruikt om een 10-bit getal afgekomstig van de ADC te converteren naar een 8-bit getal door de 2 minst beduidende bits (eng. least significant bits) te laten vallen. Een 10-bit integer type is echter niet gedefinieerd op Arduino, dus moet het originele getal in het dichtstbijzijnde grotere type bewaard worden, in dit geval een 16-bit integer. Soms wil je een volwaardig analoog signaal en geen PWM, bijvoorbeeld als je met je Arduino muziek wil produceren die via een luidspreker moet afgespeeld worden. Een PWM-signaal zal in dat geval vervelende pieptonen genereren. Dit probleem kan opgelost worden door het PWM-signaal door een laagdoorlaatfilter te sturen, die het omvormt tot een analoog signaal met een ripple die laag genoeg is voor de meeste toepassingen. Figuur 3.4 toont een actieve Sallen-Key laagdoorlaatfilter (eng. low pass filter) die voor deze toepassing kan gebruikt worden. De precieze werking van dit type filter wordt uitvoerig besproken in de cursus Ge¨ıntegreerde Elektronische Systemen in de 3e Bachelor Elektronica.
C1 Arduino PWM A
10µ
+5V C3
+ R1 1k
R2 1k C2
IC1 = LM358
10µ
IC1A
R3 1k
100n
R4
analog out
1k C4
IC1B
B
100n
Figuur 3.4: Een 4e orde Sallen-Key laagdoorlaatfilter om PWM-signalen van een Arduino om te vormen naar een analoog signaal.
Tip: als de ripple na een eerste laagdoorlaatfilter nog te hoog is, kan je er een tweede filter achter plaatsen om de ruis verder te onderdrukken.
3.4.4
Seri¨ele communicatie
Seri¨ele communicatie is de voornaamste communicatie-interface met de buitenwereld voor de Arduino. In de ATmega328p wordt dit afgehandeld door de UART-controller (eng. universal asynchronous receiver and transmitter). Deze signalen, die RX (ontvanger, eng. receiver) en TX (zender, eng. transmitter) heten, zijn beschikbaar op digitale pinnen 0 en 1 die op de Arduino ook aangeduid zijn als TX en RX (zie figuur 3.2). Deze pinnen gebruik je dus bij voorkeur niet voor andere toepassingen. Via RX kan je dus informatie die van de pc verstuurd wordt in de Arduino ontvangen, via TX kan de Arduino ook zelf informatie versturen. Omdat nieuwe laptops niet meer uitgerust worden met een DB-9 connector voor seri¨ele interfaces, beschikt de Arduino Uno over een USB-controller die de TX en RX signalen omvormt tot USB-signalen. Die kunnen dan via de pc worden ingelezen. Op die manier kan de Arduino informatie rapporteren aan de pc, of de pc kan commando’s naar de Arduino sturen. De UART-controller moet ge¨ıntialiseerd worden met de juiste zendfrequentie voor hij gebruikt kan worden. Dat gebeurt met Serial.begin() zoals al eerder werd gedemonstreerd in de void setup functie: Listing 3.16: Initialisatie van de UART-controller 1 2 3 4 5
30
void setup() { // UART-controller initialiseren met een zendfrequentie van 9.6 kHz: Serial.begin(9600); }
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
31
De frequentie die je instelt in je Arduino moet dezelfde zijn als die van de seri¨ele monitor op de pc, zo niet zal je enkel rare karakters zien of helemaal niks omdat de pc de data niet correct kan decoderen en vice versa. Een frequentie van 9.6 kHz is min of meer standaard, maar je kan elke frequentie gebruiken zolang je maar dezelfde instelt op Arduino en pc. Data versturen kan met het commando println() voor een lijn die gevolgd wordt door een regeleinde, en print() zonder regeleinde. Als je data verstuurt via println() komt die tekst onder elkaar in de seri¨ele monitor op de pc, stuur je met print() dan komt de tekst naast elkaar op dezelfde lijn. Je kan zowel strings, karakters als variabelen versturen: Listing 3.17: Een analoge lichtsensor en digitale schakelaar rapporteren aan de pc 1 2
#define LDR A0 // lichtsensor #define SWITCH 4 // schakelaar
3 4 5 6
void setup() { Serial.begin(9600);
7
pinMode(LDR, INPUT); pinMode(SWITCH, INPUT);
8 9 10
}
11 12 13 14 15 16 17
void loop() { // waarde van lichtsensor inlezen: uint16_t illuminance = analogRead(LDR); // toestand van schakelaar inlezen: uint8_t switchState = digitalRead(SWITCH);
18
// data over UART versturen naar de pc: Serial.print("Illuminance value is "); Serial.print(illuminance); Serial.print(" and switch is "); if (switchState > 0) Serial.println("on."); else Serial.println("off.");
19 20 21 22 23 24 25 26
}
De te versturen karakters en variabelen worden door de println() en print() functies in de uitgangsbuffer van de UART-controller geplaatst, die ze vervolgens verzendt aan de frequentie die je hebt ingesteld, bijvoorbeeld 9.6 kHz. Op een Arduino Uno is de buffer 64 bytes groot, dus als je minder dan 64 karakters verzendt dan kunnen die allemaal in de buffer en loopt je programma meteen na uitvoering van de instructie println() of print() verder. De UART-controller verzendt vervolgens de data in zijn buffer aan zijn eigen tempo. Als je meer dan 64 bytes verstuurt, dan pauzeert je programma totdat er ruimte vrijkomt in de buffer. Data versturen naar de pc is een handige manier om de uitvoering van je programma te volgen, en er is geen limiet op hoeveel tekst je kan versturen. Denk er wel aan dat de UART-controller een grootteorde trager loopt dan je programma, dat aan een snelheid van 16 MHz wordt uitgevoerd. E´en karakter versturen kost 11 bits (8 databits, een startbit, een stopbit en een pariteitsbit), en dus kan je aan 9.6 kHz maximaal ca. 870 bytes per seconde naar de pc sturen. Wil je meer, dan zal je de communicatiefrequentie van de UART-controller moeten opdrijven, om te verhinderen dat de volledige uitvoering van je programma vertraagt. Naast data versturen kan de UART-controller ook seri¨ele data ontvangen. Net zoals bij het versturen wordt binnenkomende data in een 64 bytes grote buffer geplaatst, waaruit je sequenti¨eel (ene byte na de andere) kan lezen. Je kan checken of er data in de buffer zit met de functie available(), die het aantal bytes retourneert dat in de buffer aanwezig is. Deze bytes kunnen vervolgens uitgelezen worden met de functie read(). De functie read() leest e´ e´ n byte, met readBytes() kan ook een 31
D ESIGN EN PROTOTYPING
32
ing. Y. Verbelen
willekeurig aantal bytes gelezen worden. Beide functies verwijderen de respectievelijke bytes uit de buffer, zodat er ruimte wordt vrijgemaakt om nieuwe data te ontvangen. Als je dus meerdere keren read() achter elkaar aanroept, dan zal je telkens een andere waarde krijgen, op voorwaarde dat er voldoende bytes in de buffer zitten natuurlijk. Als het niet wenselijk is om een byte uit de buffer te verwijderen, maar je wilt de waarde wel kennen, gebruik dan de functie peek(). Herhaaldelijk peek() aanroepen zal steeds dezelfde waarde retourneren. Een voorbeeld: Listing 3.18: LED controleren vanaf de pc 1 2 3
#define LED 13 #define ON 49 #define OFF 48
4 5 6 7
void setup() { Serial.begin(9600);
8
pinMode(LED, OUTPUT);
9 10
}
11 12 13 14
15 16 17
void loop() { if (Serial.available() > 0) // check of er bytes in de UART-buffer zitten { // lees het volgende karakter uit de buffer: uint8_t command = Serial.read();
18
if (command == ON) // schakel de LED pc digitalWrite(LED, else if (command == // schakel de LED pc digitalWrite(LED,
19 20
21 22 23
24
HIGH); OFF) uit als het karakter ’1’ wordt gestuurd door de LOW);
}
25 26
in als het karakter ’0’ wordt gestuurd door de
}
In dit voorbeeld wordt gechecked of er bytes in de UART-buffer zitten. Als er minstens e´ e´ n byte beschikbaar is in de buffer dan wordt die uitgelezen en in variabele command opgeslagen. Als de byte overeenkomt het het karakter ‘0’ (ASCII code 48) dan wordt de LED op de Arduino uitgeschakeld, is het karakter ‘1’ (ASCII code 49) dan wordt de LED ingeschakeld. Let op: de buffer die ontvangen data opslaat is slechts 64 bytes groot. Maak er dus een goede gewoonte van om de buffer regelmatig uit te lezen zodanig dat er steeds voldoende ruimte beschikbaar is om nieuwe data van de pc te ontvangen. Als je probeert om meer dan 64 bytes in de buffer te stoppen dan loopt de buffer over (eng. overflow) en gaat deze data verloren omdat er geen plaats is om ze op te slaan! Omdat stap voor stap debuggen via breakpoints niet mogelijk is in de Arduino IDE, is de seri¨ele communicatie met de pc de perfecte manier om je programma te debuggen door de waarden van allerlei variabelen en toestanden naar de pc te sturen zodat je het verloop van je programma kan volgen. Hiervoor zal je typisch op een groot aantal plaatsen in je programma Serial.print() en Serial.println() aanroepen met verschillende argumenten. Eens je programma lijkt te werken wil je echter kunnen testen zonder al deze debugging info. De preprocessor kan hier opnieuw helpen dankzij het #ifdef commando. Hiermee kan je checken of een identifier werd gedefini¨eerd, en in dat geval extra code toevoegen. Dit kan je gebruiken om gecentraliseerd alle debugging info in e´ e´ n keer aan of uit te schakelen. Het volgende voorbeeld illustreert dit principe. Listing 3.19: Debugginginfo aan of uit zetten met ifdef
32
ing. Y. Verbelen
1 2
D ESIGN EN PROTOTYPING
33
// declaratie van een identifier die DEBUG heet #define DEBUG
3 4
#define WHEEL A0 // potentiometer op analoge ingang A0
5 6 7 8 9
void setup() { Serial.begin(9600); pinMode(WHEEL, INPUT);
10
// declaratie van DEBUG bepaalt welke lijn code wordt gecompileerd: #ifdef DEBUG Serial.println("Debugging mode activated!"); #else Serial.println("Debugging mode disabled."); #endif
11 12 13 14 15 16 17
}
18 19 20 21 22 23 24 25 26
void loop() { // waarde van de potentiometer inlezen: uint16_t wheelValue = analogRead(WHEEL); #ifdef DEBUG // in debugging mode waarde van de potentiometer naar de pc sturen: Serial.print("Analog value on pin A0:" ); Serial.println(wheelValue); #endif
27
// potentiometer omrekenen naar een hoek tussen -90 en 90 float wheelAngle = 0; if (wheelValue >= 512) wheelAngle = (wheelValue - 512) * 90 / 512; else wheelAngle = -(512 - wheelValue) * 90 / 512; #ifdef DEBUG // in debugging mode berekende hoek naar de pc sturen: Serial.print("Calculated angle: "); Serial.println(wheelAngle); #endif
28 29 30 31 32 33 34 35 36 37 38
}
De preprocessor merkt bovenaan je code de declaratie van de identifier DEBUG en zal overal in het programma de lijnen code tussen #ifdef DEBUG en #endif toevoegen aan het programma. Als DEBUG niet is gedefini¨eerd dan verwijdert de preprocessor deze lijnen code en worden ze dus niet meegecompileerd. In tegenstelling tot een gewone if voorwaarde, die steeds wordt meegecompileerd, vergroot #ifdef je programma dus niet. Om debugging mode uit te schakelen zet je de lijn code die DEBUG declareert simpelweg in commentaar. In de 3e Bachelor Elektronica leer je meer over de verschillende functies van de preprocessor en de compiler, en hoe die je het leven gemakkelijker maken.
3.4.5
Interrupts
Interrupts zijn het microcontrollerequivalent van events in C#. Een interrupt is een speciaal mechanisme in microcontrollers die de normale uitvoering van het programma pauzeren om een dringende taak uit te voeren als er een externe impuls of event optreedt. Als de microcontroller zo’n event detecteert, springt de uitvoering van de code onmiddellijk naar een speciale functie, de interruptserviceroutine (ISR), die wordt uitgevoerd. Daarna gaat de uitvoering van het programma verder op de plaats waar het werd onderbroken door de interrupt. Een Arduino heeft 2 hardware-interrupts, respectievelijk op digitale pinnen 2 en 3, die INT0 en INT1 heten, zoals is aangegeven in figuur 3.2. Signalen op deze pinnen worden dus continu gemonitored. Als er een verandering plaatsvindt op deze pinnen, bijvoorbeeld een signaal dat van logisch “1” naar logisch “0” gaat, dan kan je daar een ISR aan koppelen. In deze functie schrijf je vervolgens de code die moet uitgevoerd worden als de interrupt wordt getriggerd. Hou de code in een ISR steeds zo kort mogelijk. 33
D ESIGN EN PROTOTYPING
34
ing. Y. Verbelen
Delay en timerfuncties kunnen niet gebruikt worden in een ISR. Het voorbeeld hieronder maakt de werking van een ISR duidelijk. Listing 3.20: Snel inspelen op interrupts via ISR 1 2 3
// pinnen van temperatuurinput en reactor #define CRITICAL_TEMP 2 #define REACTOR 5
4 5 6
// volatile variabele die de status van de reactor bijhoudt volatile static uint8_t reactorState = 0; // status
7 8 9
// functieprototype van de ISR void emergencyStop(void);
10 11 12 13
void setup() { Serial.begin(9600);
14
pinMode(CRITICAL_TEMP, INPUT); pinMode(REACTOR, OUTPUT);
15 16 17
// koppel de ISR ’emergencyStop’ aan een stijgende flank event op INT0: attachInterrupt(0, emergencyStop, RISING);
18
19 20
digitalWrite(REACTOR, HIGH); // reactor inschakelen reactorState = 1; // update status
21 22 23
Serial.println("Reactor started.");
24 25
}
26 27 28 29 30 31 32 33 34 35
void loop() { // statusupdate elke 100 ms if (reactorState) Serial.println("Reactor still running..."); else Serial.println("Reactor offline."); delay(100); }
36 37 38 39 40 41 42 43
void emergencyStop() { // interrupt getriggerd, reactor direct uitschakelen! digitalWrite(REACTOR, LOW); Serial.println("omfg reactor overheated, we almost died!"); reactorState = 0; // update status }
In bovenstaand voorbeeld wordt de ISR emergencyStop() getriggerd bij een stijgende flank op INT0, fysich digitale pin 2. Dit wordt aangegeven door het RISING sleutelwoord wanneer de ISR aan de interrupt wordt gekoppeld in void setup(). Het omgekeerde is FALLING, nl. het triggeren op een dalende flank. Om op beide flanken te triggeren gebruik je het sleutelwoord CHANGE (elke verandering).
De globale variabele reactorState wordt gebruikt om een toestand tussen de ISR en de hoofdroutine te commmuniceren. Omdat bij een interrupt de instructiepointer opeens verspringt zonder de variabelecontext van de lopende code op te slaan, kan je variabelen niet op de normale manier doorgeven of wijzigen binnen interrupt handlers. Om een globale variabele te wijzigen binnen een interrupt dien je die als volatile te declareren, zoals aangegeven in het voorbeeld. 34
ing. Y. Verbelen
3.4.6
D ESIGN EN PROTOTYPING
35
Timers
In tegenstelling to de meeste andere microcontrollers, zijn de hardwaretimers op een Arduino niet gemakkelijk rechtstreeks aan te spreken. Om processen te timen, moet je dus gebruik maken van een externe timer die bijvoorbeeld op e´ e´ n van de interrupts is aangesloten, zoals in de vorige paragraaf werd ge¨ıllustreerd. Gelukkig biedt Arduino nog andere technieken om de tijd bij te houden. Met de functies millis() en micros() kan het aantal ms resp. µs opgevraagd worden sinds de laatste globale reset van de microcontroller. Het getal dat door millis() wordt geretourneerd neemt dus steeds toe. Het datatype van millis() is een int32 t, en de maximale waarde wordt bereikt na ca. 50 dagen waarna millis() weer vanaf 0 begint te tellen. Het gedrag van micros() is identiek. Je kan beide functies dus gebruiken om een actie uit te voeren nadat er een bepaalde tijd verstreken is. Listing 3.21: Tijd bijhouden via millis en micros 1 2
static uint32_t time = 0; static uint16_t ticks = 0;
3 4 5 6 7
void setup() { Serial.begin(9600); }
8 9 10 11 12 13
14 15
16 17
void loop() { if (millis() > (time + 1000)) // seconde verstreken { time = millis(); // huidige aantal milliseconden toewijzen aan variabele time ticks++; // verhoog tick counter Serial.print("Seconds passed since startup: "); Serial.println(ticks); } }
Als je enkel een bepaalde tijd wil wachten in je programma, m.a.w. het programma pauzeren, dan is millis() en micros() hiervoor een omslachtige techniek. Arduino biedt echter ook 2 delayfuncties, nl. delay() dat het programma een gewenst aantal ms pauzeert, en delayMicroseconds() dat het programma een aantal µs pauzeert. Het nadeel aan beide delays is dat het programma niks nuttig kan doen terwijl het wacht, de uitvoering wordt effectief geblokkeerd. Volgend voorbeeld illustreert hoe je met delays zelf een PWM-generator kan programmeren. Listing 3.22: Uitvoering pauzeren met delays 1 2
#define POT A0 #define LED 13
3 4 5 6 7 8
void setup() { pinMode(POT, INPUT); pinMode(LED, OUTPUT); }
9 10 11 12 13
void loop() { // waarde van potentiometer lezen als input voor de PWM duty cycle uint16_t value = analogRead(POT);
14
digitalWrite(LED, HIGH); delayMicroseconds(value); digitalWrite(LED, LOW); delayMicroseconds(1024 - value); // totale periode = 1024 us
15 16 17 18 19
}
35
D ESIGN EN PROTOTYPING
36
ing. Y. Verbelen
Je merkt meteen ook het nadeel van deze techniek: door de extra rekentijd die nodig is voor de ADC (uitlezen potentiometer) en het berekenen van het verschil tussen 1024 en value zal de werkelijke periode iets langer zijn, en de duty cycle ook afwijken. Voor nauwkeurige sturingen zoals de ESC’s van quadcopters kan je dit dus niet gebruiken, maar voor minder kritische applicaties kan het wel degelijk nuttig zijn.
3.5
Documentatie
Naarmate de complexiteit van je programma’s toeneemt zal ook het aantal variabelen, klassen, functies en andere codestructuren waar je van gebruik maakt toenemen. Omdat het in dergelijke situaties geen evidentie meer is om de precieze functie van bepaalde stukken complexe code te achterhalen, is het van belang je werk voldoende te documenteren. Bij kleine programma’s van minder dan 100 regels code lijkt dit misschien tijdverlies, maar dat is het niet. Stel bijvoorbeeld dat je programma een half jaar vlot draait, en dan besluit je om extra functionaliteit toe te voegen. Hoeveel tijd zou het je kosten om uit te vissen hoe je programma precies werkt zonder documentatie? Als er tientallen variabelen of functies gedeclareerd zijn dan is dat zeker geen evidentie, en heb je misschien de neiging om het programma terug vanaf nul te schrijven in plaats van het bestaande programma aan te passen. Dat is dus verloren werk. Als ingenieur ben je natuurlijk ook niet alleen op de wereld. Het wekkerproject doe je weliswaar zelfstandig, maar volgend jaar wordt je met het Ontwerpproject voor een grotere uitdaging gesteld. Het Ontwerpproject is echter een groepsproject, en dus moet al je code zodanig gedocumenteerd zijn dat je groepsleden ze kunnen begrijpen en er wijzigingen of verbeteringen in kunnen aanbrengen. Om iemand anders zijn code te kunnen debuggen is het niet voldoende om oppervlakkig te weten hoe ze werkt, maar er is diepgaand inzicht voor nodig. Hiervoor is documentatie dus essentieel.
3.5.1
Commentaar
De gemakkelijkste manier om je code te documenteren is via commentaar (eng. comments) in C. Commentaar herken je aan de groene highlighting (of grijze highlighting in Arduino IDE), en wordt zowel door de preprocessor als de compiler genegeerd. Commentaar dient dus uitsluitend om mensen die de code lezen inzicht te verschaffen in de werking ervan. In C zijn er 2 manieren om commentaar te markeren. Een enkele lijn commentaar kan je laten voorafgaan met een dubbele slash (//), meerdere lijnen commentaar zet je tussen comment tokens als volgt: /* dit is commentaar */. Omdat de compiler geen rekening houdt met regeleindes, kan je commentaar op het even welke plaats in je code toevoegen. Listing 3.23: Documentatie met commentaar 1 2 3 4 5
// definities: #include <math.h> #define LED 13 #define G 9.8172 #define UART 9600
// // // //
voor de exp() functie LED op pin 13 op Arduino Uno gravitatieconstante frequentie voor UART hier aanpassen
6 7 8 9 10 11 12
/* aansluiting van de stappenmotor in volgorde: - rood - blauw - groen - zwart */ static const uint8_t stepperPins[] = {4, 5, 7, 6};
13 14 15 16 17 18
36
void setup() { // frequentie voor UART aanpassen in definities! Serial.begin(UART);
ing. Y. Verbelen
37
// alle pinnen voor de stappenmotor als output configureren for (uint8_t pin = 0; pin < sizeof(stepperPins); pin++) pinMode(stepperPins[pin], OUTPUT);
19 20 21 22
D ESIGN EN PROTOTYPING
}
3.5.2
Header
Omdat je wellicht meerdere versies zal schrijven van je software, die bij verschillende versies van je hardware passen bijvoorbeeld, is het warm aanbevolen om bovenaan je programma versie-informatie toe te voegen en een datum te vermelden. Gebruikelijk staat dit bovenaan je code en heet dan de header van je programa. De versie-informatie kan je dan rechtstreeks ook naar de pc printen via de seri¨ele monitor zodat steeds duidelijk is welke versie van je programma er wordt uitgevoerd. Dit verhindert dat er aanpassingen worden gedaan in verkeerde versies of dat de hardware fout wordt aangestuurd. Listing 3.24: Versie en datum in commentaar 1 2 3 4 5
/* Kirov Flight Controller versie 2.4 laatste aanpassing: 22/03/2015 door Eric Cartman hoort bij elektronica versie 0.8
6 7 8 9 10 11
!! bugs in deze versie, niet meer gebruiken !! */ #ifndef VERSION #define VERSION "2.4" #endif
12 13
#define OBSOLETE
14 15 16 17
#define LED 13 // LED op pin 13 #define ENGINE 6 // aandrijving op pin 6 (enkel PWM pinnen!) #define UART 9600 // frequentie voor UART hier aanpassen
18 19 20 21 22
void setup() { Serial.begin(UART); Serial.print("Kirov Flight Controller v"); Serial.println(VERSION);
23
#ifdef OBSOLETE Serial.println("Opgelet: verouderde versie, niet meer gebruiken!"); #endif
24 25 26 27
}
Bovenstaande voorbeeld toont goed gedocumenteerde code. De versie en datum van laatste aanpassing staan vermeld, en de versie van het programma wordt gedefini¨eerd als dat nog niet eerder gebeurde. Die versie-informatie wordt seri¨eel naar de pc gestuurd zodat ze op het scherm verschijnt telkens het programma opstart. Er is ook een identifier OBSOLETE voorzien, die kan geactiveerd worden als de code verouderd is. In dat geval wordt er ook een waarschuwing weergegeven.
3.6
Ontwerpcyclus
Telkens je een programma download naar de Arduino, wordt het in het flashgeheugen van de ATmega328p microcontroller opgeslagen. Flash is een niet-volatiel geheugentype, het behoudt zijn data ook als de stroom wordt uitgeschakeld. Jouw eigen firmware blijft dus in de microcontroller zitten todat je ze overschrijft met een nieuw programma. Eens je de ATmega328p geprogrammeerd hebt, vervalt eigenlijk het nut van heel wat elektronica op het Arduinobord: de LED’s voor debugging heb je niet meer nodig, de USB-controller ook niet, en de bijhorende USB-connector dus zeker niet (tenzij je een wekker met USB-aansluiting wil natuurlijk!). 37
38
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
Arduino’s zijn in de eerste plaats rapid prototpying hulpmiddelen, en het is niet de bedoeling dat ze in finale versies worden ge¨ıntegreerd. Eens je eerste prototype af is en je software werkt, dan neem je de ATmega328p van de Arduino af, en je integreert hem meteen in je eigen elektronisch design, een printplaatje bijvoorbeeld. Het enige wat je hiervoor nodig hebt, is een kwartskristal van 16 MHz en 2 condensators van 22 pF tot 27 pF om de ATmega328p van een kloksignaal to voorzien. Van zodra je de ATmega328p weer van voeding voorziet, zal je programma meteen weer opgestart worden! In het volgende hoofdstuk wordt gedemonstreerd hoe je de ATmega328p op een eigen printplaatje (PCB) kan zetten zodat de Arduino weer beschikbaar komt voor nieuwe projecten.
38
4
PCB-ontwerp Nothing shocks me. I’m a scientist. Indiana Jones
4.1
Inleiding
Bij het bouwen van je wekkerprototype op breadboard heb je gemerkt dat aan breadboards veel voordelen, maar ook veel nadelen verbonden zijn. Schakelingen bouwen en testen verloopt weliswaar vlot, en je kan gemakkelijk componenten toevoegen of wisselen, maar de schakeling is ook heel fragiel. Draden die loskomen, slecht contact maken, of componenten die niet goed vast zitten, kunnen leiden tot onverklaarbaar gedrag in schakelingen, met alle frustraties van dien. Hoewel een breadboard dus een uitstekend prototypingmedium is, is het zeker niet geschikt voor een finale versie van je wekker die jarenlang op je nachtkastje zal staan. Arduino’s zijn al evenmin geschikt om in finale versies te zitten. Daarvoor moet de elektronica dus omgezet worden naar een robuustere en “definitievere” vorm. De meest toegepaste oplossing is gebruik makend van gedrukte schakelingen (printed circuit boards, PCB), ook wel prints of printplaten genoemd. PCB’s hebben verschillende voordelen ten opzichte van breadboards: • componenten zitten vast gesoldeerd, en kunnen dus niet loskomen; • componenten kunnen veel dichter bij elkaar geplaatst worden, en dus wordt de schakeling kleiner; • eens je het ontwerp van een PCB hebt, kan je met weinig moeite meerdere kopie¨en maken; • de positionering van gaten in de PCB is willekeurig, en dus kan je componenten gebruiken die niet in een breadboard passen; • PCB’s zijn (op grote schaal) aanzienlijk goedkoper; • de levensduur van PCB’s is quasi ongelimiteerd. In de 2e Bachelor wordt in het studiedeel ECAD (Electronic Computer Aided Design) veel dieper ingegaan op het ontwerp van PCB’s, en leer je alle technieken die nodig zijn om zelf PCB’s te ontwerpen zoals je die vindt in hedendaagse elektronische toestellen zoals laptops en printers. Dit hoofdstuk beperkt zich tot de basisconcepten die net volstaan om een eenvoudige PCB voor je wekker te ontwerpen.
D ESIGN EN PROTOTYPING
40
4.2
ing. Y. Verbelen
CircuitMaker
Neem eens een PCB ter hand. In het labo Elektronica vind je in de recup-kasten een ruim aanbod aan PCB’s die gerecupereerd zijn uit afgedankte toestellen. Als je goed kijkt, merk je dat onder de groene laklaag (die soldeermasker, eng. solder mask heet), sporen lopen die contrasteren met de achtergrond. Deze sporen zijn eigenlijk zeer dunne koperen strips die de componenten met elkaar verbinden en zo dus een schakeling vormen. In essentie is een PCB niks anders dan een plaatje isolerend materiaal waarop aan e´ e´ n of beide zijden een verzameling koperen sporen (eng. tracks of traces) is aangebracht die de componenten met elkaar verbinden. De componenten zelf zijn elektrisch met de sporen verbonden via een proces dat solderen (soldering) heet. In de volgende hoofdstukken wordt dieper ingegaan op soldeertechnieken. Om te verhinderen dat de kopersporen zouden oxideren aan de lucht, worden ze beschermd onder een groene laklaag. Tot slot wordt er bovenop die laklaag tekst gedrukt om aan te duiden waar de componenten moeten geplaatst worden. De laklaag en tekstopdruk zijn volledig optioneel, je kan een perfect werkende PCB maken met de kopersporen alleen. Het ontwerpen van het patroon kopersporen is waar PCB-ontwerp om draait. Vroeger werd dit manueel gedaan met een zwarte alcoholstift op een blad papier, en voor h´ee´ l eenvoudige PCB’s is dat misschien nog wel de snelste oplossing. Maar als je een groot aantal componenten moet verbinden met een nog groter aantal draden, dan heb je nood aan betere hulpmiddelen. Hier komen gespecialiseerde softwaretools om de hoek kijken. Er bestaan verschillende gespecialiseerde softwarepakketten die helpen bij het ontwerpen van PCB’s, en aan de meeste van die (professionele) paketten hangt ook een prijskaartje dat vari¨eert van een high end gaming laptop tot een klein vliegtuig (!). Voor eenvoudige schakelingen zoals je wekker heb je die zeer ingewikkelde software echter niet nodig en gelukkig bestaan er ook uitstekende softwarepaketten die volledig gratis zijn. Er bestaan heel wat gratis pakketten, zoals Eagle, DesignSpark, gEDA, UltiBoard, KiCad en Fritzing bijvoorbeeld. Veruit het beste gratis pakket is echter CircuitMaker. CircuitMaker is de gratis hacker en makereditie van Altium’s professionele PCB-software Altium Designer waarmee je zal leren werken in de 3e Bachelor Elektronica. In dit hoofdstuk wordt gedemonstreerd hoe je zelf een PCB kan ontwerpen met CircuitMaker, en hoe je deze PCB later ook zelf kan maken in het fablab.
4.2.1
Installatie
Je kan het installatieprogramma van CircuitMaker rechtstreeks downloaden van de CircuitMaker website1 waarna je je nog wel voor een account moet registreren. Dit doe je eveneens via de CircuitMaker website. Het emailadres dat je hiervoor moet opgeven kan maar hoeft niet jouw VUB-emailadres te zijn. Figuur 4.1 toont het registratieformulier. Check de box I accept Terms and Conditions en klik op Register my account. Je krijgt vervolgens een email toegestuurd met daarin een wachtwoord. Met dit wachtwoord kan je vervolgens inloggen in CircuitMaker, zoals weergegeven in figuur 4.2. CircuitMaker is enkel beschikbaar voor het Windows besturingssysteem, dus wie Linux of BSD gebruikt kan CircuitMaker uitvoeren binnen een virtuele Windows-installatie. Vooraleer je je in PCB-design stort, is het verstandig om eerst het willekeurige wachtwoord dat je via email werd toegestuurd te wijzigen in een wachtwoord dat je gemakkelijker kan onthouden, zoals het wachtwoord van je VUB-account bijvoorbeeld. Dit doe je via menu Start → My Account → Change Password. Je moet je oude wachtwoord opnieuw invoeren om je wachtwoord te kunnen wijzigen. 1 http://circuitmaker.com/installer-download
40
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
41
Figuur 4.1: Registratie van een CircuitMaker account
Figuur 4.2: Inloggen in CircuitMaker
4.2.2
De “cloud”
CircuitMaker is bedoeld voor de hacker en maker community, en de focus ligt daardoor sterk op het delen van informatie en projecten, en samenwerking in teams. Daarom bewaart CircuitMaker al je projecten op de Altium servers, de zogenaamde “cloud”, en zijn ze vrij toegankelijk voor iedereen. Via Start kan je bestaande projecten bekijken. Het vermijdt ook dat je je projecten via USB-sticks moet rondzeulen en kwijtgeraken, dat je je projecten naar jezelf moet doormailen en andere archa¨ısche technieken om projecten van de ene naar de andere pc te krijgen. Het is natuurlijk ook noodzakelijk dat je vrij met CircuitMaker kan leren werken zonder dat je (genante) probeersels meteen zichtbaar zijn voor de hele wereld. Om deze reden laat CircuitMaker ook toe om aan 2 private projecten te werken, in zogenmaamde sandbox modus. Wil je een 3e private project, dan zal je e´ e´ n van de vorige 2 projecten moeten releasen in de publieke cloud of weer verwijderen. Je kan dus zoveel oefenen als je wil. 41
D ESIGN EN PROTOTYPING
42
4.3
ing. Y. Verbelen
Schema’s tekenen
Vooraleer je componenten op een PCB kan gaan zetten en met elkaar verbinden, moet CircuitMaker eerst weten welke componenten je wil gebruiken, hoeveel pinnen deze hebben, en welke componenten onderling verbonden moeten worden en met welke pinnen precies. Dit doe je door de schakeling die je op PCB wil zetten digitaal te tekenen in CircuitMaker. Deze stap wordt ook wel schematic capture genoemd. Bij wijze van voorbeeld wordt hieronder gedemonstreerd hoe je zelf een schema met een ATmega328p microcontroller kan tekenen in CircuitMaker.
Stap 1. Maak een nieuw project in CircuitMaker. Via tabblad Home en vervolgens Start → New Project. Vul een zinvolle naam in voor je project en een beschrijving die ook begrijpbaar is voor anderen, en check de optie Sandbox, zoals weergegeven in figuur 4.3. Klik Save.
Figuur 4.3: Een nieuw private (sandbox) project aanmaken.
Stap 2. Nu het project is aangemaakt in de cloud kan het bewerkt worden. Klik in het projectoverzicht op de knop Open. Het workspace panel Projects verschijnt met daarin een leeg project dat AlarmClockCore.PrjPcb (of een andere naam) heet.
Stap 3. Voeg een schemadocument toe aan het project. Klik op de knop Project in de werkbalk (op tabblad Home) en kies de optie Add New Schematic. CicuitMaker vraagt je om dit nieuwe schema een naam te geven, bijvoorbeeld Core.SchDoc. In het workspace panel Projects verschijnt er onder je project nu een nieuw schema dat Core.SchDoc heet, en het schema wordt ook geopend in de editor. Op dit virtuele blad papier zal je je schema tekenen. Merk op dat er in de werkbalk naast Project opeens heel wat nieuwe knoppen tevoorschijn zijn gekomen. De inhoud van de werkbalk verandert dynamisch afhankelijk van het actieve document in de editor.
Stap 4. Op het blanco schemadocument kan je zoveel componenten (eng. parts) toevoegen als je wenst. Start met de ATmega328p toe te voegen. Klik op de knop Libraries aan de rechterzijde van het schemadocument om het workspace panel Libraries op te roepen. Met de zoekfunctie van Libraries kan je componenten zoeken als je de naam kent. Selecteer in de bovenste dropdownbox Ciiva om in de Ciiva part library te zoeken, en typ in het zoekvak eronder atmega328p. De tekst in het zoekvak is niet hoofdlettergevoelig. Klik op de knop met het vergrootglas naast dit tekstvak om het zoeken te starten. Na enkele ogenblikken worden er zoekresultaten geretourneerd, zoals weergegeven in figuur 42
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
43
Figuur 4.4: Een ATmega328p selecteren in de Ciiva library.
4.4. De ATmega328p bestaat in verschillende behuizingen (eng. package), o.a. versies met en zonder lange pinnen. De versie met lange pinnen is natuurlijk veel gemakkelijker te solderen, en geniet de voorkeur. De volledige componentnaam met deze behuizing, die DIP-28 heet, is ATMEGA328P-PU. Je kan ze ook herkennen aan de afbeelding die in de previews getoond wordt. Selecteer een ATMEGA328P-PU om deze te downloaden, en de eigenschappen weer te geven. CircuitMaker zoekt o.a. prijsinformatie bij de belangrijkste elektronicaleveranciers op, geeft een overzicht van de modellen die gekoppeld zijn (schemasymbool en footprint), en de revisies. Selecteer de laatste revisie, en sleep de component dan uit de lijst naar je schema. Er verschijnt een gele rechthoek, het schemasymbool dat met de ATmega328p overeenkomt. Alle pinnen van de microcontroller zijn al benoemd, o.a. VCC en GND.
43
D ESIGN EN PROTOTYPING
44
ing. Y. Verbelen
Stap 5. De ATmega328p heeft nog enkele componenten nodig om goed te kunnen werken: ontkoppelcondensators op de voeding, en een kristal van 16 MHz om het kloksignaal te genereren. Het kristal toevoegen gebeurt op dezelfde manier: open opnieuw het Libraries workspace panel, en zoek naar 16 MHz crystal. Kies een type met lange pinnen, dit package heet HC49S. Je kan ook meteen op een gekend type zoeken, zoals bijvoorbeeld FOXSLF/160-20. Sleep ook het kristal naar je schema.
Stap 6. Ten slotte zijn er nog de condensators: 27 pF voor het kristal, 100 nF en 47 µF voor de voeding. Die zijn niet zo gemakkelijk te vinden omdat er zodanig veel verschillende condensators zijn dat je door de spreekwoordelijke bomen het bos niet meer ziet. Als je zoekt op 27 pF is de lijst met zoekresultaten quasi eindeloos. Jammer genoeg kan je niet filteren op enkel through hole condensators met een bepaalde pinafstand, wat zoeken op deze manier lastig maakt. In plaats van eeuwig door de lijst met zoekresultaten te bladeren, is het meestal effici¨enter om via componentdistributeurs zoals Farnell of Digikey een type op te zoeken dat je past, en dan op dit specifieke typenummer te zoeken in CircuitMaker. Dit doe je als volgt: • Open een webbrowser en navigeer naar http://www.digikey.com. • Gebruik hun zoekfunctie om naar 27pF capacitor te zoeken. Er verschijnt een overzicht met zoekresultaten. • Klik onder Capacitors op Ceramic Capacitors, het meest voorkomende type (zoals ook blijkt uit het aantal zoekresultaten erachter). • Bovenaan de pagina heb je de keuze uit een aantal filters. 3 filters zijn belangrijk: 1. Capacitance: 27 pF. 2. Mounting Type: Through Hole (het type dat in breadboards past). 3. Lead Spacing: 2.54 mm of een veelvoud ervan (de afstand tussen rijen of kolommen in een breadboard). • Klik onder de filters op de knop Apply Filters. De meer dan 2000 oorspronkelijke zoekresultaten werden gereduceerd tot een vijftigtal. • Kopi¨eer het typenummer uit de kolom Manufacturer Part Number en typ het in CircuitMaker om te zoeken naar deze condensator. • Als CircuitMaker geen zoekresultaten met een gekoppeld model (schemasymbool en footprint) oplevert, neem dan de volgende condensator uit de Digikey-lijst, enzovoort. Voor andere passieve componenten zoals weerstanden of spoelen pas je dezelfde werkwijze toe. Bruikbare condensatortypes zijn • K104M15X7RF53L2 (Vishay) voor de 100 nF condensators; • FK28C0G1H270J (TDK) voor de 27 pF condensators; • UVR1E470MDD1TA (Nichicon) voor de 47 µF condensator. Stap 7. De typenummers van de condensators als “comment” bij elke component maakt het schema er ook niet leesbaarder op. Aangezien je deze info niet echt nodig hebt, is het nuttiger e´ n duidelijker om in je schema de waarde van de respectievelijke condensators te vermelden. Dit doe je als volgt. Dubbelklik op een condensator om het eigenschappenvenster op te roepen. Links zie je enkele instellingen, rechts een lijst met eigenschappen van de condensator. Klik onderaan op de knop Add om een nieuwe eigenschap Value toe te voegen, en geef die de waarde van de condensator. Figuur 4.5 toont als voorbeeld een 27 pF condensator.
44
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
45
Figuur 4.5: De waarde (value) 27pF toevoegen aan een condensator.
Vink de optie Visible uit en klik op OK om de eigenschap (eng. property) aan de condensator toe te voegen. De eigenschap Value komt nu in de lijst te staan, en kan weergegeven worden. Selecteer vervolgens =Value uit de lijst met mogelijke comments aan de linkerzijde van het venster, zoals in figuur 4.6, en klik vervolgens op OK om de wijzigingen door te voeren. Herhaal dit voor de resterende 4 condensators.
Figuur 4.6: Het eigenschappenvenster van schemacomponenten.
Stap 8. Alle noodzakelijke componenten staan nu in het schema, maar er is nog geen enkele mogelijkheid om signalen op de (toekomstige) PCB te krijgen. Er moet ten minste toch nog een aansluiting voor de 5 V voeding van de ATmega328p voorzien worden. Om kabels voor voeding en signalen aan 45
46
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
te sluiten op een PCB worden in de elektronica connectors gebruikt. In het volgende hoofdstuk worden connectors uitvoerig besproken om je wegwijs te maken in het gigantische aanbod aan elektronische connectors. Elk type connector heeft zijn eigen toepassingen. Bij wijze van demonstratie worden er hier 2 connectors toegevoegd: e´ e´ n voor een DC-voeding (hetzelfde type dat ook op Arduino’s zit), en e´ e´ n voor seri¨ele data. Open opnieuw het Libraries workspace panel en zoek naar DC Jack, de zwarte cilindervormige connector die ook op je Arduino Uno zit. Let er ook hier weer op om een type met vertikale aansluitingen te kiezen, zoals de KLDX-0202-B van Kycon. Sleep hem bij op je schema. Zoek vervolgens naar een seri¨ele connector zoals getoond in figuur 4.10 van type D SUB 9 (de technische naam van dat soort connectors), of meteen op type DLS1XS5AK40X van Conec. In het volgende hoofdstuk wordt dieper ingegaan op de verschillende types connectors. Pas de comments van beide connectors aan naar iets zinvollers (bijvoorbeeld Power en UART), en de designators naar “K?” (K is de gebruikelijke designator voor connectors).
Stap 9. De enige component die nu nog ontbreekt is een pullupweerstand op de resetlijn van de ATmega328p. Zonder deze weerstand blijft de resetingang zwevend, en zal de microcontroller continu blijven resetten. Vermits de resetingang actief laag is, moet er dus een pullupweerstand voorzien worden om het voortdurend resetten tegen te gaan. De waarde van deze pullupweerstand is niet kritisch, elke waarde tussen ca. 10 kΩ en 33 kΩ is bruikbaar. Probeer nu zelf een weerstand van 10k toe te voegen aan het schema. Let er hierbij op dat je een radiaal type (met aansluitdraden zoals je ze in een breadboard zou pluggen) kiest!
Stap 10. Eens alle componenten op het schema staan, kunnen ze met elkaar verbonden worden. Het kristal komt tussen de twee oscillatoringangen van de ATmega328p, ondersteund door de 27p condensators. De andere condensators komen op de voedingspinnen, die ook verbonden worden met de DC Jack. De pullupweerstand trekt de resetingang van de ATmega328p hoog, en de DSUB-9 connector ten slotte wordt verbonden met de RX en TX pinnen. Figuur 4.7 toont de aansluitingen. Componenten verbinden doe je via de functie Wire die je tussen de Circuit Elements in de werkbalk vindt.
46
ing. Y. Verbelen
D ESIGN EN PROTOTYPING 47
47
Figuur 4.7: Het volledige schema.
D ESIGN EN PROTOTYPING
48
ing. Y. Verbelen
Stap 11. Er ontbreken nog enkele elementen in het schema. Er is nog geen grondpotentiaal (GND) gedefinieerd, en ook geen voedingsspanning. Een grondpotentiaal en voedingsspanning defini¨eren kan via de functie Place Power Port, die je eveneens in de werkbalk vindt tussen de andere Circuit Elements. Voeg aan het net (= verbinding) dat aan de VCC-pin van de ATmega328p gekoppeld is (pin 7) een +5 V power port toe, en aan de andere kant van de condensators een GND power port. Figuur 4.7 toont waar je de power ports moet toevoegen.
Stap 12. Om duidelijk aan te geven wat de functie is van nets, is het aanbevolen om ze een label te geven. Een label vervangt de generische naam die CircuitMaker aan nets geeft door een naam die je zelf kiest. Alle nets waar je al een power port aan gekoppeld hebt, krijgen automatisch dezelfde naam (in dit geval +5 en GND). De anderen zou je bijvoorbeeld reset, OSC1, OSC2, RX en TX kunnen noemen. Een label toevoegen aan een net doe je via de functie Net Label die je tussen de intussen bekende Circuit Elements vindt in de werkbalk. Een net label krijgt standaard de naam NetLabel1 maar je kan deze standaardnaam wijzigen door op de tabtoets te drukken nog voor je het label plaatst, en de naam te wijzigen. Je kan de naam van een geplaatst label veranderen door op het label te dubbelklikken. Let erop dat je de labels steeds boven een net plaatst. Figuur 4.7 toont waar je ze plaatst.
Stap 13. Het is je waarschijnlijk al opgevallen dat er naast heel wat componenten een rode lijn staat, die wijst op een fout. Het probleem met deze componenten is dat ze geen unieke identificatiecode (= designator) hebben. Alle condensators heten nog C?, en beide connectors heten K?. Gelukkig hoef je ze niet allemaal manueel een unieke naam te geven, want in grote designs zou dat een omslachtige bezigheid zijn. Selecteer het tabblad Tools in de menubalk en klik op Annotate, dan vervolgens op Annotate Schematics Quietly. CircuitMaker vraagt om te bevestigen dat je de designators van 10 componenten wil aanpassen. Antwoord Yes. Alle vraagtekens worden nu vervangen door getallen zodanig dat elke component een unieke designator heeft. Alle rode lijnen zijn meteen verdwenen.
Stap 14. Rechterklik op Core.SchDoc in het Projects workspace panel en klik Save om het schema op te slaan. Regelmatig opslaan is belangrijk omdat CircuitMaker nog in volle ontwikkeling is, en er dus nog vervelende bugs in kunnen zitten. Klik op het tabblad Home → Project → Compile om het project te compileren. CircuitMaker controleert je schema op kortsluitingen en andere fouten. Open het workspace panel Messages via tabblad View → Messages. De melding Compile successful, no errors found verschijnt. Het schema is nu klaar om omgezet te worden naar een PCB!
4.4
De PCB
Een correct opgezet schema bevat alle nodige informatie om een PCB te kunnen tekenen: de componenten en hun “voetafdruk” (eng. footprint), unieke designators en waarden, en de onderlinge verbindingen. Het omzetten van het schema naar een PCB is op die manier behoorlijk eenvoudig.
Stap 15. Klik op het tabblad Home → Project → Add New PCB en geef de PCB een naam, bijvoorbeeld Core.CMPcbDoc. Klik OK om de PCB toe te voegen aan je project. De PCB-editor wordt geopend, en er verschijnt een zwart vierkant. Dit vierkant weerspiegelt het bovenaanzicht van de PCB. Voorlopig is de PCB nog leeg, aangezien er nog geen componenten of traces op aangebracht zijn. Druk op de 3-toets op je toetsenbord om over te schakelen van 2D naar 3D weergave. De PCB kleurt groen zoals je gewend bent van PCB’s. Je kan de blanco PCB draaien met de muis als volgt: hou de shift-toets ingedrukt om een gele bol tevoorschijn te halen, en sleep vervolgens met de rechtermuisknop over deze bol. De PCB draait of kantelt dan in dezelfde richting. Om terug te keren naar 2D weergave druk je op de 2-toets. Je merkt ook hier dat de knoppen in de werkbalk dynamisch veranderen afhankelijk van de mode (2D of 3D) waarin je de PCB bekijkt.
48
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
49
Stap 16. De volgende stap is de componenten van het schema “vertalen” naar een fysisch equivalent op basis van hun footprints, en ze overbrengen naar de PCB. Klik op het tabblad Home → Project → Import Changes From AlarmClockCore.PrjPcb (of hoe je project heet). De ECO (Engineering Change Order) verschijnt met daarin een overzicht van alle verschillen tussen het schema en de PCB. Eerst worden alle componenten toegevoegd, dan de netten die ze verbinden, en tot slot een klasse waarin de componenten worden opgenomen. Klik onderaan op Validate Changes. CircuitMaker controleert op mogelijke conflicten, en geeft die aan met een groen vinkje of rood kruisje in de Check kolom. Als er overal een groen vinkje staat, dan kan je op Execute Changes klikken om de wijzigingen door te voeren, en de componenten op je PCB toe te voegen. Alle componenten komen nu naast de PCB te staan.
Stap 17. Elke kleur in de footprints vertegenwoordigt een andere layer, en je herkent meteen enkele bekende vormen waaruit je hun functie kan afleiden: rode cirkels met grijze omranding zijn pads (= soldeereilandjes) met gaten erin waarop je componenten zal solderen, en witte lijnen zijn tekstopdruk, zoals te zien is in figuur 4.9. De gearceerde gebieden geven de grootte van de gekoppelde 3D-modellen aan, die gebruikt worden om te detecteren wanneer componenten elkaar overlappen. De dunne witte lijntjes die de pads met elkaar verbinden, ook ratsnest genoemd, geven aan welke pads onderling elektrisch verbonden moeten worden met traces. Ze zijn van groot belang om de componenten effici¨ent te kunnen plaatsen op je PCB. Met effici¨ente plaatsing wordt bedoeld: alle connectors op de rand zodanig dat je er kabels in kan steken, en met zo weinig mogelijk kruisingen in de ratsnest. Figuur 4.10 toont een voorbeeld van een goede plaatsing van de componenten.
Stap 18. Vooraleer je tracks kan routeren moet CircuitMaker eerst weten hoe breed die tracks moeten zijn, hoe ver ze uit elkaar moeten liggen enzovoort. Deze regels definieer je als design rules. Open het venster met design rules via tab Home → Design Rules → Define Design Rules. Aan de linkerzijde zie je een hele waslijst aan regels, maar de meesten zijn al goed ingesteld en hoef je dus niet te wijzigen. De regels die wel aanpassing vereisen zijn de afstand tussen tracks en pads, deze regel heet Clearance, en de breedte van tracks die Width heet. Klik de Clearance regel open (staat onder Electrical) en pas de minimale clearance aan van 10 mil naar 15 mil. Let op: e´ e´ n mil is een duizendste van een Engelse inch en komt overeen met 0.0254 mm. In PCB-design worden mils en mm door elkaar gebruikt, dus verwar ze niet met elkaar. Figuur 4.8 toont de instelling voor de Clearance regel. Voor de breedte van tracks moet je de Width regel aanpassen, die je onder Routing vindt. Stel de minimale breedte in op 15 mil, en voorkeur op 25 mil. De maximale breedte is niet belangrijk, dus die stel je best voldoende groot in, bv. 100 mil of meer. Figuur 4.8 toont onderaan de instelling voor de Width. Net zoals bij clearance is zijn de waarden empirisch bepaald op basis van vorige ervaring met PCB’s maken in het fablab. De hierboven opgegeven waarden zijn nogal conservatief, en de kans is dus groot dat je PCB van de eerste keer zal lukken. Je kan echter veel kleiner gaan als het echt moet (tot 8 mil clearance en 8 mil width) maar dit vergt veel ervaring, en succes is niet altijd gegarandeerd. Als je dus zelf je PCB wil maken in het fablab, neem je de afmetingen van clearance en width dus bij voorkeur zo groot mogelijk.
Stap 19. Dan kan het echte werk beginnen: de componenten met elkaar verbinden. Vermits de componenten langs de bovenzijde van de PCB worden gemonteerd en dan door de gaten in de pads worden gestoken, moeten ze langs de onderzijde gesoldeerd worden. De bovenzijde wordt daarom ook wel component side genoemd, en de onderzijde solder side. In CircuitMaker moet je dus de traces tekenen op de onderzijde, die daar bottom layer heet. Selecteer de bottom layer onderaan de PCB editor door op het tweede tab te klikken. Tracks tekenen doe je via de wiring tool op het tabblad Home → Routing → Route. De cursor verandert in een target pointer (eng. crosshair) die snapt op het centerpunt van pads. Snap hem op e´ e´ n van de pads die moeten verbonden worden met andere pads, en klik met de linkermuis om de track te plaatsen. Als je nu de muis beweegt, dan volgt de track interactief de positie van de muis. Van zodra je een stukje op de goede plaats hebt liggen, klik je opnieuw met de linkermuisknop om hem vast te leggen. Routeren be¨eindigen doe je met een rechtermuisklik. Figuur 4.9 toont het principe.
49
D ESIGN EN PROTOTYPING
50
ing. Y. Verbelen
Figuur 4.8: Instellingen voor clearance (boven) en track width (onder).
Enkele tips: • Als je op de tab-toets drukt tijdens het routeren, kan je dynamisch de breedte van je tracks aanpassen. Een breedte van 25 mil is een goede waarde om mee te starten, maar power tracks (VCC en GND) maak je bij voorkeur breder. • Je kan tracks automatisch plaatsen door tijdens het routeren de control-toets (ctrl) ingedrukt te houden. De resultaten zijn echter niet altijd zo optimaal. • Je kan bestaande tracks verplaatsen door een segment te selecteren en het dan te verslepen. • Je kan geplaatste segmenten verwijderen door het laatste segment te selecteren en op de backspacetoets te drukken. Een geselecteerd segement kan je verwijderen met de delete-toets. • Je kan ook alle segmenten die aan e´ e´ n specifiek net toebehoren in e´ e´ n keer verwijderen via Home → Routing → Unroute → Net. Je merkt meteen het belang van een goede componentenplaatsing: als je teveel kruisingen hebt, wordt het routeren van de PCB een vervelende opgave. Elke minuut die je spendeert aan het plaatsen van je componenten is nadien 10 minuten uitgespaard bij het routeren! In figuur 4.10 zie je een voorbeeld van een track layout. De power tracks, VCC en GND, werden gerouteerd met een breedte van 50 mil en al de rest met 25 mil.
Stap 20. De PCB is dan weliswaar gerouteerd, maar er is nog geen manier om hem te bevestigen in de behuizing van je wekker! Hiervoor dien je nog enkele montagegaten toe te voegen. De gemakkelijkste manier om dit te doen is losse pads te plaatsen zonder koperring errond. Pads toevoegen doe je via Home → Place → Place Pad. De cursor verandert weer in een target pointer met een pad dat eronder zweeft. Druk op de tab-toets om de instellingen aan te passen. Maak de gatdiameter (eng. Hole Size) groter zodanig dat er een bout door past. De diameter moet dus enkele tienden mm groter zijn dan de diameter van de bout. Om een M4-bout (4 mm) vlot te laten passen, stel je de diameter van het gat best in op 4.2 mm of zelfs nog iets groter. Zet ook de designator van het gat op 0 om CircuitMaker duidelijk te maken dat dit pad niet elektrisch verbonden hoeft te worden met andere pads. Klik OK om 50
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
51
Figuur 4.9: Plaatsing van de componenten in de PCB-editor. De ratsnest (dunne witte lijnen die pads verbinden) geven aan waar de verbindingen moeten komen. Merk op dat de componenten zodanig geplaatst zijn dat er zo weinig mogelijk kruisingen in de ratsnest zitten. Rechts: het routen van een 5 V power track tussen de voedingspinnen van de ATmega328p.
de instellingen op te slaan, en plaats vervolgens zoveel gaten als nodig met de linkermuisknop. Als je er genoeg hebt, annuleer je de operatie met de rechtermuisknip of de escape-toets. Je doet er best aan de gaten zodanig uit te lijnen dat ze een gemakkelijk patroon volgen, bijvoorbeeld een rechthoek, wat het mechanisch design van de behuizing flink vereenvoudigt.
Figuur 4.10: De PCB in 2D-weergave (links) en 3D-weergave (rechts).
Stap 21. De laatste stap is het aanpassen van de omtrek van de PCB, die nog steeds veel te groot is. Alle zwarte gebieden behoren immers tot de PCB, terwijl de componenten en tracks maar een fractie ervan benutten. Je kan de afmetingen freestyle bijsnijden via Home → Board → Edit Board Shape en dan de contourlijnen verslepen. Een alternatieve manier is op de Outline layer, die je onderaan de editor naast Bottom Layer vindt, de contour te tekenen als lijnen (Home → Place → Line). Eens de lijnen een gesloten omtrek vormen, selecteer je ze allemaal samen (shift-toets ingedrukt houden), en vervolgens Home → Board → Define From Selected Objects. De omtrek wordt nu netjes bijgesneden volgens de outline die je zelf hebt gedefinieerd. De highlight resetten doe je via View → Hightlight & Edit Mask → Clear. De PCB is nu klaar!
Stap 22. In het geval je PCB-ontwerp nadien moet aangepast worden, bijvoorbeeld omdat je een andere vorm nodig hebt om in je behuizing te passen of omdat je extra functies wil toevoegen, dan zal je een tweede versie moeten ontwerpen, daarna een derde enzovoort. Het is dus nuttig om je eerste versie 51
D ESIGN EN PROTOTYPING
52
ing. Y. Verbelen
meteen te markeren alsdusdanig zodat je je verschillende versies later uit elkaar kan houden. Je kan in CircuitMaker vrij tekst toevoegen aan je ontwerp, en als die tekst op de bottom layer staat dan komt hij mee op de PCB terecht. Activeer de tekst tool via Home → Place → String en druk op de tab-toets om de eigenschappen van de tekst aan te passen zoals je dit intussen al een aantal keer gedaan hebt met andere objecten. Let op: je kijkt op de PCB vanuit bovenaanzicht, maar de tekst komt op de bottom layer. Als je hem dus leesbaar wilt maken, dan moet je hem spiegelen (functie Mirror aanvinken). Je kan controleren of de tekst leesbaar is door over te schakelen naar 3D-weergave en de PCB te roteren zodanig dat je de achterkant kan zien. Vergeet niet je project en PCB op te slaan.
4.5
Productie
PCB’s ontwerpen kan iedereen, maar PCB’s ontwerpen die ook echt kunnen gemaakt en getest worden vergt de vaardigheden van een industrieel ingenieur. PCB’s maken is gelukkig niet zo moeilijk, het vergt enkel wat ervaring. In ons fablab maken we PCB’s met een chemisch proces dat etsen heet (eng. etching). Hierbij wordt vertrokken van een plaat isolerend materiaal waarop een volledige koperlaag is aangebracht. Van deze koperlaag worden dan de ongewenste stukken koper verwijderd in het etsbad zodanig dat enkel de tracks overblijven. Daarna kan je door de pads gaten boren en ten slotte de componenten erop solderen.
4.5.1
Gerbers
Net zoals je DXF-bestanden exporteert van 2D-vectorinformatie voor lasercutters en STL-bestanden van 3D-vectorinformatie voor 3D-printers, zo hebben printplaten ook hun eigen formaat dat Gerber heet. Elke layer van de PCB wordt ge¨exporteerd als een afzonderlijk gerberbestand, dat eveneens een vectorformaat is. Gerberbestanden zijn een internationale standaard die alle PCB-fabrikanten ondersteunen. Deze eenvoudige PCB heeft maar e´ e´ n layer met nuttige info, namelijk de bottom layer, en dus hoeft ook enkel de bottom layer ge¨exporteerd te worden. Zorg dat de PCB geopend is in de editor en klik op het tabblad Outputs → Gerber. Er verschijnt een venster met enkele tabs met instellingen. Stel ze als volgt in: • tabblad General: stel Units in als Inches en Format als 2:5. Wat deze instellingen precies doen is hier niet zo belangrijk. • tabblad Layers: selecteer de bottom layer in de kolom Plot. Verder hoef je hier niks aan te passen. • tabblad Drill Drawing: hier hoef je niks te selecteren. • tabblad Apertures: vink de optie Embedded apertures (RS274X) aan. • tabblad Advanced: stel Leading/Trailing Zeroes in als Keep leading and trailing zeroes, en Position on Film als Reference to absolute origin. De andere instellingen mogen op hun standaardwaarde blijven staan. Klik op OK. Het gerberbestand voor de bottom layer wordt nu ge¨exporteerd, en toegevoegd aan je project. Het bestand heet PcbNaam.GBL wat staat voor Gerber Bottom Layer. Het is net zoals G-code een tekstbestand met commando’s erin. Met dit gerberbestand kan je naar het fablab om je PCB te etsen. De fablabtutorials helpen je vanaf hier verder.
4.5.2
3D-model
Naast gerberbestanden biedt CircuitMaker je nog een tweede interessante exportmogelijkheid. Je kan nl. een 3D-model van je volledige PCB inclusief montagegaten en componenten exporteren als STEPmodel. Dit model kan je op zijn beurt importeren in jouw favoriete 3D CAD software zoals Inventor of SolidWorks. Dit kan je helpen bij het ontwerpen van de behuizing om bijvoorbeeld de cutouts voor de 52
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
53
connectors op de juiste plaats te krijgen, de nodige gaten voorzien die overeenkomen met de montagegaten op de PCB enzovoort. Een STEP-model van de PCB exporteren doe je via menu Outputs → Export → STEP. CircuitMaker vraagt om een bestandsnaam en vervolgens enkele opties. Laat de standaardinstellingen staan en klik op OK. CircuitMaker zoekt de 3D-modellen voor alle componenten op de PCB samen en exporteert ze naar het STEP-model.
4.6
Gevorderd design
Voor je eerste PCB heb je uitsluitend componenten gebruikt die in de CircuitMaker library stonden, en waar al een schemasymbool en footprint aan gekoppeld was. Naarmate je designs ingewikkelder worden neemt ook de kans toe dat je tegen een component aanloopt die niet in de CiruitMaker library zit. In dat geval biedt CircuitMaker je alle nodige functionaliteit om zelf schemasymbolen en footprints te tekenen. Dit valt echter buiten de scope van het vak Ingenieursvaardigheden. In de cursus ECAD in de 2e Bachelor wordt dieper ingegaan op gevorderd PCB-design en leer je ook de geavanceerde features van CiruitMaker kennen. Als je dus een component nodig hebt die niet in de CiruitMaker library staat, vraag dan om hulp aan je medestudenten uit de 2e Bachelor. Samenwerken met anderen en elkaars sterke punten leren kennen is eveneens een belangrijke ingenieursvaardigheid!
53
54
54
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
5
Bekabeling Everything is designed. Few things are designed well. Brian Reed
5.1
Inleiding
Als prototypes falen, dan is dat in veruit de meeste gevallen niet te wijten aan de elektronica, want die staat vastgesoldeerd op een robuuste PCB. Waar het dan w´el misloopt is bij de bekabeling, die slechte contacten oplevert als ze verkeerd is uitgevoerd. Ontoereikende bekabeling is een dermate grote oorzaak van frustratie bij prototypes dat dit volledige hoofdstuk wordt gewijd aan goede bekabelingstechnieken. Met kabels kan je niet alleen interne componenten met elkaar verbinden, ze zijn ook de verbinding naar de buitenwereld toe. Gebruikers zullen kabels gebruiken om je toestel aan te sluiten aan een voeding of te interfacen met andere hardware. Hierbij is het dus van groot belang om naast het juiste type kabel ook voor de juiste connectors te kiezen afhankelijk van de toepassing. In dit hoofdstuk wordt een overzicht gegeven van de voornaamste types kabels en connectors, hun voor- en nadelen, en basistechnieken voor bekabeling en kabelmanagement.
5.2
Kabels
De term kabel en draad worden door elkaar gebruikt, en er is geen duidelijk afgelijnde betekenis. Meestal wordt onder “draad” een al dan niet ge¨ısoleerde geleider verstaan, zoals de draadjes die je gebruikt om prototypes op breadboard te bouwen. Een “kabel” bestaat daarentegen uit meerdere ge¨ısoleerde geleiders (ook aders genoemd) die op e´ e´ n of andere manier samengebundeld zijn. Denk bijvoorbeeld aan een USB-kabel die 4 aders bevat (+5 V, D+, D- en GND), een stroomkabel met 3 aders (L, N en aarding) of een netwerkkabel met 8 aders. Elke ader binnen een kabel is dus een draad. Draden hebben 3 belangrijke eigenschappen: de kern, de isolatie en de dikte.
5.2.1
Structuur
Elektrische draden bestaan uit een geleidende kern met daarrond een elektrische isolator die de mantel heet. De kern bestaat meestal uit koper, maar kan in sommige gevallen ook staal, aluminium of een
D ESIGN EN PROTOTYPING
56
ing. Y. Verbelen
zilver/goudlegering zijn als nog betere geleidbaarheid gewenst is, bijvoorbeeld bij hoogfrequentdesigns. De structuur van de kern bepaalt de eigenschappen van de draad. De kern kan massief zijn of uit meerdere fijne draadjes bestaan die in elkaar geweven zijn. Beiden hebben specifieke toepassingen. Het voordeel aan een massieve kern is dat de draad zich gemakkelijk in een bepaalde vorm laat plooien doordat de kern stijf is. Je kan de draad dus bijvoorbeeld in rechte hoeken buigen, en hij laat zich netjes samen bundelen met andere draden. Het nadeel van een massieve kern is dat elke buiging de kern verzwakt, tot het punt dat hij doorbreekt en er dus geen elektrisch contact meer is. Draden met massieve kern gebruik je dus uitsluitend in toepassingen waar de vorm van de draad niet verandert, bijvoorbeeld om PCB’s in hetzelfde toestel met elkaar te verbinden. Het alternatief is een kern die bestaat uit meerdere fijne draadjes (eng. multicore wire). Hierdoor kan de kern quasi ongelimiteerd gebogen worden zonder te breken. Alle computerkabels (HDMI, USB, eSATA, ...) bestaan uit aders met dit type kern. Multicore gebruik je dus in toepassingen waar de vorm van de draad kan veranderen.
5.2.2
Isolatie
Binnen een kabel worden de verschillende draden elektrisch van elkaar ge¨ısoldeerd door hun mantel, die uit een niet geleidende kunststof of rubber bestaat. De dikte van de isolatie bepaalt hoe groot de spanning tussen naburige aders mag worden vooraleer de islatie doorslaat en er dus kortsluiting ontstaat. Ook het materiaal waarvan de mantel gemaakt is, speelt daarbij een rol. Bij meeraderige kabels staat de maximale spanning meestal langs de buitenzijde op de kabel gedrukt. Als vuistregel kan je stellen dat spanningen tot 50 V veilig door bijna elk type kabel kunnen vervoerd worden. In geval van twijfel neem je een kabel met dikker ge¨ısoleerde draden. Sommige draden en kabels hebben buiten een elektrische isolatie ook een magnetische isolatie, waarmee de signalen die getransporteerd worden afgeschermd worden van elektromagentische interferentie (EMI). Je herkent deze magnetische isolatie een een geweven mantel van staaldraad die rond de draad of kabel is aangebracht. Dergelijke kabels heten afgeschermde kabels (eng. shielded cables).
5.2.3
Dikte
Het metaal waarvan de kern gemaakt is, is nooit een ideale geleider. Als er dus stroom door loopt, dan wordt er een bepaald vermogen gedissipeerd in de draad doordat de weerstand niet 0 is. De draad zal daardoor opwarmen. Als de temperatuur te hoog oploopt, dan kan de isolatie gaan smelten waardoor er opnieuw een risico op kortsluiting ontstaat. Een spanningsval over draden is ook ongewenst omdat het signaalverlies oplevert, en de schakeling zich dus mogelijk niet zal gedragen zoals je verwacht. Elke draad heeft zijn eigen maximale stroom (eng. current rating) die je moet respecteren. Deze maximale stroom staat ook op de buitenzijde van de kabel samen met de isolatiespanning, of je kan het als parameter in de datasheet van de draden vinden. Als je meer stroom wil vervoeren dan de maximale stroom die door de kabel wordt toegelaten, dan kan je meerdere aders in parallel schakelen. Voor grote stromen wordt de dikte van draden uitgedrukt in hun oppervlakte als mm2 , voor elektronische draden is de diameter echter zo klein dat dit moeilijk te meten is. Daarom wordt er gewerkt met de AWG-schaal (American wire gauge). Hoe groter de AWG-waarde, hoe dunner de draad. Het omrekenen van AWG naar diameter is behoorlijk complex, dus het is gemakkelijker om er een tabel voor te gebruiken1 . Enkele veel voorkomende waarden staan in tabel 5.1. 1 https://en.wikipedia.org/wiki/American
56
wire gauge#Tables of AWG wire sizes
ing. Y. Verbelen
D ESIGN EN PROTOTYPING AWG 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 5 1
diameter (mm) 0.080 0.101 0.127 0.160 0.202 0.255 0.321 0.405 0.511 0.644 0.812 1.024 1.291 1.628 2.053 2.588 4.621 7.348
doorsnede (mm2 ) 0.005 0.008 0.013 0.020 0.032 0.051 0.081 0.129 0.205 0.326 0.518 0.823 1.31 2.08 3.31 5.26 16.8 42.4
RCu (Ω/m) 3.441 2.164 1.361 0.856 0.538 0.339 0.213 0.134 0.084 0.053 0.033 0.021 0.014 0.083 0.052 0.033 0.001 0.001
57
Imax (A) 0.0137 0.0228 0.035 0.056 0.091 0.142 0.226 0.361 0.577 0.92 1.5 2.3 3.7 5.9 9.3 15 47 119
Tabel 5.1: Draaddikte volgens de AWG schaal van dun (40 AWG) naar dik (1 AWG). De maximale stroom voor elke draaddikte is eveneens aangegeven.
5.3
Kabeltypes
Hieronder wordt een overzicht gegeven van de belangrijkste types kabels die je zal tegenkomen, en in welke toepassingen je ze gebruikt.
5.3.1
Bandkabel
Bandkabels (eng. ribbon cable of flat cable) bestaan uit meerdere aders die in e´ e´ n vlak aan elkaar gekleefd zijn, en zo een brede “band” vormen. De breedte van de kabel is dus evenredig met het aantal aders. Elektrisch gezien zijn bandkabels ideaal om digitale signalen te transporteren, omdat alle aders even lang zijn en alle signalen dus op hetzelfde moment op hun bestemming toekomen (isochronie). Bandkabels zijn ook het enige type kabel met een aantal aders dat willekeurig gekozen kan worden. Voor analoge signalen zijn ze echter niet ideaal omdat de aders zo dicht bij elkaar liggen dat er interferentie onstaat tussen aanliggende aders die crosstalk wordt genoemd. Signalen van de ene ader worden dus ge¨ınduceerd in aanliggende anders en omgekeerd. Als je bandkabels toch wil gebruiken om analoge signalen te transporteren, dan kan je crosstalk onderdrukken door signaaladers af te wisselen met grondaders. Het meest voorkomende type bandkabel is grijs, met e´ e´ n zijde die rood of bruin gekleurd is om de eerste ader aan te duiden. Er bestaat ook bandkabel waarbij elke ader een ander kleurtje heeft, en de volgorde de kleurencodering van weerstanden volgt (zie handouts Basiselektronica). Deze versie wordt regenboogkabel genoemd (eng. rainbow cable) en is aanzienlijk duurder dan de grijze tegenhanger. De ader die met pin 1 overeenkomt is dus bruin, die voor pin 2 rood enzovoort. Je bent natuurlijk niet verplicht deze codering te volgen, maar het helpt om sneller te debuggen. De dikte van bandkabeladers is gestandardiseerd op 26 AWG, wat overeenkomt met een diameter van 0.4 mm. Dit is dus moeilijk op een betrouwbare manier af te strippen en te solderen. Om die reden worden bandkabels steeds gebruikt in combinatie met IDC-connectors, die verderop worden besproken. 57
D ESIGN EN PROTOTYPING
58
ing. Y. Verbelen
Figuur 5.1: Van links naar rechts: grijze en rode bandkabel, een coaxkabel met en zonder BNC-connector, en een 8-aderige UTP-kabel met en zonder RJ-45 connector.
5.3.2
Coaxkabel
Om analoge signalen die gevoelig zijn voor interferentie over lange afstanden te transporteren, moeten er maatregelen genomen worden om ze voldoende af te schermen van externe stoorbronnen. Voor deze toepassing gebruik je coaxkabels. Coaxkabels bestaan uit een centrale kern die omringd is door een isolerende mantel, en waarrond nog een extra buitengeleider is aangebracht die bestaat uit gewoven metaaldraad. De buitengeleider gedraagt zich als een Faradaykooi en verhindert dat het signaal in de kabel wordt gecontamineerd door externe interferentie. Omgekeerd verhindert het ook dat signalen naar buiten lekken en zelf voor interferentie zorgen. Coaxkabel voor elektronische toepassingen is vrij duur omdat de impedantie heel nauwkeurig gecontroleerd wordt voor toepassingen in transmissielijnen, waarover je in de 3e Bachelor Elektronica meer leert. Voor de meeste toepassingen is coaxkabel van iets mindere kwaliteit ook voldoende, en die vind je in elke doe-het-zelfzaak als tv-kabel. Om de isolatie te bewaren moeten ook connectors afgeschermd zijn. Coaxkabels worden daarom gebruikt in combinatie met BNC-connectors, zoals ze o.a. worden toegepast om probes op een oscilloscoop aan te sluiten.
5.3.3
UTP-kabel
UTP-kabels bestaan uit 8 geleiders, en worden veel gebruikt om computernetwerken te bekabelen (Ethernet). Ze zijn meestal niet afgeschermd, maar toch geschikt voor digitale signalen als de frequentie niet te hoog is (max. enkele kHz). Ze kunnen behoorlijk wat stroom transporteren, dus kleine motors of LED’s aansluiten is geen probleem.
5.3.4
Bundels
Als geen van bovenstaande types geschikt is voor jouw toepassing, bv. als je intern een korte afstand wil overbruggen en het aantal signalen dat je wil transporteren niet te groot is, dan kan je ook zelf een aantal draden bundelen tot een kabel. Je hebt dan de keuze tussen een massieve kern of een multicore, en je kan de dikte van de aders en hun aantal zelf bepalen. De netste manier om kabelbundels samen te houden is door gebuik te maken van tie-wraps (eng. zip tie, ook kabelbinders of snelbinders genoemd). Ze bestaan uit een dunne nylon strip met ribbels aan de binnenzijde. Eenmaal de vrije zijde door de opening gestoken wordt, gaat ze niet meer terug open. Je kan tie-wraps ook gebruiken om de draden meteen ook vast te zetten in de behuizing, door de tie-wrap door een opening in de behuizing te steken.
5.4
Connectors
E´en van de gulden regels van PCB design is nooit draden rechtstreeks op de PCB te solderen. De verbinding is een zwak punt omdat de mantel daar van de draad is afgestript, en vroeg of laat breekt de draad van de PCB af. Een uitzondering hierop zijn draadbruggen (eng. jumpers) die je kan gebruiken 58
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
59
om korte afstanden op de PCB te overbruggen, op voorwaarde dat beide uiteinden op dezelfde PCB zijn vastgesoldeerd e´ n dat de draad in kwestie niet kan bewegen. Om kabels te verbinden met een PCB is er dus een speciale interface nodig, die je ondertussen kent als connectors. Elk type kabel heeft zijn eigen connectors specifiek voor dit type kabel, maar er bestaan ook talrijke generische connectors die bruikbaar zijn met quasi alle types kabels. Hieronder wordt een overzicht gegeven van de voornaamste types, en in welke situaties je ze gebruikt.
5.4.1
Terminologie
De terminologie rond connectors kan voor verwarring zorgen omdat er ontelbare varianten bestaan op dezelfde principes. 5.4.1.1
Geslacht
Een connector kan mannelijk (eng. male) of vrouwelijk (eng. female) zijn. Mannelijke connectors hebben pinnen of soortgelijke uitsteeksels die in de corresponderende gaten of uitsparingen van vrouwelijke connectors passen. De meeste connectors werken volgens dit principe, maar er zijn ook geslachtloze connectors die symmetrisch zijn. Om praktische redenen wordt de mannelijke kant, die pinnen heeft, meestal op de PCB gezet omdat dezelfde pinnen rechtstreeks kunnen vastgesoldeerd worden. De vrouwelijke connector plugt er dan op in. Mannelijke PCB connectors zijn om die reden gemakkelijker te vinden dan vrouwelijke, net zoals vrouwelijke kabelaansluitingen gemakkelijker te vinden zijn dan mannelijke om dezelfde reden. In principe zijn voor PCB-aansluitingen beide echter inwisselbaar. E´en belangrijke uitzondering op dit principe zijn situaties waarin een hoge spanning op de kabelkant of de PCB-kant kant kan staan. In dat geval levert een mannelijke connector een risico op omdat de pinnen daar kunnen aangeraakt worden. In dergelijke gevallen is het dus verplicht om voor die kant een vrouwelijke connector te kiezen, en voor de kabel de mannelijke kant. Een goed voorbeeld zijn netstekkers: die zijn mannelijk (kabelkant) en worden in een vrouwelijk stopcontact geplugd. 5.4.1.2
Pinafstand
Buiten de fysische vorm van de connector bepaalt de afstand tussen 2 aanliggende pinnen grotendeels welke connectors compatibel zijn. Deze pinafstand (eng. pitch) verschilt van connectortype tot connectortype, en kan uitgedrukt worden in Engelse maten of SI-eenheden. Voor standaardheaders is de pitch bijvoorbeeld precies 100 mil (2.54 mm), en dat geldt ook voor de pitch van breadboards. Bij veel andere connectors wordt de pitch echter uitgedrukt in mm. Omdat 100 mil zo dicht bij 2.5 mm ligt, worden connectors soms met de foutieve pitch gelabeld. JST-connectors met een pitch van 2.5 mm (zoals in figuur 5.3) worden online courant geadverteerd als 100 mil pitch, hoewel dat incorrect is. Alle JST-connectors gebruiken immers SI-maten in mm. Omdat het verschil in pitch zo klein is (0.04 mm) zullen kleine connectors praktisch wel passen, maar bij brede connectors accumuleert de fout snel en die zullen dus niet meer op de footprint passen. Het connectortype dat de meeste verwarring oplevert zijn printkroonstenen. Zij zijn verkrijgbaar in versies met talloze verschillende pinafstanden, waarbij 200 mil de meest gangbare lijkt te zijn, maar ook 3.94 mm en 5 mm komen relatief veel voor. Check dus steeds je footprint met de connector in je prototype om er zeker van te zijn dat hij gaat passen. 5.4.1.3
Type
Veruit de meeste connectors zijn bedoeld om kabels te verbinden met PCB’s. In dat geval wordt de mannelijke connector op de PCB gesoldeerd en wordt er een vrouwelijke connector ingeplugd. Dit 59
D ESIGN EN PROTOTYPING
60
ing. Y. Verbelen
soort connectors heet wire to board connectors. Om kabels te verlengen, of verschillende kabels met elkaar te verbinden, worden wire to wire connectors gebruikt. Kroonstenen bestaan bijvoorbeeld in een versie met een schroefconnectie langs elke kant (de wire to wire versie) en een versie die langs de andere kant op de PCB wordt gesoldeerd, printkroonstenen. Die zijn dan wire to board. Een laatste type connectors is bedoeld om verschillende PCB’s rechtstreeks met elkaar te verbinden, zonder gebruik te maken van kabels. Deze connectors heten dan board to board connectors. Je herkent ze gemakkelijk omdat hierbij ook de vrouwelijke kant op de PCB gesoldeerd zit, wat bij wire to board connectors ongewoon is. Het bekendste voorbeeld van board to board connectors zijn de female headers op Arduino’s, die bedoeld zijn om uitbreidingsmodules (shields) in te pluggen. Andere voorbeelden zijn PCI-e slots en DIMM slots op moederborden. 5.4.1.4
Ori¨entatie
Bijna alle connectortypes bestaan in 2 versies: een vertikale versie (eng. straight) waarbij de complementaire connector langs de bovenzijde wordt ingeplugd, en een rechte hoek versie (eng. right angle) waar de complementaire connector langs de zijkant wordt ingeplugd. Welk type connector het best geschikt is hangt volledig af van de toepassing. Als er niet veel ruimte is boven de PCB dan kan het moeilijk zijn om een kabel in een vertikale connector geplugd te krijgen. Hetzelfde geldt voor stapels (eng. stacks) van PCB’s die met board to board connectors met elkaar verbonden zijn. In deze situaties gebruik je bij voorkeur right angle connectors. Heb je horizontaal niet veel ruimte, dan kies je uiteraard beter voor de straight versies.
5.4.2
Printkroonstenen
De eenvoudigste manier om draden aan te sluiten op een PCB is gebruik te maken van printkroonstenen (eng. screw blocks). Ze bestaan uit kroonstenen met een vertikale pin die bedoeld is om op een PCB gesoldeerd te worden. Draden aansluiten gebeurt dan op dezelfde manier als bij normale kroonstenen, nl. door ze dicht te draaien met een kleine schroevendraaier. Printkroonstenen zijn dus wire to board connectors.
Figuur 5.2: Aansluiting van VCC en GND aan een audioversterker (links). Doordat printkroonstenen in versies met 2 en 3 aders maar niet 4 aders verkrijgbaar zijn, werd er hier geopteerd om 2 printkroonstenen van 2 aders naast elkaar te gebruiken. De meeste types schuiven met een groef in elkaar. Rechts: een schakelende voeding met een LM2596 buckconverter waarvan de in- en uitgangsspanningen worden afgenomen via groene printkroonstenen.
Printkroonstenen kunnen veel stroom verwerken en lenen zich uitstekend om dikke draden op een PCB aan te sluiten, bijvoorbeeld om een 230 V netsnoer met een PCB te verbinden. Ze nemen in vergelijking met andere connectortypes de meeste ruimte in beslag per ader, zijn vrij duur, en hebben als 60
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
61
nadeel dat je extra gereedschap nodig hebt om de draden aan te sluiten en weer los te maken. Printkroonstenen werken enkel betrouwbaar als de draden voldoende dik zijn. Multicore draden zal je eerst moeten vertinnen met soldeertin. Omdat de pitch bij printkroonstenen niet gestandardiseerd is, moet je bij het ontwerp van je PCB goed opletten. Controleer steeds dat de pitch van je footprint overeenkomt met de werkelijke pitch van de connector. Waar gebruiken? Waar je een klein aantal dikke draden die veel stroom vervoeren wilt verbinden met een PCB.
5.4.3
JST-connectors
JST-connectors zijn het meest toegepaste connectortype. Ze zijn compact, relatief goedkoop, en zitten dankzij een kliksysteem betrouwbaar vast op de PCB. In tegenstelling tot printkroonstenen kan de aansluiting ook gemakkelijk geautomatiseerd worden. Hierdoor lenen ze zich uitstekend voor industri¨ele toepassingen die onderhevig zijn aan schokken of trillingen. JST-connectors zijn dus de keuze bij uitstek voor de meeste verbindingen die je als industrieel ingenieur moet maken tussen PCB’s, met ingebrip van de wekker. De pitch van JST-connectors is geen veelvoud van 100 mil en dus zijn ze niet breadboardcompatibel. De meest voorkomende pitch is 2.5 mm.
Figuur 5.3: PCB van een industri¨ele fotokopieermachine, met witte en blauwe JST-connectors die de H-bruggen interfacen met motors, sensors en andere PCB’s. Rechts: aansluiting van een stappenmotor met female 6-pin JST connector. Merk op dat er maar 4 van de 6 aders in gebruik zijn aan de kabelzijde.
Bij JST-connectors wordt de mannelijke kant steeds op de PCB gesoldeerd. De vrouwelijke kant bestaat uit een lege behuizing waarin afzonderlijke contacten worden vastgeklikt. Om deze contacten op draden te krijgen heb je een krimptang nodig. De werkwijze hiervoor wordt verderop gedemonstreerd. Wanneer gebruiken? Waar je verschillende PCB’s die niet naast elkaar liggen met elkaar wilt verbinden, om motors e.a. actuators aan te sluiten, enz.
5.4.4
Waferconnectors
Waferconnectors zijn een speciaal type JST-connectors waarbij het omhulsel van de mannelijke connector langs e´ e´ n kant is weggehaald. Deze connectors hebben dikkere pinnen dan normale JST-connectors en worden dus vooral gebruikt voor de aansluiting van voedingskabels. Het nadeel van waferconnectors is dat de pinnen bloot zitten als de female connector niet is ingeplugd, wat gemakkelijker kan leiden tot kortsluitingen of aanraken. Waferconnectors hebben doorgaans een grotere pitch dan JST-connectors. Wanneer gebruiken? Uitwisselbaar met JST-connectors voor toepassingen waar grote stromen moeten getransporteerd worden. 61
D ESIGN EN PROTOTYPING
62
ing. Y. Verbelen
Figuur 5.4: Male 5-pin waferconnector met 200 mil pitch op een schakelende voeding (links), aansluiting van het verwarmde bed van een Makerbot 3D-printer (midden) en een 12-pin female waferconnector voor de aansluiting van de voeding op de PCB van een XBox.
5.4.5
Headers
Headers zijn historisch gegroeid als de standaardinterface voor PCB’s. Ze bestaan uit e´ e´ n, twee of meerder rijen pinnen (mannelijke versie) die precies 100 mil (2.54 mm) uit elkaar staan, waardoor ze als enige connectortype breadboardcompatibel zijn. Bij de wire to board variant wordt de mannelijke kant op de PCB gesoldeerd om te interfacen met een vrouwelijke stekker. Omdat headers in essentie enkel bestaan uit pinnen, zijn ze het goedkoopste type connector. Ze worden dus vaak gebruikt als interfaces voor debuggers, testpunten, en allerlei aansluitingen voor kleine signalen. Doordat de pinnen zo dicht bij elkaar zitten is er geen plaats om dikke draden aan te sluiten, en headers zijn dus niet geschikt voor grotere stromen.
Figuur 5.5: Links: een witte en zwarte dual row header, en een 4-pin shrouded header. Rechts: toepassing van dezelfde 4-pin shrouded header in right angle versie voor aansluiting van een eindeloopschakelaar (eng. end stop) op een Makerbot 3D-printer.
Headers die enkel uit pinnen bestaan hebben het nadeel dat de vrouwelijke connector er in 2 richtingen kan opgeklikt worden, wat ongewenste effecten of kortsluitingen kan opleveren. Om dit probleem op te lossen wordt er een plastic omhulsel rond geplaatst waar de vrouwelijke connector maar op e´ e´ n manier in past. Bij headers met 2 rijen pinnen die bedoeld zijn voor gebruik met IDC-connectors, heet dit een shrouded header of box header. Headers zijn een uitstekende manier om losse draden te verbinden met PCB’s, bijvoorbeeld om sensors aan te sluiten. Ze zijn ook de standaardinterface voor servomotors. Net zoals bij JST-connectors en waferconnectors moet je ook bij headers een krimptang gebruiken om draden op de vrouwelijke connectors aan te sluiten. De vrouwelijke connectors worden ook Dupont-connectors genoemd. Headers met 2 pinnen kennen een specifieke toepassing als socket voor jumpers. Jumpers zijn plastic blokjes waarin een metalen brugje zit dat contact maakt tussen de 2 pinnen van de header als het over de header geschoven wordt. Jumpers worden gebruikt als goedkope schakelaars die maar weinig moeten verzet worden, bijvoorbeeld om e´ e´ n of andere instelling te wijzigen op PCB’s. Ze worden veel gebruikt in pc’s op moederborden en dergelijke, maar zijn ook interessant omdat je op een gemakkelijke en betrouwbare manier verbindingen kan maken en weer onderbreken.
62
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
63
Figuur 5.6: 2 voorbeelden van board to board-connectors. Links: male dual row right angle shrouded header op periferiebord en female dual row header op de hoofdprint. Rechts: 4 blauwe female headers zoals op de meeste prototypingborden uit de Arduino-familie te vinden zijn. De zwarte connector linksonderaan is een DC-jack.
Naast wire to board connectors en als jumpers worden headers ook gebruikt als board to board connectors. Headers zijn e´ e´ n van de weinige connectors die verkrijgbaar zijn in zowel een mannelijke als vrouwelijke versie voor PCB-montage. Het bekendste voorbeeld van vrouwelijke headers is op de Arduino Uno zelf, waar ze gebruikt worden als board to board connectors waarop andere PCB’s (shields) kunnen ingeplugd worden. Omdat board to board connectors betrouwbaarder en gemakkelijk te monteren zijn dan wire to board connectors, worden ze in industri¨ele toepassingen gebruikt om aanliggende PCB’s met elkaar te verbinden of te stapelen. De PCB’s kunnen in dat geval naast elkaar liggen (met right angle connectors), haaks staan op elkaar (´ee´ n right angle en e´ e´ n straight connector), of gesandwiched zijn (met 2 straight connectors). Figuur 5.6 toont een voorbeeld van een straight dual row female board to board header op het moederbord van een Xbox, en een right angle dual row shrouded male board to board connector op het periferiebord dat erop inklikt. Wanneer gebruiken? Waar je een klein aantal signalen over kleine afstanden wil verbinden tussen PCB’s, voor interfacing met sensors of gebruikersinterfaces (knoppen, LED’s, displays etc.). 5.4.5.1
Arduino
Arduino’s zijn ongetwijfeld het best bekende voorbeeld van board to board connectors. De Arduino Uno is meerbepaald uitgerust met 4 female headers, respectievelijk met 6, 8 of 10 aders afhankelijk van de versie. Deze headers zijn bedoeld om te interfacen met male headers in dezelfde configuratie zoals je ze aantreft op periferiebordjes, die in de Arduinowereld shields heten. Helaas nodigen de gaten in deze female headers uit om er losse draden in te steken en de digitale, analoge en digitale pinnen van de Arduino op die manier te verbinden met andere elektronische schakelingen. Hoewel deze aanpak in sommige situaties werkt, is het ten zeerste af te raden. De female headers zijn immers ontworpen voor een mate met male headers, die vierkante pinnen hebben. De openingen in female headers zijn bijgevolg ook vierkant zodat de male headers er perfect in passen. Als je echter een losse draad inplugt die rond is, dan zal die draad (met cirkelvormige doorsnede) dus maar op 4 plaatsen elektrisch contact maken met de header. Deze verbinding is bijgevolg onbetrouwbaar, kan door het kleine contactoppervlak weinig stroom verwerken, geeft voortdurend vals contact, en komt ook gemakkelijk weer los. Female headers zijn dus uitsluitend bedoeld als board to board connectors, en behalve voor prototypingdoeleinden mag je ze niet gebruiken als wire to board connectors. Wil je toch een Arduino gebruiken in je finale versies, gebruik dan een periferiebord met de juiste connectors erop dat je op de Arduinoheaders inplugt. 5.4.5.2
Stacking
Met board to board connectors kunnen PCB’s op een gemakkelijke manier elektrisch met elkaar verbonden worden. Afhankelijk van de gewenste ori¨entatie van de PCB’s onderling kan je hiervoor gebruik 63
D ESIGN EN PROTOTYPING
64
ing. Y. Verbelen
maken van combinaties van straight of right angle connectors. Door een straight connector te combineren met een right angle connector kan je 2 PCB’s in een hoek van 90◦ zetten, zoals in figuur 5.6 gedemonstreerd wordt. De connectors zijn uitsluitend bedoeld om elektrische signalen door te geven, en zeker niet om de opstaande PCB ook mechanisch te ondersteunen. Bij gebruik van board to board connectors moet dus nog een aanvullende methode voor mechanische bevestiging voorzien worden, bijvoorbeeld via montagegaten waarmee de PCB met schroeven of bouten in de behuizing kan vastgezet worden. Bij onvoldoende mechanische bevestiging zullen de resulterende krachten op de connectors ervoor zorgen dat die loskomen of zelfs afbreken. Door gebruik te maken van board to board connectors kan je behoorlijk wat plaats winnen: je kan PCB’s naast elkaar positioneren, haaks op elkaar zetten, of opstapelen zoals een sandwich. Bovendien spaar je er tijd en kosten mee uit doordat er geen bekabeling nodig is. PCB’s in sandwichconfiguratie heten een stapel (eng. stack). Stacking is de standaardmethode om shields op Arduino’s te monteren. Vroeg of laat stelt zich de vraag wat in een bepaald project de beste configuratie van de verschillende PCB’s is. Het antwoord is afhankelijk van onder meer het aantal PCB’s dat je met elkaar wilt verbinden, het aantal elektrische verbindingen ertussen, en de plaats die je beschikbaar hebt. Bij vrije keuze is stacking af te raden om 3 redenen: • Bij stacks van 3 PCB’s of meer is het moeilijk elke PCB mechanisch te bevestigen zonder daarvoor ingewikkelde ladderstructuren te bouwen. • De hoogte van de componenten op de PCB’s is beperkt, en hoge componenten lopen het risico kortsluiting te maken met de PCB erboven. • Elektrische contacten, schakelaars of connectors zijn moeilijk bereikbaar, en LED’s zijn niet of nauwelijks zichtbaar. De gemakkelijkste configuratie is de PCB’s naast elkaar te leggen in hetzelfde vlak (eng. flat layout). Alle componenten zijn dan weliswaar gemakkelijk bereikbaar, maar deze configuratie neemt ook de meeste plaats in beslag.
5.4.6
D-sub-connectors
D-sub-connectors ken je van seri¨ele poorten op pc’s maar zijn veel ouder dan dat. De “D” is afkomstig van de vorm van de connector, die bovenaan breder is dan onderaan. Aan deze vorm kan je D-subconnectors dus gemakkelijk herkennen. D-sub-connectors bestaan in verschillende versies, elk met een verschillend aantal pinnen.
Figuur 5.7: D-sub-connectors op de achterkant van een pc-moederbord. De paarse, blauwe en groene connectors zijn respectievelijk een 25-pin female D-sub, 15-pin female D-sub (VGA) en 9-pin male D-sub. Links: een digitale DVI-connector.
64
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
65
D-sub-connectors worden zeer veel gebruikt in elektronica: ze zijn robuust, gemakkelijk verkrijgbaar, worden door veel fabrikanten geproduceerd, en de verbinding is afgeschermd dankzij de metalen behuizing. Ze bestaan bovendien in veel maten, en door de “D”-vorm is het onmogelijk om ze verkeerd aan te sluiten. D-sub-connectors bestaan in PCB-versie (zoals de 9-pin versie op de voorbeeld PCB in het vorige hoofdstuk, of de rechtse 25-pin versie in figuur 5.8) maar ook met kabelaansluitingen, voor montage op controlepanelen en met IDC-interface voor bandkabels.
Figuur 5.8: Links: een 25-pin male en 15-pin female D-sub-connector voor paneelmontage. Let op de rechtstreekse aansluiting aan een bandkabel, ge¨ısoleerd met krimpkous. Rechts: dezelfde 25-pin male D-sub-connector, maar nu in right angle versie voor PCB-montage.
Waar gebruiken? Waar je digitale signalen wilt uitwisselen tussen verschillende toestellen, of binnen hetzelfde toestel over lange afstanden (bv. in machines). De pinnen van een D-sub-connector kunnen behoorlijk wat stroom verwerken, dus je kan ze gebruiken om zowel sensors als actuators aan te sluiten.
5.4.7
IDC-connectors
IDC-connectors zijn bedoeld voor aansluiting op bandkabels. Ze bestaan uit 2 rijen pinnen en een collet waar de bandkabel wordt tussengeschoven. Vervolgens wordt de collet dichtgedrukt, in een bankschroef bijvoorbeeld, waardoor de pinnen door de isolatie van de bandkabel worden gedrukt en contact maken met de geleiders. Hier komt de afkorting IDC vandaan: insulation displacement connector.
Figuur 5.9: Links: 2 bandkabels met female IDC-connectors aangesloten op dual row pin headers. Midden en rechts: een straight 14-pin shrouded header en een right angle 40-pin shrouded header (met langs de linkerkant een right angle 4-pin waferconnector en langs de rechterkant een 2-pin JST-connector), beide bedoeld voor aansluiting van bandkabels via IDC-connectors.
Het voordeel van een IDC-connector is dat ze gemakkelijk en snel op bandkabels kunnen aangebracht worden, en dat de verbinding robuust is. IDC-connectors geven zelden slechte contacten. IDCconnectors worden veel gebruikt om bandkabels aan te sluiten op PCB’s. In dat laatste geval is de complementaire mannelijke connector een dual row header, bij voorkeur shrouded om verkeerd aansluiten te verhinderen. Wanneer gebruiken? Telkens wanneer je een bandkabel gebruikt. Om IDC-connectors op bandkabels te zetten heb je enkel een knijptang of bankschroef nodig. 65
D ESIGN EN PROTOTYPING
66
ing. Y. Verbelen
Figuur 5.10: Om IDC-connectors op bandkabel te zetten heb je enkel een tang nodig. Van links naar rechts: IDC-connector met gewenste aantal aders open trekken, de bandkabel errond plooien zodat de voorkant gelijk komt met de connector, en vervolgens dichtknijpen met een tang of in de bankschroef. Let op de rode markering op de kabel, die pin 1 aanduidt.
5.4.8
Standaarden
De hierboven besproken connectors hebben fundamenteel verschillende karakteristieken, maar hebben desondanks toch e´ e´ n eigenschap met elkaar gemeen: ze zijn vrij te gebruiken in elke toepassing omdat er geen standaarden gedefini¨eerd zijn over de spanningen en types signalen die ze mogen vervoeren. Het zijn dus, zoals dit in de elektronica heet, general purpose connectors. Dat betekent ook dat je bv. een mannelijke D-sub-connector niet zomaar in een vrouwelijke D-sub-connector op een andere machine mag pluggen, zelfs als ze passen! Beide connectors zullen hoogstwaarschijnlijk immers verschillende spanningsniveaus voeren, en de kans is groot dat e´ e´ n van beide toestellen beschadigd geraakt.
Figuur 5.11: Standaard en niet-standaardconnectors naast elkaar: een RCA-connector voor composite video en 3 USB-A connectors (links), een mini-DIN-connector voor S-video en een standaard blauwe 15-pin D-sub-connector voor VGA.
Veruit de meeste elektronische connectors zijn echter geen general purpose connectors. De spanningsniveaus op een USB-connector of een HDMI-connector zijn bijvoorbeeld heel nauwkeurig gedefini¨eerd, en de taak van elke ader ligt vast in uitgebreide specificatieboeken. Als je dit soort connectors gebruikt moet je de corresponderende specificaties dus nauwgezet volgen, want deze connectors worden verondersteld om uitwisselbaar te zijn tussen verschillende apparaten. Om die reden mag je een USBconnector bijvoorbeeld niet gebruiken om een RGB-LED of stappenmotor met je PCB te verbinden, hoewel hij 4 aders bevat. Vroeg of laat zal iemand immers proberen om die connector in zijn laptop te pluggen, al dan niet onopzettelijk, met alle gevolgen van dien.
5.5
Kabels maken
Bij het bouwen van prototypes zal het aansluiten van kabels op connectors al evenveel tijd in beslag nemen als het solderen van de componenten zelf. Mits de correcte technieken en het juiste materiaal kan deze stap toch vlot verlopen. Kabel vind je per lopende meter op rollen in het fablab, en zo worden ze ook industrieel aangeleverd. Eens je de gewenste lengte van een kabel kent, zal je die dus op maat moeten maken door een stuk van 66
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
67
een rol af te snijden en langs e´ e´ n of beide kanten er een passende connector op te bevestigen.
5.5.1
Strippen
Met uitzondering van IDC-connectors zal je bij alle andere connectortypes een stukje van de isolerende mantel moeten verwijderen alvorens je de connector erop kan bevestigen. Dit proces heet strippen, en het gereedschap dat je hiervoor gebruikt heet een striptang. Met een striptang kan je snel en veilig de mantel van kabels lossnijden en van de kern afschuiven. Stel de tang zodanig in dat ze net niet tot in de kern snijdt. Op de meeste tangen is hiervoor een instelschroef voorzien. Je hoeft max. 5 mm af te strippen. Als de tang de ader volledig doorknipt, dan staat ze te diep ingesteld en moet je dus de instelschroef bijregelen.
5.5.2
Krimpen
Om vrouwelijke headers, vrouwelijke JST-connectors of vrouwelijke waferconnectors (receptacles) met draaduiteinden te verbinden, bestaat er een effici¨entere techniek dan solderen die krimpen heet. Het bijhorende gereedschap dat je ervoor nodig hebt heet een krimptang. Krimpsockets bestaan uit een mannelijke of vrouwelijke connector langs de ene kant en 2 of 4 opstaande lippen langs de andere kant. Eens er een draad tussen deze lippen zit worden ze dichtgeduwd door de krimptang waardoor de uiteinden van de lippen zich in de daad vastbijten en er een betrouwbare elektrische verbinding ontstaat. Bij de versie met 4 lippen zijn de buitenste 2 lippen bedoeld om de isolatie van de draad vast te houden. Bij draden met kleine diameter of multicore is het verstandig om de het uiteinde eerst te vertinnen.
Figuur 5.12: De 4 stappen om clips op kabels te krimpen: clip uit de rol knippen (1), clip in de krimptang steken met de open kant naar de grote holte toe (2), draad met afgestripte mantel in de clip schuiven (3) en krimptang toeknijpen om de lipjes om te buigen, vervolgens clip en draad uit de tang nemen (4).
Nadat alle aders van zo’n krimpsocket voorzien zijn, kunnen ze in een krimpbehuizing geschoven worden. Daartoe is er in de behuizing langs e´ e´ n kant een uitsparing voorzien waar een haaks lipje op de krimpsocket in kan schuiven. Duw de krimpsocket in de krimpbehuizing tot het lipje op zijn plaats zit, je hoort dan ook een klik. Het lipje verhindert dat de krimpsocket weer uit de behuizing kan schuiven.
Figuur 5.13: Schuif draden met clips met de bovenzijde (weerhaakje) in de connectorbehuizing tot het weerhaakje op zijn plaats klikt, en herhaal dit voor alle draden. De pijl op de behuizing duidt pin 1 aan.
5.5.3
Isoleren
Soms moet je op connectors, schakelaars of potentiometers solderen die tegen de wand van de behuizing gemonteerd zitten als deel van de gebruikersinterface. Dit resulteert in blote soldeerverbindingen die 67
D ESIGN EN PROTOTYPING
68
ing. Y. Verbelen
een risico vormen op kortsluitingen. Hetzelfde probleem doet zich voor als je soldeerverbindingen op hoge spanningen, bv. een netschakelaar, wil beveiligen tegen aanraken. De eenvoudigste methode is isolatietape te gebruiken. Deze tape kan je rond de blote verbinding draaien totdat alle metalen delen bedekt zijn. Het nadeel van isolatietape is dat ze lijmresten achterlaat en de neiging heeft om los te komen. Een betere oplossing is krimpkous (eng. heat shrink tube) te gebruiken. Krimpkous is een flexibele kunststof buis waarvan de diameter kan verkleind worden door ze op te warmen. Schuif een klein stukje krimpkous over de blote verbinding, en verwarm ze dan indirect met een aansteker of heteluchtsoldeerbout. De krimpkous past zich dan perfect aan de vorm van de verbinding aan en sluit ze af van de lucht waardoor ze ook niet meer kan oxideren. Krimpkous weer verwijderen doe je met een mes of scalpel. Als je draden aansluit, dan moet je uiteraard eerst een stukje krimpkous over de draad schuiven vooraleer je hem vast soldeert, anders krijg je de krimpkous er nadien niet meer over.
5.5.4
Kabelbomen
Door kabels los te laten hangen in de behuizing zijn ze onderhevig aan krachten die worden veroorzaakt door het verplaatsen of manipuleren van je wekker, bijvoorbeeld als je elke morgen 5 keer keihard op snooze mept. Zelfs goede connectors zullen dan vroeg of laat loskomen. Om dit te vermijden moet je je kabels vastmaken in de behuizing. De meest effici¨ente manier is door kabels die in dezelfde richting lopen, samen te bundelen en vast te sjorren met een tie-wrap die dan ook tegen de wand van de behuzing wordt vastgezet. Bij het ontwerpen van je behuizing denk je dus best al na waar je de kabels wil laten lopen, en voorzie je de nodige gaten waar ze doorheen passen.
Figuur 5.14: Een voorbeeld van slechte bekabeling. Kabels zijn niet vastgemaakt, lopen door elkaar, en er zijn geen of verkeerde types connectors gebruikt. Slechte contacten door falende verbindingen zijn onvermijdelijk.
Omdat kabels de neiging hebben om te vertrekken vanaf een centrale PCB en zich vervolgens uit te spreiden over het toestel in een structuur die vergelijkbaar is met een boom die zich vertakt, spreekt men over kabelbomen. In het Engels wordt dit ook wel een cable harness genoemd.
5.6
Bekabelingstechnieken
Hoewel je moet weten welke types connectors en kabels er bestaan, is het volstrekt zinloos om alle aanbevelingen en technieken in dit hoofdstuk van buiten te leren. Kabels en connectors correct gebruiken doe je vooral door zelf de spreekwoordelijke handen uit de mouwen te steken en met je eigen wekkerprototype aan de slag te gaan. Laat je inspireren door professioneel ontworpen toestellen. Printers, zowel voor particulier als industrieel gebruik, zitten boordevol kabels en connectors en tonen waar je welk type correct gebruikt. 68
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
69
Figuur 5.15: Links: correcte bekabeling in een 17” LCD-scherm. Goede keuze van connectors (wafer voor aansluiting voeding linksboven, JST voor interface tussen display en displaydriver). De zwarte connector op de displaydriver is een Molex-connector. Let op de witte klem die de centrale kabelboom op zijn plaats houdt, en de grijze houder voor de ferrietkern rond de LVDS-kabel die tegen de behuizing is vastgeschroefd. Rechts: een sleeve en lipje in de metalen behuizing om een twee-aderige kabel vast te houden.
Ook scanners, pc’s, microgolfovens, wasmachines e.d. bevatten doorgaans fraaie voorbeelden van correct gebruikte kabeltypes, connectors en kabelbomen. Volledige kabelbomen hergebruiken lukt zelden omdat de kabels nooit de juiste lengte hebben, maar individuele kabels en/of connectors laten zich wel uitstekend hergebruiken. Dit spaart meteen de tijd en moeite om zelf connectors op kabels te krimpen, met krimpkous te isoleren en dergelijke.
69
70
70
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
6
Solderen If it smells like fried chicken, you’re holding your soldering iron the wrong way. Mitch Altman
6.1
Inleiding
Nadat je PCB ontworpen en gefabriceerd is, en je hebt de juiste connectors gekozen om de kabels met je PCB te verbinden, dan kan de assemblage beginnen. Om de elektronische componenten en connectors vast te zetten op de PCB maak je gebruik van gesmolten metaal in een proces dat solderen (eng. soldering) heet. Om te solderen heb je een metaallegering nodig met een laag smeltpunt. De meest voorkomende legeringen bestaan uit combinaties van tin, lood, koper, zink en zilver in vari¨erende verhoudingen. In het fablab gebruiken we 2 types: “loodsoldeertin” met een verhouding Sn/Pb van 40/60 en “zilversoldeertin” waarbij het lood vervangen is door een mengsel van zilver, koper en zink. Solderen met loodsoldeertin is veel gemakkelijker dan met zilversoldeertin, en het is dus warm aan te bevelen om te leren solderen met loodsoldeertin. Alle soldeertinlegeringen hebben een smelttemperatuur die tussen ca. 200◦ C en 300◦ C ligt. Dat is dus meteen ook het grote verschil tussen solderen en lassen: bij solderen smelt enkel het soldeertin, bij lassen smelten ook de beide stukken die je aan elkaar wil zetten om e´ e´ n groot vloeibad te cre¨eren. Een lasverbinding kan je dus niet ongedaan maken, vermits beide stukken letterlijk in elkaar gesmolten zijn, een soldeerverbinding kan echter wel terug uiteen.
6.2
Soldeerbout
Het gereedschap dat je nodig hebt om te kunnen solderen heet een soldeerbout. Een soldeerbout is niks anders dan een geharde metalen punt die door een weerstand op temperatuur wordt gebracht. Een goede soldeerbout heeft een vermogen van meer dan 80 W en een temperatuurregeling. Soldeerbouten zonder temperatuurregeling kan je niet gebruiken om elektronica te solderen omdat ze ofwel te koud zijn ofwel de elektronische componenten verbranden. Dit soort soldeerbouten zijn enkel geschikt om waterleidingen mee aan elkaar te solderen, of als wafelijzer dienen.
72
D ESIGN EN PROTOTYPING
ing. Y. Verbelen
Nog beter dan een losse soldeerbout is een soldeerstation. Soldeerstations hebben quasi altijd een temperatuurregeling waarmee je de temperatuur kan instellen, en een houder om de losse soldeerbout in te bewaren. Goede soldeerstations zijn al commercieel verkrijgbaar vanaf ca. 30-50 EUR.
Figuur 6.1: Display voor instelling van de temperatuur op een Weller WD-80 soldeerstation, en bijhorende houder met spons. Gebruik een spuitfles om de spons te bevochtigen.
Even belangrijk als de soldeerbout zelf is de spons. Die gebruik je om de punt van de soldeerbout schoon te maken vooraleer je begint te solderen. De punt moet blinken en vrij zijn van prut of andere aanslag vooraleer je kan solderen. Uiteraad dient de spons licht bevochtigd te zijn, anders verbrandt ze. Her en der wordt op het internet aangeraden om de spons te vervangen door staalwol. Hoewel dat weliswaar werkt, heeft staalwol de eigenschap om veerkrachtig te zijn. Als er nog soldeertin aan de punt hangt, dan heeft dit de neiging om weg te springen als je het afveegt aan de staalwol. Onnodig te vermelden dat rondvliegend gesmolten metaal niet aan te bevelen is. Hou het dus bij een goede, licht bevochtigde spons.
6.3
Soldeerverbindingen maken
Neem alle nodige materiaal bij de hand: de component(en) die je wil solderen, een rol soldeertin, en de soldeerbout zelf met bijhorende bevochtigde spons. Stel de soldeerbout in op 350◦ C, wacht tot de soldeerbout warm is, en veeg de punt schoon op de spons. Om een goede soldeerverbinding te kunnen maken, mogen de componenten niet bewegen terwijl het soldeertin afkoelt, zo niet krijg je een brosse en brokkelige verbinding die slecht contact maakt. Het is aan te bevelen om componenten langs de bovenzijde op de PCB vast te plakken met Tesa-tape vooraleer je begint te solderen. Op die manier blijven ze zeker op hun plaats zitten. Neem de soldeerbout vast zoals je een pen vastneemt: tussen duim, middelvinger en wijsvinger. Als je rechtshandig bent, dan soldeer je waarschijnlijk ook best met de rechterhand, en omgekeerd. Uiteraard neem je de soldeerbout vast aan de kunststof handgreep en niet aan de metalen delen. Het soldeertin dat we gebruiken in het fablab bestaat eigenlijk uit een holle buis soldeertin die gevuld is met een substantie die flux heet. Flux is een vetachtige visceuze gel die zeer corrosief wordt als ze wordt verhit. Het doel van flux is de te solderen oppervlakken te reinigen door alle oxidatieresten en andere onzuiverheden op te lossen. De punt van de soldeerbout is echter zodanig heet dat de flux bij contact meteen verdampt zonder zijn werk te kunnen doen! Idealiter mag het soldeertin dus niet rechtstreeks in contact komen met de soldeerboutpunt. Hoe kan je dan solderen? Door beide oppervlakken eerst te verhitten en dan pas soldeertin toe te voeren. Duw de punt van de soldeerbout in een hoek van ca. 45◦ tussen de PCB en de draad van de component die je wil solderen. Hou hem daar enkele seconden om zowel het soldeereiland op de PCB (pad) en de draad van de component goed op te warmen. Duw nu voorzichtig het soldeertin tegen de draad en het pad zonder dat deze de punt van de soldeerbout raakt, bv. aan de andere kant van de draad. 72
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
73
Figuur 6.2: Solderen in 6 stappen (van links naar rechts): soldeerbout verhit zowel pad als draad, en soldeertin wordt toegevoegd (1). Soldertin smelt (2) en vloeit uit (3) totdat er een glanzende conus wordt gevormd (4) waarna het soldeertin wordt verwijderd (5) en tot slot de soldeerbout wordt weggetrokken om de verbinding te laten stollen (6).
Het soldeertin zal smelten, de flux vloeit uit en verdampt, en enkele ogenblikken later vloeit ook het soldeertin zelf mooi uit. Als het soldeertin niet smelt, dan kan je het eventueel kort tegen de punt van de soldeerbout aantikken. Je kan nu de soldeerboutpunt wegtrekken, en het soldeertin laten stollen. Bij een goede verbinding glanst het soldeertin, heeft het de vorm van een kegel aangenomen, en heeft zich goed aan beide metalen delen gehecht. Als het soldeertin geen contact maakt met het soldeereilandje of met de draad, dan is dat een indicatie dat je dat oppervlak onvoldoende warm hebt gemaakt. Geen paniek: je kan de verbinding terug smelten met de soldeerbout, en nieuw soldeertin toevoegen om de flux zijn werk te laten doen en het soldeertin te laten uitvloeien over beide oppervlakken. goede verbinding
lead onvoldoende verhit
pad onvoldoende verhit
soldeertin soldeermasker elektrische layer substraat component lead
Figuur 6.3: Van links naar rechts: een goede conische soldeerverbining, een slechte verbinding waarbij de draad onvoldoende werd verhit, en een slechte verbinding waarbij het soldeereilandje (pad) onvoldoende werd verhit.
Als de verbinding niet glanst maar er eerder dof uit ziet, dan heb je het soldeertin te lang verhit. Ook hier geldt dezelfde remedie: vebinding weer smelten, een weinig nieuw soldeertin toevoegen, en laten uitvloeien. Als de verbinding er brokkelig uit ziet of het oppervlak van de verbinding niet glad is, dan zijn beide onderdelen bewogen terwijl het soldeertin aan het stollen was. Zelfde remedie als hierboven. Mits wat oefenen kan je op deze manier de ene verbinding na de andere maken. Een soldeerverbinding hoeft niet langer dan 3 - 5 s te duren. Vergeet niet regelmatig de punt schoon te vegen op de spons om de aangekoekte fluxresten te verwijderen. 73
D ESIGN EN PROTOTYPING
74
6.4
ing. Y. Verbelen
Desolderen
Het omgekeerde van solderen heet desolderen. Omdat bij solderen de originele componenten niet beschadigd worden maar enkel met soldeertin aan elkaar vast zitten, kan je een soldeerverbinding op elk moment weer ongedaan maken. Redenen om te desolderen zijn bv. het vervangen van defecte componenten, het corrigeren van fouten en het hergebruiken van componenten van afgedankte PCB’s. De 3 voornaamste technieken om te desolderen zijn met een tang, met een desoldeerpompje of met litze (eng. solder wick of solder braid).
6.4.1
De tang
Bij componenten die over slechts 2 aansluitingen beschikken zoals weerstanden, condensatoren, diodes, inductors e.d. is de simpelste manier om te desolderen door gebruik te maken van een tang. Stel de PCB vertikaal op, bijvoorbeeld in een bankschroef of door hem vast te houden, en verhit e´ e´ n van beide contacten om die los te maken. Trek dan met een fijne tang die kant door de PCB. Een variant hierop is een schroevendraaier als hefboom gebruiken. Voor condensators heb je helemaal geen extra gereedschap nodig: duw hem van de losse pin naar de nog vastzittende zijde, en de losse pin wordt vanzelf uit de PCB getild. Vervolgens verhit je de andere verbinding, zodat je de component met dezelfde tang kan lostrekken.
6.4.2
Desoldeerpomp
Een desoldeerpomp bestaat uit een pneumatische zuiger die onder spanning wordt gehouden door een veer. Smelt de verbinding die je wenst te verbreken met de soldeerbout, en duw dan de desoldeerpomp er zo dicht mogelijk tegen. Als de pomp zich ontspant dan zal het gesmolten soldeertin met de omringende lucht mee in de pomp worden gezogen. Hoewel nuttig om grote hoeveelheden tin te verwijderen is een desoldeerpomp alleen zelden voldoende om componenten los te maken. Het gebruik ervan vergt ook heel wat oefening.
Figuur 6.4: Desolderen met behulp van een desoldeerpomp (links) en met litze (rechts).
6.4.3
Litze
De meest effectieve manier om te desolderen, en ook de enige techniek die goed werkt bij kleine verbindingen met inbegrip van surface mount componenten, is litze. Litze bestaat uit zeer fijn gewoven metaaldraad, meestal koperdraad, dat gedrenkt is in flux. Als het tegen gesmolten soldeertin wordt geduwd, zal het tin in de litze worden opgezogen dankzij het capillair effect. Kies de litze in functie van de toepassing. Voor kleine verbindingen kies je dunne litze, voor grote verbindingen dikke litze. Koperen litze werkt iets gemakkelijker dan stalen litze voor loodsoldeertin, bij 74
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
75
zilversoldeertin is er weinig verschil tussen beide types. Leg de litze tegen de verbinding die je wenst te verwijderen, en duw er dan de soldeerboutpunt tegenaan. Maak het contactoppervlak tussen litze en soldeerboutpunt zo groot mogelijk om de warmteoverdracht te maximaliseren. Van zodra het soldeertin smelt, zal het opgezogen worden. Indien nodig moet je de litze bewegen om “verse” litze toe te voeren.
6.5
Oververhitting
Elektronische componenten zijn van nature gevoelig voor warmte, en zeker halfgeleiders zoals transistors (BJT’s, MOSFET’s, ...) en IC’s zijn erg gevoelig voor oververhitting. IC’s zoals de ATmega328p soldeer je daarom niet rechtstreeks op de PCB, maar plaats je in een socket die je eerst vastsoldeert zonder dat er een IC in zit. Als je halfgeleiders te sterk verhit, dan bestaat de kans dat ze al kapot zijn nog voor ze goed en wel vast zitten. Je kan dit risico minimaliseren door enkele vuistregels te volgen: • Zet de temperatuur van de soldeerbout nooit hoger dan nodig, een temperatuur van 300 - 350◦ C moet volstaan. • Verwarm de component kort maar krachtig, nooit meer dan enkele seconden. • Test halfgeleiders die je gedesoldeerd hebt op een breadboard vooraleer je ze opnieuw gebruikt.
6.6
Veiligheid
Dat tijdens solderen looddampen vrijkomen is een fabeltje omdat lood niet verdampt bij een temperatuur van 350◦ C zoals iedereen die een basiscursus fysica heeft gehad weet. De dampen die ontsnappen zijn afkomstig van de flux die verdampt als hij in contact komt met de hete soldeerboutpunt. Of de fluxdampen “gezonder” zijn dan looddampen is een zinloze discussie: een substantie die als doel heeft oxidatie op de PCB op te lossen, adem je best niet in. Zorg voor een goed geventileerde werkplek: bij voorkeur ga je voor een open raam zitten, onder een afzuiging (bv. trekkast) of zet je simpelweg een ventilator aan om de dampen van je weg te blazen. Een tweede veiligheidsaspect is natuurlijk de hete soldeerbout zelf. Zorg dat die altijd in zijn houder staat, en leg hem zeker nooit los op tafel. Alles waar de punt mee in contact komt zal schroeiplekken oplopen, en mogelijk brand veroorzaken. Wijs ook je medestudenten erop dat een soldeerbout warm staat als ze in de buurt van je werktafel komen maar er zich niet van bewust zijn. Het kan een kwartier duren vooraleer een soldeerbout voldoende is afgekoeld om veilig opgeborgen te kunnen worden.
75
7
Behuizing An expert is a man who has made all the mistakes which can be made in a very narrow field. Niels Bohr
7.1
Inleiding
Eens je elektronica af is en de software heeft bewezen dat ze correct werkt, dan rest er enkel nog het maken van een behuizing. De behuizing is een omhulsel waar alle onderdelen zoals PCB’s, voeding, bekabeling, eventuele batterijen e.d. in passen. Het doel van de behuizing is je ontwerp robuuster te maken voor alledaags gebruik door de elektronica te beschermen tegen beschadiging en stof. Afhankelijk van de toepassing kunnen er andere eisen gesteld worden aan de behuizing. Bij toestellen die buiten gebruikt worden, moet de behuizing de elektronica ook beschermen tegen regen en sneeuw. Tegelijk moet de behuizing de nodige ventilatieopeningen voorzien, zonder dat de gebruiker daarbij de spanningvoerende onderdelen op printplaten per ongeluk kan aanraken. Bedieningselementen zoals knoppen en schakelaars, displays en LED’s moeten echter wel bereikbaar of zichtbaar blijven. Het ontwerp van een behuizing is dus niet altijd triviaal.
7.2
Ontwerpvolgorde
Ontwerp je eerst de behuizing en maak je de elektronica daarna zodanig compact dat alles erin past, of begin je bij de elektronica en teken je de behuizing nadien op maat? Beide pistes zijn mogelijk, maar het is veel gemakkelijker om eerst de elektronica te ontwerpen zonder dat je rekening moet houden met bepaalde afmetingen. Ontwikkel dus eerst de PCB’s. Je moet er in dat design natuurlijk wel op letten dat LED’s in de juiste richting staan, dat connectors op de rand van je PCB zijn gelocaliseerd enzovoort. Als je een LCD-scherm langs de ene kant van je PCB zet en de knoppen langs de andere kant, dan wordt het onmogelijk om er een behuizing voor te ontwerpen nadien.
7.3
Mechanisch ontwerp
De beste manier om te starten is eerst je PCB te exporteren uit CircuitMaker als een STEP-model, zoals in hoodstuk 4 werd gedemonstreerd. Dit STEP-model bevat informatie over de vorm van de PCB, de positie en grootte van montagegaten, de vorm en positie van connectors, en zelfs de hoogte van alle componenten op de PCB. Kortom, op basis van een STEP-model heb je alle nodige informatie om
D ESIGN EN PROTOTYPING
78
ing. Y. Verbelen
een passende behuizing te ontwerpen. Als je ontwerp uit meerdere PCB’s bestaat, dan exporteer je afzonderlijke STEP-modellen van elke PCB.
7.3.1
3D CAD software
Je zal de behuizing prototypen op basis van onderdelen die je zal lasercutten of 3D-printen in het fablab. Lasercutten en 3D-printen zijn compleet verschillende technologie¨en, en de werkwijze om de vereiste stukken ervoor te ontwerpen zijn dus ook radicaal verschillend. Om te kunnen 3D-printen heb je een 3D-model nodig, te vergelijken met een STEP-model van de PCB, terwijl je om te lasercutten vectori¨ele 2D-tekeningen nodig hebt. Om beide te combineren met 3D-modellen van je PCB’s is mechanische ontwerpsoftware vereist die zowel met 2D als 3D overweg kan. Net zoals voor PCB-ontwerp bestaan er ook voor mechanisch CAD verschillende softwarepakketten, de voornaamste zijn AutoCAD, SolidWorks, LibreCAD, Solid Edge, 123D, Sketchup en Inventor. Anders dan bij PCB software is er voor mechanisch ontwerp geen pakket dat duidelijk boven de anderen uitsteekt qua performantie en mogelijkheden. Dankzij de uitgebreide documentatie die ervoor beschikbaar is, adviseren we Autodesk Inventor. Een tutorial van Inventor valt buiten het beste van deze cursus.
Figuur 7.1: Een PCB in de editor van CircuitMaker (3D view) links, en dezelfde PCB ge¨exporteerd als STEP-model uit CircuitMaker en ge¨ımporteerd in Autodesk Inventor rechts. Let op de passende contour, en de cirkelvormige cutout in het midden die overeenkomt met een gelijkaardige cutout in de behuizing. Er zijn ook enkele rode en zwarte kabels (14 AWG) aangesloten.
Figuur 7.1 toont een voorbeeld van gecombineerd design. De linkerafbeelding is een 3D-weergave van een PCB in CircuitMaker, waarop alle componenten vertegenwoordigd worden door eigen 3Dmodellen. De vorm van de PCB is complexer dan de “standaard” rechthoekige PCB’s die je vaak tegenkomt. Er is ook een uitsnijding voorzien in het midden (eng. cutout) en er zijn verschillende montagegaten voorzien. Na exporteren als STEP-model kan de PCB dan in Inventor ge¨ımporteerd worden, en ingepast worden in het design van de behuizing zoals te zien is op de rechterafbeelding. Je ziet meteen waar er plaats moet gelaten worden voor bekabeling, waar de montagegaten moeten komen enzovoort.
7.3.2
Rapid prototyping
3D-printers en lasercutters zijn allebei beschikbaar in het fablab en even gemakkelijk in gebruik, maar toch verschillen beide types machines fundamenteel van elkaar wat betreft de toepassingen waarvoor je ze gebruikt. 7.3.2.1
Lasercutters
Lasercutters snijden 2D patronen uit vlak materiaal zoals hout, acrylaat (plexiglas), rubber of allerlei andere kunststoffen. Omdat lasercutters snel snijden kan je meteen je prototypes passen en testen, waardoor de ontwerpcyclus ook snel gaat. De voornaamste beperkingen van lasercutters zijn de beperkte 78
ing. Y. Verbelen
D ESIGN EN PROTOTYPING
79
dikte van de materialen die je kan snijden en de types materialen (enkel brandbare of smeltbare materialen, en geen metaal). De diktebeperking kan je gemakkelijk omzeilen door hetzelfde stuk meerdere keren te snijden uit dun materiaal, en de verschillende lagen dan op elkaar te lijmen of te schroeven. Door op deze manier op te splitsen in “lagen” kan je ook met lasercutters eenvoudige 3D-objecten maken. De simpelste vorm van een gelasercutte behuizing voor je wekker is een doos (eng. box) in de klassieke zin van het woord: 4 zijwanden, een bodem en een deksel. Deze 6 stukken kan je afzonderlijk op een lasercutter snijden en dan in elkaar passen. De techniek die je gebruikt om de doos in elkaar te zetten zal bepalend zijn voor de stevigheid en de toegankelijkheid. De 3 belangrijkste manieren zijn vlakke hoeken, vingers en T-slots.
Vlakke hoeken De oudste methode is die met vlakke hoeken. Alle stukken zijn dan zuivere rechthoeken. Het voordeel aan deze methode is dat de stukken zo eenvoudig zijn dat je zelfs geen lasercutter nodig hebt om ze te snijden, maar het gaat uiteraard wel sneller. Figuur 7.2 toont links een doosontwerp met vlakke hoeken. Vingers Een ontwerp met vingers is beter dan vlakke hoeken omdat het contactoppervlak tussen beide stukken wordt vergroot. Dit leent er zich dus beter toe om te lijmen. De patronen worden zodanig complex dat manueel uitsnijden niet meer realistisch is en een lasercutter dus noodzakelijk. Figuur 7.2 toont in het midden een ontwerp met vingers.
Figuur 7.2: Drie technieken om een gelasercutte doos in elkaar te zetten: vlakke hoeken (links), vingers (midden) en een combinatie van vingers en T-slots (rechts). (afbeeldingen: Jon Hollander, www.makercase.com, overgenomen met toestemming van de auteur)
T-slots Het is mogelijk om de vingers zodanig te ontwerpen dat er net genoeg speling zit tussen de stukken om ze te laten in elkaar klemmen en de doos dus in elkaar te zetten zonder lijm. Het is dan wel een lastige opgave om de doos weer uiteen te halen, bijvoorbeeld om batterijen te vervangen. Na ettelijke keren open en dicht gemaakt te zijn, sluiten de stukken ook minder goed aan waardoor ze uiteindelijk niet meer voldoende wrijving hebben om bij elkaar te blijven. Een oplossing hiervoor is schroeven en bouten te gebruiken. Om 2 stukken die haaks op elkaar staan vast te zetten met bouten wordt een T-slot gebruikt. Hierin past langs de ene kant een moer, en de bout wordt er overlangs in gedraaid. T-slots hebben dus 2 voordelen: de gelasercutte stukken hoeven niet perfect in elkaar te passen, en je kan de doos zoveel openen en sluiten als je wilt. Figuur 7.2 toont rechts een voorbeeld van een ontwerp met vingers en T-slots. 7.3.2.2
Templates
Door slim gebruik te maken van symmetrie is het doenbaar om zelf de 6 stukken te ontwerpen in Inventor die je nodig hebt om een doos te assembleren. Als je echter verbindingen met vingers en/of T-slots wilt, dan wordt dit ontwerp ingewikkeld waardoor de kans op fouten toeneemt. Gelukkig bestaan er tal van 79
D ESIGN EN PROTOTYPING
80
ing. Y. Verbelen
templates online waarvan je kunt vertrekken. Deze templates kan je dan openen en aanpassen in Inventor waar nodig. Enkele voorbeelden van templates: • http://www.makercase.com • http://makeabox.io • http://boxmaker.connectionlab.org 7.3.2.3
3D-printers
3D-printers bouwen 3D-objecten laag per laag op basis van een kunststof die op lage temperatuur smelt, vergelijkbaar met soldeertin. Deze kunststof wordt ge¨extrudeerd tot dunne draden waarmee laagjes worden getekend. De opeenstapeling van al deze laagjes resulteert in een 3D object. Het voordeel aan 3D-printen is dat quasi elk object dat je kan tekenen in Inventor ook kan geprint worden – theoretisch althans. In de praktijk zijn er beperkingen: grote objecten hebben de neiging los te komen van het printerbed en op te krullen, overhangende storten in tijdens het printen, en fijne details komen niet goed tot hun recht. De laagjes blijven ook een zwak punt in de structuur, en als het contactoppervlak tussen laagjes te klein is dan komen ze los en schilfert je object uiteen. Het voornaamste nadeel van 3D-printers is echter dat ze traag zijn. De snelheid waarmee kunststof kan gesmolten worden in de extruderkop is beperkt, net zoals de snelheid waarmee het gesmolten materiaal weer afkoelt. Afhankelijk van hoe massief je je stuk wenst te printen (eng. material infill) kan het printproces voor grote en complexe stukken vele uren of zelfs dagen in beslag nemen. Als je je prototype snel wilt kunnen assembleren en testen, dan is 3D-printen dus niet de beste keuze. De kracht van een fablab zit in de combinatie van de verschillende machines. Met lasercutters kan je snel vlakke stukken snijden zoals de 6 “wanden” van een doos bijvoorbeeld. Montagegaten voor bouten of schroeven, ventilatiegaten e.d. nemen nauwelijks tijd in beslag op een lasercutter. 3D-printers lenen zich dan weer uitstekend om knoppen te printen, koppelstukken tussen gelasercutte plaatjes, afstandshouders, beugels om kabels mee vast te zetten enzovoort.
7.3.3
Bereikbaarheid
Een behuizing heeft tot doel om de elektronica te beschermen tegen gebruikers en vice versa, maar tegelijk moet de elektronica ook bereikbaar zijn om bijvoorbeeld batterijen te kunnen vervangen. Zonder bereikbaarheid als ontwerpcriterium zou je ook een halve emmer epoxy over de elektronica kunnen gieten om deze te beschermen. Dit werd vroeger wel eens gedaan om te beschermen tegen vocht en reverse engineering door concurrenten, maar maakt natuurlijk ook elke reparatie onmogelijk. Dergelijke methodes zijn dus verwerpelijk omdat ze weinig meerwaarde bieden maar hergebruik of recyclage belemmeren. De kwaliteit van een behuizing wordt naast mechanische stevigheid dus vooral bepaald door de bereikbaarheid van de interne componenten. De behuizing moet zodanig ontworpen zijn dat alle interne componenten bereikbaar en vervangbaar zijn. De mate van bereikbaarheid hangt af van de component in kwestie. Batterijen moet je bij voorkeur kunnen vervangen zonder dat je daarvoor een schroevendraaier nodig hebt, terwijl het voor het vervangen van een display of condensator op de voeding geen probleem is om enkele schroeven te moeten losmaken. Een behuizing die volledig dichtgelijmd zit kan je niet meer openen zonder ze open te breken, en is dus niet acceptabel. Je kan echter w´el 3 kanten van je doos in elkaar lijmen, en dan enkel de achterkant met schroeven vastzetten zodat de behuizing langs daar kan geopend worden.
80