Introduction to programming using Arduino

From XinCheJian
Jump to navigation Jump to search

Introduction

Requirements

  • Laptop computer (Mac OS X, Windows, Linux)
  • Arduino microcontroller and USB cable
  • Arduino environment installed - Go here for download links Arduino IDE

Overview of this guide

  • How a computer (or microcontroller like the Arduino) work
  • Human languages versus computer languages
  • Input/Output
  • Arduino basic program layout
  • Compilation and Deployment
  • Comments
  • Boolean logic
  • Logic structure (if) and
  • Strings and numbers representation
  • Variables and datatypes
  • Subroutine and functions
  • Libraries


How Computers Work

  • Computers process instructions (also called programs or code).
    • This code has to be precise.
    • Computers can process many instructions very quickly.
    • How quickly? Even these little Arduinos can run 16 million instructions every second!
    • We will program in a high level language. This is more powerful, but slower. (Still very fast!)
  • Memory is where we store instructions and data. There are 3 types of memory.
  • Input is where we acquire data
  • Output is where we send data or control a device
  • Compiling is converting the instructions from human readable text format to machine readable binary
  • Uploading is loading this binary code into the Arduino
  • Some programming terms:
   Comments
   Datatypes 
   Boolean logic
   Strings and numbers representation
   Variables
   Logic structure (if) (there are others we will get to as well)
   Subroutine and functions
   Libraries 


Arduinos

Safety Notice

  • Watch out - sharp bits
  • Take care when connected - don't short on metal or wires...
  • Static care


Intro to Arduino GUI Software

See Arduino IDE for pictures.

  • Compiling
  • Uploading
  • Help - reference

The Bare Minimum Arduino Program

You can find all of these examples inside the Arduino IDE.

  • Arduino IDE > File > Examples > Basics > BareMinimum.

This program does... nothing! But it will compile and it will run.

/*
 * My first program
 */
void setup() 
  {
  // put your setup code here, to run once
  }

void loop() 
  {
  // put your main code here, to run repeatedly
  }

CONCEPT: Functions:

  • SETUP is a function that is always run once
  • LOOP is a function that is run over and over

Functions are the same as mathematical functions

  • For example: sin(x) is a function that takes a number x and returns the sin value of it.
  • The empty parenthesis () means that it does not take any parameters
  • VOID means that it does not return anything

CONCEPT: Comments

  • Comments are there to help the programmer document (explain) his own code.
  • Comments are ignored by the computer.
  • Lines block that start with /* and end with */ are multiline comments
  • Lines starting with // are comments

CONCEPT: Curly Braces

  • The inside of the two { } blocks are the definition of what the functions do.

CONCEPT: Compilation

  • Turning your human readable text into machine readable binary code.

CONCEPT: Upload

  • Pushing your binary to the Arduino.


Do it!

  • Compile and upload the program above. What outputs do you observe?
  • Add your name in the top-file multiline comment
  • Add an empty function named 'hello'. Add a comment on what you think this function should do


Your First Output: PRINTLN

void setup() {
  Serial.begin(9600);
  Serial.println(F("My name is ..."));
}

void loop() {
}

NOTE: Semi-colons ";"

  • Every instruction line (calls to functions, definition of variables) end up with a semi-colon (;)


Do it!

  • Modify the string to add your own name
  • Add a print out of a short description of yourself


Your First Subroutine

void setup() {
  Serial.begin(9600);
  output_name();
}

void loop() {
}


void output_name() {
  Serial.println(F("My name is ..."));
}


Do it!

  • Add a second function called output_age and call it from loop
  • Do two calls to output_name() and one call to output_age()
    • What do you observe?
  • Move output_name() to inside output_age()
    • Is the behavior the same?
  • Move the function calls to loop()
    • What is the difference in the behavior?


Your First Variable

void setup() {
  Serial.begin(9600);
  int age = 21;
  Serial.print(F("My age is "));
  Serial.println(age);
}

void loop() {
}


Do it!

  • Modify the age variable to put your own age


Your First Condition: IF THEN

void setup() {
  Serial.begin(9600);
  int age = 21;
  Serial.print(F("My age is "));
  Serial.println(age);
  if(age < 22) {
    Serial.println(F("I'm young!"));
  }
  if(age > 22) {
    Serial.println(F("I'm old!"));
  }
}

void loop() {
}


Do it!

  • The program given above has a bug. What is it?
  • Change age to your age.
    • Change the conditions to always print "I'm young!"
    • Change the conditions to always print "I'm old!"
    • Change the conditions to always print both "I'm young!" and "I'm old!"


Your First Else Condition: IF THEN ELSE

void setup() {
  Serial.begin(9600);
  int age = 21;
  Serial.print(F("My age is "));
  Serial.println(age);
  if(age < 22) {
    Serial.println(F("I'm young!"));
  } else {
    Serial.println(F("I'm old!"));
  }
}

void loop() {
}


Do it!

  • Swap the "I'm young!" string with the "I'm old!" string.
    • How do you need to change the condition so it's still valid?


Your First Interactive Input Program

void setup() {
  Serial.begin(9600);
  int input = Serial.read();
  Serial.println(input);
}

void loop() {
}


Do it!

  • Move the code (except "Serial.begin(9600);" to loop()
    • What happens?
  • Change Serial.println to Serial.print
    • What is the difference in the output? Why do we use Serial.println instead of Serial.print?


Your First Interactive (Input/Output) Program

void setup() {
  Serial.begin(9600);
}

void loop() {
  int input = Serial.read();
  if(input == 'h') {
    Serial.println(F("Hello!"));
  }
}


Do it!

  • Add your own interactions when pressing other keys of your choice
  • Move all your code except for "Serial.begin(9600);" to the loop() function
    • What is the difference in the behavior?





Debugging Compile Errors

These exercises help you recognize and fix compile errors. Find the error and fix it.


No Matching Function

void setup() {
  Serial.begin();
}

void loop() {
  Serial.println(F("My name is ..."));
}


Undefined Reference

/*
 * hello
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(F("This program also does not compile"));
}
*/

Error: Expected ',' or ';' before '}' Token

void setup() {
}

void loop() {
 int i = 1
}


Does Not Declare Parameters

void setup() {
 int i = 1;
 int j = 2;
}

void loop() {
}

void my_function {
}

Missing terminating character

void setup() {
}

void loop() {
  Serial.println(F("My example program));
}

void my_function() {
}


See Also