introduction to arduino and circuits
DESCRIPTION
Workshop I delivered at Code4LibDC Unconference 2014 on open hardware and arduino for libraries and archives.TRANSCRIPT
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
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
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: [email protected]
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