Skip to main content
Frode Roxrud Gill | 27. oktober 2023 | Blogginnlegg

Elektronikk for utviklere - Hjemmeautomatiserere #2. Vi designer et kretskort!

Når du skal lage en krets er det naturlig å første tegne den på papir og deretter teste den ut på et Breadboard. Når ting virker som det skal er det fint å kunne lage kretsen på et ordentlig kretskort, og det å lage kretskort er faktisk enklere enn man skulle tro.


I dette innlegget forutsetter jeg at vi bruker KiCAD . Jeg forutsetter også at kretskortet vil monteres som et shield på en Espressif ESP32-WROOM-32D (en rimelig Arduino-basert ESP32), og at det vi skal lage er noe som aktiverer et relé når det er mørkt ute.
For moro skyld foutsetter jeg også at lyssensoren krever 5V, selv om ESP32 kun kan motta maksimalt 3.3V på sine GPIO-pinner.Installere KiCAD

Å installere KiCAD er ganske enkelt:

sudo apt-get install kicad kicad-packages3d

(det er valgfritt om du vil installere den relativt store 3D-pakken)Komme i gang med KiCAD

Når du har startet opp KiCAD og opprettet et nytt prosjekt (jeg kalte prosjektet 'skumringsbryter'), vil du se noe tilsvarende skjermbildet under. Siden vi skal benytte relativt vanlige komponenter kommer vi ikke til å trenge å se på hverken Symbol Editor eller Footprint Editor. Vi kommer derfor først til å tegne kretsen i Schematic Editor, og så designe selve kretskortet i PCB Editor.

kicad

 En skjematisk fremstilling skal egentlig være uavhengig av den fysiske kretsen, men vårt shield trenger ikke å dekke hele WROOM-32D og det kan derfor være kjekt å ha en formening om hvor stor den faktisk må være. Kravet er at vi må ha tilgang til Jord (GND), strøm til reléet, 5V til sensoren, én digital GPIO-pin til å skru av og på reléet, én analog GPIO-pin til å ta i mot lyssensor-verdier, og det må være fysisk plass til et relé, en lyssensor og et par andre små komponenter. Vi ser altså for oss noe omtrent som dette:

preview

 Som så mye annet innen elektronikken har WROOM-32D pinner med 1/10 tomme (2.54mm) mellomrom, og som vist på bildet vil vi dekke alle kravene våre hvis vi kobler oss på de 8 nederste pinnene. Det er også verdt å notere seg til senere at den er 11 pinner bred.

wroom32 2

For å se hvilke pinner vi kan bruke er det greit å slå opp i databladet (eller søke etter "wroom 32d pin out" på Internet). Der dukker følgende figur opp:

wroom32

 Figuren er kanskje litt liten, men pinnene på venstre side nedenfra og oppover er henholdsvis "5V", "GPIO11/CMD", "GPIO10/D3", "GPIO9/D2", "GPIO13", "GND", "GPIO12" og "GPIO14".

På høyre side nedenfra og oppover er de henholdsvis "GPIO6/SCK", "GPIO7/D0", "GPIO8/D1", "GPIO15", "GPIO2", "GPIO0", "GPIO4" og "GPIO16".

Så begynner puslejobben:

  • Siden 3.3V er ganske langt unna (helt i øverste venstre hjørne) er det derfor enklest å bruke et 5V relé som vi igjen styrer med en transistor som vi klarer å styre fra en 3.3V GPIO-pinne.
  • Databladet sier vi bør unngå "D0", "D1", "D2", "D3", "CMD" og "SCK" siden disse brukes internt til kommunikasjon mot flash-minne.
  • Databladet sier GPIO12, GPIO15, GPIO2, GPIO0 og GPIO4 bør unngås, siden de brukes under oppstart av ESP32.

