diff --git a/art/Breadboard+switch+buzzer.fzz b/art/Breadboard+switch+buzzer.fzz new file mode 100644 index 0000000..551b33e Binary files /dev/null and b/art/Breadboard+switch+buzzer.fzz differ diff --git a/art/Breadboard+switch+buzzer.png b/art/Breadboard+switch+buzzer.png new file mode 100644 index 0000000..6625083 Binary files /dev/null and b/art/Breadboard+switch+buzzer.png differ diff --git a/presentations/arduino-intro-2016/images/buzzer-breadboard.png b/presentations/arduino-intro-2016/images/buzzer-breadboard.png index 86bfde4..4a9ce99 100644 Binary files a/presentations/arduino-intro-2016/images/buzzer-breadboard.png and b/presentations/arduino-intro-2016/images/buzzer-breadboard.png differ diff --git a/presentations/arduino-intro-2016/images/buzzer-zoom.png b/presentations/arduino-intro-2016/images/buzzer-zoom.png new file mode 100644 index 0000000..d421d37 Binary files /dev/null and b/presentations/arduino-intro-2016/images/buzzer-zoom.png differ diff --git a/presentations/arduino-intro-2016/images/one-led.png b/presentations/arduino-intro-2016/images/one-led.png new file mode 100644 index 0000000..b41b9c0 Binary files /dev/null and b/presentations/arduino-intro-2016/images/one-led.png differ diff --git a/presentations/arduino-intro-2016/images/rapha1.png b/presentations/arduino-intro-2016/images/rapha1.png new file mode 100644 index 0000000..5ef27b3 Binary files /dev/null and b/presentations/arduino-intro-2016/images/rapha1.png differ diff --git a/presentations/arduino-intro-2016/images/rapha2.png b/presentations/arduino-intro-2016/images/rapha2.png new file mode 100644 index 0000000..9f33efc Binary files /dev/null and b/presentations/arduino-intro-2016/images/rapha2.png differ diff --git a/presentations/arduino-intro-2016/talk.ebook.pdf b/presentations/arduino-intro-2016/talk.ebook.pdf index 077e2b4..e489854 100644 Binary files a/presentations/arduino-intro-2016/talk.ebook.pdf and b/presentations/arduino-intro-2016/talk.ebook.pdf differ diff --git a/presentations/arduino-intro-2016/talk.md b/presentations/arduino-intro-2016/talk.md index 203d7d6..4c6365b 100644 --- a/presentations/arduino-intro-2016/talk.md +++ b/presentations/arduino-intro-2016/talk.md @@ -7,7 +7,16 @@ lang: en-CA colorlinks: true ... -# Goals +## Goals + +By the end of this class, you'll: + + - Know how to create programs for Arduino and run them. + - Have learned about digital input and output, reading switches and + lighting LEDs + - Have created a *Whack-a-Mole* type game. + - Be prepared to follow Arduino tutorials online and continue + exploring. ## Unlondon @@ -55,17 +64,39 @@ Hacker, Church of the Weird Machine, Odd Duck \end{center} \end{columns} -## Raphael: The Vital Info +## Raphael: Day Job -- Manufacturing Engineer -- Instructor at Fanshawe -- Maker +Mechanical Engineer + + - Working in the medical device industry + - Experience in medical device R&D and Manufacturing + - Teaching SolidWorks CAD at Fanshawe + +## Raphael: The Fun Stuff + +Thinker, Jack of all Trades - Master of None + +\begin{columns}[c] +\column{0.50\textwidth} +\begin{itemize} + \item Arduino for Fun, and Odd Jobs + \item 3D Printer Hobbyist + \item PC Builder \& Gamer + \item Fish keeper +\end{itemize} +\column{0.50\textwidth} +\begin{center} +\includegraphics[width=0.80\textwidth]{images/rapha1.png} +\vspace{5mm} +\includegraphics[width=0.80\textwidth]{images/rapha2.png} +\end{center} +\end{columns} # What's in your kit? ## Kit Contents -- Arduino Uno R3 Clone +- Arduino Uno R3 - Solderless Breadboard - Connecting wires - LEDs @@ -82,14 +113,6 @@ It's a kit (on a board) with the bare minimum components to easily use the $\mu$ hardware. They do the basic, boring design needed for any board, so users only need to add the neat stuff. - - - - - - - - ## Arduino Software The Arduino folks also adapted an *Integrated Development Environment* @@ -99,27 +122,48 @@ their boards and then write the programs to the $\mu$C. \Large Get the Arduino IDE: [https://www.arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software) -## Installation + -\Large Get installing + # Circuit Basics ## Current -Current is the flow of charge through a circuit. Conventionally we -think of this as happening from HIGH ($+$) to LOW ($-$) +Current is the flow of charge through a circuit. Measured in Amperes +(\si{\ampere}). -## Voltage / Potential / Resistance +## Resistance / Impedance -Voltage is how fast the current can move in the circuit. River -metaphor: +Circuits have a resistance to current flow that depends on the parts +in the circuit. - - current = flow rate: ($\si{\liter\per\second}$) - - voltage = change in height: ($\si{\meter}$) - -Other devices in a circuit can impede / effect current flow. We'll -call them resistance(s). +Measured in Ohms (\si{\ohm}) + +## Voltage + +Voltage is a potential (akin to a pressure) pushing the current +through a circuit. Current is said to flow from higher (+) voltage +to lower (-) voltage. + +Measured in Volts (\si{\volt}) + +## Ohm's Law; Light + +Voltage, Current and Resistance are related to each other. + +- As voltage increases, current increases +- As voltage decreases, current decreases +- As resistance increases, current decreases +- As resistance decreases, current increases + +## \si{\volt}, \si{\ohm}, \si{\ampere}: The Water Analogy + +If charge were water, then: + + - resistance = obstacles blocking flow + - current = flow rate + - voltage = change in height *or* pressure. ## Diode @@ -159,8 +203,7 @@ call them resistance(s). \begin{itemize} \item \emph{Resists}/limits the flow of current -\item Needed for LEDs: $\approx\SI{400}{\ohm}$\\ -(safe for $\le\SI{6}{\volt}$) +\item Needed for LEDs: $\approx\SI{1000}{\ohm}$\\ \item Button Pull-up/down: $\ge\SI{10}{\kilo\ohm}$ \item Color coded, Google it \end{itemize} @@ -170,32 +213,6 @@ call them resistance(s). \end{columns} -## Ohm's Law - -Ohm's Law relates current to potential and resistance. - -$$ V = IR $$ -$$ I=\frac{V}{R} $$ -$$ R = \frac{V}{I} $$ - -* V = Potential in Volts (\si{\volt}) -* I = Current in Amperes (\si{\ampere}) -* R = Resistance in Ohms (\si{\ohm}) - -## Ohm's Law: Example - -The datasheet for an LED says that the maximum continuous current is -\SI{15}{\milli\ampere}. Your circuit operates at \SI{5}{\volt}\footnotemark[1]. How -big should your resistor be? - -$$ \si{\ohm} = \frac{\SI{5}{\volt}}{\SI{0.015}{\ampere}} = 333.\overline{3}\si{\ohm} $$ - -How much current for our *cheet sheet* value? - -$$ \si{\ampere} = \frac{\SI{5}{\volt}}{\SI{400}{\ohm}} = \SI{12.5}{\milli\ampere} $$ - -\footnotetext[1]{\tiny Actually, this calculation is inaccurate. LEDs will have a *forward voltage drop* of between \SI{300}{\milli\volt} and \SI{700}{\milli\volt} this should be subtracted from \si{\volt} above... but it's not critical.} - ## Buttons - Buttons connect _or_ disconnect two wires/parts @@ -331,19 +348,21 @@ will not flow and the LED is off. ## Your first Program ~~~ C +#define LED 13 + /* the setup function runs once on reset / power */ void setup() { - /* set pin 13 as an output */ - pinMode(13, OUTPUT); + pinMode(LED, OUTPUT); } -/* the loop function repeats forever */ +/* loop() repeats until reset or power off */ void loop() { - digitalWrite(13, HIGH); // turn on LED - delay(1000); // wait for a second - digitalWrite(13, LOW); // turn the off LED + digitalWrite(LED, HIGH); // turn on LED delay(1000); // wait for a second + digitalWrite(LED, LOW); // turn the off LED + delay(1000); } + ~~~ # Add Some Parts @@ -363,36 +382,13 @@ $\SI{5}{\volt}$ on the pin marked `5V`, the reference (GND) is marked ![Arduino + Breadboard](images/bb+uno.png) - - - - - - - - - - - - - - - - - - - - - - - -## Push Button: Hardware +## Buzzer & Button: Hardware \begin{center} -\includegraphics[width=0.98\textwidth]{images/bb+switch.png} +\includegraphics[width=0.98\textwidth]{images/buzzer-breadboard.png} \end{center} -## Push Button: Hardware, Pt. 2 +## Push Button: Zoom \begin{center} \includegraphics[width=0.98\textwidth]{images/bb+switch+zoom.png} @@ -411,18 +407,24 @@ is floating! Connect the pin to Vcc so that it reads High; use a resistor to prevent short circuit (limit current). -## Push Button: Software (Part 1) +## Buzzer: Zoom + +\begin{center} +\includegraphics[width=0.98\textwidth]{images/buzzer-zoom.png} +\end{center} + +## Buzzer / Button: Software (Part 1) ~~~ C #define BUTTON 2 -#define LED 13 +#define BUZZER 8 -int button_state = 0; +int button_state; void setup() { pinMode(BUTTON, INPUT); - pinMode(LED, OUTPUT); - digitalWrite(LED, LOW); /* Start w/ LED off */ + pinMode(BUZZER, OUTPUT); + digitalWrite(BUZZER, LOW); /* Start w/ LED off */ } ~~~ ## Programming Note: Variables @@ -430,7 +432,7 @@ void setup() { Declare a variable: ~~~ C -int delay_ms = 1000; +int button_state = HIGH; ~~~ ` [= ];` (value optional) @@ -438,15 +440,6 @@ int delay_ms = 1000; It's a name, like a preprocessor `#define`, but the value can change at *runtime* - - - - - - - - - ## Programming Note: *If* Statement ~~~ C @@ -469,16 +462,56 @@ In C-like languages, the `==` operator checks if two things - It returns `1` if the items are equal, *or* - It returns `0` if the items are not equal + +## Programming Note: Functions + +Functions make it easy to reuse code. You already know / use several +functions: + + - pinMode + - digitalWrite + - delay +digitalRead(pin number) returns HIGH or LOW depending on current state +of any **INPUT** pin. + +You can write your own functions! + +## Programming Note: Writing Functions + +~~~ C +void my_function(int arg1, ...) { + // Do fun things +} +~~~ + +void: +: Return type. Void means nothing returned. Can be any type. + +my_function: +: A name for your function + +arguments: +: A type and name for any parameters you want to use in your function +from the outside. + +Define a function once, you can use it again and again. Better than +copy/pasting. + + + ## Push Button: Software (Part 2) ~~~ C +void buzz(int ms) { + digitalWrite(BUZZER, HIGH); + delay(ms); + digitalWrite(BUZZER, LOW); +} void loop() { button_state = digitalRead(BUTTON); - if (button_state == HIGH) { - digitalWrite(LED, LOW); - } else { - digitalWrite(LED, HIGH); + if (button_state == LOW) { + buzz(100); } } ~~~ @@ -514,21 +547,24 @@ Connect center pin to `A0`, outer pins to ($+$) and ($-$) rails ## Pot Code -`analogRead(`*pin*`)` returns the current state of the pin (0--1023), -it can be assigned to a variable. +`analogRead(`*pin*`)` returns the voltage at the pin (0--1023), it can +be used directly or via variable. ~~~ C +#define LED 13 +void setup() { + pinMode(LED, OUTPUT); +} void loop() { - delay_ms = analogRead(A0); digitalWrite(LED, HIGH); - delay(delay_ms); + delay(analogRead(A0)); digitalWrite(LED, LOW); + delay(analogRead(A0)); } ~~~ -Each time through the loop, a new `delay_ms` value is read. Since the -subsequent delay calls use `delay_ms`, the blink rate changes with -knob position. +Since the delay() calls use the result of analogRead (0-1023), the +blink rate changes with knob position. # Shall we play a game? @@ -538,15 +574,21 @@ knob position. \includegraphics[width=0.65\textwidth]{images/bb+switch+pot+leds.png} \end{center} +## LEDs, the first one + Looks complicated, but for each LED: The short leg goes to ground, the long leg goes to one end of a resistor, and the other end of the resistor goes to the arduino pin. +\begin{center} +\includegraphics[width=0.55\textwidth]{images/one-led.png} +\end{center} + ## Programming Note: `for` Loop ~~~ C for ( initializer ; condition; increment ) { - // This body will repeat until condition != 0 + // This body will repeat while condition != 0 } ~~~ @@ -555,80 +597,117 @@ initializer variable. condition -: Loop will repeat until condition $\neq0$ +: Loop will repeat while condition is true ($\neq0$) increment : Runs *after* each loop. Often used to increment variables. \center{*All fields are optional*} -## Game Code: Part. 1; Cylon Attack +## Cylon Simulator: Part. 1; Pin Setup + +~~~ C +setup() { + pinMode(3, OUTPUT); + pinMode(4, OUTPUT); + pinMode(5, OUTPUT); + pinMode(6, OUTPUT); + pinMode(7, OUTPUT); +} +~~~ + +## Cylon Simulator: Part. 2 ~~~ C loop () { for (int i = 4; i <= 7; i++) { delay_ms = analogRead(A0); - analogWrite(i - 1, LOW); - analogWrite(i, HIGH); + digitalWrite(i - 1, LOW); + digitalWrite(i, HIGH); delay(delay_ms); } for (int i = 6; i >= 3; i--) { delay_ms = analogRead(A0); - analogWrite(i + 1, LOW); - analogWrite(i, HIGH); + digitalWrite(i + 1, LOW); + digitalWrite(i, HIGH); delay(delay_ms); } } ~~~ -## Programming Note: Functions +## Programming Note: `while` Loop ~~~ C -void my_function(int arg1, ...) { - // Do fun things +while ( statement ) { + // This body will repeat while condition is true + // True means statement != 0 } ~~~ -void: -: Return type. Void means nothing returned. Can be any type. +initializer +: Executed once at beginning of loop. Often used to declare a local +variable. -my_function: -: A name for your function +condition +: Loop will repeat while condition is true ($\neq0$) -arguments: -: A type and name for any parameters you want to use in your function -from the outside. +increment +: Runs *after* each loop. Often used to increment variables. -Define a function once, you can use it again and again. Beats -copy/pasting. +\center{*All fields are optional*} ## Winner, Winner, Chicken Dinner ~~~ C +#define WINNER 5 void check_delay(int cur_led, int delay_ms) { - if (cur_led != 5) { // No chance of winner - delay(delay_ms); // Do a normal delay - return; - } - int start = millis(); + unsigned long start = millis(); while (millis() < start+delay_ms) { if (digitalRead(BUTTON) == LOW) { - for (int i = 3; i <= 7; i++) { - digitalWrite(i, HIGH); - }; for (;;); // Loop until reset - } + if (cur_led == WINNER) { + do_winner(); + } else { + while (digitalRead(BUTTON) == LOW) { + do_loser(); + } + } + } } } ~~~ +## More functions, pt. 1 +~~~ C +void set_all_leds(int state) { + for (int i = 3; i <= 7; i++) { + digitalWrite(i, state); + } +} + +void do_loser(void) { + buzz(500); +} +~~~ + +## More functions, pt. 2 +~~~ C +void do_winner(void) { + set_all_leds(HIGH); + buzz(100); + delay(100); + buzz(100); + set_all_leds(LOW); +} +~~~ + ## Putting it Together ~~~ C loop () { for (int i = 4; i <= 7; i++) { delay_ms = analogRead(A0); - analogWrite(i - 1, LOW); - analogWrite(i, HIGH); + digitalWrite(i - 1, LOW); + digitalWrite(i, HIGH); check_delay(i, delay_ms); } for (int i = 6; i >= 3; i--) { @@ -638,8 +717,89 @@ loop () { } ~~~ -## The End? +# The End? -\begin{center} -\LARGE{Let's build some cool stuff!} -\end{center} +# Extra Credit +## Ohm's Law + +Ohm's Law relates current to potential and resistance. + +$$ V = IR $$ +$$ I=\frac{V}{R} $$ +$$ R = \frac{V}{I} $$ + +* V = Potential in Volts (\si{\volt}) +* I = Current in Amperes (\si{\ampere}) +* R = Resistance in Ohms (\si{\ohm}) + +## Ohm's Law: Example + +The datasheet for an LED says that the maximum continuous current is +\SI{15}{\milli\ampere}. Your circuit operates at \SI{5}{\volt}\footnotemark[1]. How +big should your resistor be? + +$$ \si{\ohm} = \frac{\SI{5}{\volt}}{\SI{0.015}{\ampere}} = 333.\overline{3}\si{\ohm} $$ + +How much current for our *cheet sheet* value? + +$$ \si{\ampere} = \frac{\SI{5}{\volt}}{\SI{1}{\kilo\ohm}} = \SI{5}{\milli\ampere} $$ + +\footnotetext[1]{\tiny Actually, this calculation is inaccurate. LEDs +will have a *forward voltage drop* of between \SI{1.8}{\volt} and +\SI{3.3}{\volt} this should be subtracted from \si{\volt} above... but +it's not critical.} + +## Current Limits, Arduino + +- No single pin should source more that \SI{20}{\milli\ampere} (\SI{40}{\milli\ampere} is absolute max) +- Pins are ganged together in groups of 8, no group should source more + than \SI{150}{\milli\ampere} total +- The whole board cannot source more than \SI{200}{\milli\ampere} total + +Practically speaking, this means that the Arduino cannot drive +speakers, most motors, or anything normally mains powered. + +## So\ldots no Arduino smart blender? + +You can control almost anything with an arduino, you just can't power +it with the Arduino. There are various devices that let you switch +highier powered devices: + + - Transistors + - Relays + - Solid State Relays + - Triac + +## HIGHs and LOWs + +Many different logic levels are in common use: \SI{1.2}{\volt}, +\SI{1.8}{\volt}, \SI{2.5}{\volt}, \SI{3.3}{\volt}, and +\SI{5}{\volt}. The voltage cited is the *nominal* Vcc of the system. + +A HIGH signal is generally any voltage $\geq \frac{2}{3}V_{cc}$. + +A LOW signal is generally any voltage $\leq \frac{1}{3}V_{cc}$. + +## HIGHs and LOWs, pt. 2 + +In your travels, you're likely to see both \SI{5}{\volt} and +\SI{3.3}{\volt} sensors and peripherals. + +Since $\SI{3.3}{\volt}\geq\frac{2}{3}V_cc$ your Arduino will accept +input from a \SI{3.3}{\volt} peripheral without issue. + +If you drive an output to \SI{5}{\volt} while it's connected to a +\SI{3.3}{\volt} peripheral with an Arduino **it will blow up your +peripheral**.^[In the datasheet for the sensor, it'll have a +section called *Absolute Maximums*. Generally \SI{3.3}{\volt} parts +won't accept more that $\approx\SI{3.6}{\volt}$, but some will.] + +## HIGHs and LOWs, pt. 3 + +Solutions: + + - Level Shifter: A dedicated chip that translates between + voltages. Available as uni or bidirectional. + + - Buy a 3.3V Arduino Compatible. Arduinos are available that operate + at the lower voltage. diff --git a/presentations/arduino-intro-2016/talk.pdf b/presentations/arduino-intro-2016/talk.pdf index 21b603c..67cce0b 100644 Binary files a/presentations/arduino-intro-2016/talk.pdf and b/presentations/arduino-intro-2016/talk.pdf differ diff --git a/presentations/arduino-intro-2016/talk.pdfpc b/presentations/arduino-intro-2016/talk.pdfpc index 7aaea59..5cf3c88 100644 --- a/presentations/arduino-intro-2016/talk.pdfpc +++ b/presentations/arduino-intro-2016/talk.pdfpc @@ -10,4 +10,4 @@ Giant Trackball Katamari Damacy Sphero Mini-Golf Mind Controlled Robot Painting ### 13 -Yarn Grid + Projector = Three Dimentional moving lights. +Yarn Grid + Projector = Three Dimentional moving lights. \ No newline at end of file diff --git a/sketchbook/blink/blink.ino b/sketchbook/blink/blink.ino new file mode 100644 index 0000000..084e47c --- /dev/null +++ b/sketchbook/blink/blink.ino @@ -0,0 +1,12 @@ +#define LED 13 + +void setup() { + pinMode(LED, OUTPUT); +} + +void loop() { + digitalWrite(LED, HIGH); // turn on LED + delay(1000); // wait for a second + digitalWrite(LED, LOW); // turn the off LED + delay(1000); +} diff --git a/sketchbook/buzz/buzz.ino b/sketchbook/buzz/buzz.ino new file mode 100644 index 0000000..0ece514 --- /dev/null +++ b/sketchbook/buzz/buzz.ino @@ -0,0 +1,22 @@ +#define BUZZER 8 +#define BUTTON 2 + +int button_state; + +void setup() { + pinMode(BUTTON, INPUT); + pinMode(BUZZER, OUTPUT); +} +void buzz(int ms) { + digitalWrite(BUZZER, HIGH); + delay(ms); + digitalWrite(BUZZER, LOW); +} + +void loop() { + button_state = digitalRead(BUTTON); + if (button_state == LOW) { + buzz(100); + } +} + diff --git a/sketchbook/cylon/cylon.ino b/sketchbook/cylon/cylon.ino new file mode 100644 index 0000000..3920fdf --- /dev/null +++ b/sketchbook/cylon/cylon.ino @@ -0,0 +1,24 @@ +int delay_ms; + +void setup() { + pinMode(3, OUTPUT); + pinMode(4, OUTPUT); + pinMode(5, OUTPUT); + pinMode(6, OUTPUT); + pinMode(7, OUTPUT); +} + +void loop() { + for (int i = 4; i <= 7; i++) { + delay_ms = analogRead(A0); + digitalWrite(i - 1, LOW); + digitalWrite(i, HIGH); + delay(delay_ms); + } + for (int i = 6; i >= 3; i--) { + delay_ms = analogRead(A0); + digitalWrite(i + 1, LOW); + digitalWrite(i, HIGH); + delay(delay_ms); + } +} diff --git a/sketchbook/variable-blink/variable-blink.ino b/sketchbook/variable-blink/variable-blink.ino new file mode 100644 index 0000000..01f5b34 --- /dev/null +++ b/sketchbook/variable-blink/variable-blink.ino @@ -0,0 +1,15 @@ +#define LED 13 +void setup() { + pinMode(LED, OUTPUT); +} +void loop() { + digitalWrite(LED, HIGH); + delay(analogRead(A0)); + digitalWrite(LED, LOW); + delay(analogRead(A0)); +} + +void buzz(int ms) { + return; +} + diff --git a/sketchbook/whack-a-mole/whack-a-mole.ino b/sketchbook/whack-a-mole/whack-a-mole.ino new file mode 100644 index 0000000..c1007f4 --- /dev/null +++ b/sketchbook/whack-a-mole/whack-a-mole.ino @@ -0,0 +1,69 @@ +#define BUTTON 2 +#define BUZZER 8 +#define WINNER 5 + +int delay_ms; + +void setup() { + pinMode(BUTTON, INPUT); + pinMode(3, OUTPUT); + pinMode(4, OUTPUT); + pinMode(5, OUTPUT); + pinMode(6, OUTPUT); + pinMode(7, OUTPUT); + pinMode(BUZZER, OUTPUT); +} + +void buzz(int ms) { + digitalWrite(BUZZER, HIGH); + delay(ms); + digitalWrite(BUZZER, LOW); +} + +void set_all_leds(int state) { + for (int i = 3; i <= 7; i++) { + digitalWrite(i, state); + } +} + +void do_winner(void) { + set_all_leds(HIGH); + buzz(100); + delay(100); + buzz(100); + set_all_leds(LOW); +} + +void do_loser(void) { + buzz(500); +} + +void check_delay(int cur_led, int delay_ms) { + unsigned long start = millis(); + while (millis() < start+delay_ms) { + if (digitalRead(BUTTON) == LOW) { + if (cur_led == WINNER) { + do_winner(); + } else { + while (digitalRead(BUTTON) == LOW) { + do_loser(); + } + } + } + } +} + +void loop() { + for (int i = 4; i <= 7; i++) { + delay_ms = analogRead(A0); + digitalWrite(i - 1, LOW); + digitalWrite(i, HIGH); + check_delay(i, delay_ms); + } + for (int i = 6; i >= 3; i--) { + delay_ms = analogRead(A0); + digitalWrite(i + 1, LOW); + digitalWrite(i, HIGH); + check_delay(i, delay_ms); + } +}