MAKING THE FAB ISP

Tasks:

☑ Mill in-circuit programmer Fab ISP
☑ Source the components from FabLab inventory
☑ Solder components to the PCB
☑ Download and set up the programming environment for programming the new programmer.
☑ Program the new programmer with some old programmer i.e. other FabISP or some commercial version like Dragon or Atmel-ICE. (optional)

Group Assignment

On this week group assignment we explore specifications of the PCB production process in Aalto fablab specifically accuracy of our SRM-20 milling machine using 0.4mm milling bits. Link to this weeks experiment we did with Kitja and Ranjit : Group assignment

SORTING OUT OUR SETUP


In our fablab we use windows computer to talk to our Roland MDX-20 when we use this cnc machine for other operations than making Pcbs. The machine id connected using a coupled USB-RS232-Serial cable. This cable combination works great with Windows but creats a problem with data transfer between the computer and the MDX-20 when the g-code or the Roland version of the code is send through Fab Modules.
A separate Ubuntu partition was needed to be installed and an original serial-to-usb cable has to be used to send the code from fabmodules.

The USB-RS232-Serial cable that is used in the Lab with Windows

Original roland serial to usb cable

I switched to the mod_server directory in terminal and ran the modules:

node mod_server.js

The server started and began listening for connections from 127.0.0.1 on 12345.

Next, I cleaned up the MDX-20’s buildplate and lasercut a new MDF spoilboard. I placed the board and use a 6mm tool to surface mill the board.

6mm for surface milling with Allen key to change the bit


I also know from expirience that the machine's bed might not be completely on a flate so I wanted to serface mill the spoilboard to level everything with respect to the machines spindle.


Surface milled MDF mess

Our machine is physically ready!

From the Fab Modules website, I uploaded a .png file, selected .rml as the output format and PCB traces (1/64) for the process. From there, I could choose the MDX-20 from the machine dropdown and try sending a command.

I first wanted to try moving the spindle to x0 = 20, y0 = 20, z0 = 0. Sending the command with xyz0 threw the following error:

error: /bin/sh: 1: mod_serial.py: not founding

As described in the Fab Modules troubleshooting documentation, I checked that mod_serial.py was in the same folder as mod_server.js and prefixed the send command with ./

alive!

FAB MODULES

Milling the PCB

Fab community offered variety of the FabISP designs to choose from. The evolution of the designs is by itself very interesting. I started with the one based on Dick Streefland's USBTiny FabTinyISP.

First I downloaded the files i.e. design that was available That included the traces and outline -files. Then I generated the milling files from .PNG pictures using Fab Modules. Software written by Neil. In Fab Modules, milling machine spesific settings has to be selected.

Fab modules setup Fab modules setup with the MDX-20

The cut depth field (6) setting in the above picture was set to be 0.15mm which is deep enought to remove all the unwanted copper.
Number 8 defines how much copper is removed next to a wire. If it is set to 1 the mill bit will only make one pass, if the setting is for example 4, the bit will run four parallel rounds I found setting 5 rounds will give proper distance with out compromissing the thinest areas and being more suitable to solder in the next step.
Setting number 9 defines how much these parallel runs go on top of each other. If you use a V-shaped drill, Some good overlap like 50-75% is good, so that all the copper is removed. Select the starting position (5) for the starting cordinates. After defining all the settings press the "calculate"-button. After calculation, press the "save"-button to save generated milling file. When all is set and zero the tool (Z) press send.

Fab modules setup Fab modules setup with the MDX-20

Milling the PCB


For milling the tracing I used the 1/64” bit.I fixed the one sided FR4 Board and zerowed the X,y and Z axis from V panel. After that I outputted the .rml file that I generated using mods.

Milling the traces with 1/64” endmill

Similar procedure to the tracing, For milling out the outline I used the 1/32” bit.zerowed the Z axis and kept the same the X,y position from thje tracing operation. After that I outputted the .rml file that I generated using mods.

Notice from the picture below the boarders on the left picture, the tracing and the cut out were not aligned properly. That was caused because the double sided tape I used behind the board and the sacrificial board was lose which usually happens if the Surface milling on the MDF is not smooth and clean from any dust and small mdf particles....Make sure the bed is total clean before appliying the tape. On the right, the final board with all the Traces cut cleanly, with no issues.


