I made a tool: Generate pogo pin test fixtures from Gerbers or photos of PCBs - Page 1
Forum section: electronics / general

author: actuallyjaseg
author_rank: Contributor
timestamp: September 30, 2019, 08:45:34 am
content: 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 fromgithubor use the online version atpogojig.jaseg.net.The tool works by first exporting the gerbers into anInkscapeSVGtemplate 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 anInkscapeSVGthere is also anempty templateif 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.

author: IEvenKnowOhmsLaw
author_rank: Newbie
timestamp: November 10, 2019, 01:07:30 am
content: 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?

author: actuallyjaseg
author_rank: Contributor
timestamp: November 10, 2019, 10:42:44 am
content: Thanks for your report.The gerber-to-SVG tool athttps://pogojig.jaseg.net/static/pogospace/index.htmlworks 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:-- Logs begin at Sat 2019-06-01 01:02:26 UTC. --Nov 09 23:50:55 wendelstein.jaseg.net python3: INFO:root:Processing render job 15 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:50:54Nov 09 23:50:55 wendelstein.jaseg.net sudo: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9Nov 09 23:50:55 wendelstein.jaseg.net sudo: pam_unix(sudo:session): session opened for user root by (uid=0)Nov 09 23:50:55 wendelstein.jaseg.net python3: Spawning container pogojig-b967afd906c03c86 on /var/lib/machines/pogojig/.#machine.1c7b569fd9e51a23.Nov 09 23:50:55 wendelstein.jaseg.net python3: Press ^] three times within 1s to kill container.Nov 09 23:50:56 wendelstein.jaseg.net python3: Sat Nov 9 23:50:56 UTC 2019Nov 09 23:50:56 wendelstein.jaseg.net python3: Cleaning up previous outputNov 09 23:50:56 wendelstein.jaseg.net python3: Sat Nov 9 23:50:56 UTC 2019Nov 09 23:50:56 wendelstein.jaseg.net python3: RenderingNov 09 23:50:56 wendelstein.jaseg.net python3: make: Entering directory '/mnt/sources'Nov 09 23:50:56 wendelstein.jaseg.net python3: 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: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxfNov 09 23:51:01 wendelstein.jaseg.net python3: (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 directoryNov 09 23:51:01 wendelstein.jaseg.net python3: (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 directoryNov 09 23:51:02 wendelstein.jaseg.net python3: mkdir -p outNov 09 23:51:02 wendelstein.jaseg.net python3: openscad -o out/jig.stl src/jig.scadNov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: 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: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: 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: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)Nov 09 23:51:03 wendelstein.jaseg.net python3: Current top level object is empty.Nov 09 23:51:03 wendelstein.jaseg.net python3: make: *** [Makefile:21: out/jig.stl] Error 1Nov 09 23:51:03 wendelstein.jaseg.net python3: make: Leaving directory '/mnt/sources'Nov 09 23:51:03 wendelstein.jaseg.net python3: Container pogojig-b967afd906c03c86 failed with error code 2.Nov 09 23:51:03 wendelstein.jaseg.net python3: INFO:root:Finishied processing render job 15Nov 09 23:51:16 wendelstein.jaseg.net python3: INFO:root:Processing render job 16 session 4038a26b-2c1b-49ce-8624-40c520b354b9 from ###.###.###.### submitted 2019-11-09 23:51:16Nov 09 23:51:16 wendelstein.jaseg.net sudo: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 4038a26b-2c1b-49ce-8624-40c520b354b9Nov 09 23:51:16 wendelstein.jaseg.net sudo: pam_unix(sudo:session): session opened for user root by (uid=0)Nov 09 23:51:16 wendelstein.jaseg.net python3: Spawning container pogojig-a0b04b967942a28b on /var/lib/machines/pogojig/.#machine.749dbbb866706ff3.Nov 09 23:51:16 wendelstein.jaseg.net python3: Press ^] three times within 1s to kill container.Nov 09 23:51:17 wendelstein.jaseg.net python3: Sat Nov 9 23:51:17 UTC 2019Nov 09 23:51:17 wendelstein.jaseg.net python3: Cleaning up previous outputNov 09 23:51:17 wendelstein.jaseg.net python3: Sat Nov 9 23:51:17 UTC 2019Nov 09 23:51:17 wendelstein.jaseg.net python3: RenderingNov 09 23:51:17 wendelstein.jaseg.net python3: make: Entering directory '/mnt/sources'Nov 09 23:51:17 wendelstein.jaseg.net python3: 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: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxfNov 09 23:51:18 wendelstein.jaseg.net python3: Traceback (most recent call last):Nov 09 23:51:18 wendelstein.jaseg.net python3: File "support/inkscape_exporter.py", line 52, in <module>Nov 09 23:51:18 wendelstein.jaseg.net python3: effect.ExportEffect.check_document_units(args.infile)Nov 09 23:51:18 wendelstein.jaseg.net python3: File "/mnt/sources/support/pogojig/inkscape/effect.py", line 273, in check_document_unitsNov 09 23:51:18 wendelstein.jaseg.net python3: 'Height of SVG document is not an absolute measure. See 'Nov 09 23:51:18 wendelstein.jaseg.net python3: ValueError: Height of SVG document is not an absolute measure. See https://github.com/Feuermurmel/openscad-template/wiki/Absolute-MeasurementsNov 09 23:51:18 wendelstein.jaseg.net python3: make: *** [Makefile:13: src/input.preprocessed.dxf] Error 1Nov 09 23:51:18 wendelstein.jaseg.net python3: make: Leaving directory '/mnt/sources'Nov 09 23:51:18 wendelstein.jaseg.net python3: Container pogojig-a0b04b967942a28b failed with error code 2.Nov 09 23:51:18 wendelstein.jaseg.net python3: INFO:root:Finishied processing render job 16Nov 09 23:54:06 wendelstein.jaseg.net python3: INFO:root:Processing render job 17 session 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3 from ###.###.###.### submitted 2019-11-09 23:54:06Nov 09 23:54:06 wendelstein.jaseg.net sudo: root : TTY=unknown ; PWD=/var/lib/pogojig ; USER=root ; COMMAND=/usr/local/sbin/pogojig_generate.sh 0e9a5b1d-3645-49eb-aa5a-1ddb31d703c3Nov 09 23:54:06 wendelstein.jaseg.net sudo: pam_unix(sudo:session): session opened for user root by (uid=0)Nov 09 23:54:06 wendelstein.jaseg.net python3: Spawning container pogojig-b3c9160f97499afe on /var/lib/machines/pogojig/.#machine.d2e67dd1f756c03f.Nov 09 23:54:06 wendelstein.jaseg.net python3: Press ^] three times within 1s to kill container.Nov 09 23:54:07 wendelstein.jaseg.net python3: Sat Nov 9 23:54:07 UTC 2019Nov 09 23:54:07 wendelstein.jaseg.net python3: Cleaning up previous outputNov 09 23:54:07 wendelstein.jaseg.net python3: Sat Nov 9 23:54:07 UTC 2019Nov 09 23:54:07 wendelstein.jaseg.net python3: RenderingNov 09 23:54:07 wendelstein.jaseg.net python3: make: Entering directory '/mnt/sources'Nov 09 23:54:07 wendelstein.jaseg.net python3: 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: support/inkscape_exporter.py src/input.preprocessed.svg src/input.preprocessed.dxfNov 09 23:54:11 wendelstein.jaseg.net python3: (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 directoryNov 09 23:54:11 wendelstein.jaseg.net python3: (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 directoryNov 09 23:54:12 wendelstein.jaseg.net python3: mkdir -p outNov 09 23:54:12 wendelstein.jaseg.net python3: openscad -o out/jig.stl src/jig.scadNov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache insert: group(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache insert: union(){group(){multmatrix([[1,0,0,0],[0 (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: 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: CGAL Cache insert: difference(){linear_extrude(height=15,ce (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache insert: difference(){difference(){linear_extrude (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache insert: union(){linear_extrude(height=9.2,center (53272 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: 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: CGAL Cache insert: union(){multmatrix([[1,0,0,0],[0,1,0,0], (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache insert: difference(){difference(){difference(){l (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: CGAL Cache hit: difference(){difference(){difference(){l (0 bytes)Nov 09 23:54:13 wendelstein.jaseg.net python3: Current top level object is empty.Nov 09 23:54:13 wendelstein.jaseg.net python3: make: *** [Makefile:21: out/jig.stl] Error 1Nov 09 23:54:13 wendelstein.jaseg.net python3: make: Leaving directory '/mnt/sources'Nov 09 23:54:13 wendelstein.jaseg.net python3: Container pogojig-b3c9160f97499afe failed with error code 2.Nov 09 23:54:13 wendelstein.jaseg.net python3: INFO:root:Finishied processing render job 17

