Author Topic: I made a tool: Generate pogo pin test fixtures from Gerbers or photos of PCBs  (Read 466 times)

0 Members and 1 Guest are viewing this topic.

Offline actuallyjaseg

  • Contributor
  • Posts: 8
  • Country: de
    • jaseg.net
Hi,

I made a tool that takes a board's gerber files to semi-automatically generate a 3D-printable model and a KiCAD PCB template for a pogo pin test fixture. You can download a Makefile project template from github or use the online version at pogojig.jaseg.net.

The tool works by first exporting the gerbers into an Inkscape SVG template for you to manually draw pogo pin locations and test fixture cutouts into. From that SVG the tool then generates a 3D model for the PCB holder with holes and indents in all the right places, and a KiCAD PCB with the outline for a backing PCB going below the plastic PCB holder with pads for soldering the pogo pins already in the right locations. You can directly print the 3D model, and you could either directly have the KiCAD PCB manufactured if you just want to solder wires directly to the pogo pins and use the backing PCB only as a mechanical mount, or you could add your own connectors and traces to the backing PCB. I've attached a render of a generated plastic jig and PCB to this post.

Since the intermediate step is just an Inkscape SVG there is also an empty template if you want to start with something other than gerbers such as a screenshot from your PCB tool or even a scan or photo of a physical PCB. In that case you just have to make sure everything is to scale and there is no distortion.

Do you think you might use pogo pin test fixtures even as a hobbyist now that this mostly automated tool is available?

I'd love to hear your thoughts and comments and I'm open to suggestions.
845548-0
 
The following users thanked this post: Jeroen3, ebclr, laneboysrc, Ysjoelfir, cgroen, devan, IEvenKnowOhmsLaw

Offline IEvenKnowOhmsLaw

  • Newbie
  • Posts: 2
  • Country: ca
Not having any luck with it unfortunately. Trying to load a gerber file just gives an endless loading screen (even after leaving it for an hour) and the SVG page gives an unspecified file error after accepting the upload. I'm relatively inexperienced with this type of stuff though.
Created the files with Ultiboard, exported as Gerber RS-274X and SVG.
Cheers for creating this nonetheless. Does it store any uploaded files once its finished processing?
 
The following users thanked this post: actuallyjaseg

Offline actuallyjaseg

  • Contributor
  • Posts: 8
  • Country: de
    • jaseg.net
Thanks for your report.

The gerber-to-SVG tool at https://pogojig.jaseg.net/static/pogospace/index.html works fine for me. Is your browser maybe blocking Javascript? You can check the browser console for error messages from the gerber renderer itself.
The issue with your SVG upload seems to be that the renderer was unable to find board outline and pogo pin objects. If you can't get it to work feel free to email me the gerbers or SVG and I can try to reproduce your issue. DM me for my email.

As for storing files, the gerbers and SVG are not even uploaded to the server since the rendering is done 100% client-side in JavaScript. They are stored in your browser's site data though, so you can still see your past uploads the next time you open the site. If you upload an SVG file that is stored until an error occurs or processing is finished. The generated downloads (renders and 3D files) are stored for up to I think 48 hours, and are then automatically deleted. They are tied to your session, so nobody else can see them.

