Wednesday, April 13, 2016

48" T8 CREE LED TUBE TEARDOWN


LED based replacements for old T8 fixtures are finally becoming reasonably priced.  I see two old competitors  back at it again: CREE, and Philips.  Both bulbs attractively priced, both 4000K.


I tore down the Cree 1st.  Longest circuit board that I have ever seen......




Saturday, April 2, 2016

A LOOK A REALLY EARLY INTEGRATED CIRCUIT











This Integrated Circuit was taken out of a old teletype / teleprinter.  One of my earliest computer printers I had in the early 1980's.  By the time I got this printer it was all ready really old... I think the design dates from the mid 1960's.

40 pin DIP, however 1" wide (eventually 40 pin DIP packages standardized on a 0.6" lead spacing).

A really nice example of a very early integrated circuit.

This video also goes into some challenges with photography.  IC die sizes are awkward... too small for normal macro lens.... too big for a microscope.   In this video I talk about the solution that worked for me (after a very long set of purchases of macro extender rings, bellows, a macro lens, macro rails... and eventually a reversing ring).









Sunday, March 6, 2016

IKEA RYET LED BULB TEARDOWN: CRAZY CHEAP



A 400lm bulb for under $2.00 CDN (less than $1.50 USD).  That's cheaper than I have ever seen from a vendor with a safety listed bulb.

I can't decide if this is a loss leader or if they can make a profit.  Standard retail requires 100% markup... which would put the make-cost of the bulb at $0.75. 





Sunday, February 28, 2016

Computerized Camera Slider Build Log


A camera slider moves a camera in a linear direction.  Often used in cinematography for sweeping views or in stop-motion photography.

This one has computerized controls which is useful for my Youtube channel.   It can be set up to take a video without needing any user intervention... useful when I am operating some equipment or trying to make a point and I run out of hands to move the camera.

Video below, code from the sketch below that .

A satisfying build involving mechanical fabrication, electrical engineering and coding!






// Camera Slider: leadscrew variant
// Sketch is for illustrative purposes only  The sketch is  provided as-is without any guarantees or warranty or suitability to purpose.
//
// electronupdate@gmail.com
//
//  dependencies:
//  - u8glib required for driving OLED display
//  - timerone
//  - Ardunio Nano rev 3
//  - 128 x 64 OLED display. i2c interface... "heltec.cn"
//  - 8 push button switchs arranged as a key pad
//  - stepper motor driver based on EasyDriver v4.5

#include "U8glib.h"
#include <Wire.h> //I2C Arduino Library
#include "TimerOne.h"
#include <Keypad.h>
#include <string.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI ** this is specific to the OLED panel in use... refer to google's library to select different (huge # of panels supported!)

bool display_mode = 0;   //when in mode zero it shows numeric results, when in mode one, graphically
long distance;
int processed = 0; // zero if sample buffer consumed otherwise 1
int cycle;
int inPin1 = 12;  
int inPin2 = 11;
int inPin3 = 10;
int button1, button2, button3;
int control_pin = 3;
int i,j,k;
int sample_buffer[129];
int sample_pos = 0;
int full_flag = 0;
int sample_min = 1023;
int sample_max = 0;
int min_final = 1023;
int max_final = 0;
int light_sample = 0;
int cursor_x = 0;
bool run_state = 0; // 0 == idle, scan keyboard, 1== running and moving camera
bool jog_state = 0; // 0 == idle, scan keyboard, 1 == manual mode for moving camera
int cursor_y = 0;
int dirPin = 2;
int stepperPin = 3;

char string_keypad[2] = "\0";

int parm_array[5][4];  //0 = pos, 1 == speed, 2 == dwell time to next step  

char key, last_key;


const byte ROWS = 3; //three rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'3','6','9'},
  {'2','5','8'},
  {'1','4','7'}
};
byte rowPins[ROWS] = {10,11,12};  //connect to the row pinouts of the keypad
byte colPins[COLS] = {7,8,9}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );









void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  char temp[50];
  char temp1[50];
  char temp2[50];

    u8g.setFont(u8g_font_fixed_v0);
     
  u8g.drawStr(0,7,"    POS    SPEED   WAIT");

  u8g.setFont(u8g_font_unifont);

  for (i = 0 ; i < 5 ; i++)
     for ( j = 0 ; j < 3 ; j++)
        {
          sprintf(temp,"%d", parm_array[i][j]);
          u8g.drawStr( 21 +j*36, i*10+19,temp);
        }

     u8g.setFont( u8g_font_fur20);
     if (run_state)   u8g.drawStr( 10,32, " RUN  ");

     if ( jog_state)  u8g.drawStr( 10,32, " JOG  ");

u8g.setCursorFont(u8g_font_unifont);
//  u8g.setCursorFont(u8g_font_7x13B);
  u8g.enableCursor();
  u8g.setCursorColor(255,255);
  u8g.setCursorStyle(0x34);
  


   u8g.setCursorPos( 13+36 *cursor_x, 19+10*cursor_y);

}

void setup(){

      Serial.begin(9600);

      pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
      
  //setup oled screen
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(1);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(1);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(1,1,1);
  }

  k  = 0;
  for ( i = 0 ; i < 5 ; i++)
    for (j = 0; j < 3; j++)
      { parm_array[i][j] = 0;
      }

      keypad.setHoldTime(500);
      keypad.setDebounceTime(50);
}