I tillegg til 5V og GND, sitter vi dermed igjen med GPIO13 og GPIO14 på venstre side og GPIO16 på høyre side, der både GPIO13 og GPIO14 kan settes opp til å motta analog verdi fra lyssensoren. Mer eller mindre tilfeldig velger jeg GPIO13 til å motta verdi fra lyssensor og GPIO14 til å styre relé.

Vi tegner kretsen

Trykk på knappen for å åpne Schematic Editor (markert i skjermbildet i starten av bloggen). I editoren kan du trykke 'a' for å legge til komponenter. Legg til:

  • 2 stk "Conn_01x08_Female" (den ene vil ikke ha noen koblinger til kretsen, men fungere som støtte for kretskortet)
  • 3 stk "R" (som er forkortelsen for Resistor, altså motstand. En vil brukes som begrensning til Base-benet på en transistor, og to vil brukes til å fordele spenningen slik at en 5V lyssensor kan kobles til en 3.3V GPIO)
  • 1 stk "BC337", som er en enkel og grei NPN transistor
  • 1 stk "SANYOU_SRD_Form_C" (som er det reléet jeg hadde liggende. Har du et annet er det selvfølgelig bare å velge dette i stedet)
  • 2 stk "Conn_01x02_Male" for å ha tilkobling for to-polet ledning vi kontrollerer med reléet
  • 1 stk "D" (som er forkortelsen for Diode)
  • 1 stk "Conn_01x03_Male" for å ha en plass for lyssensoren. Den har ikke eget symbol, men den har 3 ben med standard 1/10 tomme avstand mellom benene.

 Du kan bruke 'F1'/'F2' for å zoome inn/ut, 'm' for å flytte på ting og 'r' for å rotere dem. (Rotasjon er satt til 90 grader, men kan endres i innstillinger).

Du skal nå ha noe tilsvarende dette:

schematic1

Når alle komponentene er på plass kan du kjøre "Tools|Annotate Schematic" (eventuelt trykke på knappen som ser ut som "R??->R42" i verktøylinjen). Trykk på "Annotate"-knappen og deretter "Close"-knappen. Alle komponentene skal nå ha fått unik ID. Kjør dette på nytt hvis du legger til flere komponenter senere.

Vi kobler sammen komponentene

Velg "Add A Wire ('w')" i verktøylinjen på høyre side. Tegn så linje mellom de små sirklene mellom:

  • Pin1 på den ene Conn_01x02 til Pin1 på den andre Conn_01x02. Reléet er kun 1-polet, så vi lar en leder passere uhindret mens vi enten bryter eller bryter ikke den andre lederen via reléet.
  • Pin2 på den ene Conn_01x02 til Pin1 på reléet, og Pin2 på den andre Conn_01x02 til Pin3 på reléet. Pin4 vil være NC (Normally Closed), mens vi er interessert i NO (Normally Open) slik at vi aktivt må skru det på.
  • Siden vi har sagt at GPIO14 skal skru på reléet, og GPIO14 er øverst av de 8 koblingspunktene på venstre Conn_01x08 (som hos meg har et 1-tall), tegn en strek fra Pin1 på venstre Conn_01x08 ned til en av sidene på en motstand, og fra andre siden av motstanden til Pin2 (Base) på transistoren.

For å sjekke status, skal du ha noe tilsvarende dette nå:

schematic2

