Remotely Controlling Devices

Содержание

Слайд 2

Remotely Controlling Devices interact with almost any device that uses some

Remotely Controlling Devices

interact with almost any device that uses some form

of remote control
TVs, audio equipment, cameras, garage doors, appliances, and toys
remote controls work by sending digital data from a transmitter to a receiver
infrared light (IR) or wireless radio technology
different protocols (signal patterns) used
translate key presses into a digital signal
Слайд 3

IR remote works by turning an LED on and off in

IR remote

works by turning an LED on and off in patterns
produce

unique codes
codes are typically 12 to 32 bits
Each key on the remote is associated with a specific code that is transmitted when the key is pressed
If the key is held down, the remote usually sends the same code repeatedly
some remotes (e.g.,NEC) send a special repeat code when a key is held down
Слайд 4

IR remote low-cost IR receiver module detect the signal and provide

IR remote

low-cost IR receiver module
detect the signal and provide a digital

output that the Arduino can read
digital output is then decoded by a library called IRremote
same library is used when Arduino sends commands to act like a remote control
to install the library, place it in the folder named libraries in your Arduino sketch folder
Слайд 5

Wireless radio technology more difficult to emulate than IR controls button

Wireless radio technology

more difficult to emulate than IR controls
button contacts on

these controls can be activated by Arduino
simulate button presses by closing the button contacts circuit inside the remote control
need to take apart the remote control and connect wires from the contacts to Arduino
isolation prevents voltages from Arduino from harming the remote control, and vice versa
Слайд 6

Optocouplers Components called optocouplers are used to provide electrical separation between

Optocouplers

Components called optocouplers are used to provide electrical separation between Arduino

and the remote control
enable you to safely control another circuit
provide a way to keep things electrically separated
contain an LED, which can be controlled by an Arduino digital pin
light from the LED in the optocoupler shines onto a light-sensitive transistor
turning on the LED causes the transistor to conduct
Слайд 7

Responding to an IR Control Arduino responds to IR remote signals

Responding to an IR Control

Arduino responds to IR remote signals using

a device called an IR receiver module
The IR receiver converts the IR signal to digital pulses
IR remote library decodes these pulses and provides a numeric value for each key
Слайд 8

Responding to an IR Control #include //adds the library code to

Responding to an IR Control

#include //adds the library code to

the sketch
const int irReceiverPin = 2; //pin the receiver is connected to
const int ledPin = 13;
IRrecv irrecv(irReceiverPin); //create an IRrecv object
decode_results decodedSignal; //stores results from IR detector
boolean lightState = false; //keep track of whether the LED is on
unsigned long last = millis(); //remember when we last received an IR message
void setup(){
pinMode(ledPin, OUTPUT);
irrecv.enableIRIn(); // Start the receiver object
}
void loop(){
if (irrecv.decode(&decodedSignal) == true){ //true if message received
if (millis() - last > 250) { //has it been 1/4 sec since last message?
lightState = !lightState; //Yes: toggle the LED
digitalWrite(ledPin, lightState);
}
last = millis();
irrecv.resume(); // watch out for another message
}
}
Слайд 9

IRremote library #include - makes the library code available to your

IRremote library

#include - makes the library code available to your

sketch
IRrecv irrecv(irReceiverPin); - creates an IRrecv object to receive signals from an IR receiver module connected to irReceiverPin
use the irrecv object to access the signal from the IR receiver
decoded responses provided by the library are stored in a variable named decode_results
Слайд 10

IRremote library irrecv.enableIRIn(); - start listening the IR receiver irrecv.decode(&decodedSignal); -

IRremote library

irrecv.enableIRIn(); - start listening the IR receiver
irrecv.decode(&decodedSignal); - check the

results of receiver
returns true if there is data, which will be placed in the decodedSignal
irrecv.resume(); - library needs to be told to continue monitoring for signals
code toggles the LED if more than ¼ s since the last received message (otherwise, the LED will toggle quickly by remotes that send codes more than once)
Слайд 11

Decoding IR Control Signals #include const int RECV_PIN = 2; const

Decoding IR Control Signals

#include
const int RECV_PIN = 2;
const int NUM_OF_BUTS