author: cgroen
author_rank: Unknown
timestamp: November 11, 2019, 05:44:54 pm
content: I do get "413 Request Entity Too Large" onhttps://pogojig.jaseg.net/upload/svgwhen uploading my SVG file (approx 1 MByte in size)

author: actuallyjaseg
author_rank: Contributor
timestamp: November 11, 2019, 06:34:14 pm
content: Quote from: cgroen on November 11, 2019, 05:44:54 pmThis 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

author: cgroen
author_rank: Unknown
timestamp: November 11, 2019, 06:49:52 pm
content: I get it to pass nowI 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:

author: actuallyjaseg
author_rank: Contributor
timestamp: November 11, 2019, 07:02:30 pm
content: 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.

author: cgroen
author_rank: Unknown
timestamp: November 11, 2019, 07:11:21 pm
content: Quote from: actuallyjaseg on November 11, 2019, 07:02:30 pmThat worked fine, jig shown belowI'm not sure I see your email address on the website ?(I sent you a PM with a link to the file on dropbox)

author: IEvenKnowOhmsLaw
author_rank: Newbie
timestamp: November 11, 2019, 07:38:20 pm
content: 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 saysCode:stack-layers.js:52 Uncaught TypeError: Cannot read property 'id' of undefinedat t.exports (stack-layers.js:52)at index.js:45at Array.map (<anonymous>)at t.exports (index.js:44)at index.js:53at n (index.js:21)at r (index.js:18)at f (index.js:22)at l (index.js:28)at index.js:43In firefox it saysCode:TypeError: b is undefined 2.2860b24d78cee11b8d5e.worker.js:8:23981exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8x https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8map self-hosted:291exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8n https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1r https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1f https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1l https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1exports https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1e https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:8d https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1apply self-hosted:2018o https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8<anonymous> self-hosted:1017apply self-hosted:2018emit https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:8I https://pogojig.jaseg.net/static/pogospace/2.2860b24d78cee11b8d5e.worker.js:1run https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1p https://pogojig.jaseg.net/static/pogospace/2860b24d78cee11b8d5e.worker.js:1I messaged you about email so I can pass on the board I'm testing out with this. Thanks!