Merge pull request #12 from mdurvaux/master

Electrical and mechanical design documentation
pull/33/head
Raphaël Vinot 2015-02-21 13:12:49 +01:00
commit bf66e76d1c
11 changed files with 23462 additions and 0 deletions

View File

@ -0,0 +1,50 @@
Daughter board schematic
========================
Note
======
the schematic has been created using GNU gEDA
Bill of material
================
Part list
- 3mm diameter low power LED Green
- 3mm diameter low power LED Yellow
- 3mm diameter low power LED Red
- PCB mounted SPST normally open push-button
- 26 (or 40) DIL poles pin-header female connector
- resistors (values are not critical)
510 Ohm (3)
16 KOhm
1.3 KOhm
Mechanical design
=================
coordinate (0,0) is located at the PCB corner near the power supply connector.
the X axis is along the longest side.
hole_x1 = 3.50 ; // hole center x offset from PCB edge (uSD side)
LedBtn_y = device_y - hole_y - 2.5 * 2.54 + tolerance ; // Y axis center position of LEDs and button(s)
R_Led_x = hole_x1 + 29 + 2.54 + tolerance ; // X axis center position of red LED
Y_Led_x = R_Led_x - 3 * 2.54 ; // X axis center position of yellow LED
G_Led_x = R_Led_x - 6 * 2.54 ; // X axis center position of green LED
Btn_x = R_Led_x + 4.5 * 2.54 ; // X axis center position of button
The LEDs and the push-button are positioned on the 2.54 mm (0.1 inch) grid
Relative to he GPIO connector pin 1
along the X axis : -2 * 2.54 mm
along the Y axis (in multiples of 2.54 mm)
Green LED center : 4.5
Yellow LED center : 7.5
Red LED center : 10.5
Push-button center : 15.0
The LEDs have a 3 mm diameter
The top of the LEDs are 11 mm above the PCB

Binary file not shown.

View File

