Monday, May 2, 2016

Philips T8 LED Tube Tear down: The most boring teardown yet....

48" long T8 LED tube: design as a drop in replacement for a florescent tube.  No need to change the ballast.



Very straight forward design...












Sunday, May 1, 2016

Extreme Tear down of a Digital Luggage Scale

Tear down of a scale I got off of Amazon: the "Etekcity Digital Portable Luggage Fishing Scale 50 Kg".  I took a look at the die, de-capped it from the board and then etched off the top metal layer.

The video completes with a look at the construction of the strain guage assembly.

Again: just  a world of engineering in even the cheapest  assembly.

die photos:  https://www.flickr.com/photos/electronupdate/albums/


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.