Vi fortsetter å tegne ledninger:

  • Siden vi har valgt en NPN-transistor, tegn linje mellom Emitter (Pin3, der pilen er) til Jord (som er nummer 6 nedenfra i Conn_01x08, altså Pin3 hos meg)
  • Fra transistorens Collector opp til lasten (som da blir Pin2 eller Pin5 på reléet) og videre til diodens anode (den som pilen ikke peker på)
  • Fra andre siden av lasten ned til diodens katode (den som pilen peker på) og videre til 5V (som er den nederste på venstre conn_01x08). Dioden vil nå fungere som en Flyback Diode og hindre problemer når reléets magnetfelt kollapser når vi skrur det av og på.
  • Lyssensorens pinner er henholdsvis Signal, VCC og GND. Tegn strek fra den midterste sirkelen i Conn_01x03 ned til 5V og fra den nederste sirkelen til Jord.
  • Tegn linje fra den øverste sirkelen i Conn_01x03 til den øverste for de to resterende motstandene (de to motstandene skal lage en Voltage Divider slik at vi kan ta ut 3.3V fra sensorens 5V signal)
  • Tegn linje mellom de to motstandene og en linje fra den gjenværende sirkelen på motstandene ned til Jord.
  • Hvis vi bruker en Voltage Divider-kalkulator ser vi at hvis motstanden nærmest sensorens 5V er 1KΩ og motstanden nærmest Jord er 2KΩ, kan vi ta ut 3.3V i punktene mellom dem. Tegn linje fra et av punktene som kobler motstandene sammen og ned til GPIO13 (som er sirkelen rett under Jord, Pin4 hos meg)

Nå skal alle komponentene være koblet sammen. Velg "Add a no-connection flag (Q)" i verktøylinjen til høyre, og sett kryss på alle punktene som ikke har linjer til seg.

For at KiCAD skal kunne vite hvor Jord og VCC er, trykk 'a' og legg til "+5V" og "GND". Husk at det skal være sirkel på sirkel og at 'r' roterer.

Siden vi har laget et Shield som skal kobles på en Arduino, har vi ikke tegnet opp noen strømkilde e.l., og KiCAD skjønner derfor ikke hvor strømmen kommer og går. Trykk 'a' og legg til "PWR_FLAG" både der du har "+5V" og der du har "GND". Dette forteller KiCAD at du er klar over problemet og går god for at +5V er +5V og Jord er Jord. Du skal nå kunne kjøre "Incpect|Electrical Rules Checker", trykke på "Run ERC", og ikke få rapportert noen feil. 

Du skal nå ha noe som likner på skjermbildet under. (Merk at dette er en såpass enkel krets at jeg ikke har brukt noe som helst tid på å lage ryddig plassering og pene linjer med knekk. KiCAD tilbyr massevis av funksjonalitet for slikt)

schematic3

 Velg "File|Save (Ctrl+S)" og klapp deg selv på skulderen.

Tilordne komponenter til symbolene i kretsen

Til nå har vi jobbet med en logisk representasjon av kretskortet vi ønsker å lage, men nå har vi kommet så langt at vi må begynne å koble oss til den virkelige verdenen. Velg "Tools|Assign Footprints". Du vil da få opp en dialog som viser alle symbolene du har lagt inn. Velg de to venstre av de tre filterknappene (altså "Filter footprint list by footprint filters defined in the symbol" og "Filter footprint list by pin count").

Klikk på én etter én, og velg:

  • For de tre 'R': Filtrer på "Resistor_THT" og dobbeltklikk f.eks "Resistor_THT:R_Axial_DIN309_L9.0mm_D3.2mm_P12.70mm_Horizontal" (som er en ganske klassisk størrelse for Through-Hole motstander)
  • For 'BC337', bruk "HandSolder" som filtertekst og dobbeltklikk på "Package_TO_SOT_THT:TO-92_Handsolder". Dette er den som er best egnet til å lodde for hånd, men du må ha en stødig hånd og tynn tupp på loddebolten..
  • Reléet har bare ett mulig valg, og er antakeligvis ferdig utfylt.
  • For 'D', filtrer på "Diode_THT" og dobbeltklikk på f.eks "Diode_THT:D_T-1_P12.70mm_Horizontal"
  • For connector som har 3 eller 8 pinner, filtrer på "PinHeader_1" (slik at du kun får opp dem som har én kolonne med pinner) og velg den som er 2.54mm og enten Horizontal eller Vertical. Den som har 3 pinner skal egentlig være lyssensoren, men for KiCAD sin del er denne helt identisk med en PinHeader.
  • For connector som har 2 pinner, fjern filter som filtrerer på det som er definert i symboler og filtrer på teksten "Terminalblock_Phoenix". Velg "TerminalBlock_Phoenix_PT-1,5-2-5.0-H_1x02_P5.00mm_Horizontal". Dette er en ganske klassisk skrutilkobling, men nok en gang står du fritt til å velge noe annet hvis du har en annen kobling i roteskuffen. 

