5. Electronic Production

1. Assignment && week workflow planning

  • Group

characterize the design rules for your PCB production process

  • Individual

make an in-circuit programmer by milling and stuffing the PCB, test it, then optionally try other PCB processes

2. How i did it

2.0 HeroShot of the week

Testing_04

Testing_04

2.1 My working progress

  • Characterize the design rules

groupLink

My group assignment actually is also my individual assignment, as our lab has only me as Fab 2020 student :) Anyway let me get started

Luckily it is not too difficult for me to understand roughly about a PCB production process, as i’m working at Seeed(which Neil also introduced as a board house. Well not exactly accurate definition of the entire business but we do have this business unit). We have an 43 pages DFM handbook, online(Also hardcopy available) available, also translated to different languages other than English, Japanese, French, German, Russian, Portuguese, etc.

GroupAssignment_03
GroupAssignment_01
GroupAssignment_02

Find the SeeedFusion_DFM here.

GroupAssignment_12

The usual way we do mass production of PCB, not using milling machines but etching machines. The process looks like following(in short) -
Design files ready -> Check the design -> Film -> film on FR4(inner layer) -> etching -> Film strip -> inspection -> PP & other layers(outter layers) -> repeat from Film step to strip step -> drilling -> plating -> Inspection.

However from Fab Academy i’m not following the above process, as i’m doing only several boards instead of mass production. I’m using a milling machine instead.

I was using a made-in-China milling machine “JINGYAN”. It reads G code. The CAM software also comes with the machine “CopperCAM”.

GroupAssignment_04

The tools that in the lab we had

GroupAssignment_05

Thickness of the copper board : 1.6mm, which means the maximum cutting depth should be no more than 1.6mm - below are the parameters set to the Mods.

Mods_parameter

The design rules will be: having a design file ready, go to CopperCAM, and generate Gcodes. Then adjusting the milling machine, by making the Copper board stays flat, Selecting the machining tools, checking the focus, zeroing the tool, everything ready and start milling the different layers with changing tools in the between.

  • Eagle

Got 2 files from my local instructor, designed originally by Neil.
One was .brd while another it was .sch. To my understanding the .sch was the schematic while another was the layout

Eagle_01
Eagle_02
Eagle_03

By click the ‘manufacturing’ button on upper right corner i will be able to export this layout to a gerber file, by clicking the ‘CAM’ button. The gerber file will include all the layers that needed to be manufactured - Top Copper, Bottom Copper, etc.

Eagle_04
Eagle_05

Now i have all the gerber files ready. Copying the gerber files to an USB Drive and then i carried it to another step.

  • CAM_CopperCAM

The CAM software i was using was not Mods or Fabmodule, but using gerber files and use CopperCAM as the CAM software.

Animate the final board looks by selecting different tools

GroupAssignment_06
CAM_01

The CAM tool can generate and export Gcode for milling

GroupAssignment_07

  • Milling Machine
    Tools
    0.1mm concial20 degree for milling the trace, 0.2mm 20 degree
    1mm For cutting the edge

Zeroing, 29.5cm,
Focus,

Milling_02
Milling_03
Milling_05

Start milling

Milling_06

  • Soldering

Picking the materials i would be using, the list of parts i would be using and getting soldering iron, solder wire and flux ready start soldering.

Solder_01

It took me one hour to solder and finally done. Checked with multimeter and there were no open circuits or short circuits which was perfect.

Solder_02

I was not using another FabISP board but instead an Arduino as the programmer.

Arduino_03

CD into the source code directory and run

Edited the makefile

Testing_01
Testing_02
Testing_03

Running the programming tutorials and it was all successful!

make clean
maker hex
make fuse
make program
➜  fabISP_mac.0.8.2_firmware make clean
rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s
➜  fabISP_mac.0.8.2_firmware make hex
avr-gcc -Wall -Os -DF_CPU=20000000  -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/usbdrv.c -o usbdrv/usbdrv.o
avr-gcc -Wall -Os -DF_CPU=20000000  -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -x assembler-with-cpp -c usbdrv/usbdrvasm.S -o usbdrv/usbdrvasm.o
avr-gcc -Wall -Os -DF_CPU=20000000  -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c usbdrv/oddebug.c -o usbdrv/oddebug.o
avr-gcc -Wall -Os -DF_CPU=20000000  -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -c main.c -o main.o
main.c:88:13: warning: always_inline function might not be inlinable [-Wattributes]
 static void delay ( void )
             ^~~~~
avr-gcc -Wall -Os -DF_CPU=20000000  -Iusbdrv -I. -DDEBUG_LEVEL=0 -mmcu=attiny44 -o main.elf usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o
rm -f main.hex main.eep.hex
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
avr-size main.hex
   text    data     bss     dec     hex filename
      0    1968       0    1968     7b0 main.hex
➜  fabISP_mac.0.8.2_firmware make fuse
avrdude -c stk500v1 -b19200 -P /dev/cu.usbmodem14401 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9207 (probably t44)
avrdude: reading input file "0xDF"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDF:
avrdude: load data hfuse data from input file 0xDF:
avrdude: input file 0xDF contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF)

avrdude done.  Thank you.

➜  fabISP_mac.0.8.2_firmware make program
avrdude -c stk500v1 -b19200 -P /dev/cu.usbmodem14401 -p attiny44 -U flash:w:main.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9207 (probably t44)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: writing flash (1968 bytes):

Writing | ################################################## | 100% 2.80s

avrdude: 1968 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 1968 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.40s

avrdude: verifying ...
avrdude: 1968 bytes of flash verified

avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF)

avrdude done.  Thank you.

avrdude -c stk500v1 -b19200 -P /dev/cu.usbmodem14401 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9207 (probably t44)
avrdude: reading input file "0xDF"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xDF:
avrdude: load data hfuse data from input file 0xDF:
avrdude: input file 0xDF contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude: safemode: Fuses OK (E:FF, H:DF, L:FF)

avrdude done.  Thank you.

Testing_04
Testing_04

3. Problems Occurred & Solutions

3.1 I broke 2 tools during the process

  • When i was adjusting the Zeroing, i forgot to snap the negative side to the tool. The tool touched the hard surface and with nonstop then trying to go deeper - And it broke.

3.2 How to tell the orientation of the diodes?

  • The zener diodes are marked, both in the drawing and on the packages, with a line on the cathode side.

5. Design Files