Arduino Cookbook



Arduino Cookbook                                    Download



Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
1. Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Installing the Integrated Development Environment (IDE) 4
1.2 Setting Up the Arduino Board 6
1.3 Using the Integrated Development Environment (IDE) to Prepare
an Arduino Sketch 8
1.4 Uploading and Running the Blink Sketch 11
1.5 Creating and Saving a Sketch 13
1.6 Using Arduino 15
2. Making the Sketch Do Your Bidding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1 Structuring an Arduino Program 20
2.2 Using Simple Primitive Types (Variables) 21
2.3 Using Floating-Point Numbers 23
2.4 Working with Groups of Values 25
2.5 Using Arduino String Functionality 28
2.6 Using C Character Strings 30
2.7 Splitting Comma-Separated Text into Groups 32
2.8 Converting a Number to a String 34
2.9 Converting a String to a Number 36
2.10 Structuring Your Code into Functional Blocks 38
2.11 Returning More Than One Value from a Function 41
2.12 Taking Actions Based on Conditions 44
2.13 Repeating a Sequence of Statements 45
2.14 Repeating Statements with a Counter 47
2.15 Breaking Out of Loops 49
2.16 Taking a Variety of Actions Based on a Single Variable 50
2.17 Comparing Character and Numeric Values 52
2.18 Comparing Strings 54
2.19 Performing Logical Comparisons 55
2.20 Performing Bitwise Operations 56
2.21 Combining Operations and Assignment 58
3. Using Mathematical Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.1 Adding, Subtracting, Multiplying, and Dividing 61
3.2 Incrementing and Decrementing Values 62
3.3 Finding the Remainder After Dividing Two Values 63
3.4 Determining the Absolute Value 64
3.5 Constraining a Number to a Range of Values 65
3.6 Finding the Minimum or Maximum of Some Values 66
3.7 Raising a Number to a Power 67
3.8 Taking the Square Root 68
3.9 Rounding Floating-Point Numbers Up and Down 68
3.10 Using Trigonometric Functions 69
3.11 Generating Random Numbers 70
3.12 Setting and Reading Bits 72
3.13 Shifting Bits 75
3.14 Extracting High and Low Bytes in an int or long 77
3.15 Forming an int or long from High and Low Bytes 78
4. Serial Communications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.1 Sending Debug Information from Arduino to Your Computer 86
4.2 Sending Formatted Text and Numeric Data from Arduino 89
4.3 Receiving Serial Data in Arduino 92
4.4 Sending Multiple Text Fields from Arduino in a Single Message 95
4.5 Receiving Multiple Text Fields in a Single Message in Arduino 98
4.6 Sending Binary Data from Arduino 101
4.7 Receiving Binary Data from Arduino on a Computer 105
4.8 Sending Binary Values from Processing to Arduino 107
4.9 Sending the Value of Multiple Arduino Pins 109
4.10 How to Move the Mouse Cursor on a PC or Mac 112
4.11 Controlling Google Earth Using Arduino 115
4.12 Logging Arduino Data to a File on Your Computer 121
4.13 Sending Data to Two Serial Devices at the Same Time 124
4.14 Receiving Serial Data from Two Devices at the Same Time 128
4.15 Setting Up Processing on Your Computer to Send
and Receive Serial Data 131
5. Simple Digital and Analog Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.1 Using a Switch 136
5.2 Using a Switch Without External Resistors 139
5.3 Reliably Detecting the Closing of a Switch 141
5.4 Determining How Long a Switch Is Pressed 144
5.5 Reading a Keypad 149
5.6 Reading Analog Values 152
5.7 Changing the Range of Values 154
5.8 Reading More Than Six Analog Inputs 155
5.9 Displaying Voltages Up to 5V 158
5.10 Responding to Changes in Voltage 161
5.11 Measuring Voltages More Than 5V (Voltage Dividers) 162
6. Getting Input from Sensors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
6.1 Detecting Movement 167
6.2 Detecting Light 170
6.3 Detecting Motion (Integrating Passive Infrared Detectors) 171
6.4 Measuring Distance 173
6.5 Measuring Distance Accurately 176
6.6 Detecting Vibration 180
6.7 Detecting Sound 181
6.8 Measuring Temperature 185
6.9 Reading RFID Tags 187
6.10 Tracking the Movement of a Dial 190
6.11 Tracking the Movement of More Than One Rotary Encoder 193
6.12 Tracking the Movement of a Dial in a Busy Sketch 195
6.13 Using a Mouse 197
6.14 Getting Location from a GPS 201
6.15 Detecting Rotation Using a Gyroscope 206
6.16 Detecting Direction 208
6.17 Getting Input from a Game Control Pad (PlayStation) 211
6.18 Reading Acceleration 213
7. Visual Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
7.1 Connecting and Using LEDs 220
7.2 Adjusting the Brightness of an LED 223
7.3 Driving High-Power LEDs 224
7.4 Adjusting the Color of an LED 226
7.5 Sequencing Multiple LEDs: Creating a Bar Graph 229
7.6 Sequencing Multiple LEDs: Making a Chase Sequence (Knight
Rider) 232
7.7 Controlling an LED Matrix Using Multiplexing 234
7.8 Displaying Images on an LED Matrix 236
7.9 Controlling a Matrix of LEDs: Charlieplexing 239
7.10 Driving a 7-Segment LED Display 245
7.11 Driving Multidigit, 7-Segment LED Displays: Multiplexing 248
7.12 Driving Multidigit, 7-Segment LED Displays Using MAX7221 Shift
Registers 250
7.13 Controlling an Array of LEDs by Using MAX72xx Shift Registers 253
7.14 Increasing the Number of Analog Outputs Using PWM Extender
Chips (TLC5940) 255
7.15 Using an Analog Panel Meter As a Display 259
8. Physical Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
8.1 Controlling the Position of a Servo 264
8.2 Controlling One or Two Servos with a Potentiometer
or Sensor 266
8.3 Controlling the Speed of Continuous Rotation Servos 267
8.4 Controlling Servos from the Serial Port 269
8.5 Driving a Brushless Motor (Using a Hobby Speed Controller) 271
8.6 Controlling Solenoids and Relays 272
8.7 Making an Object Vibrate 273
8.8 Driving a Brushed Motor Using a Transistor 276
8.9 Controlling the Direction of a Brushed Motor
with an H-Bridge 277
8.10 Controlling the Direction and Speed of a Brushed Motor with an
H-Bridge 280
8.11 Using Sensors to Control the Direction and Speed of Brushed
Motors (L293 H-Bridge) 282
8.12 Driving a Bipolar Stepper Motor 287
8.13 Driving a Bipolar Stepper Motor (Using the EasyDriver Board) 290
8.14 Driving a Unipolar Stepper Motor (ULN2003A) 293
9. Audio Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
9.1 Playing Tones 299
9.2 Playing a Simple Melody 301
9.3 Generating More Than One Simultaneous Tone 303
9.4 Generating Audio Tones and Fading an LED 305
9.5 Playing a WAV File 308
9.6 Controlling MIDI 311
9.7 Making an Audio Synthesizer 314
10. Remotely Controlling External Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
10.1 Responding to an Infrared Remote Control 318
10.2 Decoding Infrared Remote Control Signals 321
10.3 Imitating Remote Control Signals 324
10.4 Controlling a Digital Camera 327
10.5 Controlling AC Devices by Hacking a Remote Controlled Switch 330
11. Using Displays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
11.1 Connecting and Using a Text LCD Display 334
viii |
11.2 Formatting Text 337
11.3 Turning the Cursor and Display On or Off 340
11.4 Scrolling Text 342
11.5 Displaying Special Symbols 345
11.6 Creating Custom Characters 347
11.7 Displaying Symbols Larger Than a Single Character 349
11.8 Displaying Pixels Smaller Than a Single Character 352
11.9 Connecting and Using a Graphical LCD Display 355
11.10 Creating Bitmaps for Use with a Graphical Display 359
11.11 Displaying Text on a TV 361
12. Using Time and Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
12.1 Creating Delays 367
12.2 Using millis to Determine Duration 368
12.3 More Precisely Measuring the Duration of a Pulse 372
12.4 Using Arduino As a Clock 373
12.5 Creating an Alarm to Periodically Call a Function 380
12.6 Using a Real-Time Clock 384
13. Communicating Using I2C and SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
13.1 Controlling an RGB LED Using the BlinkM Module 392
13.2 Using the Wii Nunchuck Accelerometer 397
13.3 Interfacing to an External Real-Time Clock 401
13.4 Adding External EEPROM Memory 404
13.5 Reading Temperature with a Digital Thermometer 408
13.6 Driving Four 7-Segment LEDs Using Only Two Wires 412
13.7 Integrating an I2C Port Expander 416
13.8 Driving Multidigit, 7-Segment Displays Using SPI 418
13.9 Communicating Between Two or More Arduino Boards 421
14. Wireless Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
14.1 Sending Messages Using Low-Cost Wireless Modules 425
14.2 Connecting Arduino to a ZigBee or 802.15.4 Network 431
14.3 Sending a Message to a Particular XBee 438
14.4 Sending Sensor Data Between XBees 440
14.5 Activating an Actuator Connected to an XBee 446
15. Ethernet and Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
15.1 Setting Up the Ethernet Shield 453
15.2 Obtaining Your IP Address Automatically 455
15.3 Resolving Hostnames to IP Addresses (DNS) 458
15.4 Requesting Data from a Web Server 462
15.5 Requesting Data from a Web Server Using XML 466
15.6 Setting Up an Arduino to Be a Web Server 469
15.7 Handling Incoming Web Requests 471
15.8 Handling Incoming Requests for Specific Pages 474
15.9 Using HTML to Format Web Server Responses 479
15.10 Serving Web Pages Using Forms (POST) 483
15.11 Serving Web Pages Containing Large Amounts of Data 486
15.12 Sending Twitter Messages 493
15.13 Sending and Receiving Simple Messages (UDP) 496
15.14 Getting the Time from an Internet Time Server 502
15.15 Monitoring Pachube Feeds 507
15.16 Sending Information to Pachube 510
16. Using, Modifying, and Creating Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
16.1 Using the Built-in Libraries 515
16.2 Installing Third-Party Libraries 517
16.3 Modifying a Library 518
16.4 Creating Your Own Library 522
16.5 Creating a Library That Uses Other Libraries 527
17. Advanced Coding and Memory Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
17.1 Understanding the Arduino Build Process 532
17.2 Determining the Amount of Free and Used RAM 535
17.3 Storing and Retrieving Numeric Values in Program Memory 537
17.4 Storing and Retrieving Strings in Program Memory 540
17.5 Using #define and const Instead of Integers 542
17.6 Using Conditional Compilations 543
18. Using the Controller Chip Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
18.1 Storing Data in Permanent EEPROM Memory 551
18.2 Using Hardware Interrupts 554
18.3 Setting Timer Duration 557
18.4 Setting Timer Pulse Width and Duration 559
18.5 Creating a Pulse Generator 562
18.6 Changing a Timer’s PWM Frequency 565
18.7 Counting Pulses 567
18.8 Measuring Pulses More Accurately 569
18.9 Measuring Analog Values Quickly 571
18.10 Reducing Battery Drain 572
18.11 Setting Digital Pins Quickly 574
A. Electronic Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
B. Using Schematic Diagrams and Data Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
C. Building and Connecting the Circuit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
D. Tips on Troubleshooting Software Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
E. Tips on Troubleshooting Hardware Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
F. Digital and Analog Pins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
G. ASCII and Extended Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Table of