COMPONENT STUFFING


Hello ISP 44 schematic: http://academy.cba.mit.edu/classes/embedded_programming/hello.ISP.44.png

Qty. Component Marking(s)
1 ATtiny44 ICt44
1 6-Pin Header J1 ISP
1 USB Mini-B SMD Connector J2 USB
1 Crystal 20 MHz 20 MHz
1 Capacitor 1uF C1
2 Capacitor 10pF C2, C3
2 Diode Zener 3.3V D1, D2
1 Resistor 1k ohm R1
1 Resistor 499 ohm R2
2 Resistor 100 ohm R3, R4
1 Resistor 10k ohm R5
1 Resistor 0 ohm SJ2


Bill of materials (BOM) *SJ1 is a solder jumper - bridge with solder

Fab modules setup BOM print out help me pick up the components

Soldering Process

Mini USB Header
  • Solder the mini USB header first.

    This is the most difficult part.

  • J2 USB is the mini USB header
  • Solder with a blob, then wick solder away with desoldering braid.
Microcontroller
  • Solder the microcontroller second.
  • "IC1 t44" in the diagram is an attiny44a chip.
  • There is a little circle on the chip that should be facing to the top left if your board is oriented in the same direction as Neil's diagram.
Crystal
  • Marked as "20 MHz" on board diagram.
  • Tin the pads first, then place the component on top.
  • Hold component down with tweezers, the reflow solder at either end.

NOTE: crystals do not have polarity, orientation does not matter.

Diodes (warning)
  • Diodes have polarity the "C" or cathode end is marked with a tiny line.
  • Place the side with the line on it over the "C" side pad in the diagram.
  • You may need a magnifing glass.

NOTE: it is helpful to solder the 1K resistor first, otherwise it is hard to get to after you have soldered the diodes.

Resistors

NOTE: resistors do not have polarity, orientation does not matter.

Diagram-----Component Value-----Part

  • R1-----1 K ohm -----1001
  • R2-----499 ohm -----4990
  • R3-----100 ohm -----1000
  • R4-----100 ohm -----1000
  • R5-----10k ohm -----1002
Capacitors
  • Components marked with a "C" (C1, C2, etc) are capacitors.
  • Capacitors are not marked, be careful not to mix them up.

    NOTE: </span> capacitors do not have polarity, orientation does not matter.

Diagram-----Component Value-----Part

  • C1-----1 uf -----
  • C2-----10 pf -----
  • C3-----10 pf -----
Jumpers
  • The components marked SJ1 and SJ2 are solder jumpers.
  • SJ1 can be bridged with solder.
  • Put a 0 ohm resistor over SJ2 on this board
