Sunday, November 16, 2025

Canva Affinity and Kicad 9: Graphical Madness for DiWhy Projects

Many thanks Elton at Otter Mods for introducing me to Kicad and Affinity.

============

When I look at professionally created front panels, surrounding knobs I often see "goes to 11" gradients:

                             




(What are these called? Dials? Tick marks? Tap Mach II? I'm not sure, but, I wanted to add them to my front panels. 

For the post I'll call them "dials").

Using the built-in graphics tools in Kicad 9 didn't get me far, but found I could import graphics into Kicad as footprints, then add them to PCB's used as front panels on a silkscreen layer. 

OK, how?

There are two graphics import methods in Kicad I know of:  

First--easy: through Kicad's "Project Manager"--a tool you see when you first open the program--I could turn PNG graphics into bitmaps, using the Image Converter tool. 


Works, but, I found at times the output was grainy.  

What else?

Elton at Otter Mods, the resident Kicad expert of my geeky tech group, described a better way:

Use Affinity Designer to create SVG formatted files, then import the files into Kicad as footprints. Finally, place the graphic footprints on your front panels.

Today's post outlines a workflow to do this--this may be documented somewhere, but I couldn't find it, and ChatGPT was out to lunch.

CANVA AFFINITY 

First I needed to get Canva Affinity, Elton's choice for creating SVG graphics. 

Tough choice. Pay enormous bucks for an Adobe Creative Cloud subscription, complete with hidden fees, a confusing cloud presence, and terrible tech support? 

Nope. Good news: like Kicad 9, Canva Affinity is free




Or is it? I had to set up a Canva account, last I heard the friendly Canva folks aren't a 501C, rather someone has to buy lunchroom donuts and most important: keep the shareholders happy.  

Whatever....I set up a "free" Canva account, downloaded Affinity, and installed it on my W11 PC. 

So far, so good.

After a few hours of trying out the new Affinity: it felt like a true Adobe killer, combining features found in Illustrator, Photoshop, and InDesign, into one mega-graphics app. Affinity can do most everything Adobe, except grab you by your legs, flip you upside-down, shake the hell out of you, then pocket whatever change falls out.

For creating dials I focused on Affinity's VECTOR persona which closely matched features found in illustrator.  

It had an Export > SVG feature--so far, so good.

CREATING THE DIAL

Knowing squat about Affinity vector I watched this video which contained a lot of what I wanted to do. 

An aside: I found a lot of online documentation for Canva Affinity out of date; perhaps Affinity, like Microsoft, has no problem changing their UI early and often, like soiled chonies;  Internet documentation (and AI) is slower to catch up.  

....they moved around the furniture?
.
After an hour or so I ended up with this:




A few notes; I won't remember any of this 2 days from now.

  • I chose a 120mm x 120mm artboard and made sure the diameter of the outer circle had a 100mm diameter. How to set up artboards and canvases in Affinity is covered in this video--video is not for the UI current as of 12-1-25 but I could follow it. The 100mm diameter made the size conversions described below easier to figure out.

  • I used grids/guides. Good video for that (again, for an earlier version of Affinity Designer but the steps still seem current?) is here. However, there does not appear top be a way to save a custom grid configuration, unfortunate. Here are the settings used:


  • To make the tick marks, use Affinity's Vector "power repeat" feature; take a look at this  how-to video. I had to make sure to set the checkboxes and adjust rotate points as described in the video or I'd end up with an ugly mess. 
  • The repeat settings used for the big ticks:


  • I then created a smaller tick over the large one at 12 o'clock, dragged its rotation point to center (red line and green guide lines visible) and repeated with rotation of 7.5 and number of copies of 64. 

Couldn't find anywhere: how I created the gap between 7PM and 5PM at the bottom of the dial. 

By trial and error, here's how; most everything I found online appeared to be uselessly out of date: 
  • Use the Affinity Vector knife tool
  • If you zoom way in on the circle the knife tool becomes the scissor tool—yeh, I knew that.
  • Make the start and end cuts on the arcs, where we need to get rid of parts of the circle, by left clicking with the scissor tool
  • From the main menu: vector > separate curves 
  • Using the move tool (not node tool!) click between 5 and 7; 
  • The arc to be deleted is boxed with a faint blue rectangle.
  • Hit delete on your keyboard
  • Arc that was boxed is now gone
  • Use node tool to further clean up any ugliness.
Finally I exported the 100mm x 100mm dial using File > Export > Export > SVG > SVG (for export).

AND NOW--A WORD ABOUT THIS BLOG'S SPONSOR


As soon as you have your front panel design and gerber you will need your work fabricated. For this, you should use PCBWAY.

PCBWAY, the sponsor of this blog, has a service to fabricate PCBs and other materials using any color of the rainbow. That's full color PCB's folks! Details are here. I will be covering this super cool service in a future post.

In addition to top notch PCB fabrication they also do fantastic work with assembly, 3D printing, injection molding, and so much more. Their staff is super friendly and PCBWAY always turns the work around quickly. I am always impressed!

You can help this blog by checking out the PCBWAY site.  Thanks.

IMPORTING INTO KICAD


In Kicad 9 I used the footprint editor to create a new footprint library then a new footprint for the dial.  SVG's import: file > import > graphics.

.....this dialog:



This seemed straightforward until I discovered the "Import Scale" was linear but inaccurate. 

Meaning, if I set Import scale to .5 and imported a 100mm circle the resulting footprint was not a 50mm circle. 

Damn!

Not sure if this is documented anywhere--probably is, but, I couldn't it--I ended up crafting this formula which seemed to get the job done:

X = Z/(A*3.08)

Where:

  • X is the # to use for Kicad's import scale
  • Z is final size you want
  • A is the original size of SVG
Why 3.08?  No idea, I figured it might be PI, which got me close, but no, 3.08 yielded better results.  

For instance, for a 100mm diameter, and 25 mm output, I used this.

X = 25/(100*3.08)

X = .0811

BINGO.



For 100mm source, and 15mm target:

X = 15/(100 * 3.08) 

so x = .0487 to use for import scale, here’s what I got in Kicad. BUTTER!



I found that for smaller inputs (e.g., 50mm circle SVG instead of 100mm) the outputs drifted a bit, not sure why, but was still good enough. In general, I figured: why not stick with 100mm SVG source files. That's what I did here.

Summarizing--here are some common Input scale: values to use based on a 100mm SVG source. Target footprint size in millimeters is the column on the left.

8 0.025974026
9 0.029220779
10 0.032467532
11 0.035714286
12 0.038961039
13 0.042207792
14 0.045454545
15 0.048701299
16 0.051948052
17 0.055194805
18 0.058441558
19 0.061688312
20 0.064935065
21 0.068181818
22 0.071428571
23 0.074675325
24 0.077922078
25 0.081168831
26 0.084415584
27 0.087662338
28 0.090909091
29 0.094155844
30 0.097402597
31 0.100649351
32 0.103896104
33 0.107142857
34 0.11038961
35 0.113636364
36 0.116883117
37 0.12012987
38 0.123376623
39 0.126623377
40 0.12987013


Before wrapping up--one more thing. Affinity allowed me to jump between "Vector" ("Illustrator") and "Pixel" ("Photoshop") mode. Great, it meant that I had more cool editing tools at my disposal. But--I found that SVG's modified in Pixel mode often created a file that Kicad couldn't import. I found it best to do all the work in the Vector Persona.

WHAT'S NEXT?


This whole SVG > Kicad thing can be used for more than dials. Line art?  Yep. Logos? Sure. Any single color or BW 2D graphic import should work. 

I uploaded my footprints from this SVG > Kicad silk workflow into Github (here) and will try to keep the repo current.

For the full color materials, Affinity would be a great way to get into that. I'll cover this in a future post....

And of course I will add more dials and graphics to future projects using the methods above.  

Overall, many enjoyable hours down the rabbit hole for this one. More to come.






Monday, November 10, 2025

Small Dual LFO--OTA based--Works Great!

Readers: If you'd like to build the dual LFO featured in this post, please go to PCBWAY's Community pages--gerber file; KiCAD 9 project/pcb/schematic/library files, B.O.M.'s, and more, are here.  

You can also help out this blog immensely by checking out PCBWAY. Thanks!

==============

Hello again:

I needed a small dual LFO with edge connectors for a few upcoming projects. 

Done--fabricated--worked first time. Joy!



To review: I found a cool OTA-based LFO design on EFM's site, here. I built a single really small CA3080 version, see this post, but then realized for some projects I needed--more? 

I redesigned two LFO's in one small PCB--read about that in this part I post.

The Revision1 design had some stupid mistakes, which are corrected in the version you see in today's post. Everything now works. Go A's!

THE PCB


Thanks as always to PCBWAY for sponsoring this blog and coming through with perfectly manufactured PCB's. They do great work! You can help out the blog by checking 'em out, here

PCB remains pretty small, 48 x 63mm. Which means: You can get 10 of these for $5USD from PCBWAY.

This rev worked great the first time!

....doesn't happen often, but when it does 
I'll take it.


DUAL LFO SETUP AND PINOUTS

As with the earlier designs, the 10K trimmers set the minimum LFO frequencies when CV = 0V.  

On the bench I could adjust this trim to make the slowest frequency REAALLLLY slow--didn't figure out exactly how slow but maybe one full cycle every 5-10 seconds, something like that.


Because I want to use this design as a drop-in to future projects I broke the inputs and outputs of each LFO to 100mil edge pins:
  • TRI1, SQR, TRI2 and SQR2 are outputs.  
  • 11,12 are ground; 
  • 13 is Vcc (circuit should work with different rail voltages; I have only tested with +/-12);
  •  Bias (Pins 4,5,9,10) set the voltage offsets for each output independently, with negative voltages relative to ground driving the offset up. I used "inverted CV" to avoid needing another op amp stage for each bias offset.
You shouldn't have to do a lot of tweaking, except for R9 and R5. These 2 resistors set the overall frequency based on incoming CV.  I tried values from 10K to 100K, what you use here depends on your needs. 

On the bench 20K worked for me, but if you are adding more external CV you should put a 0 ohm resistor in there then follow the guideline laid out in step 3 in "ideas" section below.

IDEAS FOR PROJECTS USING THE DUAL LFO AS A DAUGHTERBOARD





First idea: output of LFO1 feeds input of LFO2.  Put a digitally controlled switch or VCA in here?  


Second idea:  Have bias controls for each output.  As mentioned above, to save op amp stages the bias is wired "backwards" so plan accordingly.  Also, the output of each waveform is about 12V P/P so to not clip a voltage divider at each triangle output may be needed.  

This bias offset could be clamped and then controlled by CV.  Why not?


Step 3: add more CV.  I found the LFO's respond well to wide swings in CV, from maybe -10V to 10V, going from EVENN SLOWWER to way into the audible range. Cool!  If I set R9 and R5 to 0 ohm resistors the CV input op amps become mixers, so it's easy to add as many CV's as needed....maybe a "master CV" pot  from -12 to +12 and a few CV inputs with a B100K in front.  The diagram above shows you how to set this up.


OUTTRO


Overall: glad this design is finally working.  I will use this and the 3080 miniLFO in upcoming projects.  Until then, modulate slowly, and don't breathe the fumes!

Create Indestructable SBC's with overlayfs--Part II--uv, flask, and systemd

Last time I covered using overlayfs on a Linux Single Board Computer  to survive unwelcomed power hits.  To understand this post you may wa...