Introduction to Arduino and Circuits

Preview:

DESCRIPTION

Workshop I delivered at Code4LibDC Unconference 2014 on open hardware and arduino for libraries and archives.

Citation preview

Intro to ArduinoThe Basics of Open Hardware and Circuits

Jason Griffey Evenly Distributed LLC

http://evenlydistributed.net

Code4LibDC 2014

SSID: LibraryBox - Free Content!

Folder: Code4LibDC

http://librarybox.us

Connect to wifi signal, then launch/refresh any browser

Software install?

Let’s Plug In

Open Source Hardware

Moore’s Law

Photo by Marcin Wichary - http://flic.kr/p/4v4DSq

Koomey’s Law

Photo by LisaW123 - http://flic.kr/p/7eiqaq

Photo by sobczak.paul - http://flic.kr/p/aDD8ep

Arduino

Photo by bjepson - http://flic.kr/p/8EVHqm

Why Arduino?

Open Hardware

Photo by dam - http://flic.kr/p/8hLXBM

Photo by dam - http://flic.kr/p/8hLXwT

Photo by dam - http://flic.kr/p/8hQcJs

Photo by dam - http://flic.kr/p/8hQcDG

Photo by dam - http://flic.kr/p/8hQcDG

Photo by Nathan Chantrell - http://flic.kr/p/aALqhd

Photo by Nathan Chantrell - http://flic.kr/p/aALqhd

Photo by antonw - http://flic.kr/p/91daJe

Shields

A La Mode

http://learn.adafruit.com/system/assets/assets/000/000/426/original/FSR402_MED.jpg?1340650766

Sensors

Arduino Software

Our Hardware

Fritzing

ArduinoIDE

Our Sketch

int val; !void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); Serial.begin(9600); } !void loop() { Serial.println(analogRead(0)); val = analogRead(0); !if (val > 256) digitalWrite(2,HIGH); if (val < 256) digitalWrite(2,LOW); if (val > 512) digitalWrite(3,HIGH); if (val < 512) digitalWrite(3,LOW); !if (val > 768) digitalWrite(4,HIGH); if (val < 768) digitalWrite(4,LOW); !if (val > 769) digitalWrite(5,HIGH); if (val < 1020) digitalWrite(5,LOW); }

Globals

Setup

Loop

int val; !void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); Serial.begin(9600); } !void loop() { Serial.println(analogRead(0)); val = analogRead(0); !if (val > 256) digitalWrite(2,HIGH); if (val < 256) digitalWrite(2,LOW); if (val > 512) digitalWrite(3,HIGH); if (val < 512) digitalWrite(3,LOW); !if (val > 768) digitalWrite(4,HIGH); if (val < 768) digitalWrite(4,LOW); !if (val > 769) digitalWrite(5,HIGH); if (val < 1020) digitalWrite(5,LOW); }

Globals

Setup

Loop

int val; !void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); Serial.begin(9600); } !void loop() { Serial.println(analogRead(0)); val = analogRead(0); !if (val > 256) digitalWrite(2,HIGH); if (val < 256) digitalWrite(2,LOW); if (val > 512) digitalWrite(3,HIGH); if (val < 512) digitalWrite(3,LOW); !if (val > 768) digitalWrite(4,HIGH); if (val < 768) digitalWrite(4,LOW); !if (val > 769) digitalWrite(5,HIGH); if (val < 1020) digitalWrite(5,LOW); }

Globals

Setup

Loop

int val; !void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); Serial.begin(9600); } !void loop() { Serial.println(analogRead(0)); val = analogRead(0); !if (val > 256) digitalWrite(2,HIGH); if (val < 256) digitalWrite(2,LOW); if (val > 512) digitalWrite(3,HIGH); if (val < 512) digitalWrite(3,LOW); !if (val > 768) digitalWrite(4,HIGH); if (val < 768) digitalWrite(4,LOW); !if (val > 769) digitalWrite(5,HIGH); if (val < 1020) digitalWrite(5,LOW); }

Globals

Setup

Loop

Can you:

Can you:

• Change one of the Pin Numbers?

Can you:

• Change one of the Pin Numbers?

• Re-wire the ground wires?

Can you:

• Change one of the Pin Numbers?

• Re-wire the ground wires?

• Change the order the LEDs light up?

Can you:

• Change one of the Pin Numbers?

• Re-wire the ground wires?

• Change the order the LEDs light up?

• Light up 2 LEDs at once?

Can you:

• Change one of the Pin Numbers?

• Re-wire the ground wires?

• Change the order the LEDs light up?

• Light up 2 LEDs at once?

• Add another LED?

Can you:

• Change one of the Pin Numbers?

• Re-wire the ground wires?

• Change the order the LEDs light up?

• Light up 2 LEDs at once?

• Add another LED?

• Swap the sensor?

Structure/* Each Arduino sketch must contain the following two functions. */void setup(){/* this code runs once at the beginning of the code execution. */}void loop(){/* this code runs repeatedly over and over as long as the board is powered. */}

Comments// this is a single line/* this isa multiline */

SetuppinMode(pin, [INPUT \ OUTPUT \ INPUT_PULLUP]);/* Sets the mode of the digital I/O pin. It can be set as an input, output, or an input with an internal pull-up resistor. */