@ -0,0 +1,139 @@
v 20110115 2
C 40000 40000 0 0 0 title-A4.sym
T 44700 40700 9 10 1 0 0 0 1
RaspberryPi GPIO : LED and switches
T 44700 40400 9 10 1 0 0 0 1
Raspi_IO.sch
T 44800 40100 9 10 1 0 0 0 1
1
T 46300 40100 9 10 1 0 0 0 1
1
T 48500 40400 9 10 1 0 0 0 1
1.1 - 05/02/2015
T 48600 40100 9 10 1 0 0 0 1
Marc Durvaux
C 41000 47200 1 270 0 header26-1.sym
{
T 46400 46600 5 10 0 1 270 0 1
refdes=J?
T 45700 45600 5 10 0 0 270 0 1
device=HEADER26
}
C 47500 42000 1 90 0 switch-pushbutton-no-1.sym
{
T 47200 42400 5 10 0 1 90 0 1
refdes=S?
T 46900 42400 5 10 0 0 90 0 1
device=SWITCH_PUSHBUTTON_NO
}
C 44300 42900 1 270 0 led-1.sym
{
T 44900 42100 5 10 0 0 270 0 1
device=LED
T 44700 42100 5 10 0 1 270 0 1
refdes=LED?
T 45100 42100 5 10 0 0 270 0 1
symversion=0.1
T 44000 42600 5 10 1 1 0 0 1
value=Red
}
C 41600 43200 1 90 0 resistor-2.sym
{
T 41250 43600 5 10 0 0 90 0 1
device=RESISTOR
T 41300 43400 5 10 0 1 90 0 1
refdes=R?
T 41300 43700 5 10 1 1 180 0 1
value=510R
}
C 42800 42900 1 270 0 led-1.sym
{
T 43400 42100 5 10 0 0 270 0 1
device=LED
T 43200 42100 5 10 0 1 270 0 1
refdes=LED?
T 43600 42100 5 10 0 0 270 0 1
symversion=0.1
T 42300 42600 5 10 1 1 0 0 1
value=Yellow
}
C 41300 42900 1 270 0 led-1.sym
{
T 41900 42100 5 10 0 0 270 0 1
device=LED
T 41700 42100 5 10 0 1 270 0 1
refdes=LED?
T 42100 42100 5 10 0 0 270 0 1
symversion=0.1
T 40800 42600 5 10 1 1 0 0 1
value=Green
}
C 43100 43200 1 90 0 resistor-2.sym
{
T 42750 43600 5 10 0 0 90 0 1
device=RESISTOR
T 42800 43400 5 10 0 1 90 0 1
refdes=R?
T 42800 43700 5 10 1 1 180 0 1
value=510R
}
C 44600 43200 1 90 0 resistor-2.sym
{
T 44250 43600 5 10 0 0 90 0 1
device=RESISTOR
T 44300 43400 5 10 0 1 90 0 1
refdes=R?
T 44300 43700 5 10 1 1 180 0 1
value=510R
}
C 47600 43500 1 90 0 resistor-2.sym
{
T 47250 43900 5 10 0 0 90 0 1
device=RESISTOR
T 47300 43700 5 10 0 1 90 0 1
refdes=R?
T 47300 44000 5 10 1 1 180 0 1
value=16K
}
C 48700 43400 1 180 0 resistor-2.sym
{
T 48300 43050 5 10 0 0 180 0 1
device=RESISTOR
T 48500 43100 5 10 0 1 180 0 1
refdes=R?
T 48100 43500 5 10 1 1 0 0 1
value=1K3
}
N 41500 43200 41500 42900 4
N 43000 43200 43000 42900 4
N 44500 43200 44500 42900 4
N 47500 43500 47500 43000 4
N 47800 43300 47500 43300 4
N 41500 42000 41500 41700 4
N 41500 41700 47500 41700 4
N 43000 41700 43000 42000 4
N 47500 42000 47500 41700 4
N 44500 42000 44500 41700 4
N 47500 44400 47500 45000 4
N 44500 45000 47500 45000 4
N 43300 45000 41500 45000 4
N 41500 45000 41500 44100 4
N 43300 47200 43300 47500 4
N 43300 47500 40500 47500 4
N 40500 47500 40500 44600 4
N 43000 44100 43000 44600 4
N 43000 44600 40500 44600 4
T 47100 45100 9 10 1 0 0 0 1
3.3V
T 45500 41800 9 10 1 0 0 0 1
GND
N 44100 45800 44100 44600 4
N 44100 44600 44500 44600 4
N 44500 44600 44500 44100 4
N 49000 47500 49000 43300 4
N 49000 43300 48700 43300 4
N 44100 47500 49000 47500 4
N 44100 47200 44100 47500 4
N 46100 45800 46100 41700 4
N 44500 45800 44500 45000 4
N 43300 45000 43300 45800 4

View File

@ -0,0 +1,35 @@
Case mechanical design
======================
Notes
=====
- the mechanical design has been created using OpenSCAD
- the Raspberry Pi B Plus Mechanical Drawing is included for reference
Design files
============
The main design file is "myRaspiBp.scad". It is self-documented.
Through parametric configuration, one can generate either the bottom part or the top part
of the case, or both parts. A fit test can also be performed.
Use the file "myRaspBp_Button.scad" to create the push-button.
The design file include "shapes.scad" for common composite shape modules.
Manufacturing files
===================
STL files can be used directly for 3D printing.
The following files are available :
myRaspiBp_bottom.stl for the bottom part
myRaspiBp_top.stl for the top part
myRaspiBp_Button.stl for the push-button.

View File

