Saturday, 22 April 2017

Two years on

I have failed to update this blog for two years.

I have no excuse, I am now retired and am active in a number of ways on Amateur Radio and Light engineering.

I am playing with in no particular order:-
  • WSPR
  • SDR Receivers and Transmitters
  • Raspberry Pi's
  • Encrypted Internet Links
  • Remote Web-servers
  • Laser Cutters (Solid state)
  • CNC Milling (Small scale)
  • 3D Printing
These all interact in interesting ways, for instance I am using 3D printing to make parts to improve my Laser Cutter which I intend to use for PCB etch resist removal which gives me small circuit boards cut and drilled by the CNC Mill to make RF  circuits for my electronic and radio experiments!

So not of interest to many but an early attempt at creating a support component for this tangled chain I used OPENSCAD to produce a replacement carriage for the laser cutter with tighter tolerances to reduce the side slip that was affecting the reliability and repeat-ability of the laser cutter.

OpenSCAD uses a simple language to define 3 Dimension shapes mathematically. So in this case a source code of :-

/* Plate

units mm

*/

$fn=45;

PlateType = 2;


Toplen = 114.5;
Thick = 6.7;
Height = 112.75;
ShaftH = 5.2;
Hole3 = 4.6;
Hole4 = Hole3;
Hole5 = 24;
Hole6 = 4;
Hole7 = Hole6;
Hole8 = 3.6;
Hole9 = Hole8;
Hole10 = Hole8;
HoleS1 = Hole8;
HoleS2 = Hole8;
KHole1a = 6;
KHole1b = KHole1a;
KHole2 = KHole1a;
HoleRow = 5.6;
HoleRow2 = 62;
HoleRow3 = 22;
HoleRow4 = 45.7;
HoleRow5 = 88;
HoleRow6 = HoleRow5-31/2 ; /* Nema17 */
HoleRow7 = HoleRow5+31/2 ;
HoleRow8 = 16.4;
HoleRow9 = 56.3;
HoleRow10 = 95;
HoleSLen = 1.6;
HoleS1a = 37.7;
HoleS1b = HoleS1a + HoleSLen;
HoleSS = 33.5;
HoleS2a = HoleS1a +HoleSS;
HoleS2b = HoleS1b +HoleSS;
KHoleR1 = 31;
KHoleR2 = 70.5;
HoleIn = 11.3;
HoleIn2 = 19;
HoleSep3 = 17;
HoleSep4 = HoleSep3;
HoleSep6 = 31;
HoleSep7 = 31;
HoleSep8 = 20;
HoleSep9 = HoleSep8;
HoleSep10 = HoleSep8;
HoleSSep = 50;
KHole1Sep = 15;
KHoleBH = 6;
KHoleBW = 3.3;


difference() {
     union(){
        cube([Toplen, Height,Thick],center=true);
}
     union(){
        
    /* Wheels */    
         translate([0,(Height/2) - HoleRow,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=ShaftH, true) ;
        
         translate([0- (Toplen / 2) + HoleIn ,(Height/2) - HoleRow,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=ShaftH, true) ;
        
         translate([ (Toplen / 2) - HoleIn ,(Height/2) - HoleRow,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=ShaftH, true) ;
        
         translate([0- (Toplen / 2) + HoleIn2 ,(Height/2) - HoleRow2,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=ShaftH, true) ;
        
         translate([ (Toplen / 2) - HoleIn2 ,(Height/2) - HoleRow2,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=ShaftH, true) ;
      
     if (PlateType == 1){
        
         translate([ HoleSep3/2 ,(Height/2) - HoleRow3,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole3, true) ;
        
         translate([ 0 - HoleSep3/2 ,(Height/2) - HoleRow3,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole3, true) ;
     
        
         translate([ HoleSep4/2 ,(Height/2) - HoleRow4,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole4, true) ;
        
         translate([ 0 - HoleSep4/2 ,(Height/2) - HoleRow4,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole4, true) ;
      
 /* NEMA17 */
       translate([0,(Height/2) - HoleRow5,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole5,true);

      
              
         translate([ HoleSep6/2 ,(Height/2) - HoleRow6,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole6, true) ;
        
         translate([ 0 - HoleSep6/2 ,(Height/2) - HoleRow6,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole6, true) ;
      
         translate([ HoleSep7/2 ,(Height/2) - HoleRow7,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole7, true) ;
        
         translate([ 0 - HoleSep7/2 ,(Height/2) - HoleRow7,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole7, true) ;
      
        
        }
        else
        {
           
      /* Holes */
           
                   
         translate([ HoleSep8/2 ,(Height/2) - HoleRow8,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole8, true) ;
        
         translate([ 0 - HoleSep8/2 ,(Height/2) - HoleRow8,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole8, true) ;
     
        
         translate([ HoleSep9/2 ,(Height/2) - HoleRow9,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole9, true) ;
        
         translate([ 0 - HoleSep9/2 ,(Height/2) - HoleRow9,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole9, true) ;
  
        
         translate([ HoleSep10/2 ,(Height/2) - HoleRow10,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole10, true) ;
        
         translate([ 0 - HoleSep9/2 ,(Height/2) - HoleRow10,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=Hole10, true) ;
        
      /* Key Holes */
           
         translate([ KHole1Sep/2 ,(Height/2) - KHoleR1,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=KHole1a, true) ;
        
               translate([ KHole1Sep/2 ,(Height/2) - KHoleR1 - KHoleBH + 1 ,0]) rotate([0,0,0]) cube([KHoleBW,KHoleBH,3*Thick],true) ;
        
         translate([ 0 - KHole1Sep/2 ,(Height/2) - KHoleR1,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=KHole1b, true) ;
   
             translate([0- KHole1Sep/2 ,(Height/2) - KHoleR1 - KHoleBH + 1 ,0]) rotate([0,0,0]) cube([KHoleBW,KHoleBH,3*Thick],true) ;
   
          translate([ 0 ,(Height/2) - KHoleR2,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=KHole2, true) ;
         
          
            translate([0 ,(Height/2) - KHoleR2 - KHoleBH + 1 ,0]) rotate([0,0,0]) cube([KHoleBW,KHoleBH,3*Thick],true) ;
     
      /* Slots */     
     
       translate([ HoleSSep/2 ,(Height/2) - HoleS1a,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS1, true) ;
        
         translate([ 0 - HoleSSep/2 ,(Height/2) - HoleS1a,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS1, true) ;
     
        
         translate([ HoleSSep/2 ,(Height/2) - HoleS1b,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS1, true) ;
        
         translate([ 0 - HoleSSep/2 ,(Height/2) - HoleS1b,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS1, true) ;
  
                translate([ HoleSSep/2 ,(Height/2) - HoleS2a,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS2, true) ;
        
         translate([ 0 - HoleSSep/2 ,(Height/2) - HoleS2a,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS2, true) ;
     
        
         translate([ HoleSSep/2 ,(Height/2) - HoleS2b,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS2, true) ;
        
         translate([ 0 - HoleSSep/2 ,(Height/2) - HoleS2b,0-(1.5*Thick)]) rotate([0,0,0]) cylinder(3*Thick,d=HoleS2, true) ;
  
       translate([ HoleSSep/2 ,(Height/2) - (HoleS1a+HoleS1b) / 2,0]) rotate([0,0,0]) cube([HoleS1,HoleSLen,3*Thick], true) ;
        
      translate([ 0 - HoleSSep/2 ,(Height/2) - (HoleS1a+HoleS1b) /2 ,0]) rotate([0,0,0]) cube([HoleS1,HoleSLen,3*Thick], center=true) ;
   
      translate([ HoleSSep/2 ,(Height/2) - (HoleS2a+HoleS2b) / 2,0]) rotate([0,0,0]) cube([HoleS2,HoleSLen,3*Thick], true) ;
        
      translate([ 0 - HoleSSep/2 ,(Height/2) - (HoleS2a+HoleS2b) /2 ,0]) rotate([0,0,0]) cube([HoleS2,HoleSLen,3*Thick], true) ;   
           
     }
}
}



Can generate two different 3D shapes depending on the value of  Platetype.

For Platetype = 1
 


For Platetype = 2

 

 These are of course simpler than the original parts that had shaping for clearance and minor style reasons.

Comparing these with the Clear Acrylic originals shows the disadvantages of the PLA I used to print it being opaque and prettier than my new test replacements, however the big advantage is that the slop is now gone from the mechanism so I will use these simple replacements for further experimentation.

(For interest the Laser Cutter is an  

EleksMaker® EleksLaser-A3 Pro 2500mW Laser Engraving Machine CNC Laser Printer )



 

Saturday, 25 July 2015

Update to Yesterdays update - Double sided PCB and Giga Hertz frequencies.

Well I was getting very weird results yesterday.......

........ but today I now understand them better!


I am used to using high frequency that is in this case  > 1 Ghz kit! I am not however used to building it! Well I have learned a new lesson for me!  Here am I trying to build a low pass filer for around 150 Mhz, I didn't think I needed to learn construction for >1 GHz, Wrong!

The filters I was building were exactly as planned and I was using double sided board with the lower side being a pure ground plane. However there behavior above 3-400 Mhz was wrong, and there behaviour at 1.2Ghz was just silly (2db attenuation when I expeced over 40db down!).

What I had not thought was that my Top layer ground fill was contiguous but greatly narrowed in places by the other components. I had made a series of resonators working in the Gigahertz ranges. I had built tuned slots and all sorts of things that were just not as they should be.

These boards are self designed and self fabricated. I had forgotten to put any vias between the top and bottom layers except at the ends where the SMA sockets connected the sides to each other.

Pick up drill, drill a number of via holes in sensible places. Insert copper wire in vias solder both ends trim off excess wire and re test.

Now my board is behaving with all below -40db above the 300Mhz level right up to 2.7Ghz. Most below 65db down and I could probably get the hump at 1.4G down if I added some more vias.


Lesson learned I may think I'm playing with 2M radio, that doesn't stop my boards playing up above 1Ghz. Grounding is critical watch how well things are grounded, and use vias!

--
Peter

Friday, 24 July 2015

Update on Crystal measurement

I am making progress.  I have been playing with a resistive fitting to do the impedance matching and following that by a small two transistor post amp to bring the signal back into a measurable range.

It's looking promising.

I am also experimenting with producing PCB's by toner transfer and that is looking promising as well using SMT components. I have started on building filters with SMT components and that is also promising but I have a lot to learn. I have built a 148Mhz low pass filer and it isn't quite right yet. It's come down to 140 Mhz. I think that's due to the components I have being only 5% and almost all the capacitors on the high side (or is that just my SMD device measuring tools?) Of course stray capacitance is present in all PCB's (and stray inductance as well!) I'm not yet good at compensating for that.

The worst part is I have a lot to learn about using SMD Inductors! The filer I built looked usable up to about 240Mhz then the attenuation rises and above 500Mhz I would rather not comment about but at some frequencies between 500Mhz and 2.7G (As high as my measuring gear go's) the attenuation was under 10db! As I say I have a lot to learn.
--
Peter

Friday, 26 June 2015

Making a headache by musing on electronics measurement

I have been experimenting in a field well outside my comfort area! I have started to play with RF construction and measurement. I have a reasonable set of test gear from my Radio Ham days but very little of it is suitable for serious "Research". Well I will never have the best gear but I either have or can build some measurement tools that let me start to get a better feeling for the fundamentals of RF.

Currently I have an RF Explorer Spectrum Analyzer (which is very good for it's price) and an RF Explorer Signal Generator (also a bargain). These together cover about 25Mhz to 2600Mhz (actually a bit more as the generator go's up to 6Ghz and the analyzer go's down to 10Mhz)  but I have started building some home brew kit to cover from about a Megahertz up to about 50 Mhz.

Signal generator / recording voltmeter

Front Crystal test jig / Back 3db splitter

Overview of setup
The first picture shows a PSOC5LP development board and an AD9851 module. This board takes the output from the AD9851 and converts from the 200ohm filter output to a 50ohm SMA socket using a bifiliar wound impedance matching transformer.  The PSOC5LP also supports a high resolution ADC which is used to measure the output voltage from the Log Amp that is in the diecast box on the left.
The code on the PSOC5 is partially mine and partially stolen from other open source projects. This code lets the PSOC configure and drive the AD9851. It also reads the high res ADC fed from the Analog Devices logamp.

The second picture shows a crystal test jig that is basically two SMA sockets with a pair of 4:1 impedance transformer to better max the crystal characteristic impedance which is around 111ohms.

You can also see the Mini-Circuits splitter (ZFSC-2-2500-S+) that I used in my tests.

I firstly ran the test with a wire jumper in place of the crystal, With nothing between the generator and the Crystal test rig, I then inserted a 32Mhz crystal and took another set of readings. I then inserted a Mini circuits splitter setup with a 50ohm dummy load on the second output. Next was a home brew resistive splitter also terminated on the unused output .



The blue line is the reference run with the short circuit instead of the Crystal.
The orange line is the setup with just the crystal.
The yellow line is with the 6db attenuation of the resistive splitter.
The grey line is replacing the resistive splitter with a high quality (transformer) splitter rated for 10-2500Mhz usage.


As you can see the grey line is the closest to the expected classical shape. at the extreme right the lines are spaced as expected in 3db intervals (The sensor has a slope of 25mv per db of power detected).

The left hand side is not as expected. The splitter insertion loss showing as near zero!
Also at the anti-resonant point the shape is much closer to what I would expect.

However as you see I have a lot to learn and understand. My head hurts!

By the way all of this is because I want to build a few crystal filters and to do that I have to characterize the crystals (I have a bag of 100 32Mhz crystal purchased very cheaply on ebay).

G4DCP - Peter D Hull