Ergogen: Add PCB and net definitions
This commit is contained in:
parent
ed1b4b7632
commit
eec05917c1
8 changed files with 821 additions and 17 deletions
140
ergogen/footprints/rp2040_purple.js
Normal file
140
ergogen/footprints/rp2040_purple.js
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
// Pin header footprint for a RP2040-based controller board from AliExpress.
|
||||
// Doesn't really have a name, it's just "the purple one with USB-C".
|
||||
// The pinout differs from the Raspberry Pi Pico!
|
||||
// -------------------------------
|
||||
// Params
|
||||
// orientation: if up (default), the controller will be on the front side of the PCB, otherwise on the back side
|
||||
|
||||
module.exports = {
|
||||
params: {
|
||||
designator: 'MCU',
|
||||
orientation: 'up',
|
||||
|
||||
// Right side of pins (with USB port at the top), top to bottom
|
||||
VBUS: {type: 'net', value: 'VBUS'},
|
||||
VIN: {type: 'net', value: 'VIN'},
|
||||
GND: {type: 'net', value: 'GND'},
|
||||
'3V3_EN': {type: 'net', value: '3V3_EN'},
|
||||
'3V3': {type: 'net', value: '3V3'},
|
||||
// (GND pin)
|
||||
RUN: {type: 'net', value: 'RUN'}, // Reset pin: Pull down to reset
|
||||
GP29: {type: 'net', value: 'GP29'}, // also: ADC3
|
||||
GP28: {type: 'net', value: 'GP28'}, // also: ADC2
|
||||
GP27: {type: 'net', value: 'GP27'}, // also: ADC1
|
||||
GP26: {type: 'net', value: 'GP26'}, // also: ADC0
|
||||
AGND: {type: 'net', value: 'AGND'},
|
||||
GP25: {type: 'net', value: 'GP25'},
|
||||
GP24: {type: 'net', value: 'GP24'},
|
||||
GP23: {type: 'net', value: 'GP23'},
|
||||
GP22: {type: 'net', value: 'GP22'},
|
||||
GP21: {type: 'net', value: 'GP21'},
|
||||
GP20: {type: 'net', value: 'GP20'},
|
||||
GP19: {type: 'net', value: 'GP19'},
|
||||
GP18: {type: 'net', value: 'GP18'},
|
||||
|
||||
// Left side of pins (with USB port at the top), top to bottom
|
||||
GP0: {type: 'net', value: 'GP0'},
|
||||
GP1: {type: 'net', value: 'GP1'},
|
||||
GP2: {type: 'net', value: 'GP2'},
|
||||
GP3: {type: 'net', value: 'GP3'},
|
||||
GP4: {type: 'net', value: 'GP4'},
|
||||
// (GND pin)
|
||||
GP5: {type: 'net', value: 'GP5'},
|
||||
GP6: {type: 'net', value: 'GP6'},
|
||||
GP7: {type: 'net', value: 'GP7'},
|
||||
GP8: {type: 'net', value: 'GP8'},
|
||||
GP9: {type: 'net', value: 'GP9'},
|
||||
GP10: {type: 'net', value: 'GP10'},
|
||||
GP11: {type: 'net', value: 'GP11'},
|
||||
GP12: {type: 'net', value: 'GP12'},
|
||||
// (GND pin)
|
||||
GP13: {type: 'net', value: 'GP13'},
|
||||
GP14: {type: 'net', value: 'GP14'},
|
||||
GP15: {type: 'net', value: 'GP15'},
|
||||
GP16: {type: 'net', value: 'GP16'},
|
||||
GP17: {type: 'net', value: 'GP17'},
|
||||
},
|
||||
body: p => {
|
||||
let def_neg, def_pos, side, mirror;
|
||||
if (p.orientation === 'down') {
|
||||
def_neg = '';
|
||||
def_pos = '-';
|
||||
side = 'B';
|
||||
mirror = 'mirror';
|
||||
} else {
|
||||
def_neg = '-';
|
||||
def_pos = '';
|
||||
side = 'F';
|
||||
mirror = '';
|
||||
}
|
||||
|
||||
const PINS_PER_SIDE = 20;
|
||||
const PINS_PER_SIDE_HALF = 10;
|
||||
|
||||
const pins_left = [
|
||||
'GP0', 'GP1', 'GP2', 'GP3', 'GP4', 'GND', 'GP5', 'GP6', 'GP7', 'GP8',
|
||||
'GP9', 'GP10', 'GP11', 'GP12', 'GND', 'GP13', 'GP14', 'GP15', 'GP16', 'GP17',
|
||||
];
|
||||
const pins_right = [
|
||||
'VBUS', 'VIN', 'GND', '3V3_EN', '3V3', 'GND', 'RUN', 'GP29', 'GP28', 'GP27',
|
||||
'GP26', 'AGND', 'GP25', 'GP24', 'GP23', 'GP22', 'GP21', 'GP20', 'GP19', 'GP18',
|
||||
];
|
||||
|
||||
function pin_pos_y(pin_number) {
|
||||
// Fucking floating points...
|
||||
return (254 * (pin_number - PINS_PER_SIDE_HALF) + 127) / 100;
|
||||
}
|
||||
|
||||
function pin_labels(pin_names, right_side) {
|
||||
const sign = right_side ? def_pos : def_neg;
|
||||
const justify = right_side ? 'right' : 'left';
|
||||
let pin_label_body = '';
|
||||
|
||||
for (let i = 0; i < PINS_PER_SIDE; i++) {
|
||||
pin_label_body += `
|
||||
(fp_text user ${pin_names[i]} (at ${sign}7.62 ${pin_pos_y(i)} ${p.r}) (unlocked yes) (layer ${side}.SilkS)
|
||||
(effects (font (size 0.8 0.8) (thickness 0.15)) (justify ${justify} ${mirror}))
|
||||
)`;
|
||||
}
|
||||
return pin_label_body;
|
||||
}
|
||||
|
||||
function pin_pads(pin_names, right_side) {
|
||||
const sign = right_side ? def_pos : def_neg;
|
||||
const offset = right_side ? 21 : 1;
|
||||
let pin_pad_body = '';
|
||||
|
||||
for (let i = 0; i < PINS_PER_SIDE; i++) {
|
||||
pin_pad_body += `
|
||||
(pad ${i + offset} thru_hole circle (at ${sign}8.89 ${pin_pos_y(i)} 0)
|
||||
(size 1.7526 1.7526) (drill 1.0922) (layers *.Cu *.SilkS *.Mask) ${p[pin_names[i]]}
|
||||
)`;
|
||||
}
|
||||
return pin_pad_body;
|
||||
}
|
||||
|
||||
return `
|
||||
(module RP2040_USB_C_Purple (layer F.Cu) (tedit 66A6C4CD)
|
||||
${p.at /* parametric position */}
|
||||
|
||||
${'' /* footprint reference */}
|
||||
(fp_text reference "${p.ref}" (at 0 0) (layer ${side}.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
|
||||
(fp_text value "" (at 0 0) (layer ${side}.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
|
||||
|
||||
${'' /* component outline */}
|
||||
(fp_line (start -10.16 -28.6) (end 10.16 -28.6) (layer ${side}.SilkS) (width 0.15))
|
||||
(fp_line (start 10.16 -28.6) (end 10.16 25.4) (layer ${side}.SilkS) (width 0.15))
|
||||
(fp_line (start 10.16 25.4) (end -10.16 25.4) (layer ${side}.SilkS) (width 0.15))
|
||||
(fp_line (start -10.16 25.4) (end -10.16 -28.6) (layer ${side}.SilkS) (width 0.15))
|
||||
|
||||
${'' /* pin labels */}
|
||||
${pin_labels(pins_left, false)}
|
||||
${pin_labels(pins_right, true)}
|
||||
|
||||
${'' /* pin pads */}
|
||||
${pin_pads(pins_left, false)}
|
||||
${pin_pads(pins_right, true)}
|
||||
)
|
||||
`;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue