
terjeio
-
Content Count
145 -
Joined
-
Last visited
-
Days Won
27
Reputation Activity
-
terjeio got a reaction from greeeg in What are you doing right now..?
@@timotet - nice result from isolation milling.
The first machine I made is a fairly standard CNC mill, ballscrews, linear rails & steppers, using Mach3 and Vectric Cut2D & VCarve in the toolchain. The design was inspired by Neo7CNCs machines. This is my main workhorse and vital for my projects. It is mainly used for milling aluminium parts and drilling/milling PCBs.
The PCB printer was inspired by a youtube video "PCB Laserprinter Version 2" by "Hobby Elektronik" - he has not published any design details so I had to start from the information provided in the video.
The reason for doing this was that toner transfer did not work for me, and I think isolation milling not well suited for SMD components (IMO). I could have used my main mill by adding a laser to it - but it has a fairly heavy gantry/Z-assembly so not well suited for high speed laser "printing".
The "printer" is designed for PCBs up to Eurocard size (100 x 160 mm) and has a moving table mounted on a THK KR33A actuator. The laser sledge is from an old 3.5" disc drive - I thought I needed to control the focus so I choose that because the assemby contains a small stepper. This is not needed in practice - once the focus it set I have found there is no need to adjust it.
I am using GT2 belt for the X-axis, combined with 17 teeth pulleys and microstepping gives it a mechanical resolution of 1196 dpi - very close to the standard 1200 dpi.
The software renders bmp images directly (no conversion to G-code) so it is "pixel perfect". The PCB outline on the board above is only 5 pixels wide - a tad over 0.1mm, not bad I think. It is my first attempt at double sided printing - this was not my initial design goal so I need to add some way of achieving layer alignment. Since the table has well defined inside edges I think I can utilize that. What I will try is to mill the board slightly oversized so it aligns perfectly with the home position of the laser when I turn it. A complicating factor is that I have to accelerate the laser to max speed before I start exposing the PCB - this to ensure I do not overexpose the board on the edges.
-
terjeio reacted to timotet in What are you doing right now..?
This looks awesome @@terjeio. I really like diy CNC machines and would like to see your machine.
I've machined a couple of 2 sided pcb's and had good luck re-aligning the 2nd side.
When I layout the pcb I put in mounting holes for a small fixture I made. Then I bolt the pcb
to the fixture run the 1st side, pull the fixture out flip the boad and reload the fixture. It works
pretty well.
1st side
2nd side through holes line up pretty well!
finished!
heres a shot of my robot
thanks for posting your project, you've got me thinking about putting a laser on my printer.
-
terjeio got a reaction from timotet in What are you doing right now..?
LQFP-64, 0.25mm tracks - PCB outline is around 0.1mm. Now, if I only can figure out a good way to align layers then prototyping double sided boards should be within reach.
Since KiCAD is open source it should be possible add code to plot directly to the board - after a quick glance through the sources this seems doable...
To build the "printer" one needs a CNC mill/router to make the parts (and drill the pcbs), so maybe it is a bit too demanding to post as a project?
-
terjeio got a reaction from timotet in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from PTB in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from bluehash in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from cubeberg in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from tripwire in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from Fred in What are you doing right now..?
Making my first PCB using KiCAD, switching over from ZenitPCB. Next I am going make a prototype board with a LQFP-64 (TM4C123), will push my homemade PCB "printer" to its limits (its inherent resolution is 1200dpi).
PCB "printer" in action - a blu-ray laser (100mW), two steppers controlled by MSP430 and main rendering program written i C# for Windows.
First PCB authored in KiCad - laminator is no good, and I am having some problems with dust. I am using Riston film - maybe better to use presensitized boards...
-
terjeio got a reaction from tripwire in What are you doing right now..?
Preamp / Multimedia-center featuring:
Raspberry Pi running OSMC, will add a MSP430 for power control.
My preamp modified for I2C control - I2C implemented in a MSP430G2553.
My RC5 remote, based on a MSP430G2312.
Tiva C as main controller: 320x240 LCD panel, old stepper motor as volume control & navigator (via QEI)
Keystone DAB (on a Monkeyboard) - awaiting delivery, I assume this will be the most tricky part to program for.
Prototyping:
Previous design in background, new design in front :
-
terjeio reacted to RobG in Graphics Library for MSP432
MSP432 version of my Universal Graphics Library.
Works with my latest Color LCD BoosterPacks, 2.2" and 2.4" (320x240)
Touch support will be added in late April.
ugl432.zip
-
terjeio got a reaction from RobG in What are you doing right now..?
Monkeyboard arrived, driver and grahics library working - but still some hiccups in main code to be ironed out...
Current version in action:
I may publish the graphics library and Monkeyboard driver if any are interested.
-
terjeio got a reaction from RobG in What are you doing right now..?
While waiting for the Monkeyboard I have been busy porting the Keystone driver and writing a graphics library:
I have chosen to write my own graphics library that, shock horror, uses the heap for storing the widget descriptors.
It is fully event driven and currently has support for Canvas, Frame, Button, List and Listelement widgets and stands on top of RobGs LCD driver.
It integrates nicely with remote control and the stepper navigator, and I suspect it should work with a touch driver as well.
So far so good - I hope my code will work together with the Monkeyboard when it arrives...
Terje
-
terjeio got a reaction from RobG in What are you doing right now..?
Preamp / Multimedia-center featuring:
Raspberry Pi running OSMC, will add a MSP430 for power control.
My preamp modified for I2C control - I2C implemented in a MSP430G2553.
My RC5 remote, based on a MSP430G2312.
Tiva C as main controller: 320x240 LCD panel, old stepper motor as volume control & navigator (via QEI)
Keystone DAB (on a Monkeyboard) - awaiting delivery, I assume this will be the most tricky part to program for.
Prototyping:
Previous design in background, new design in front :
-
terjeio got a reaction from bluehash in What are you doing right now..?
Monkeyboard arrived, driver and grahics library working - but still some hiccups in main code to be ironed out...
Current version in action:
I may publish the graphics library and Monkeyboard driver if any are interested.
-
terjeio got a reaction from bluehash in I2C OLED Display from Ebay - only random Pixels
Strange, when I converted a driver for SH1106 I found it was (nearly?) impossible to get anything to display unless it was initialized correctly.
Check that the initialization sequence is exactly the same as used in the Arduino library, if different then that might be the reason.
Be aware that it is not easy to differentiate between SH1106 and SSD1306 displays from their physical apperance, the one I got also uses I2C address 0x3C.
Their initialization sequences are incompatible, at least the SSD1206 sequence does not work for SH1106.
-
terjeio got a reaction from bluehash in More fonts for RobGs Color LCD graphics library
While searching for a font creator I found an interesting one here: http://www.mikrocontroller.net/topic/99701#865331
It creates fontdata that are bit aligned so was a bit tricky to render but I have managed to create code that does that.
By default it generates proportional fonts (from True Type) and also includes the top bit set characters that I need for my radio library.
So, here is my initial code for rendering fonts generated by this utility - please note it is cannot handle fonts higher than 24 pixes.
Add as font.h or to graphics.h:
#include <stdbool.h> typedef struct Font { // common shared fields uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; uint8_t font_Width_in_Pixel_for_fixed_drawing; uint8_t font_Height_in_Pixel_for_all_Characters; uint8_t font_Bits_per_Pixels; // if MSB are set then font is a compressed font uint8_t font_First_Char; uint8_t font_Last_Char; uint8_t font_Char_Widths[1]; // size dependent on number of glyphs uint8_t font_data[]; // bit field of all characters } Font; uint8_t getFontWidth (Font *font); uint8_t getFontHeight (Font *font); inline uint8_t getCharWidth (Font *font, unsigned char c); uint16_t getStringWidth (Font *font, unsigned char *string); uint8_t drawFontChar (Font *font, uint16_t x, uint16_t y, unsigned char c, bool opaque); void drawFontString (Font *font, uint16_t x, uint16_t y, unsigned char *string, bool opaque); Add to graphics.c - also include font.h if code above not added to graphics.h :
static uint16_t getoffset (Font *font, unsigned char c) { uint16_t offset = 0; if(c > font->font_First_Char) { c -= font->font_First_Char; while(c--) { offset += font->font_Char_Widths[c]; }; } return offset; } uint8_t getFontWidth (Font *font) { return font->font_Width_in_Pixel_for_fixed_drawing; } uint8_t getFontHeight (Font *font) { return font->font_Height_in_Pixel_for_all_Characters; } uint8_t getCharWidth (Font *font, unsigned char c) { return c != ' ' && (c < font->font_First_Char || c > font->font_Last_Char) ? 0 : ((c == ' ' || font->font_Char_Widths[c - font->font_First_Char] == 0 ? font->font_Width_in_Pixel_for_fixed_drawing / 4 : font->font_Char_Widths[c - font->font_First_Char]) + 2); } uint16_t getStringWidth (Font *font, unsigned char *string) { unsigned char c; uint16_t width = 0; while((c = *string++)) { width += getCharWidth(font, c); } return width; } uint8_t drawFontChar (Font *font, uint16_t x, uint16_t y, unsigned char c, bool opaque) { uint8_t width = getCharWidth(font, c); uint32_t row, column, bitOffset, dataIndex, preShift, pixels; bool paintSpace; unsigned char *fontData = font->font_Char_Widths + font->font_Last_Char - font->font_First_Char + 1; if(width) { bitOffset = getoffset(font, c) * font->font_Height_in_Pixel_for_all_Characters; dataIndex = bitOffset >> 3; preShift = bitOffset - (dataIndex << 3); column = width; width -= 2; paintSpace = c == ' ' || !font->font_Char_Widths[c - font->font_First_Char]; if(!paintSpace || opaque) { x += column; while(column--) { row = font->font_Height_in_Pixel_for_all_Characters; if(!((column == 0) || (column > width)) && !paintSpace) { pixels = *((uint32_t *)&fontData[dataIndex]) >> preShift; while(row--) { if(pixels & 0x01) { setArea(x - column, y - row, x - column, y - row); writeData(colorHighByte); writeData(colorLowByte); } else if(opaque) { setArea(x - column, y - row, x - column, y - row); writeData(bgColorHighByte); writeData(bgColorLowByte); } pixels >>= 1; } bitOffset += font->font_Height_in_Pixel_for_all_Characters; dataIndex = bitOffset >> 3; preShift = bitOffset - (dataIndex << 3); } else if(opaque) { while(row--) { setArea(x - column, y - row, x - column, y - row); writeData(bgColorHighByte); writeData(bgColorLowByte); } } } } } return width == 0 ? 0 : width + 2; } void drawFontString (Font *font, uint16_t x, uint16_t y, unsigned char *string, bool opaque) { uint32_t xs = x; unsigned char c; while((c = *string++)) { xs += drawFontChar(font, xs, y, c, opaque); } } The font files has to be modified slightly before they can be used - it should be quite obvious what to remove.
Example:
drawFontString((Font *)pixelmix, 5, 100, "The lazy fox...", false); There are room for optimizations, but I'll leave that for later - my primary goal is to get the DAB project on air.
Terje
-
terjeio got a reaction from RobG in More fonts for RobGs Color LCD graphics library
While searching for a font creator I found an interesting one here: http://www.mikrocontroller.net/topic/99701#865331
It creates fontdata that are bit aligned so was a bit tricky to render but I have managed to create code that does that.
By default it generates proportional fonts (from True Type) and also includes the top bit set characters that I need for my radio library.
So, here is my initial code for rendering fonts generated by this utility - please note it is cannot handle fonts higher than 24 pixes.
Add as font.h or to graphics.h:
#include <stdbool.h> typedef struct Font { // common shared fields uint16_t font_Size_in_Bytes_over_all_included_Size_it_self; uint8_t font_Width_in_Pixel_for_fixed_drawing; uint8_t font_Height_in_Pixel_for_all_Characters; uint8_t font_Bits_per_Pixels; // if MSB are set then font is a compressed font uint8_t font_First_Char; uint8_t font_Last_Char; uint8_t font_Char_Widths[1]; // size dependent on number of glyphs uint8_t font_data[]; // bit field of all characters } Font; uint8_t getFontWidth (Font *font); uint8_t getFontHeight (Font *font); inline uint8_t getCharWidth (Font *font, unsigned char c); uint16_t getStringWidth (Font *font, unsigned char *string); uint8_t drawFontChar (Font *font, uint16_t x, uint16_t y, unsigned char c, bool opaque); void drawFontString (Font *font, uint16_t x, uint16_t y, unsigned char *string, bool opaque); Add to graphics.c - also include font.h if code above not added to graphics.h :
static uint16_t getoffset (Font *font, unsigned char c) { uint16_t offset = 0; if(c > font->font_First_Char) { c -= font->font_First_Char; while(c--) { offset += font->font_Char_Widths[c]; }; } return offset; } uint8_t getFontWidth (Font *font) { return font->font_Width_in_Pixel_for_fixed_drawing; } uint8_t getFontHeight (Font *font) { return font->font_Height_in_Pixel_for_all_Characters; } uint8_t getCharWidth (Font *font, unsigned char c) { return c != ' ' && (c < font->font_First_Char || c > font->font_Last_Char) ? 0 : ((c == ' ' || font->font_Char_Widths[c - font->font_First_Char] == 0 ? font->font_Width_in_Pixel_for_fixed_drawing / 4 : font->font_Char_Widths[c - font->font_First_Char]) + 2); } uint16_t getStringWidth (Font *font, unsigned char *string) { unsigned char c; uint16_t width = 0; while((c = *string++)) { width += getCharWidth(font, c); } return width; } uint8_t drawFontChar (Font *font, uint16_t x, uint16_t y, unsigned char c, bool opaque) { uint8_t width = getCharWidth(font, c); uint32_t row, column, bitOffset, dataIndex, preShift, pixels; bool paintSpace; unsigned char *fontData = font->font_Char_Widths + font->font_Last_Char - font->font_First_Char + 1; if(width) { bitOffset = getoffset(font, c) * font->font_Height_in_Pixel_for_all_Characters; dataIndex = bitOffset >> 3; preShift = bitOffset - (dataIndex << 3); column = width; width -= 2; paintSpace = c == ' ' || !font->font_Char_Widths[c - font->font_First_Char]; if(!paintSpace || opaque) { x += column; while(column--) { row = font->font_Height_in_Pixel_for_all_Characters; if(!((column == 0) || (column > width)) && !paintSpace) { pixels = *((uint32_t *)&fontData[dataIndex]) >> preShift; while(row--) { if(pixels & 0x01) { setArea(x - column, y - row, x - column, y - row); writeData(colorHighByte); writeData(colorLowByte); } else if(opaque) { setArea(x - column, y - row, x - column, y - row); writeData(bgColorHighByte); writeData(bgColorLowByte); } pixels >>= 1; } bitOffset += font->font_Height_in_Pixel_for_all_Characters; dataIndex = bitOffset >> 3; preShift = bitOffset - (dataIndex << 3); } else if(opaque) { while(row--) { setArea(x - column, y - row, x - column, y - row); writeData(bgColorHighByte); writeData(bgColorLowByte); } } } } } return width == 0 ? 0 : width + 2; } void drawFontString (Font *font, uint16_t x, uint16_t y, unsigned char *string, bool opaque) { uint32_t xs = x; unsigned char c; while((c = *string++)) { xs += drawFontChar(font, xs, y, c, opaque); } } The font files has to be modified slightly before they can be used - it should be quite obvious what to remove.
Example:
drawFontString((Font *)pixelmix, 5, 100, "The lazy fox...", false); There are room for optimizations, but I'll leave that for later - my primary goal is to get the DAB project on air.
Terje
-
terjeio got a reaction from bluehash in What are you doing right now..?
While waiting for the Monkeyboard I have been busy porting the Keystone driver and writing a graphics library:
I have chosen to write my own graphics library that, shock horror, uses the heap for storing the widget descriptors.
It is fully event driven and currently has support for Canvas, Frame, Button, List and Listelement widgets and stands on top of RobGs LCD driver.
It integrates nicely with remote control and the stepper navigator, and I suspect it should work with a touch driver as well.
So far so good - I hope my code will work together with the Monkeyboard when it arrives...
Terje
-
terjeio got a reaction from pine in What are you doing right now..?
Preamp / Multimedia-center featuring:
Raspberry Pi running OSMC, will add a MSP430 for power control.
My preamp modified for I2C control - I2C implemented in a MSP430G2553.
My RC5 remote, based on a MSP430G2312.
Tiva C as main controller: 320x240 LCD panel, old stepper motor as volume control & navigator (via QEI)
Keystone DAB (on a Monkeyboard) - awaiting delivery, I assume this will be the most tricky part to program for.
Prototyping:
Previous design in background, new design in front :
-
terjeio got a reaction from PTB in What are you doing right now..?
Preamp / Multimedia-center featuring:
Raspberry Pi running OSMC, will add a MSP430 for power control.
My preamp modified for I2C control - I2C implemented in a MSP430G2553.
My RC5 remote, based on a MSP430G2312.
Tiva C as main controller: 320x240 LCD panel, old stepper motor as volume control & navigator (via QEI)
Keystone DAB (on a Monkeyboard) - awaiting delivery, I assume this will be the most tricky part to program for.
Prototyping:
Previous design in background, new design in front :
-
terjeio got a reaction from Fmilburn in Controlling RGB LED strip with MSP430?
From 2x53 specifications: "The maximum total current, I(OHmax) and I(OLmax), for all outputs combined should not exceed