@ -0,0 +1,251 @@
// raspberry pi model b+ case
//
// v 1.3 - 29/01/2015 - initial release + corrections (Marc Durvaux)
// v 1.4 - 06/02/2015 - reduced Z clearance, hole opening for audio connector (audio_y),
// added spacers on cover (MD)
// v 1.5 - 08/02/2015 - fine tuning of connector hole Z position
// v 1.7 - 10/02/2015 - fine tuning of holes, cutouts, spacers
//
// design control
test_fit = 0 ; // set to one for test fit
top_bottom = 1 ; // 0 = bottom only, 1 = top only, 2 = top & bottom
print = 1 ; // set to one for printing configuration
// parameters
$fn = 30 ;
tolerance = 0.50 ; //
wall_thickness = 3.00 ; // box wall thickness
rounding_radius = 5.00 ; // box external wall corner rounding radius
cover_thickness = 3.00 ; // box cover overall thickness at the edge
cover_inside_t = 2.00 ; // box cover material thickess
cover_overlap = 5.00 ; // cover edge overlap height
edge_thickness = 1.00 ; // cover edge thickness (reduction in wall thickness)
clearance_z = 2.00 ; // clearance on Z axis for daughter board
Top_spacer_r = 3.00 ; // radius of spacers on cover
// Raspberry Pi dimensions (from mechanical specs, when available)
// positions on PCB are from lower right corner (near power connector)
device_x = 85.00 ; // pcb size exluding protruding connectors
device_y = 56.00 ;
device_z = 16.80 ; // overall size, excluding bottom solders and USB connector top edge
riser_z = 2.00 ; // riser to cope with PCP bottom solders, located under PCB hole
riser_r = 2.50 ; // riser radius (PCB mask hole radius = 3.1)
hole_x1 = 3.50 ; // hole center x offset from PCB edge (uSD side)
hole_x2 = 58.00 + hole_x1 ; // hole center x offset from PCB edge (uSD side)
hole_y = 3.50 ; // hole center y offset from PCB edge
uSD_x = 2.70 ; // uSD card protrusion
uSD_w = 11.00 ; // uSD card width
uSD_y = device_y/2; // uSD center y offset
PWR_w = 8.00 ; // micro-USB power connector width
PWR_z = 3.00 ; // micro-USB power connector height over PCB
PWR_x = 10.60 ; // micro-USB power connector center X offset from PCB edge
PWRplug_w = 11.00 ; // micro-USB power plug width (used for outside wall stamping)
PWRplug_h = 8.00 ; // micro-USB power plug height (used for outside wall stamping)
PWRplug_d = 2.00 ; // micro-USB power plug outside wall stamping depth
//audio_y = 2.70 ; // audio connector protrusion (masked audio)
audio_y = 2*wall_thickness ; // open audio connector
audio_w = 5.80 ; // audio connector external diameter (width)
audio_z = 6.50 ; // audio connector height over PCB
audio_x = 53.50 ; // audio connector center X offset from PCB edge
hdmi_y = 1.00 ; // hdmi connector protrusion
hdmi_w = 15.00 ; // hdmi connector width
hdmi_z = 7.00 ; // hdmi connector height over PCB
hdmi_x = 32.00 ; // hdmi connector center X offset from PCB edge
Ether_x = 2.60 ; // Ethernet connector protrusion
Ether_w = 15.60 ; // Ethernet connector width
Ether_z = 15.00 ; // Ethernet connector height over PCB lower side
Ether_y = 10.25 ; // Ethernet connector center Y offset from PCB edge
USB_x = 2.60 ; // USB connectors protrusion
USB_w = 15.10 ; // USB connectors width
USB_z = 16.60 ; // USB connecotrs height over PCB
USBl_y = 29.00 ; // left USB connector center Y offset from PCB edge (near Ethernet connector)
USBr_y = 47.00 ; // right USB connector center Y offset from PCB edge
LedBtn_y = device_y - hole_y - 2.5 * 2.54 + tolerance ; // Y axis center position of LEDs and button(s)
R_Led_x = hole_x1 + 29 + 2.54 + tolerance ; // X axis center position of red LED
Y_Led_x = R_Led_x - 3 * 2.54 ; // X axis center position of yellow LED
G_Led_x = R_Led_x - 6 * 2.54 ; // X axis center position of green LED
Btn_x = R_Led_x + 4.5 * 2.54 ; // X axis center position of button
Led_r = 1.50 ; // LED radius + margin
Btn_r = 4.00 ; // push button radius
PCB_z = 12.00 ; // Daughter board top side to main PCB bottom side
// inside box dimension
in_x = device_x + uSD_x + USB_x + 2 * tolerance ;
in_y = device_y + 3 * tolerance ;
in_z = device_z + riser_z + clearance_z ;
in_r = rounding_radius - wall_thickness ;
pcb_top = riser_z + device_z - USB_z ; // the USB connector is the highest component
spacer_z = pcb_top + 2*tolerance ; // spacer on uSD side
// outside box dimension
box_x = in_x + 2 * wall_thickness ;
box_y = in_y + 2 * wall_thickness ;
box_z = in_z + wall_thickness ; // without cover
cover_z = cover_thickness + cover_overlap ; // box cover height
edge_offset = wall_thickness - edge_thickness ; // box cover edge offset
USB_sep = USBr_y - USBl_y - USB_w + tolerance ; // separation between USB connectors
mask_z = clearance_z - 2 * tolerance ; // USB connector mask, cover side
// cover spacer to hold PCB in place
USB_spacer = cover_thickness + clearance_z ;
Eth_spacer = cover_thickness + clearance_z + device_z - Ether_z - tolerance ;
Con_spacer_x = wall_thickness + uSD_x + (device_x + hole_x2) / 2 ; // USB and Ethernet connectors
PCB_spacer = cover_thickness + clearance_z + device_z - PCB_z - tolerance ;
PCB_spacer_x = wall_thickness + uSD_x + (G_Led_x + hole_x1) / 2 ;
// print dimensions for control
echo(box_x = box_x) ;
echo(box_y = box_y) ;
echo(box_z = box_z) ;
echo(cover_z = cover_z) ;
echo(in_x = in_x) ;
echo(in_y = in_y) ;
echo(in_z = in_z) ;
echo(G_Led_x = G_Led_x) ;
echo(USB_sep = USB_sep) ;
echo(cover_z = cover_z) ;
echo(USB_spacer = USB_spacer) ;
echo(Eth_spacer = Eth_spacer) ;
echo(Con_spacer_x = Con_spacer_x) ;
echo(PCB_spacer = PCB_spacer) ;
echo(PCB_spacer_x = PCB_spacer_x) ;
// create device
if (test_fit == 1) {
// test fit
box_bottom() ;
translate([0, 0, box_z - cover_overlap]) box_top() ;
} else {
if (top_bottom < 1) {
box_bottom() ;
} else {
if (print == 1) { translate([0, box_y, cover_z]) rotate([180,0,0]) box_top() ; }
else { box_top() ; }
if (top_bottom > 1) {
translate([0, -100, 0])
box_bottom() ;
}
}
}
// modules
include <shapes.scad>
module right_cutouts() { // position from PCB lower left corner
bezel = 4*PWRplug_d ; // to limit overhang angle for manufacturing
translate([ PWR_x - tolerance - PWR_w/2, 0, tolerance])
cube([ PWR_w + 2*tolerance, wall_thickness + tolerance, PWR_z + 4*tolerance]); // power
translate([PWR_x, 0, PWR_z/2 + 3*tolerance]) rotate ([-90, 0,0]) // stamping for power plug
truncated_square_pyramid(PWRplug_w + bezel,PWRplug_h + bezel,PWRplug_w,PWRplug_h,PWRplug_d) ;
translate([ hdmi_x - tolerance - hdmi_w/2, wall_thickness - hdmi_y -2*tolerance, 3*tolerance])
cube([ hdmi_w + 2*tolerance, hdmi_y + 3*tolerance, hdmi_z + tolerance]) ; // hdmi
translate([audio_x, wall_thickness + tolerance, audio_z - audio_w/2 + 2*tolerance]) {
rotate ([90, 0, 0]) cylinder(h = audio_y, r = audio_w/2 + 3*tolerance) ; } // audio
}
module back_cutouts() { // position on back side from PCB on Y axis
translate([0, USBl_y - USB_w/2, USB_z/2]) // upper-left USB
cube([wall_thickness +tolerance, USB_w +USB_sep, 2*USB_z]) ; // Z size large enough!
translate([0, USBr_y - USB_w/2, 0]) // lower-right USB
cube([wall_thickness +tolerance, USB_w + 3*tolerance, 2*USB_z]) ; // Z size large enough!
}
module box_bottom() {
difference () {
union() { // box + added structures
// basic box
difference(){
round_cube(box_x, box_y, box_z, rounding_radius) ;
translate([wall_thickness, wall_thickness, wall_thickness])
round_cube(in_x, in_y, in_z, in_r) ;
}
// add inside structure
translate([wall_thickness, wall_thickness, wall_thickness]) union() {
// add uSD side wall spacer
difference() {
cube([uSD_x, in_y, spacer_z]) ;
translate([0, uSD_y - uSD_w, 0])
cube([uSD_x, 2*uSD_w, spacer_z]) ;
}
// add PCB spacers
translate([uSD_x, 0, 0])
spacers(hole_x1 + tolerance, hole_x2 + tolerance,
hole_y + tolerance, device_y - hole_y + tolerance,
riser_r, riser_z) ;
}
}
// substract cutouts
union() {
translate([wall_thickness + uSD_x, 0, wall_thickness + pcb_top])
right_cutouts() ;
translate([box_x - wall_thickness, wall_thickness, wall_thickness + pcb_top + 3*tolerance])
back_cutouts() ;
translate([edge_offset, edge_offset, box_z - cover_overlap])
round_cube(box_x - 2*edge_offset, box_y - 2*edge_offset, cover_overlap,
rounding_radius - edge_offset) ;
}
}
}
module box_top() {
difference () {
union() {
// basic cover
difference(){
round_cube(box_x, box_y, cover_z, rounding_radius) ;
union() {
translate([wall_thickness, wall_thickness, 0])
round_cube(in_x, in_y, cover_z - cover_inside_t, in_r) ;
translate([0, 0, 0])
round_belt(box_x, box_y, cover_overlap, rounding_radius, edge_offset) ;
// USB connector cut-out
translate([box_x - wall_thickness, wall_thickness + USBl_y - USB_w/2, 0])
cube([wall_thickness, USBr_y - USBl_y + tolerance, cover_overlap]) ;
}
}
// add connector covers
translate([box_x - wall_thickness, wall_thickness, cover_overlap])
//translate([box_x - wall_thickness, wall_thickness, 0])
union() {
translate([0, USBl_y - USB_w/2 + 0.5*tolerance, -mask_z])
cube([wall_thickness, USBr_y - USBl_y + USB_w + tolerance, mask_z]) ;
translate([0, USBl_y + USB_w/2 + tolerance, -(mask_z + USB_z/2) + 1.5*tolerance])
cube([wall_thickness, USB_sep + USB_w + 0.5*tolerance, mask_z + USB_z/2]) ;
}
// add spacers
translate([Con_spacer_x, wall_thickness + Ether_y, cover_z - Eth_spacer])
cylinder(h = Eth_spacer, r = Top_spacer_r) ;
translate([Con_spacer_x, wall_thickness + USBr_y, cover_z - USB_spacer])
cylinder(h = USB_spacer, r = Top_spacer_r) ;
translate([PCB_spacer_x, wall_thickness + LedBtn_y, cover_z - PCB_spacer])
cylinder(h = PCB_spacer, r = Top_spacer_r) ;
}
// substract cutouts (holes for LEDs and push-button)
translate([wall_thickness + uSD_x, wall_thickness, 0]) union() {
translate([G_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([Y_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([R_Led_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Led_r + tolerance) ;
translate([Btn_x, LedBtn_y, 0])
cylinder(h = cover_z, r = Btn_r + tolerance/2) ;
}
}
}
// --- end of file ---

View File

@ -0,0 +1,45 @@
// raspberry pi model b+ case top button
//
// v 1.2 - 06/02/2015 - initial release (MD)
//
// parameters
$fn = 50 ;
// parameters copied from myRaspiBp.scad
cover_inside_t = 2.00 ; // box cover material thickess
clearance_z = 2.00 ; // clearance on Z axis for daughter board
Btn_r = 4.00 ; // push button radius
foot_z = 2.00 ; // foot thickness
// specific parameters
Btn_protrusion = 2.00 ;
Btn_foot_r_extension = 1.50 ;
Btn_top_rounding = 8 ;
// derived parameters
z_size = cover_inside_t + clearance_z + Btn_protrusion ; // button z dimension
foot_r = Btn_r + Btn_foot_r_extension ; // button foot radius
// modules
include <shapes.scad>
// create device
union() {
cylinder(h= foot_z, r= foot_r) ;
difference() {
translate([0, 0, z_size - Btn_top_rounding])
intersection() {
cylinder(h = Btn_top_rounding, r = Btn_r) ;
halfsphere (Btn_top_rounding) ;
}
translate([0, 0, -foot_r/2])
cube( size = [2*foot_r, 2*foot_r, foot_r], center=true) ;
}
}
// --- end of file ---

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
// Advanced shapes
//
// v 1.0 - 24/01/2015 - initial release (MD)
// v 1.1 - 05/02/2014 - added half-sphere (MD)
//
module round_cube(x,y,z,r) {
hull() {
translate([r, r, 0]) cylinder(h = z, r = r) ;
translate([r, y - r, 0]) cylinder(h = z, r = r) ;
translate([x - r, r, 0]) cylinder(h = z, r = r) ;
translate([x - r, y - r, 0]) cylinder(h = z, r = r) ;
}
}
module round_belt(x,y,z,r,t) {
// x, y, z, r are outer dimensions, thickness t is inwards
difference() {
round_cube(x, y, z, r) ;
translate([t, t, 0]) round_cube(x-2*t, y-2*t, z, r-t) ;
}
}
module spacers(x1,x2,y1,y2,z,r) {
translate([x1, y1, 0]) cylinder(h = z, r = r) ;
translate([x1, y2, 0]) cylinder(h = z, r = r) ;
translate([x2, y1, 0]) cylinder(h = z, r = r) ;
translate([x2, y2, 0]) cylinder(h = z, r = r) ;
}
module truncated_square_pyramid(x1,y1,x2,y2,z) {
dx = (x1-x2)/2 ;
dy = (y1-y2)/2 ;
ax = 90 - atan2(z, dx) ;
ay = 90 - atan2(z, dy) ;
difference() {
translate([0, 0, z/2]) cube(size=[x1,y1,z], center=true) ;
union() {
translate([-x1/2, 0, 0]) rotate([0, ax, 0])
translate([-x1/2, 0, z]) cube(size=[x1,y1,2*z], center=true) ;
translate([ x1/2, 0, 0]) rotate([0, -ax, 0])
translate([ x1/2, 0, z]) cube(size=[x1,y1,2*z], center=true) ;
translate([0, -y1/2, 0]) rotate([-ay, 0, 0])
translate([0, -y1/2, z]) cube(size=[x1,y1,2*z], center=true) ;
translate([0, y1/2, 0]) rotate([ ay, 0, 0])
translate([0, y1/2, z]) cube(size=[x1,y1,2*z], center=true) ;
}
}
}
module halfsphere( r) {
difference() {
sphere (r = r) ;
translate([0, 0, -r/2])
cube(size=[2*r, 2*r, r], center=true) ;
}
}
// --- end of file ---