6 pin programming header
  • The components marked J1 ISP is the 6 pin programming header.
  • Orientation does not matter.
  • The board with all components mounted with shiny solder joints

    I then connected the board to the usb hub. Smoke test went without a hitch! That is great. I your computer shuts down or complains about too much power drain, check for a loss connection on the soldering.

    PROGRAMMING THE ISP


    We had an Adafruit AVR Programmer kit in the Lab, it wasn’t built up, so I started putting it together. I completed the assembly.
    I connected the new FAbISP board to the programmer. The programmer LED turn Green a good sign that it correctly assumes that there is a new chip connected

    ErrorError sign shows that there is a problem with the board. I unplugged the board and look for cold joints. And I found that the Attiny board Vcc was not even soldered! Done that Plugged it back! and It is alive.

    To send the Makefile to the FabISP, I first needed to install an AVRprogramming application. I’m running Mac OS, so I chose Crosspack AVR .

    The list of supported devices is amazing

    I downloaded the FabISP Firmware from the Fab Academy documentation, I didn't have to edit the programmer configuration in the Makefile as the Adafruit AVR Programmer is already set as the programming unit

    AVRDUDE = avrdude -c avrisp2 -P usb -p $(DEVICE) # edit this line for your programmer
    

    Now to compile the firmware:

    cd Downloads/fabISP_mac.0.8.2_firmware
    make clean
    

    A positive response should be:

    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
    

    Make Hex:

    make hex
    

    Next, set the fuses so the board will use the external crystal:Make fuse

    make fuse
    

    Response:

    avrdude -c stk500v1 -b19200 -P /dev/tty.usbmodem1411 -p attiny44 -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m
    
    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14
    
    avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
    avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
    avrdude: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.
    
    avrdude: stk500_disable(): unknown response=0x12
    
    avrdude done.  Thank you.
    
    make: *** [fuse] Error 1
    

    Oh dear. At this point, I inspected the board closely for cold joints or visible shorts and realised I hadn’t soldered the pins on the back of the USB header at all! I also had a 4.99 Ohm resistor in place of the 499 Ohm resistor. Lesson learned: don’t trust that resistors have been put in the correct draw in the component tower - always check the component markings.

    With those problems fixed, I attempted to set the fuses again (this time using sudo to run my command):

    sudo make fuse
    

    Still I had the same error message, even after checking carefully for shorts with a multimeter, so I abandoned the Arduino and tried using a FabISP made by Ali Neissi .

    I changed the programmer config to:

    AVRDUDE = avrdude -c usbtiny -p $(DEVICE)
    

    Then ran:

    sudo make fuse
    

    Response:

    avrdude -c usbtiny -p attiny44  -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.00s
    
    avrdude: Device signature = 0x1e9207
    avrdude: reading input file "0xDF"
    avrdude: writing hfuse (1 bytes):
    
    Writing | ################################################## | 100% 0.00s
    
    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.00s
    
    avrdude: verifying ...
    avrdude: 1 bytes of hfuse verified
    avrdude: reading input file "0xFF"
    avrdude: writing lfuse (1 bytes):
    
    Writing | ################################################## | 100% 0.00s
    
    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.00s
    
    avrdude: verifying ...
    avrdude: 1 bytes of lfuse verified
    
    avrdude: safemode: Fuses OK (H:FF, E:DF, L:FF)
    
    avrdude done.  Thank you.
    

    That’s more like it!

    sudo make program
    

    Response:

    avrdude -c usbtiny -p attiny44  -U flash:w:main.hex:i
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.00s
    
    avrdude: Device signature = 0x1e9207
    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 (2002 bytes):
    
    Writing | ################################################## | 100% 1.96s
    
    avrdude: 2002 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 2002 bytes
    avrdude: reading on-chip flash data:
    
    Reading | ################################################## | 100% 2.32s
    
    avrdude: verifying ...
    avrdude: 2002 bytes of flash verified
    
    avrdude: safemode: Fuses OK (H:FF, E:DF, L:FF)
    
    avrdude done.  Thank you.
    
    avrdude -c usbtiny -p attiny44  -U hfuse:w:0xDF:m -U lfuse:w:0xFF:m
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.00s
    
    avrdude: Device signature = 0x1e9207
    avrdude: reading input file "0xDF"
    avrdude: writing hfuse (1 bytes):
    
    Writing | ################################################## | 100% 0.00s
    
    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.00s
    
    avrdude: verifying ...
    avrdude: 1 bytes of hfuse verified
    avrdude: reading input file "0xFF"
    avrdude: writing lfuse (1 bytes):
    
    Writing | ################################################## | 100% 0.00s
    
    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.00s
    
    avrdude: verifying ...
    avrdude: 1 bytes of lfuse verified
    
    avrdude: safemode: Fuses OK (H:FF, E:DF, L:FF)
    
    avrdude done.  Thank you.
    

    Yiiihewwww! With that, I verified that the FabISP was identified correctly.

    The FabISP making friends with my Macbook

    All good! Finally I desoldered jumpers SJ1 and SJ2, then went for a beer!


    The second board

    Fab community offers multiple of designs of the Fab-ISP from where to choose. I wanted to make the one made by Brian called FabTinyISP as it has a dirrect USB support.

    First I downloaded the files i.e. design that was available That included the traces and outline -files. Then I generated the milling files from .PNG pictures using Fab Modules. Software written by Neil. In Fab Modules, milling machine spesifications were the same as I described earlier. This was very good exercise and I have learned a lot and have so much fun!

    Files

    FabISP Traces (14kB) - hello-ISP44_traces.png
    FabISP Cutout (12kB) - hello-ISP44_interior.png

    Links

    Fab Academy 2016 - Electronics Production
    FabISP Programming Tutorial - FabISP: Programming
    FabISP Troubleshooting - FabISP: Electronics Production

WHOIS

Solomon is an Engineer, Designer and Lab Manager
at Aalto Fablab in Helsinki, Finland