Trykk på OK-knappen for å lukke dialogen og trykk Ctrl+S for å lagre endringene.

Vi designer kretskort!

Velg "Tools|Switch to PCB Editor" (eventuelt trykk på "PCB Editor"-knappen i hovedvinduet til KiCAD).

Det aller første vi vil gjøre er å importere kretsen vår, så velg "Tools|Update PCB from Schematic (F8)". Trykk på "Update PCB"-knappen i dialogen som dukker opp, og lukk dialogen. Plasser komponentene på et mer eller mindre tilfeldig sted litt i utkanten av arket. 

Sørg for at KiCAD er satt opp til å vise rutenett-prikker og at rutenetter er satt til 1/10 tomme (2.54mm). Se skjermbilde:

pcb1

Nå kan du markere de lengste koblingslistene. Siden disse skal stå på motsatt side av kretskortet, trykk 'e' når du har markert dem og sett "Position|Side" til "Back". Siden de står på baksiden blir de også stående speilvendt, slik at koblingslisten med tilkoblinger må stå til høyre på skjermen, selv om den frem til nå har vært fremstilt som å stå til venstre. Bruk 'r' for å rotere dem slik at den ensomme 5V-pinnen altså havner nede til høyre og den helt ubrukte havner til venstre. Bruk 'm' for å flytte på dem slik at de står på samme høyde og 11 prikker fra hverandre (altså koblingslist, 9 prikker, koblingslist) horisontalt.

Nå begynner enda mer puslearbeid. Prøv å rotere og flytte resten av komponentene ned slik at de passer mellom koblingslistene! Prøv også å roter komponentene slik at de hvite strekene (som viser hvor vi må tegne forbindelser) blir kortest mulige og krysser hverandre minst mulig. Du kan gjerne bytte grid til noe mere finkornet, og får du ikke plass er det greit at du plasserer ting over (men fortsatt mellom koblingslistene, slik at du ikke risikerer at det kommer komponenter i konflikt med pinnene til WEMOS-32D)

Det ble raskt klart at plassen jeg hadde satt av var litt knapp, og jeg endte opp med å utvide kretskortet relativt mye oppover. I skjermbildet nedenfor ser du hvordan jeg endte opp med å plassere kompnentene. Lyssensoren er plassert ca 5.5mm bak pinnene sine, så jeg valgte å sette pinnene veldig tett på koblingslisten slik at sensoren vil stå på andre siden av loddepunktene vi får der. Har vi ekstremt lite plass uten å kunne utvide kortet ville det også vært mulig å plassere flere komponenter enn koblingslistene på baksiden av kretskortet.

pcb2

Legg merke til hvordan de gule feltene til komponentene ikke kan komme i konflikt med der det ville vært gule felter hvis koblingslistene hadde gått høyere opp. Grunnen til dette er som nevnt at WROOM-32D faktisk har pinner på disse punktene.

Vi tegner forbindelser

Litt avhengig av installasjonen av KiCAD og hvor mye du har brukt applikasjonen, er det mulig at det ikke er definert "Track sizes" ennå. Velg "Edit Pre-defined Sizes" i nedtrekksboksen oppe til venstre på verktøylinjen (eventuelt velg "File|Board Setup" og gå til "Design Rules, Pre-defined Sizes"). Personlig pleier jeg alltid å ha størrelsene "0.5mm", "1mm" og "2mm" tilgjengelig, så legg inn disse hvis de ikke allerede er der.