The system is keeping error logs for debugging, but those don't contain any identifiable information. Here's the processing log from yesterday's uploads:
Code: [Select]
-- Logs begin at Sat 2019-06-01 01:02:26 UTC. --
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 15 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:50:54
Nov 09 23:50:55 wendelstein.jaseg.net sudo[247631]:     root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9
Nov 09 23:50:55 wendelstein.jaseg.net sudo[247631]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-b967afd906c03c86 on /var/lib/machines/pogojig/.#machine.1c7b569fd9e51a23.
Nov 09 23:50:55 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:50:56 UTC 2019
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:50:56 UTC 2019
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:50:56 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:51:01 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:51:01.901: Attempting to store changes into `/root/.local/share/recently-used.xbel', but failed: Failed to create file ?/root/.local/share/recently-used.xbel.J914A0?: No such file or directory
Nov 09 23:51:01 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:51:01.902: Attempting to set the permissions of `/root/.local/share/recently-used.xbel', but failed: No such file or directory
Nov 09 23:51:02 wendelstein.jaseg.net python3[125951]: mkdir -p out
Nov 09 23:51:02 wendelstein.jaseg.net python3[125951]: openscad -o out/jig.stl src/jig.scad
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,1 (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,- (53272 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: Current top level object is empty.
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:21: out/jig.stl] Error 1
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: Container pogojig-b967afd906c03c86 failed with error code 2.
Nov 09 23:51:03 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 15
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 16 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:51:16
Nov 09 23:51:16 wendelstein.jaseg.net sudo[247657]:     root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9
Nov 09 23:51:16 wendelstein.jaseg.net sudo[247657]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-a0b04b967942a28b on /var/lib/machines/pogojig/.#machine.749dbbb866706ff3.
Nov 09 23:51:16 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:51:17 UTC 2019
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:51:17 UTC 2019
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:51:17 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: Traceback (most recent call last):
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]:   File "support/inkscape_exporter.py", line 52, in <module>
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]:     effect.ExportEffect.check_document_units(args.infile)
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]:   File "/mnt/sources/support/pogojig/inkscape/effect.py", line 273, in check_document_units
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]:     'Height of SVG document is not an absolute measure. See '
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: ValueError: Height of SVG document is not an absolute measure. See https://github.com/Feuermurmel/openscad-template/wiki/Absolute-Measurements
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:13: src/input.preprocessed.dxf] Error 1
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: Container pogojig-a0b04b967942a28b failed with error code 2.
Nov 09 23:51:18 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 16
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: INFO:root:Processing render job 17 session 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3 from ###.###.###.### submitted 2019-11-09 23:54:06
Nov 09 23:54:06 wendelstein.jaseg.net sudo[247680]:     root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3
Nov 09 23:54:06 wendelstein.jaseg.net sudo[247680]: pam_unix(sudo:session): session opened for user root by (uid=0)
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: Spawning container pogojig-b3c9160f97499afe on /var/lib/machines/pogojig/.#machine.d2e67dd1f756c03f.
Nov 09 23:54:06 wendelstein.jaseg.net python3[125951]: Press ^] three times within 1s to kill container.
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:54:07 UTC 2019
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Cleaning up previous output
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Sat Nov  9 23:54:07 UTC 2019
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: Rendering
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: make: Entering directory '/mnt/sources'
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: support/inkscape_svg_filter_layers.py input.svg src/input.preprocessed.svg --only --name "Test Points" "Mounting Holes" "Grip Slots" "Outline"
Nov 09 23:54:07 wendelstein.jaseg.net python3[125951]: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxf
Nov 09 23:54:11 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:54:11.637: Attempting to store changes into `/root/.local/share/recently-used.xbel', but failed: Failed to create file ?/root/.local/share/recently-used.xbel.P45AB0?: No such file or directory
Nov 09 23:54:11 wendelstein.jaseg.net python3[125951]: (inkscape:11): Gtk-WARNING **: 23:54:11.639: Attempting to set the permissions of `/root/.local/share/recently-used.xbel', but failed: No such file or directory
Nov 09 23:54:12 wendelstein.jaseg.net python3[125951]: mkdir -p out
Nov 09 23:54:12 wendelstein.jaseg.net python3[125951]: openscad -o out/jig.stl src/jig.scad
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,1 (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: multmatrix([[1,0,0,0],[0,1,0,0],[0,0,1,- (53272 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: Current top level object is empty.
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: make: *** [Makefile:21: out/jig.stl] Error 1
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: make: Leaving directory '/mnt/sources'
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: Container pogojig-b3c9160f97499afe failed with error code 2.
Nov 09 23:54:13 wendelstein.jaseg.net python3[125951]: INFO:root:Finishied processing render job 17
 
The following users thanked this post: IEvenKnowOhmsLaw

Offline cgroen

  • Supporter
  • ****
  • Posts: 300
  • Country: dk
    • Carstens personal web
I do get "413 Request Entity Too Large" on https://pogojig.jaseg.net/upload/svg when uploading my SVG file (approx 1 MByte in size)
 

Offline actuallyjaseg

  • Contributor
  • Posts: 8
  • Country: de
    • jaseg.net
I do get "413 Request Entity Too Large" on https://pogojig.jaseg.net/upload/svg when uploading my SVG file (approx 1 MByte in size)

This should be fixed now. Uploads up to 10MB are accepted. If you want to process larger files you can run the script on your own machine ;)
 

Offline cgroen

  • Supporter
  • ****
  • Posts: 300
  • Country: dk
    • Carstens personal web
I get it to pass now :)
I also do get the STL file, but without any holes in it ?
I'm not sure I did everything correct in inkscape (first time I have used it), I moved 3 pads to the "test points" layer, and deleted all layers except the outline and the testpoints (I'm not sure if I'm supposed to do that ?)

In inkscape it looks like this:
 

Offline actuallyjaseg

  • Contributor
  • Posts: 8
  • Country: de
    • jaseg.net
From your explanation it sounds like you're doing everything right. You can compare with my test SVG file in the attachment if that helps. If you can't get it to work you can mail me your SVG and I can take a look.
 

Offline cgroen

  • Supporter
  • ****
  • Posts: 300
  • Country: dk
    • Carstens personal web
From your explanation it sounds like you're doing everything right. You can compare with my test SVG file in the attachment if that helps. If you can't get it to work you can mail me your SVG and I can take a look.

That worked fine, jig shown below
I'm not sure I see your email address on the website ?
(I sent you a PM with a link to the file on dropbox)
« Last Edit: November 11, 2019, 07:13:06 pm by cgroen »
 

Offline IEvenKnowOhmsLaw

  • Newbie
  • Posts: 2
  • Country: ca
Javascript is enabled in the browser, though its possible some of the other security setup gets in the way. I tried a couple browsers to see.
In chrome the console says
Code: [Select]
stack-layers.js:52 Uncaught TypeError: Cannot read property 'id' of undefined
    at t.exports (stack-layers.js:52)
    at index.js:45
    at Array.map (<anonymous>)
    at t.exports (index.js:44)
    at index.js:53
    at n (index.js:21)
    at r (index.js:18)
    at f (index.js:22)
    at l (index.js:28)
    at index.js:43

In firefox it says
Code: [Select]
TypeError: b is undefined 2.2860b24d78cee11b8d5e.worker.js:8:23981
    exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
    x https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
    map self-hosted:291
    exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
    exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
    n https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    r https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    f https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    l https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    e https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8
    d https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    apply self-hosted:2018
    o https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8
    <anonymous> self-hosted:1017
    apply self-hosted:2018
    emit https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8
    I https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1
    run https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1
    p https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1

I messaged you about email so I can pass on the board I'm testing out with this. Thanks!
 
The following users thanked this post: actuallyjaseg


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf