Strobit Google Sketchup Models

I’ve been playing around with Googles sketchup over the weekend and have created some components, one the RFM12B module and a basic camera hotshoe to scale.  It’s been a great little exercise in learning both Alibre and Sketchup as I’ve been wanting to get some 3D modelling practice, I’m finding that it’s easier to create things in Alibre and then export them to Sketchup.  Alibre does not support texture mappings in the drawing or export to POV, but Sketchup does it brilliantly, while on the other hand, Alibre’s3D modelling is very easy to use.

Currently the workflow is:  Model in Alibre –> textures in Sketchup – > POV Rendering– > Eagle3D Components.

Keep an eye out for more to come.  I’ve started a Stobit Collection in Googles 3D warehouse  for use with this project and will be adding to it as I go.   I’ll be putting the Eagle3D component files that I’ve created online shortly.

Step 4

Tweaking the Settings

Now we have added the component into Eagle3d we need to tweak and fine-tune the settings.

  1. Now render your PCB, more than likely a couple of problems will show up.  The first is your component is very small.  so we need to tweak the scaling from within the component file we recreated in the previous steps.

    Very Small component shown. (click to enlarge)
    07/08/09 update: (Thanks for the tip Jeremy)

    > Jeremy wrote:
    > Hey. I read over your tutorial on making Eagle3d components in Google
    > Sketchup, and I wanted to thank you for saving me a considerable
    > amount of time. I also found something you might have missed. Sketchup
    > records units in mm
    > (millimeters) but when su2pov plugin is run, it converts all the mm
    > into inches (1mm -> .03937 inch). The problem is that Eagle3D
    > interprets the numbers in the .inc files as in mm. So the best way to
    > fix the problem is to scale up your drawing in Sketchup by 25.4 times
    > (thus counteracting the plugin’s unit conversion).

  2. To scale the component scroll down to near the end of the file where you should see something like this
       2: #object {MRFceJeaMA
       3: matrix < 0.1,0.0,0.0,
       4: 0.0,0.1,0.0,
       5: 0.0,0.0,0.1,
       6: 0.0,0.0,0.0>
       7: }
  3. tweak the settings that have numbers in them, the following worked for me
       1: // Scale
       2: #object {MRFceJeaMA
       3: matrix < 2.55,0.0,0,
       4: 0.0,2.50,0.0,
       5: 0.0,0.0,2.55,
       6: 0.0,0.2,0.0>
       7: }
  4. Now the component should be close to the right size, but the offset is off.triggr-020
  5. We now need to get the correct offsets, which is a bit ht and miss, but I found the following works best.
  6. Locate the component in the generated POV file (step 8 above)
  7. Change the translate values just after the macro name as shown below, the hit and miss comes in by taking a guess in what direction and value to use.
       1: #ifndef(pack_U2) #declare global_pack_U2=yes; object {MRF24J40MA()translate<-5,0,0> rotate<0,0.000000,0>rotate<0,-270.000000,0> rotate<0,0,0> translate<61.569600,0.000000,15.240000>}#end        //MRF24J40MA FCC Approved module U2 MRF24J40MA MRF24J40MA
  8. We are heading in the right direction, so keep changing until it all lines up on that axis.


  9. looks like we are right on here, onto the next axis


  10. to change the next axis offset we need to modify the last value in the translate function
       1: MRF24J40MA()translate<-9,0,-5>
  11. Just about there


  12. finally looks right


  13. Now we have found the values we need to put them in the 3dusepac.dat file or else the next time we run the ulp script we will loose these settings
  14. In the line we added added to the 3dusrpac.dat file we need to add the values we have just fount to positions 15 and 1 7 as shown below.
       1: MRF24J40MA:0:0:0:0:0:0:0:0:0:0:0:0:0:0:-9:0:-8:0:0:0:0:0:0:0:0:0:0:0:0:0:MRF24J40MA(::
  15. If this file is changed we need to re-run the ulp script to re-generate the POV file, then check that your values are there and renders correctly.triggr-020
  16. The same process can be followed if the component is not rotated correctly.  such as shown below


  17. change this value in the POV file to tweak the rotation side of things. change the value show below (-180)  in this example the value that works for me is 90  once again this value must be updated in the 3dusrpac.dat file in position 14.
       1: {MRF24J40MA()translate<-9,0,-8> rotate<0,0.000000,0>rotate<0,-180.000000,0>
  18. Remember to re-run the ULP script to regenerate the POV file.Happy component creating !!!!!
<<Step 3

Step 3

Integrating into Eagle3D

Now we have converted the file to work in Eagle3D we now need to tell Eagle3D how to use it.

  1. Add your include file to the file
    #declare __user_inc = true;
        #include ""
  2. Now open and add the following to the end of 3dusrpac.dat (found in the Eagle3D install directory)
  3. To find the PACKAGE_NAME, first go back to your PCB editor in Eagle, click the info button, then click on the component we have just created the library for.image
  4. Replace PACKAGE_NAME with the Package variable. In this case it is MRF24J40MA Note that this is always in caps!
  5. Next, we need to replace MACRO_NAME with the exact macro name we added to the file in step 2. In this example it’s MRF24J40MA.
  6. The line should now look like this
  7. Now run the Eagle3D ulp script and create the the POV file for the PCB.image
  8. Open the POV file and scroll down until and check that the component has been added to the file (line 3 below)
       1: #ifndef(pack_S1) #declare global_pack_S1=yes; object {SWITCH_SECME_1K2_RH()translate<0,0,4> rotate<0,180.000000,0>rotate<0,-180.000000,0> rotate<0,0,0> translate<41.910000,0.000000,1.727200>}#end        // S1  SWITCH-SPDT-SMD
       2: #ifndef(pack_U1) #declare global_pack_U1=yes; object {QFP_TQFP_32_080MM("ATMEGA168V","ATMEL",)translate<0,0,0> rotate<0,0.000000,0>rotate<0,-45.000000,0> rotate<0,0,0> translate<26.670000,0.000000,16.510000>translate<0,0.035000,0> }#end        //TQFP-32 U1 ATMEGA168V TQFP32-08
       3: #ifndef(pack_U2) #declare global_pack_U2=yes; object {MRF24J40MA()translate<0,0,0> rotate<0,0.000000,0>rotate<0,-270.000000,0> rotate<0,0,0> translate<61.569600,0.000000,15.240000>}#end        //MRF24J40MA FCC Approved module U2 MRF24J40MA MRF24J40MA
       4: }//End union
  9. Now render your PCB, more than likely a couple of problems will show up.  The first is your component is very small.  so we need to tweak the scaling from within the component file we recreated in the previous steps.
<< Step 2 Step 4 >>

Step 2

Convert POV file into Eagle3D .inc file

  1. In the new POV file that was created by the plug-in now needs to be saved as a *.inc in the same directory as Eagle3D component include files this is usually called EAgle3D\pov


  2. Next we need to delete all the information not needed and will cause conflicts with Eagle3D.
       1: // Persistence Of Vision raytracer version 3.5 (or higher) file.
       2: // Exported from Sketchup 6.4.112 (en-US) through SU2POV 3.2. by D. Bur.
       3: // 04/03/2009, 16:25
       4: //-------------------------------------------
       7: // Pov-Ray includes
       8: #include ""
       9: #include ""
      10: #include ""
      11: #include ""
      12: #include ""
      13: #include ""
      14: #include ""
      15: #include ""
      16: #include ""
      17: #include ""
      18: #include ""
      19: #include ""
      20: #include ""
      21: #include ""
      22: #include ""
      23: //-------------------------------------------
      26: // Declare section
      27: //Gamma
      28: #declare GAMMA=2;
      29: //Default finish
      30: #default { texture { finish { ambient 0.1 diffuse 0.7 brilliance 0 roughness 0.005 } } }
      31: // Finishes
      32: #declare Dull = finish {specular 0.5 roughness 0.2}
      33: #declare Shiny = finish {specular 1 roughness 0.0003}
      34: #declare Glossy = finish {specular 1 roughness 0.0003 reflection 0.1}
      35: #declare Phong_Glossy = finish {phong 10 phong_size 300 reflection 0.1}
      36: #declare Phong_Dull = finish {phong 0.5  phong_size 1}
      37: #declare Luminous = finish {ambient 0  diffuse 20}
      38: #declare Mirror = finish {ambient 0  diffuse 0 reflection 0.97}
      39: // Lights colors
      40: #declare Incandescence = rgb <1, 0.9, 0.6>;
      41: #declare Halogen = rgb <1, 0.98, 0.85>;
      42: #declare Sodium = rgb <1, 0.6, 0.2>;
      43: #declare Neon = rgb <0.9, 0.95, 1>;
      44: #declare Mercury = rgb <0.92, 1, 0.92>;
      46: #declare Lightbulb = sphere {
      47:     <0,0,0>,1.5
      48:     scale <1,1.3,1>
      49:     texture { pigment {color rgb <1, 1, 0.5>}}
      50:     finish { Luminous }
      51:     }
      53: //-------------------------------------------
      56: //Radiosity settings
      57: global_settings {
      58: radiosity { Rad_Settings(Radiosity_Final, off, on) }
      59: assumed_gamma GAMMA
      60: radiosity { gray_threshold 0.8 }
      61: }
      62: //-------------------------------------------
      65: // Gradient Background
      66: sky_sphere {
      67:     pigment {
      68:     gradient y
      69:    color_map {
      70:     [(1-cos(radians(0)))/2 color White]
      71:     [(1-cos(radians(50)))/2 color rgb <0.741176470588235,0.819607843137255,0.815686274509804>]
      72:     }
      73:     scale 1
      74:     translate -1
      75:     }
      76: }
      77: //-------------------------------------------
      80: //-------------------------------------------
      83: //-------------------------------------------
      86: // Camera
      87: camera {
      88:     perspective
      89:     location <2.25145468567195,1.60043897233161,-1.06394822934727>
      90:     look_at <-0.466904134380124,-0.965594533672687,1.31022929677542>
      91:     right <1.3333,0,0>
      92:     up <-0.436428953203423,0.815008198675065,0.381171096619603>
      93:     angle 63.7985225255377
      94: }
      95: //-------------------------------------------
      98: //-------------------------------------------
  3. Copy and paste the following code into the very beginning of the file.  replace ‘inc_MRF24J40MA’ with the name of your component, e.g. inc_YOUR_COMPONENT.
    #declare inc_MRF24J40MA=true;
    #declare inc_testmode=true;
    #include ""
    #undef inc_testmode
  4. Now scroll down until you see the start of the object definition
       2: // LEVEL 0 #<Sketchup::ComponentDefinition:0x3e508c0> MRF24J40MA
       3: #declare MRFceJeaMA = union {
       4: mesh2 {
       5:     vertex_vectors {
       6:       4,
       7: <7.000109088,4.98688000008518e-006,1.35>,
       8: <7.000109088,0.32000498688,1>,
  5. insert the component macro declare statement (line2 below) into the file.  The macro name needs to be the name of your component (in this case ‘MRF24J40MA’)
       1: // LEVEL 0 #<Sketchup::ComponentDefinition:0x3e4f8b8> MRF24J40MA
       2: #macro  MRF24J40MA()
       4: #declare MRFceJeaMA = union {
  6. Scroll to the very end of the file and delete lines 3,4 and 8 as shown below
       1: //-------------------------------------------
       3: #declare MODEL = union {
       4: } // End of MODEL object declare
       5: //-------------------------------------------
       8: object { MODEL }
       9: //-------------------------------------------
      12: #object {MRFceJeaMA
      13: matrix < 0.1,0.0,0.0,
      14: 0.0,0.1,0.0,
      15: 0.0,0.0,0.1,
      16: 0.0,0.0,0.0>
      17: }
      18: //-------------------------------------------
      21: //-------------------------------------------
  7. Finally insert all of the following to the very end of the file.  Replace MR24J40MA() with your component macro name.
    #end //end of macro  
    //Size of the Grid Plane (+/- span)
    #local XYZ_span=20;
    //Orientation axes
    cylinder{<-XYZ_span,0,0><XYZ_span,0,0>0.1 pigment{Blue}}    //X
    cylinder{<0,-XYZ_span,0><0,XYZ_span,0>0.1 pigment{Red}}        //Y
    cylinder{<0,0,-XYZ_span><0,0,XYZ_span>0.1 pigment{Yellow}}    //Z
    // Useful GRIDS:
    #local XYZ_step= 1 ;          // axis increment
    #local XYZ_cnt = 0;           //  loop counter
    #local xyz_thick = 0.05;     // grid line thickness
    // GRID PLANES: Remove comment begin/end to activate & select PLANES:
    #while (XYZ_cnt <= XYZ_span)
        cylinder{<-XYZ_span,0,XYZ_cnt><XYZ_span,0,XYZ_cnt>xyz_thick pigment{Blue}}        // Positive Z-Lines
        cylinder{<-XYZ_span,0,-XYZ_cnt><XYZ_span,0,-XYZ_cnt>xyz_thick pigment{Blue}}    // Negative Z-Lines
        //cylinder{<0,XYZ_cnt,-XYZ_span><0,XYZ_cnt,XYZ_span>xyz_thick pigment{Red}}        // Positive Y-Z Plane Lines
        //cylinder{<0,-XYZ_cnt,-XYZ_span><0,-XYZ_cnt,XYZ_span>xyz_thick pigment{Red}}    // Negative Y-Z Plane Lines
        //cylinder{<-XYZ_span,XYZ_cnt,0><XYZ_span,XYZ_cnt,0>xyz_thick pigment{Red}}        // Positive Y-X Plane Lines
        //cylinder{<-XYZ_span,-XYZ_cnt,0><XYZ_span,-XYZ_cnt,0>xyz_thick pigment{Red}}    // Negative Y-X Plane Lines
        cylinder{<XYZ_cnt,0,-XYZ_span><XYZ_cnt,0,XYZ_span>xyz_thick pigment{Yellow}}    // Positive X-Lines
        cylinder{<-XYZ_cnt,0,-XYZ_span><-XYZ_cnt,0,XYZ_span>xyz_thick pigment{Yellow}}    // Negative X-Lines
        #local XYZ_cnt = XYZ_cnt+XYZ_step;
        #local tt = 40;                //let's you change the distance easily
        location <-tt,tt,-tt>
        //location<0,5,-50>            //alternate location
        look_at <0,0,0>                //best to select the approximate centre of the object
        angle 30
    light_source { <100, 100, -100> White}
    light_source { <-100, 100, -100> White }
    light_source { <-100, 100, 100> White }
    light_source { <100, 100, 100> White }
    //light_source { <-tt,tt,-tt> White }
    //light_source { <-tt,tt,-tt> White }
    //light_source { <-tt,tt,-tt> White }
    //End of Macros
  8. Now test the inc file by rendering the component.  This will test to make sure the macro and file are all working.  A grid and the actual component will now be rendered.image
  9. UPDATE: You also need to copy any surface map graphic files across to the same directory as the new component file.