Velg laget "F.Cu" (Front Kobber) i den høyre verktøylinjen. Dette sier at du nå vil tegne forbindelser på oversiden av kretskortet. Ikke overraskende betyr laget "B.Cu" at du tegner forbindelser på baksiden av kretskortet. Forbindelser på "F.Cu" og "B.Cu" kan krysse hverandre, men forbindelser fra samme lag kan ikke krysse hverandre. Dermed er det klar for en ny runde med pusling..

Velg "Route Tracks (X)" i høyre verktøylinje og prøv å tegne linjer mellom punktene som har hvite streker mellom seg. KiCAD vil vise deg hva som skal ha forbindelser, og også hjelpe til med avstander og slikt. Bruk 0.5mm for forbindelser med lite strøm (f.eks for sensorsignal til GPIO-pin), 1mm for alt som forbinder 3.3V-5V komponenter og 2mm for forbindelser som overstiger 5V (i vårt eksempel vil det være kontaktpunktene på J3 og J4). Det kan være smart å starte med f.eks 2mm-forbindelsene, og en del av puslejobben er å finne ut hvilke steder det kan være smart å legge én forbindelse på B.Cu for å forenkle rutingen av forbindelser på F.Cu. Hvis det blir helt umulig å unngå at forbindelser krysser kan du legge inn en "Via", som er en gjennomføring slik at en forbindelse på et gitt punkt skifter lag fra F.Cu til B.Cu eller motsatt.

Trenger du å endre på en forbindelse kan du klikke på et segment av den. Vil du velge hele forbindelsen trykker du 'u'.

Resultatet mitt ble som vist i skjermbildet under. Mens du holder på kan det være kjekt å se på antall "Unrouted", og det er alltid en god følelse å klare å få denne ned til 0 uten å måtte bruke Vias..

pcb3

Vi pynter på kretskortet

Først og fremst er det viktig å poengtere at vi faktisk ikke har et definert kretskort ennå. Velg laget "Edge.Cuts" og tegn linjer (med "Draw a line(Ctrl+Shift+L)") slik at det blir et rektangel som omkranser komponentene. Etter å ha gjort dette kan du bruke "View|3D Viewer (Alt+3)" for å se en relativt nøyaktig presentasjon av hvordan kretskortet blir.

Deretter kan du velge én og én komponent, trykke 'e' for å editere innstillinger, og i dialogen som dukker opp fjerne kryss fra "Show"-kolonnen for verdier og lag du ikke er interessert i. F.eks gir det ikke noe mening å ha "J1" skrevet ut i "F.Silkscreen" eller "F.Fab" (som er to lag som blir malt på kretskortet i sluttfasen av produksjonen). Nok en gang kan det være greit å bruke 3D-visningen for å se hvordan kretskortet vil bli. Du kan bruke "Preferences|Toggle Through Hole 3D models" for å skru av visning av komponentene for å få et bedre bilde av selve kretskortet.

For transistoren kan det være greit å beholde teksten "BC337" slik at den som skal lodde kretskortet vet hvilken type transistor som skal benyttes, men velg at denne teksten skal være på "F.Silkscreen"-laget. For dioden er symbolet ganske selvforklarende, men for motstandene bør det legges inn tekst i F.Silkscreen med verdier for hver enkelt motstand. Den motstanden i Voltage Divider som er koblet til Jord skulle være 2KΩ og de to andre skulle være 1KΩ.

Du kan også ha F.Silkscreen eller B.Silkscreen valgt (avhengig av om du vil ha ting foran eller bak på kretskortet) og bruke "Add a text item (Ctrl+Shift+T)" i verktøylinjen til høyre for å legge til tekst. Det kan f.eks være smart å legge til tekst som viser hvilken pin som er 5V og GND, slik at ikke WROOM-32D koples på feil. Dessuten er det alltid gøy å legge inn tekst som sier hva kortet gjør og hvem som har laget det.