void timerIsr()
{
  // nothing here
}



void step(boolean dir,long int steps, long int delay_time){

  steps = abs (steps);
  
  Serial.println(dir);
  Serial.println(steps);
  Serial.println(delay_time);
  
  
  digitalWrite(dirPin,dir);
  delay(50);
  for(long int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(delay_time);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(delay_time);
  }
}

void loop(){

   char temp[50];
   char temp2[1];
   char temp3[1];
   
   key = keypad.getKey(); // read keypad
   if (key == '0') last_key = '0';
   if (key == '1') last_key = '1';
    if (key == '2') last_key = '2';
    if (key == '3') last_key = '3';
    if (key == '4') last_key = '4';
    if (key == '5') last_key = '5';
    if (key == '6') last_key = '6';
    if (key == '7') last_key = '7';
    if (key == '8') last_key = '8';
    if (key == '9') last_key = '9';


    if (keypad.keyStateChanged() || keypad.getState() == HOLD)
      {
        last_key = key;
        temp2[0] = key;
        temp3[0] = last_key;
        temp2[1] = 0;
        temp3[1] = 0;
        if (( key == '6') || ( keypad.getState() == HOLD) && last_key == '6') cursor_x--;
        if (( key == '7') || ( keypad.getState() == HOLD) && last_key == '7') cursor_x++;
        if (( key == '5') || ( keypad.getState() == HOLD) && last_key == '5') cursor_y--;
        if (( key == '8') || ( keypad.getState() == HOLD) && last_key == '8') cursor_y++;
        if (cursor_x < 0) cursor_x = 0;
        if (cursor_y < 0) cursor_y = 0;
        if (cursor_x > 2) cursor_x = 2;
        if (cursor_y > 5) cursor_y = 5 ;
        if (( key == '3' ) || ( keypad.getState() == HOLD && last_key == '3')) parm_array[ cursor_y][cursor_x ]++;
        if (( key == '4' ) || ( keypad.getState() == HOLD && last_key == '4')) parm_array[ cursor_y][cursor_x ]--;
        if ( key == '1' ) run_state = run_state ^ 1; // flip the bit
        if ( key == '2' ) jog_state = jog_state ^ 1; // flip the bit
      }


  // draw screen    
  u8g.firstPage();      
   do { 
            draw();
     
      }  while( u8g.nextPage() );

      
   // ***********************************************
   // run program on motor time
    if (run_state)
    {
     
        for( j = 0 ; j < 5 ; j++ )
          {
           if (parm_array[j][0] == 0) break;
        
           if ( parm_array[j][0] > 0 )step(true ,(long int)(parm_array[j][0]*38400),parm_array[j][1]*75);
           if ( parm_array[j][0] < 0 )step(false,(long int)(parm_array[j][0]*38400),parm_array[j][1]*75);
           delay( parm_array[j][2]*100);
          }
       run_state = 0;
       
     }


       
  // **************************
  // jog state

  if(jog_state)
  {

      do
      {

       
        key = keypad.getKey(); // read keypad 
        if (key == '2' )    // exit this loop
            {
              jog_state = 0;
            }

       if ( key == '7') step(true ,3840,75);   //3840 = 0.1"inches of travel
       if ( key == '6') step(false,3840,75);
      } while (jog_state == 1);
        
  }
  
  
       
      
}






Monday, February 15, 2016

Measuring Light Bulb Flicker with Nothing More Than a Cell Phone



Flicker can be quite annoying.  I understand there can be a link with headaches and flicker... it's also not very helpful when using lighting for movie making.

A recent viewer to my Youtube channel was trying to understand what equipment he needed to buy... but the reality is that a smart cell phone with a camera is probably all that one needs. 




Monday, February 1, 2016

Vertias (Lee Valley) Optical Center Punch

The problem of needing to mount a circuit board onto something is a common mechanical problem.

I often favor mounting my electronics onto aluminum metal carrier plates.  It's a relatively fast way to secure items and it requires a minimal tool set.

One challenge, however, is getting the holes in exactly the right postion.  Most circuit board mouting holes are small M2, M1.6 or smaller.  Precision is the name of the game.

I have always had trouble getting the punch mark in the absolute right position using my spring punch.  I found a gadget today at a store (leevalley.com) which make that quite a bit easier and more repetitive.

Lee Valley part # 05N59.01

https://www.youtube.com/watch?v=Jxf65hgmVYw

Wednesday, January 27, 2016

Philips "100W" LED for less than $10.00

Philips returns as the price leader.  It's nice to see 100 watt equivalent bulbs showing up on the market.  The 60 watt products long ago became very affordable.   However, many bulbs in my home are 100W and I could not justify spending upwards of $60.00 to replace those old CFLs.  At < $10.00 that decision becomes much easier.

I tear down a bulb, reverse engineer some of the circuits followed by some performance analysis.

There are trade-offs for sub  $10.00 bulbs.  The light pattern is more downward firing than it should be for a good emulation of an incandescent.   The warranty is quite a bit shortened (3 hours per day for 3 years)... that's only 3,285 hours.