Table of contents

Showing posts with label light. Show all posts
Showing posts with label light. Show all posts

Thursday, 13 February 2014

LED ring light for Velleman K8200 3D printer



This time I would like to present you how I have added a light around the extruder.
Instead of re-inventing the wheel I just bought a simple tent light in Argos (LINK).


It contains 2 rings with white 5mm LEDs and it is battery powered. It takes 3x AA batteries so the maximum voltage is about 4.5V – close enough to onboard 5V. I’m going to drive it using PWM so I’m not worried about exceeding the limits (I’m sure there is a voltage margin in the product design so it will not catch the flames if 4.51V is provided :) 

I’ve created a circular holder for the rings:




To mount the PCB rings – I simply marked all the holes in the PCBs with a tip of soldering iron (mmmmm, that sweet smell of melted PLA :)) and then used some small screws lying around to hold the 2 rings in place.



Then was a time to make some brackets to hold the lights next to the extruder:







To mount it to the Z carriage arm I used clips from my previous design: 
http://ljwinkler.blogspot.com/2014/01/frame-clip-and-locking-pin-for-velleman.html





For the PWM driver I used Atmega328P microcontroller with an Arduino bootloader. It is a bit overkill using a microcontroller for such a simple purpose but it leaves me an open window for future modifications and it was also very quick to set up from parts I had. The other big advantage of this solution comes when a small tweaks are required – it just means changing the source code and re-uploading it back to the microcontroller.
I used one of the analogue inputs (A0 - pin 23) to read value of the potentiometer and one of the PWM outputs (D10 - pin 16) to drive a transistor that controls the LEDs. Atmega328P has a 10 bit A/D converter, therefore it can read 1024 positions of the potentiometer (0-1023). However, the PWM output is only 8-bit (0-255). I have modified the range to be 3-255 – so turning the potentiometer to its edge will turn off the lights completely. I have also added averaging of last 10 readings to prevent flickering.
A 4-pin header (Reset, RxD, TxD, GND) was added for programming purposes.
As a power supply I used the main controller board, pins marked as +5V and GND from the header J1 located in the corner of the controller board.

Here is a quick schematic:

 

List of components used:
  • 1x ATmega328P with Arduino bootloader
  • 1x BUF644 NPN transistor
  • 1x 16MHz crystal
  • 2x 22p ceramic capacitor
  • 1x 10k resistor
  • 1x 100R resistor
  • 1x 10k potentiometer


I have soldered it on a single layer protoboard:


Then I have designed a base for the PCB.
I have created small support elements keeping the board raised 5 mm and holding it in place by two M3 screws in the corners. The whole unit is mounted on the main controller board mount (described here: http://ljwinkler.blogspot.ie/2014/01/controller-board-mount-for-velleman.html)




Afterwards I have created a holder for the potentiometer. I have redesigned one of my clips - this time I used the flat one as there are wires running underneath.




And here is the source code:


// Arduino program for PWM LED lighting
// Copyright 2014 - LJ Winkler (lwinkler247@gmail.com)
//
//-------------------------------------------------------------------------//
// Permission is hereby granted, free of charge, to any person             //
// obtaining a copy of this software and associated documentation files    //
// (the "Software"), to deal in the Software without restriction,          //
// including without limitation the rights to use, copy, modify, merge,    //
// publish, distribute, sublicense, and/or sell copies of the Software,    //
// and to permit persons to whom the Software is furnished to do so,       //
// subject to the following conditions:                                    //
//                                                                         //
// The above copyright notice and this permission notice shall be          //
// included in all copies or substantial portions of the Software.         //
//                                                                         //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,         //
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF      //
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  //
// IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDERS BE LIABLE FOR ANY     //
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,    //
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE       //
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                  //
//-------------------------------------------------------------------------//

/*
 * pin A0 - PWM pot input
 * pin 10 - PWM output
 */

const int numReadings = 10;
const int potINpin = A0;
const int pwmOUTpin = 10;
int potValue = 0;
int pwmValue = 0;
int readings[numReadings];
int index = 0;
int total = 0;
int average = 0;

void setup() {
  pinMode(pwmOUTpin, OUTPUT);
  pinMode(potINpin, INPUT);
  for (int thisReading = 0; thisReading < numReadings; thisReading++){
    readings[thisReading] = 0;
  }   
}

void loop() {
  total = total - readings[index];        
  readings[index] = analogRead(potINpin);
  total = total + readings[index];      
  index = index + 1;                   
  if (index >= numReadings){
    index = 0;                          
  }
  average = total / numReadings;        
  pwmValue = map(average, 0, 1023, 255, 0); 
  if(pwmValue<3){
    pwmValue=0;
  }
  analogWrite(pwmOUTpin, pwmValue);
  delay(1);
}




To download the files - visit my profile on Thingiverse (http://www.thingiverse.com/ljwinkler/designs) or use direct links below:



Follow me on Twitter, Google+, Thingiverse, YouTube or by email to receive the latest updates.

If you like my blog - please use the donate button :)  This will help me making new stuff. THANK YOU!