= 21;
long BUTTON_CODES[NUM_OF_BUTS] = {
0xE0E08877, //button 0
0xE0E020DF, //button 1
0xE0E0A05F, //button 2
0xE0E0609F, //button 3
0xE0E010EF, //button 4
0xE0E0906F, //button 5
0xE0E050AF, //button 6
0xE0E030CF, //button 7
0xE0E0B04F, //button 8
0xE0E0708F, //button 9
0xE0E08679, //button 100+/DOWN
0xE0E006F9, //button 200+/UP
0xE0E0D02F, //button VOL-
0xE0E0E01F, //button VOL+
0xE0E016E9, //button EQ/MENU
0xE0E0A659, //button PREV/LEFT
0xE0E046B9, //button NEXT/RIGHT
0xE0E0F00F, //button PAUSE/MUTE
0xE0E008F7, //button CH-
0xE0E048B7, //button CH+
0xE0E040BF //button CH/POWER
};
String BUTTON_NAMES[NUM_OF_BUTS] = {
"0","1","2","3","4","5","6","7","8","9",
"100+/DOWN","200+/UP","VOL-","VOL+",
"EQ/MENU","PREV/LEFT","NEXT/RIGTH",
"PAUSE/MUTE","CH-","CH+","CH/POWER"
};

IRrecv irrecv(RECV_PIN);
decode_results results;
void setup(){
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
int button_id = findButton(results.value);
if(button_id <0){
Serial.println("Unknown button is pressed!");
} else{
Serial.print("Button ");
Serial.print(BUTTON_NAMES[button_id]);
Serial.println(" is pressed!");
}
irrecv.resume(); // Receive the next value
}
}
int findButton(long val){
for(int i = 0; i < NUM_OF_BUTS; i++){
if(val == BUTTON_CODES[i]) return i;
}
return -1;
}

Слайд 12

Imitating Remote Control Signals want to use Arduino to control a

Imitating Remote Control Signals

want to use Arduino to control a TV

or etc
Arduino controls the device by flashing an IR LED
duplicate the signal that would be sent from your remote control
IR library handles the translation from numeric code to IR LED flashes
need to create an object for sending IR messages
IRsend object - control the IR LED on pin 3
hardcoded within the library, can not change it
Слайд 13

Imitating Remote Control Signals irsend.sendSony(code, nob); - send code in sony

Imitating Remote Control Signals

irsend.sendSony(code, nob); - send code in sony format

which has nob bits
irSend object has different functions for various popular infrared code formats
check the library documentation for other formats
Each character in hex represents a 4-bit value
The codes here use eight characters, so they are 32 bits long
Слайд 14

Imitating Remote Control Signals LED is connected with a current-limiting resistor

Imitating Remote Control Signals

LED is connected with a current-limiting resistor
to increase

the sending range, use multiple LEDs or select one with greater output
you won’t see anything when the codes are sent because the light from the IR LED isn’t visible to the naked eye.
verify that an infrared LED is working with a digital camera
you should be able to see it flashing in the camera’s LCD viewfinder.
Слайд 15

Imitating Remote Control Signals #include const int NUM_OF_BUTS = 21; long

Imitating Remote Control Signals

#include
const int NUM_OF_BUTS = 21;
long BUTTON_CODES[NUM_OF_BUTS] =

{
0xE0E08877, //button 0
0xE0E020DF, //button 1
0xE0E0A05F, //button 2
0xE0E0609F, //button 3
0xE0E010EF, //button 4
0xE0E0906F, //button 5
0xE0E050AF, //button 6
0xE0E030CF, //button 7
0xE0E0B04F, //button 8
0xE0E0708F, //button 9
0xE0E08679, //button 100+/DOWN
0xE0E006F9, //button 200+/UP
0xE0E0D02F, //button VOL-
0xE0E0E01F, //button VOL+
0xE0E016E9, //button EQ/MENU
0xE0E0A659, //button PREV/LEFT
0xE0E046B9, //button NEXT/RIGHT
0xE0E0F00F, //button PAUSE/MUTE
0xE0E008F7, //button CH-
0xE0E048B7, //button CH+
0xE0E040BF //button CH/POWER
};

IRsend irsend;
void setup(){
}
void loop() {
for (int i = 0; i < NUM_OF_BUTS; i++) {
irsend.sendSony(BUTTON_CODES[i], 32);
delay(40);
//half second delay between each signal burst
}
}

Слайд 16

Liquid crystal displays (LCD) offer a convenient and inexpensive way to

Liquid crystal displays (LCD)

offer a convenient and inexpensive way to provide

a user interface for a project
is the text panel that displays two or four lines of text, with 16 or 20 characters per line
library for driving LCD is provided with Arduino
can do more than display simple text
can be scrolled or highlighted
can display special symbols and non-English characters
Слайд 17

LCD vs. Graphical Display create your own symbols and block graphics

LCD vs. Graphical Display

create your own symbols and block graphics with

a text LCD
small resolution (5x9, 7x12, 8x16)
graphical LCD has fine graphical details
can display up to eight lines of 20 text characters in addition to graphics
Слайд 18

Connecting and Using a Text LCD Display

Connecting and Using a Text LCD Display

Слайд 19

Connecting and Using a Text LCD Display #include // include the

Connecting and Using a Text LCD Display

#include // include the