If you have successfully converted the file we next need to add it to Eagle3D

<<Step 1 Step 3 >>

Follow me on Twitter / Strobit Update

I know I’m a bit slack in updates on the blog.  If you haven’t noticed I now have a twitter account so you can follow what I’m doing when it’s not getting updated here.

However since the blog is way over due for an update here is what’s been happening in a nutshell.

Strobit Trigger:

I have finally gotten off my butt and done a redesign (hah and you thought the project had died a slow death, it may have stalled slowed, but certainly not dead!)

Features worthy of note in the new design (in no particular order):

  • 3V design, will run from x2 AA Alkaline or single CR123A 3V battery.
  • Fairly compact board, 30mm x 70mm. (without battery)  slightly lalonger on 2.4ghz design due to antenna.
  • Onboard on/off switch to save batteries when not in use.
  • FTDI 3.3v breakout cable port for connecting to either RS232 or USB using the FTDI cable.
  • Onboard ISCP port for programming.
  • Personality daughter boards.  Will allow users to create their own hardware modules, i.e. sound trigger, light trigger, LCD UI, or whatever they like etc
  • Atmega168V processor, low cost, low voltage design = longer battery life.
  • Can run Arduino bootloader, so developers have access to Arduino development libraries.
  • I’ve designed 2 different boards.  One using the RFM12B module at either 433Mhz or 915Mhz.  The second board I’m going to try a 2.4GHZ design using Microchips FCC certified MRF24J40MA 802.15.4 module, this is purely experimental so I don’t have any testing done yet, but I have some of these modules and would like to try them out, also being FCC certified will be an added benefit.  (not to mention I’ll be using these for a mesh sensor network project I have planned around the house)
  • RFM12B board design has external SMA antenna.
  • Base PCB board designs are done and I’m fairly happy with them so far, I’m just finishing a basic personality modules which I can used for testing and maybe another one so I can make up the  max designs I can have on a single panelized board (may as well get the most designs I can get fabricated when I send it off to GoldPheonix).  I’ve done some initial Eagle3D runs to get an idea of the boards and so I can post them on the blog, but I really need to learn how to create components in Eagle3D as it leaves unknown components blank, i.e. the RF modules and therefore looks incomplete.  (anyone that can help me here please contact me)

Still To Do:

  • Panelize boards
  • Send to GoldPheonix for PCB fabrication.
  • Assemble and test.

I’ve also been playing with learning Alibre, a fantastic 3D design package (they have a free version) so I can get some ideas for building enclosures design for these boards.