Control Structuresif(condition){// if condition is TRUE, do something here}else{// otherwise, do this}

for(initialization; condition; increment){// do this}/* The ‘for’ statement is used to repeat a block of statements enclosed in curly braces. An increment counter is usually used to increment and terminate the loop. */

Digital I/OdigitalWrite(pin, val); /* val = HIGH or LOW. Sets the digital pin to either ON or OFF. */int var = digitalRead(pin);/* Reads the voltage from a digital pin. Returns either HIGH or LOW. */int var = digitalRead(pin);/* Reads the value from a specified digital pin, either HIGH or LOW. */

Analog I/OanalogWrite(pin, val); /* Writes an analog voltage to a pin.val = integer value from 0 to 255 */int var = analogRead(pin);/* Reads the voltage from the specified analog pin. */int var = analogRead(pin);/* Reads the value from the specified analog pin. */

Timedelay(time_ms);/* Pauses the program for the amount of time (in milliseconds). */delayMicroseconds(time_us);/* Pauses the program for the amount of time (in microseconds). */millis();/* Returns the number of milliseconds since the board began running the current program. max: 4,294,967,295 */micros();/* Returns the number of microseconds since the board began running the current program. max: 4,294,967,295 */

Serial CommunicationSerial.begin(baudrate);/* Sets the data rate in bits per second (baud) for serial data transmission. */Serial.print("");/* Sets the data rate in bits per second (baud) for serial data transmission. */Serial.print("Hello World!!");/* Sends a string "Hello World!!" to the serial bus. This will be seen on the Serial Monitor in Arduino. */Serial.println("Hello World!");/* Identical to Serial.print(), but this also adds a carriage-return / line-feed to advance to the next line. */Serial.println("");/* Identical to Serial.print(), but this also adds a carriage-return / line-feed to advance to the next line. */boolean Serial.available()/* Serial.available() returns TRUE if there is data available on the Serial bus. */int Serial.read();/* Returns a single byte of data available from the Serial buffer. */int Serial.read();/* Returns a single byte of data available from the Serial buffer. */

Data Typesvoid // nothing is returnedboolean // 0, 1, false, truechar // 8 bits: ASCII characterbyte // 8 bits: 0 to 255, unsignedint // 16 bits: 32,768 to 32,767, signedlong /* 32 bits: 2,147,483,648 to 2,147,483,647, signed */float // 32 bits, signed decimal

ConstantsHIGH \ LOWINPUT \ OUTPUTtrue \ false

Mathematical Operators= // assignment+ // addition- // subtraction* // multiplication/ // division% // modulus

Logical Operators== // boolean equal to!= // not equal to< // less than> // greater than<= // less than or equal to>= // greater than or equal to&& // Boolean AND|| // Boolean OR! // Boolean NOT

Bitwise Operators& // bitwise AND| // bitwise OR^ // bitwise XOR~ // bitwise INVERTvar << n // bitwise shift left by n bitsvar >> n // bitwise shift right by n bits

Libraries#include <libraryname.h>/* this provides access to special additional functions for things such as servo motors, SD card, wifi, or bluetooth. */

Advanced I/Otone(pin, freq);/* Generates a square wave of the specified frequency to a pin. Pin must be one of the PWM (~) pins. */tone(pin, freq, duration);/* Generates a square wave of the specified frequency to a pin for a duration in milliseconds. Pin must be one of the PWM (~) pins. */noTone(pin);// Turns off the tone on the pin.

LilyPad ProtoSnap Simple:

RedBoard:

ATmega328Microcontroller

TemperatureSensor(Pin A1)

Button(Pin A5)

Vibe Motor(Pin 3)

RGB LED(Pins R=9,G=11, B=10)

Switch(Pin 2)

LightSensor(Pin A6)

Buzzer/Speaker(Pin 7)

LEDs(Light Emitting Diodes)(Pins 5, 6, A2, A4, A3)

Power In

Power5V / 3.3 / GND

USB to ComputerReset

AnalogInputs

SCL/SDA(I2C Bus)

ATmega328Microcontroller

Digital I/OPWM(3,5,6,9,10,11)

Building Your Own Hardware

Patron Counters

$300

$280

Build One Yourself

Build One Yourself

• Arduino - $35

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

• Sensor (infrared, laser tripwire, ultrasonic, or PID) - $10

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

• Sensor (infrared, laser tripwire, ultrasonic, or PID) - $10

• TOTAL COST - $70

Temperature/Humidity Loggers

$240

$415

Build One Yourself

Build One Yourself

• Arduino - $35

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

• Temperature/Humidity Sensor - $5-10

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

• Temperature/Humidity Sensor - $5-10

• LCD Display screen - $15

Build One Yourself

• Arduino - $35

• Data Logger Shield - $20

• SD Card - $10

• Temperature/Humidity Sensor - $5-10

• LCD Display screen - $15

• TOTAL COST - $85

Other Possibilities

Other Possibilities

• RFID Reader

Other Possibilities

• RFID Reader

• Barcode Scanner

Other Possibilities

• RFID Reader

• Barcode Scanner

• Seat usage detector

Other Possibilities

• RFID Reader

• Barcode Scanner

• Seat usage detector

• What else?

Go Build Stuff!

Email: griffey@gmail.com

Site: jasongriffey.net

gVoice: 423-443-4770

Twitter: @griffey

http://librarybox.us

http://evenlydistributed.net

!Founder & Principal Consultant

Evenly Distributed LLChttp://pinboard.in/u:griffey/

Jason Griffey