Jeg endte opp med kretskort vist med henholdsvis fremside og bakside:

Andre ting KiCAD kan gjøre

  • I dette prosjektet er det to forskjellige Jord (som riktignok er helt separerte), og jeg har derfor gjort det enkelt og kun tegnet forbindelser der det skal være forbindelser. Har du én Jord kan det være greit å bruke "Add a filled zone (Ctrl+Shift+Z)" til å la Jord dekke f.eks alt av ledig plass på baksiden av kretskortet, og gjerne også det samme for å la VCC (3.3V eller 5V) dekke ledig plass på forsiden av kortet. KiCAD vil stort sett holde dette automatisk oppdatert mens du holder på med kretskortet.
  • Du kan bruke F.Mask/B.Mask til å maskere bort deler av det øverste laget av kretskortet. Kombinert med et fylt rektangel i et av kopper-lagene, evt Filled Zone som ikke er koblet til noe som helst, kan dette være en grei måte å f.eks tilby et område for kontakt med en kjøleribbe.
  • Edge.Cuts trenger ikke å være kun rette linjer. Det er helt greit å bruke sirkelsegmenter til å lage avrundede hjørner, eller til og med lage hull midt i kretskortet hvis du har behov for noe slikt.
  • Hvis du har en komponent som ikke finnes i Footprint-biblioteket er det relativt greit å lage footprint selv. Se om du finner databladet for komponenten - der står det nøyaktige mål!
  • Det finnes haugevis av ting KiCAD kan gjøre automatisk for deg. Både plassering av komponenter og forbindelser kan gjøres automatisk, selv om det ikke alltid blir like vellykket...

Vi sender et kretskort til produksjon

Når du føler deg ferdig med designet og "Inspect|Design Rules Checker, Run DRC" ikke viser noen feil (og forhåpentligvis ikke noen alvorlige advarsler heller), er det på tide å lage en Gerber-fil.

Velg "File|Plot", sett Output Directory til f.eks "/tmp/skumringsbryter/", dobbeltsjekk at alle lagene du har innhold på er valgt og trykk på "Plot"-knappen. Siden vi har valgt å bruke THT-komponenter må vi også generere filer for hullene. Trykk på "Generate Drill Files"-knappen og på "Generate Drill File"-knappen som dukker opp i den nye dialogen. Nå er alle filene generert og du kan lukke dialogene. 

Dra opp din favoritt-terminal, og skriv:

cd /tmp/

zip -r skumringsbryter.zip skumringsbryter/

Dette pakker ned alle filene KiCAD genererte og legger dem i en zip-fil.

Gå til en kretskortprodusent (jeg pleier å bruke https://jlcpcb.com/. De er rimelige, kjappe, og jeg kan veldig enkelt logge på med gmail-kontoen min og betale med enten PayPal eller bankkort). Så er det bare å laste opp zip-filen der de spør etter Gerber-fil, velge antall kort du ønsker, fullføre bestillingen og deretter vente spent på at kretskortene ligger i postkassen eller leveres på døren din.

Ved bestilling er det ganske mange valg som må tas, men alle sammen er ferdig utfylt basert på Gerber-filen vi har lastet opp til dem. Antall lag, størrelsen på kretskortet osv, osv.. Det eneste som kan være aktuelt å endre er antallet du ønsker produsert og fargen på kretskortet (her har jeg valgt et snasent svart kort, selv om det tar noen dager ekstra å få dette produsert).

JLCPCB kommer til å trykke bestillingsnummeret et tilfeldig sted på kretskortene. Det er mulig å bestemme i KiCAD hvor dette skal havne (les JLCPCB sin dokumentasjon!) eller å betale en liten slant ekstra for at de ikke skal legge på ordrenummeret. Jeg er prisbevisst og valgte billigste produksjon og postforsendelse.

production