library code
//constants for the number of rows and columns in the LCD
const int numRows = 2;
const int numCols = 16;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //RS, E, D4, D5, D6, D7
void setup(){
lcd.begin(numCols, numRows);
lcd.print("hello, world!"); // Print a message to the LCD.
}
void loop(){
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}

If you don’t see any text and you have double-checked that all wires are connected correctly, you may need to adjust the contrast pot. With the pot shaft rotated to one side (usually the side connected to Gnd), you will have maximum contrast and should see blocks appear in all the character positions. With the pot rotated to the other extreme, you probably won’t see anything at all. The correct setting will depend on many factors, including viewing angle and temperature—turn the pot until you get the best looking display

Слайд 20

LCD library functions LiquidCrystal(rs, enable, d4, d5, d6, d7) - Creates

LCD library functions

LiquidCrystal(rs, enable, d4, d5, d6, d7) - Creates a

variable of type LiquidCrystal and initializes it with indicated pins
lcd.begin(cols, rows) - Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
lcd.clear() - Clears the LCD screen and positions the cursor in the upper-left corner
lcd.home() - Positions the cursor in the upper-left of the LCD
Слайд 21

LCD library functions lcd.setCursor(col, row) - set the location (column and

LCD library functions

lcd.setCursor(col, row) - set the location (column and row)

at which subsequent text written to the LCD will be displayed
lcd.write(data) - Write a custom character to the LCD
lcd.print(data) - Prints text to the LCD.
lcd.cursor() / lcd.noCursor() - Set cursor visible/invisible
lcd.blink() / lcd.noBlink() - Turns blinking of the cursor on/off
lcd.display() / lcd.noDisplay() - Turns on/off the LCD display
lcd.scrollDisplayLeft() / lcd.scrollDisplayRight() - Scrolls the contents of the display one space to the left/right
lcd.createChar(num, data) - Create a custom character specified by data. Up to eight characters of 5x8 pixels are supported (num - 0 to 7)
Слайд 22

Formatting Text #include // include the library code: //constants for the

Formatting Text

#include // include the library code:
//constants for the number

of rows and columns in the LCD
const int numRows = 2;
const int numCols = 16;
int count;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(){
lcd.begin(numCols, numRows);
lcd.print("Starting in "); // this string is 12 characters long
for(int i=9; i > 0; i--){ // count down from 9
// the top line is row 0
lcd.setCursor(12,0); // move the cursor to the end of the string
lcd.print(i);
delay(1000);
}
}
void loop(){
int columnWidth = 4; //spacing for the columns
int displayColumns = 3; //how many columns of numbers
lcd.clear();
for(int col=0; col < displayColumns; col++){
lcd.setCursor(col * columnWidth, 0);
count = count + 1;
lcd.print(count);
}
delay(1000);
}
Слайд 23

Turning the Cursor and Display On or Off #include LiquidCrystal lcd(12,

Turning the Cursor and Display On or Off

#include
LiquidCrystal lcd(12, 11,

5, 4, 3, 2);
void setup(){
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void displayBlink(int blinks, int duration){
while(blinks--){
lcd.noDisplay();
delay(duration);
lcd.display();
delay(duration);
}
}

void loop(){
lcd.setCursor(0, 1);
lcd.print("cursor blink");
lcd.blink();
lcd.setCursor(0, 1);
lcd.print("noBlink");
delay(2000);
lcd.noBlink();
delay(2000);
lcd.clear();
lcd.print("Display off ...");
delay(1000);
lcd.noDisplay();
delay(2000);
lcd.display();
// turn the display back on
lcd.setCursor(0, 0);
lcd.print(" display flash !");
displayBlink(2, 250);
// blink twice
displayBlink(2, 500);
// and again for twice as long
lcd.clear();
}

Слайд 24

Displaying Special Symbols #include const int numRows = 2; const int

Displaying Special Symbols

#include
const int numRows = 2;
const int numCols =

16;
const byte degreeSymbol = B11011111;
const byte piSymbol = B11110111;
const byte centsSymbol = B11101100;
const byte sqrtSymbol = B11101000;
const byte omegaSymbol = B11110100; // the symbol used for ohms
byte charCode = 32; // the first printable ascii character
int col; int row;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup(){
lcd.begin(numRows, numCols);
}
void loop(){
showSymbol(degreeSymbol, "degrees");
showSymbol (piSymbol, "pi");
showSymbol(centsSymbol, "cents");
showSymbol(sqrtSymbol, "sqrt");
showSymbol(omegaSymbol, "ohms");
}
void showSymbol( byte symbol, char * description){
lcd.clear();
lcd.write(symbol);
lcd.print(' '); // add a space before the description
lcd.print(description);
delay(3000);
}
Слайд 25

Character codes

Character codes

Слайд 26

Character codes

Character codes