This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
oak:tutorials:lesson_template [2016/03/22 16:19] jwhendy |
oak:tutorials:lesson_template [2016/03/22 20:39] jwhendy |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | In progress... | ||
| - | ----- | + | ======Oak: RGB LED Lesson====== |
| - | ===== Oak: LED basics ===== | + | [Fritzing or photo of final main circuit for this lesson] |
| + | Fritzing parts here: https://github.com/digistump/OakCore/issues/38 | ||
| - | [[http://digistump.com/wiki/_media/oak/tutorials/oak-1-led.png|{{http://digistump.com/wiki/_media/oak/tutorials/oak-1-led.png?400}}]] | + | Description of the lesson - ex: This lesson will show you how to safely connect a Red, Green, Blue LED to your Oak and control it from a sketch. |
| - | 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. | + | =====Components Used:===== |
| - | + | ||
| - | ===== Components used ===== | + | |
| ^ Part ^ Quantity ^Identification^ | ^ Part ^ Quantity ^Identification^ | ||
| | Oak with soldered headers |1| | | | Oak with soldered headers |1| | | ||
| - | | Breadboard|1| | | + | | Breadboard| 1| | |
| - | |5mm LED bulb, any color|2| | | + | | 5mm RGB Common Cathod LED| 1| | |
| - | |Jumper wires|2| | | + | | 330R Resistors| 3| Orange-Orange-Red| |
| - | |Resistor, 1k ohm|1|Red-Red-Brown| | + | |
| - | ===== Concepts ===== | + | [NOTE: You can find an index of the parts in the starter and ultimate kits here: [[oak:tutorials:kit_parts|Starter and Ultimate Kit Parts List]]] |
| - | === analogWrite() === | + | =====Concepts:===== |
| - | 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 one, and how bright it should be. | + | In this section you would cover the concepts new for this lesson. For this lesson that may include PWM (both what it is, how it works, and how to change it in code with tiny code examples), LEDs (briefly what they are, as the first single LED lesson should cover that more in depth), RGB LEDs (how they are different then a single LED, common cathode vs annode, etc), resistors (again in brief as the first single LED lesson should cover that more in depth). |
| - | === PWM === | + | Example of a concept: |
| - | 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! | + | **PWM**: In this lesson we will use Pulse Width Modulation (PWM) to control the 3 different color LED emitters inside the RGB LED. By powering each color from a separate pin of the Oak (through a resistor) we can use the Oak to control how much power goes to each color, which allows us to control the color of the RGB 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 also 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: | + | |
| - | + | ||
| - | [pic] | + | |
| - | + | ||
| - | ===== Code ===== | + | |
| - | + | ||
| - | === Code: blink, revisited === | + | |
| - | + | ||
| - | Using the same code from the blink tutorial with one change, we can blink our new LED bulb! | + | |
| + | PWM can be used in your code like this: | ||
| <code> | <code> | ||
| - | void setup() | + | analogWrite(0,1023); |
| - | { | + | more code here... |
| + | </code> | ||
| + | Where analogWrite(0,1023) means turn Pin0 fully on. A value from 0-1023 can be used to turn the pin on at a level from 0-100%. | ||
| - | // initialize digital pin 9 as an output. | + | What is actually happening with PWM: PWM creates an output that averages out to a certain voltage/power level by turning the pin on and off very quickly. The setting you set of 0-100% (0-1023) is called the duty cycle, at 100% the pin remains on 100% of the time, at 50% it remains on half of the time. |
| - | pinMode(9, OUTPUT); //LED on Oak | + | |
| - | } | + | Etc, etc, diagrams and images are welcome but each concept should be no more than two short paragraphs and a code block or image. |
| + | =====Circuit:===== | ||
| - | // the loop() routine runs over and over again | + | [Fritzing diagram of hooking the Oak to the RGB LED with resistors and the breadboard] |
| - | void loop() | + | |
| - | { | + | |
| - | // turn pin 9 "on" by making the voltage HIGH) | + | Steps to make these connections, things to watch out for (polarity, resistor codes etc) |
| - | digitalWrite(1, HIGH); | + | |
| - | + | ||
| - | // wait a second (1000 milliseconds) | + | |
| - | delay(1000); | + | |
| - | + | ||
| - | // turn the LED off by making the voltage LOW | + | |
| - | digitalWrite(9, LOW); | + | |
| - | // wait another second | ||
| - | delay(1000); | ||
| - | } | + | =====Code:===== |
| - | </code> | + | |
| - | + | ||
| - | === Code: for() loop === | + | |
| - | + | ||
| - | You can also define the delays using variables and loops to make things more interesting: | + | |
| <code> | <code> | ||
| - | // now we've added two variables to hold our | + | Code to show example of it working |
| - | // on and off time delays | + | |
| - | // the "int" variable is able to hold integer values | + | |
| - | int on_time; | + | |
| - | int off_time; | + | |
| - | + | ||
| - | void setup() | + | |
| - | { | + | |
| - | + | ||
| - | pinMode(1, OUTPUT); //LED on Oak | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | void loop() | + | |
| - | { | + | |
| - | + | ||
| - | // the for() loop will initialize a new temporary variable, i | + | |
| - | // it runs until i >= 500, adding 50 each time | + | |
| - | for(int i = 0; i < 500; i = i+50) | + | |
| - | { | + | |
| - | + | ||
| - | // the on time will equal i (0, 50, 100, ...) | + | |
| - | on_time = i; | + | |
| - | + | ||
| - | // the off time will equal 500 - i (500, 450, 400, ...) | + | |
| - | off_time = 500 - i; | + | |
| - | + | ||
| - | digitalWrite(1, HIGH); | + | |
| - | delay(on_time); | + | |
| - | + | ||
| - | digitalWrite(1, LOW); | + | |
| - | delay(off_time); | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | } | + | |
| </code> | </code> | ||
| - | Here is what happens each time the loop runs: | + | Explanation of code |
| - | + | ||
| - | ^time through loop ^i ^on_time ^off_time| | + | |
| - | |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): | + | |
| - | + | ||
| - | [[http://digistump.com/wiki/_media/oak/tutorials/loop-changing-blink.gif|{{oak:tutorials:loop-changing-blink.gif?300}}]] | + | |
| + | =====Conclusion:===== | ||
| - | Congratulations! You've taken your first steps with the Oak. Take a look at some of the other [[http://digistump.com/wiki/oak?redirect=1|tutorials]] for more! | + | Where to go from here, potential uses, etc. |