User Tools

Site Tools


oak:tutorials:leds

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Last revision Both sides next revision
oak:tutorials:leds [2016/03/22 13:51]
jwhendy migrate more complex led stuff from the blink tutorial
oak:tutorials:leds [2016/03/22 20:38]
jwhendy accidentally wrote a tutorial over a different page! copying it here to the correct location
Line 1: Line 1:
-In progress...+===== Oak: LED basics =====
  
------+[[http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.png|{{http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.png?​400}}]]
  
-=== Codea for() loop ===+This tutorial will build on the [[oak:tutorials:​blink|last]] by using an external LED bulb. We will also control the brightness of an LED vs. simply turning it on and off. There are excellent articles about LEDs, so if you want to know more about the nitty gritty of how LEDs work, please seek out other resources. One example is the excellent article, [[https://​learn.adafruit.com/​all-about-leds/​overview|All about LEDs]] on Adafruit.
  
-You can also define the delays using variables and loops to make things more interesting:​+===== Components used =====
  
-<​code>​ +^ Part       ^ Quantity ​         ^Identification^ 
-// now we've added two variables to hold our +| Oak with soldered headers |1| | 
-// on and off time delays +| Breadboard|1| | 
-// the "​int"​ variable is able to hold integer values +|5mm LED bulb, any color|2| | 
-int on_time; +|Jumper wires|2| | 
-int off_time;+|Resistor, 220 ohm|1|Red-Red-Brown|
  
-void setup() ​+===== Concepts ===== 
 + 
 +=== analogWrite() === 
 + 
 +The ''​digitalWrite()''​ function used in the blink tutorial can send ''​HIGH''​ or ''​LOW''​ signals to a pin on the Oak. This is like turning the light switch on and off. Using ''​analogWrite()''​ is like adding a //dimmer// to your switch! You can now decide if the LED is on, and how bright it should be. The function takes parameters for a pin on which to send the output, and what output level to send. Microcontrollers use integers from 0 - some limit based on the bits of resolution they use. To keep things simple, just remember that the Oak can use ''​analogWrite()''​ from 0 (off) to 1023 (full power). 
 + 
 +=== PWM === 
 + 
 +The term PWM stands for pulse-width modulation. A full description is outside the scope of this tutorial, but feel free to read up on the concept (e.g. on [[https://​en.wikipedia.org/​wiki/​Pulse-width_modulation|Wikipedia]]). The simplified version is that by pulsing a single voltage (like 3.3V) on and off, the LED will behave as if we sent a lower voltage. The pulses are very fast (generally faster than one can see) and thus this is a great way to control the brightness of an LED! 
 + 
 +=== LED === 
 + 
 +An LED is a light emitting diode, and a diode only allows electricity to flow in one direction. This means that LEDs are also directional. There is generally one leg of an LED that is longer, which is used to indicate the //​positive//​ side. The shorter leg is generally connected to ground, so electricity will flow in the positive leg, through the bulb (generating light) and through the negative leg to ground. 
 + 
 +LEDs typically have an optimal current, which is typically about 20-30mA for a 5mm LED. To obtain this current, we use a resistor. In the interest of keeping this simple, we're simply providing a value of 220 ohm as a middle of the road recommendation. There'​s some good information at [[http://​www.evilmadscientist.com/​2012/​resistors-for-leds/​|Evil Mad Scientist]] about //how// these resistor values can be chosen if you'd like to learn more. What's certain is that you should //never// plug an LED directly into the Vin or Vcc of the Oak; too much current will destroy it! 
 + 
 +===== Circuit ===== 
 + 
 +We will build this circuit: 
 + 
 +[[http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.png|{{http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.png?​400}}]] 
 + 
 +  * Start by inserting the 220 ohm resistor into two different rows on the breadboard 
 +  * Insert the LED into the breadboard so that it's //long// leg is in the same row as the resistor, and the other leg in a different row 
 +  * Connect pin 9 of the Oak to the free end of the resistor with a jumper wire 
 +  * Connect a ground pin of the Oak to the row containing the short leg of the LED 
 + 
 +If real world pictures help, you can double check your circuit against this one: 
 + 
 +[[http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.jpg|{{http://​digistump.com/​wiki/​_media/​oak/​tutorials/​oak-1-led.jpg?​500}}]] 
 + 
 +===== Code ===== 
 + 
 +=== Code: blink, revisited === 
 + 
 +Using the same code from the blink tutorial with one change, we can blink our new LED bulb! 
 + 
 +<​code>​ 
 +void setup()
 {                ​ {                ​
  
-  pinMode(1, OUTPUT); //LED on Oak+  ​// initialize digital pin 9 as an output. 
 +  ​pinMode(9, OUTPUT); //LED on Oak
  
 } }
  
 +
 +// the loop() routine runs over and over again
 void loop() void loop()
 { {
  
-  // the for(loop will initialize a new temporary variablei +  // turn pin 9 "​on"​ by making ​the voltage HIGH) 
-  // it runs until i >= 500, adding 50 each time +  digitalWrite(9HIGH); 
-  ​for(int i = 0; i < 500; i = i+50+  ​ 
-  ​{+  // wait a second (1000 milliseconds) 
 +  ​delay(1000); 
 +  ​ 
 +  // turn the LED off by making the voltage LOW 
 +  digitalWrite(9,​ LOW);
  
-    ​// the on time will equal i (0, 50, 100, ...) +  ​// wait another second 
-    ​on_time = i; +  delay(1000);
-     +
-    // the off time will equal 500 - i (500, 450, 400, ...) +
-    off_time = 500 - i;+
  
-    digitalWrite(1, HIGH); +
-    delay(on_time); +</​code>​ 
-   + 
-    ​digitalWrite(1LOW); +This code does just what the on-board blink sketch did: it sends a ''​HIGH''​ voltage to a pin (9 in this case instead of 1)waits a second, then turns off the power to that pin by sending a ''​LOW''​ signal, waiting for an additional second before repeating. By changing the pin, and connecting an LED to that pin, we've blinked our LED bulb. 
-    delay(off_time); + 
-   +=== Code: changing brightness === 
-  ​}+ 
 +With the next code, we will switch to using ''​analogWrite''​ so that we can control the desired brightness:​ 
 + 
 +<​code>​ 
 +void setup(
 +{                 
 + 
 +  // initialize digital pin 9 as an output. 
 +  // this stays the same for analogWrite(
 +  pinMode(9, OUTPUT); //LED on Oak 
 + 
 +
 + 
 + 
 +// the loop() routine runs over and over again 
 +void loop() 
 +
 + 
 +  ​// start with pin 9 off by sending a 0 
 +  ​analogWrite(90); 
 +  delay(500); 
 + 
 +  ​// set pin 9 to 100/1023, or about 10% power 
 +  ​analogWrite(9,​ 100); 
 +  delay(500);
   ​   ​
 +  // increase to about 25% power
 +  analogWrite(9,​ 250);
 +  delay(500);
 +
 +  // 50% power
 +  analogWrite(9,​ 500);
 +  delay(500);
 +
 +  // full power
 +  analogWrite(9,​ 1023);
 +  delay(500);
 +
 } }
 </​code>​ </​code>​
  
-Here is what happens each time the loop runs:+This code may look a lot longer and possibly intimidating,​ but we've simply used the same basic structure from above (do something, then wait) over and over. The analog functions and their corresponding delays have been grouped tighter to show that these are pairs of commands.
  
-^time through ​loop ^i ^on_time ^off_time| +Since the Oak can send values from 0-1023, this sketch cycles ​through ​some various PWM values to show you the effect. Sending ''​100''​ means that the ''​analogWrite''​ signal is high 100/1023 or about 9.8% of the timeWhen you upload this sketch, you'll see a demonstration of your LED going from off to full brightness in steps:
-|1|0|0|500| +
-|2|50|50|450| +
-|3|100|100|300| +
-|.|.|.|.| +
-|.|.|.|.+
-|10|450|450|50|+
  
-When the ''​for()''​ loop above runs, ''​i''​ is equal to 0. It calculatesIf you upload this code, you will see this (click for enlarged view in new tab):+[gif of progression]
  
-[[http://​digistump.com/​wiki/​_media/​oak/​tutorials/​loop-changing-blink.gif|{{oak:​tutorials:​loop-changing-blink.gif?​300}}]]+Play around with the code abovePerhaps change the order (high to low), the timing between each step (altering the ''​delay()''​ value used), or the number of steps (what about a more gradual transition?​).
  
 +===== Conclusion =====
  
-Congratulations! You'​ve ​taken your first steps with the OakTake a look at some of the other [[http://​digistump.com/​wiki/​oak?​redirect=1|tutorials]] for more!+Congratulations ​on taking another step with your Oak! You'​ve ​now wired up an external LED, learned about LED polarity and the need for a resistor, and gotten started with ''​analogWrite()''​Please take a look at the [[oak:​tutorials:​advanced-leds|advanced LED tutorial]] (multiple LEDs, using a ''​for()''​ loop, and an alternative to ''​delay()''​) or some of the other [[http://​digistump.com/​wiki/​oak?​redirect=1|tutorials]] for more!
oak/tutorials/leds.txt · Last modified: 2016/03/22 20:50 by jwhendy