Computer Architectures

Similar documents
Home Security System for Automatic Doors

Microcontroller Programming Beginning with Arduino. Charlie Mooney

Lab 6 Introduction to Serial and Wireless Communication

Arduino project. Arduino board. Serial transmission

DEPARTMENT OF ELECTRONICS ENGINEERING

Embedded Software Development: Spottbillige Hardware + OSS = Zum Spielen zu Schade!

Arduino Due Back. Warning: Unlike other Arduino boards, the Arduino Due board runs at 3.3V. The maximum. Overview

Arduino ADK Back. For information on using the board with the Android OS, see Google's ADK documentation.

How To Control A Car With A Thermostat

Yun Shield Quick Start Guide VERSION: 1.0 Version Description Date 1.0 Release 2014-Jul-08 Yun Shield Quick Start Guide 1 / 14

Arduino Lesson 5. The Serial Monitor

Data Acquisition Module with I2C interface «I2C-FLEXEL» User s Guide

An Introduction To Simple Scheduling (Primarily targeted at Arduino Platform)

Android, Bluetooth and MIAC

Chapter 1 Hardware and Software Introductions of pcduino

Arduino Shield Manual

1602 LCD adopts standard 14 pins(no backlight) or 16pins(with backlight) interface, Instruction of each pin interface is as follows:

DKWF121 WF121-A B/G/N MODULE EVALUATION BOARD

Surveillance System Using Wireless Sensor Networks

MANUAL FOR RX700 LR and NR

ENGI E1112 Departmental Project Report: Computer Science/Computer Engineering

GM862 Arduino Shield

Embedded Systems Design Course Applying the mbed microcontroller

Basic Pulse Width Modulation

Microtronics technologies Mobile:

Web Site: Forums: forums.parallax.com Sales: Technical:

Microcontroller Based Low Cost Portable PC Mouse and Keyboard Tester

Develop a Dallas 1-Wire Master Using the Z8F1680 Series of MCUs

Chapter 13. PIC Family Microcontroller

Cypress Semiconductor: Arduino Friendly PSoC Shield

TUTORIAL FOR INITIALIZING BLUETOOTH COMMUNICATION BETWEEN ANDROID AND ARDUINO

Example Connection between USB Host and Android

Intelligent Home Automation and Security System

Arduino Shield Manual

Arduino Microcontroller Guide W. Durfee, University of Minnesota ver. oct-2011 Available on-line at

User s Manual of Board Microcontroller ET-MEGA2560-ADK ET-MEGA2560-ADK

Soft processors for microcontroller programming education

Arduino-Based Dataloggers: Hardware and Software David R. Brooks Institute for Earth Science Research and Education V 1.2, June, , 2015

Freescale Semiconductor, I

A REST API for Arduino & the CC3000 WiFi Chip

C4DI Arduino tutorial 4 Things beginning with the letter i

Introduction to Arduino

MeshBee Open Source ZigBee RF Module CookBook

Yun Shield User Manual VERSION: 1.0. Yun Shield User Manual 1 / 22.

SBC8100 Single Board Computer

A-307. Mobile Data Terminal. Android OS Platform Datasheet

ESP 8266: A BREAKTHROUGH IN WIRELESS SENSOR NETWORKS AND INTERNET OF THINGS

2.0 Command and Data Handling Subsystem

Friendly ARM MINI2440 & Dalvik Virtual Machine with Android

Lecture 7: Programming for the Arduino

Connecting Arduino to Processing a

Lab Experiment 1: The LPC 2148 Education Board

Bluetooth for device discovery. Networking Guide

Microcontrollers and Sensors. Scott Gilliland - zeroping@gmail

The I2C Bus. NXP Semiconductors: UM10204 I2C-bus specification and user manual HAW - Arduino 1

Chapter 1 Lesson 3 Hardware Elements in the Embedded Systems Chapter-1L03: "Embedded Systems - ", Raj Kamal, Publs.: McGraw-Hill Education

Lesson 10:DESIGN PROCESS EXAMPLES Automatic Chocolate vending machine, smart card and digital camera

SKP16C62P Tutorial 1 Software Development Process using HEW. Renesas Technology America Inc.

Arduino Internet Connectivity: Maintenance Manual Julian Ryan Draft No. 7 April 24, 2015

Arduino Lesson 1. Blink

Computer Organization and Components

Raspberry Pi. Hans- Petter Halvorsen, M.Sc.

Design And Implementation Of Bank Locker Security System Based On Fingerprint Sensing Circuit And RFID Reader

INTRODUCTION TO SERIAL ARM

Radio sensor powered by a mini solar cell the EnOcean STM 110 now functions with even less light

PCAN-MicroMod Universal I/O Module with CAN Interface. User Manual. Document version ( )

RTOS based Home Automation System using Android

LCD I 2 C/Serial RX Backpack. Data Sheet. LCD to I2C/Serial RX Backpack I2C or Serial RX communication with Standard 16 Pin LCD modules

Character LCDs. Created by Ladyada. Last updated on :45:29 PM EDT

1 /*ora sincrinizzata con NTP. Inserendo codice OTP si attiva un servo che ruota di 95 grad. Per chiudere il servo premere 2 "*" mentre per azzerrare

Arduino Wifi shield And reciever. 5V adapter. Connecting wifi module on shield: Make sure the wifi unit is connected the following way on the shield:

Firmware version: 1.10 Issue: 7 AUTODIALER GD30.2. Instruction Manual

ADVANCED VEHICLE TRACKING SYSTEM USING ARM7

Embedded Display Module EDM6070

Serial Communications

Theory and Practice of Tangible User Interfaces. Thursday Week 2: Digital Input and Output. week. Digital Input and Output. RGB LEDs fade with PWM

Prototyping Connected-Devices for the Internet of Things. Angus Wong

PHYS 2P32 Project: MIDI for Arduino/ 8 Note Keyboard

USBSPYDER08 Discovery Kit for Freescale MC9RS08KA, MC9S08QD and MC9S08QG Microcontrollers User s Manual

SBC8600B Single Board Computer

UniPi technical documentation REV 1.1

Tutorial for MPLAB Starter Kit for PIC18F

Technical Note. Micron NAND Flash Controller via Xilinx Spartan -3 FPGA. Overview. TN-29-06: NAND Flash Controller on Spartan-3 Overview

Designed for the needs of automation, telecommunications, remote supervision, and monitoring

ANDROID BASED FARM AUTOMATION USING GR-SAKURA

Computer Automation Techniques. Arthur Carroll

3. Programming the STM32F4-Discovery

Intro to Intel Galileo - IoT Apps GERARDO CARMONA

Board also Supports MicroBridge

SUDT AccessPort TM Advanced Terminal / Monitor / Debugger Version 1.37 User Manual

WA Manager Alarming System Management Software Windows 98, NT, XP, 2000 User Guide

PN532 NFC RFID Module User Guide

A+ Guide to Managing and Maintaining Your PC, 7e. Chapter 1 Introducing Hardware

T-BOXN12R. First steps with T-BOXN12R. You can make it wireless. Date: Version 1.0

Workshop Intel Galileo Board

Accurate Measurement of the Mains Electricity Frequency

Location-Aware and Safer Cards: Enhancing RFID Security and Privacy

4511 MODBUS RTU. Configuration Manual. HART transparent driver. No. 9107MCM100(1328)

PC Base Adapter Daughter Card UART GPIO. Figure 1. ToolStick Development Platform Block Diagram

Lecture N -1- PHYS Microcontrollers

Transcription:

Implementing the door lock with Arduino Gábor Horváth 2015. március 9. Budapest associate professor BUTE Dept. Of Networked Systems and Services ghorvath@hit.bme.hu

Outline Aim of the lecture: To show how easy it is to work with the highly integrated microcontrollers available today Outline: Introducing Arduino The hardware How to program Sensors, peripherals Implementing the door lock The display The RFID reader The keypad The whole hardware The whole source code 2

Arduino 2005, Ivrea, Italy Purpose: simple prototyping It is a family of prototyping boards (http://arduino.cc) Common features: Atmel AVR 8 bit CPU (Harvard architecture!) Integrated flash memory to store the program Integrated EEPROM to be used as a non-volatile memory Integrated RAM Input/output capabilities: Digital Analog It can be programmed through an USB port (not all of them) C++-like language for software development 3

The Arduino Family Leonardo: 17 Mini: 15 Mega ADK: 44 LilyPad: 19 4

The Arduino Family Differences: Number of input/output pins Size of the memory (flash/eeprom/ram) Some special features: The Mega ADK can be connected to Android devices The LilyPad can be sewn to fabric CPU freq. Flash RAM EEPROM Digital I/O Analog I/O Leonardo 16 MHz 32 kb 2.5 kb 1 kb 20 12/7 Mega ADK 16 MHz 256 kb 8 kb 4 kb 54 16/15 Mini 16 MHz 32 kb 2 kb 1 kb 14 8/6 LilyPad 8 MHz 16 kb 1 kb 512 byte 14 6/6 5

Nonsense! What?? 44, for a 8 bit CPU, 16 MHz freq., and a couple kb or memory? When there is the Raspberry Pi for $35? (700 MHz 32 bit ARM CPU, 256 MB RAM, strong GPU, HD movie playback, HDMI output, Ethernet port, etc.) They have different purposes: Arduino: Emphasis: I/O, all the time, as simply as possible When switched on, it is up and running in 1 second It is the largest model that costs 44, the cheap Leonardo is sufficient for most projects Raspberry Pi: Emphasis: general purpose computer (for teaching programming) It requires an operating system (linux)! Booting process takes a while. It has input/output capabilities, but using them needs deep knowledge of the linux kernel 6

Arduino Mega ADK USB for programming And power supply Microcontroller PWM outputs Serial ports Reset button Digital in- and outputs USB to be connected to Android Analog inputs Power supply for I/O devices Alternative power supply 7

Programming 8

Programming Open-source cross-platform development environment (IDE) (http://arduino.cc/en/main/software) Language: C++-like (file extension:.ino) Compilation process: IDE compiles AVR code (cross compiler) It writes the program to the flash memory of the microcontroller through the USB port Debugging: What the Arduino writes to its default serial port is transmitted to the PC through USB and displayed by the IDE 9

The development environment Syntax check Upload to Android New file Open file Save to file Serial monitor 10

The programming language Arduino calls the program a sketch Data types: int: 16 bit integer long: 32 bit integer boolean: logical type (true/false), occupies 1 bit only in the memory (C++ has no such data type) float: 32 bit floating point char: stores ASCII characters (1 byte) etc. Operators, loops, branches: like C++ Class-es are allowed to use, and preprocessor directives as well To mandatory functions to write: void setup () { - this function is executed once, when Arduino starts up void loop () { - thus function runs after the initialization again and again (when it terminates, it is started again automatically) 11

Inputs/Outputs 12

Digital in- and outputs Digital pins can act as both input and output direction But only one direction at a time To set it up: pinmode (4, INPUT); pin 4 is set up to act as input pinmode (5, OUTPUT); pin 5 is set up to act as output Putting digital signals to digital pins: digitalwrite (5, HIGH); puts a logical 1 (5V) to pin 5 digitalwrite (5, LOW); puts a logical 0 (0V) to pin 5 Reading digital inputs: int val; val=digitalread (4); reads digital value from pin 4 if (val==high), or if (val==low) 13

Analog inputs Does not detect only HIGH and LOW values ADC (Analog-Digital Converter) with 10 bit resolution 1024 different voltage levels can be distinguished 1024 levels between 0V and 5V 4.88 mv resolution Usage: int val; val = analogread (3); - sample from analog input number 3 val: from 0 (in case of 0V) to 1023 (5V) The 5V maximum reference can be adjusted by calling analogreference(), but the maximum is 5V 14

PWM output It can not provide continuous analóg output (e.g. 4.2V) But it can switch the output on and off very fast: it can produce any voltage in the average sense PWM: Pulse Width Modulation This is done be calling function analogwrite () Parameters: pin number, duty cycle (between 0 255) 15

Serial input and output Serial communication needs only 2 wires at most: RX: for receiving bytes (if we need to receive bytes) TX: for transmitting (sending) bytes (if needed) The Arduino ADK has 4 serial ports The first one is used by the development environment for debugging purposes Usage: through class Serial Pre-defined instances: Serial, Serial1, Serial2, Serial3 Initialization: Serial1.begin (9600); - open serial port 1 and set up speed to 9600 bps Writing: Serial1.write ( ); - sends a single byte, a NULL terminated string, or an array Writing: Serial1.print (...); - the parameter is converted to string, and sends it. Function Serial1.println (...); adds an extra line break at the end as well. Reading: int received=serial1.read(); - obtains a byte received (-1, if no bytes received) Check data availability: int count = Serial1.available(); - gives back the number of bytes received Close port: Serial1.end (); - after closing the port the pins can be used as general purpose in/out pins 16

Serial input and output Behind the scenes: An interrupt is generated when receiving a byte The interrupt is handled by the Arduino: It stores it in a buffer (a waiting line) Function read() reads from this buffer Function available() gives back the number of bytes in the buffer 17

Memory 18

Memory The microcontroller of Arduino has 3 kinds of memories Flash memory: stores the program Content is kept without power supply RAM: stores the variables and the stack Power supply is needed to keep content EEPROM: to store volatile data Content is kept without power supply AVR processors follow a Harvard architecture There are 2 address spaces: Instructions and constants are taken from the flash memory For variables/stack the RAM is used And how to access the EEPROM? It is treated as a pheripheral (an I/O device) There is a library to access it 19

The flash memory and the RAM Flash memory: Written by the development environment only The program can not write it. But it can read it! By appropriate function calls. RAM: Limited capacity Non-changing large arrays should be put to the flash memory: int codes[] = {21342, 2442, -34887,...; char text[] = veryverylong...verylongtext ; c = codes[4]; t = text[7]; Preferred version: PROGMEM prog_uint16_t codes[] = {21342, 2442, -34887,...; PROGMEM prog_uchar text[] = veryverylong...verylongtext ; c = pgm_read_word_near (codes + 4); t = pgm_read_byte_near (text + 7); 20

EEPROM The EEPROM library is a standard component #include <EEPROM.h> Writing it: EEPROM.write (address, data); Address is int Data is byte Reading it: byte a; a = EEPROM.read (42); Reads the 42th byte from the EEPROM 21

Connecting peripherals 22

Digital output peripherals Example: Blinking LED Components: LED, 220 Ohm resistor It even works without components! Pin 13 has a built-in LED. Code: const int ledpin = 13; void setup () { pinmode (ledpin, OUTPUT); void loop () { digitalwrite (ledpin, HIGH); delay (1000); digitalwrite (ledpin, LOW); delay (1000); 23

Digital input peripherals Example: Detecting the state of a button, and switching on the built-in LED accordingly Code: const int buttonpin = 2; const int ledpin = 13; int buttonstate = 0; void setup () { pinmode (ledpin, OUTPUT); pinmode (buttonpin, INPUT); void loop () { buttonstate = digitalread (buttonpin); digitalwrite (ledpin, buttonstate); 24

Analog input peripherals Example: TMP36 temperature sensor Code: const int sensorpin = 0; void setup () { Serial.begin (9600); void loop () { int reading = analogread (sensorpin); float voltage = reading * 5.0 / 1024.0; float temperature = (voltage - 0.5) * 100; Serial.println (temperature); delay(1000); 25

Analog input peripherals The most interesting family of peripherals Dozens of cheap sensors: 3-axis accelerometer (uses 3 analog inputs) Alcohol gas sensor Carbon monoxide sensor Optical dust sensor Flex sensor Force sensitive sensor Vibration sensor Gyro-sensor (2 axis uses 2 analog inputs) Proximity sensor (both infrared and ultrasonic) Temperature Humidity sensor Etc. They convert the physical quantity to analog signals 26

PWM output peripherals Example: LED fading Code: const int ledpin = 9; void setup () { void loop () { for (int fadevalue = 0 ; fadevalue <= 255; fadevalue +=5) { analogwrite (ledpin, fadevalue); delay (30); for (int fadevalue = 255 ; fadevalue >= 0; fadevalue -=5) { analogwrite (ledpin, fadevalue); delay (30); 27

Peripherals connected through a serial port Peripherals that can be connected through serial ports: RFID modul: sends the card ID through a serial port GPS modul: sends the geospatial position through a serial port in regular intervals GSM/GPRS modul: can be controlled through serial ports, the received data and the data to transmit is sent on the serial line as well Etc. 28

Shields Complete peripherals stacked over the Arduino There are dozens of shields available: GPS, LCD controller, SD card reader, WIFI, Bluetooth, ZigBee, GSM,... GPS Shield 18 2.8 TFT and touch sensor 40 MP3 Shield 25 29

Implementing the door-lock 30

Door lock What components do we need? A display to interact with the user A numeric keypad A card reader we use RFID based card reader A switch to open the door An Arduino from the family that is the most appropriate for us 31

The display A cheap display with 2 rows and 16 cols ( 8) Pins: Data bus: D0...D7, but it works in 4 bit mode as well, we use it that way: we connect only D4...D7 RS: indicates the display if the character sent is a command or a symbol to display EN: enable signal, the display samples the data bus when receiving the enable signal RW: if we ask something from the display we dont need it Power supply (5V) Contrast of the display (potmeter) Power supply of the backlight We use 6 wires for data transmission: RS, EN, D7, D6, D5, D4 32

Using the display How to connect it: Google arduino display Usage: Instancing the LiquidCrystal class (write(), setcursor(), blink(), clear(), etc.) Example: #include <LiquidCrystal.h> const int numrows = 2; const int numcols = 16; // tell it which pins we connected to the 6 wire required LiquidCrystal lcd (12, 11, 5, 4, 3, 2); void setup () { lcd.begin (numcols,numrows); void loop () { for (int thisletter = 'a'; thisletter <= 'z'; thisletter++) { for (int thisrow = 0; thisrow < numrows; thisrow++) { for (int thiscol = 0; thiscol < numcols; thiscol++) { lcd.setcursor (thiscol, thisrow); lcd.write (thisletter); delay (200); 33

The numeric keypad A 4x3 matrix of keys ( 3) Pins: Has 7 pins, 4 for the rows and 3 for the columns If we push a button, it connects the corresponding column and row lines 34

Using the numeric keypad Google arduino keypad Usage: Instancing the Keypad class (getkey(), waitforkey(), getstate(), etc.) Example: #include <Keypad.h> const byte ROWS = 4; const byte COLS = 3; char keys[rows][cols] = { {'1','2','3', {'4','5','6', {'7','8','9', {'*','0','#'; byte rowpins[rows] = {32, 22, 24, 28; // where did we connect the row pins byte colpins[cols] = { 30, 34, 26 ; // where did we connect the column pins Keypad keypad = Keypad ( makekeymap (keys), rowpins, colpins, ROWS, COLS ); #define ledpin 13 void setup () { digitalwrite (ledpin, HIGH); void loop () { char key = keypad.getkey(); if(key) { switch (key) { case '*': digitalwrite(ledpin, LOW); break; case '#': digitalwrite(ledpin, HIGH); break; 35

The RFID card reader Radio-frequency identification Each card has a unique code consisting 12 hex digits Reader: we have an expensive one ( 25), because we could find only that one Tags: cheap ( 1 each, cards, buttons, etc.) Communicates through serial port Pins: Power supply (5V) External antenna (we use the internal one) Format selection (we use the ASCII format) 2 wires for data transmission (we use only one of them, as a serial line) LED/buzzer at card reading (we dont need it) Reset Connects to Arduino with only 2 wires: Reset (to digital pin), D0 (to serial RX pin) 36

Using the RFID reader Google arduino id-12 Usage: as a serial device Example: (reset: pin 2, D0: pin RX1) const int RFIDResetPin = 2; char userid[13]; void setup () { Serial.begin(9600); Serial1.begin(9600); pinmode(rfidresetpin, OUTPUT); digitalwrite(rfidresetpin, LOW); delay (100); digitalwrite(rfidresetpin, HIGH); void loop () { while (Serial1.available()) { int readbyte = Serial1.read(); if (readbyte == 2) index = 0; else if (readbyte == 3) { userid[index] = 0; Serial.println(userID); else userid[index++] = readbyte; // Reset pin of the reader is connected to digital pin 2 // Card ID will be stored in this array // set up serial port 0 to 9600 bps (for debug) // set up serial port 1 to 9600 bps (RFID reader connected here) // set RFID Reset pin to output // RFID reset, we generate a rising edge. Set it to low... // wait a bit... // raise it to high. // If bytes arrived from the reader // Read the next byte arrived from the reader // ASCII 0x2 means start of message // Initialize index variable, userid is filled from the beginning. // ASCII 0x3 means end of message // Terminate the card ID with a NULL. // Send it to the debug serial port. This appears on the PC connected. // We are in the middle of the message, store the character. 37

Selecting the proper Arduino What to check: How many digital input/output pins we need: For the display: 6 For the keypad: 7 For the RFID reader: 2 Total: 15 The Leonardo has 20, but it did not exist when we bought it. Its predecessor had only 14, thus we selected ADK (it has 54) Further input and output pins: We dont need analog inputs and PWM outputs We need a serial port for the RFID reader If we want to debug, we need an other serial port The Leonardo has 2 serial ports (its predecessor had only 1) Ideal choice: Leonardo 38

Assembling the hardware Using a breadboard, without soldering Breadboard: a set of pre-connected holes: Unfortunately we still have to do some soldering The display and the keypad had no headers The pin distance of the RFID reader was not compatible with the breadboard We bought an adapter Soldering can be learnt from some youtube tutorials! 39

The software We use a state machine with 3 states start state: waiting for the card rfid state: card is there, the RFID reader is sending the characters of the card ID code state: waiting for key press The 12 characters of the card ID and the 4 characters of the PIN code are concatenated We obtain a 16 character long string If this string equals to one of the pre-stored ones, we open the door 40

The software - 2 #include <LiquidCrystal.h> #include <Key.h> #include <Keypad.h> const int RFIDResetPin = 2; const int LEDPin = 13; char userid[17]; int index = 0; enum estate { start, rfid, code ; estate state = start; // the card ID and the PIN code are stored here (concatenated) LiquidCrystal lcd(49, 47, 48, 46, 44, 42); // the display has been connected to these pins // state of the state machine const byte ROWS = 4; const byte COLS = 3; char keys[rows][cols] = { {'1','2','3', {'4','5','6', {'7','8','9', {'*','0','#' ; byte rowpins[rows] = {32, 22, 24, 28; byte colpins[cols] = { 30, 34, 26 ; // the row pins of the keypad are connected to these pins // the column pins of the keypad are connected to these pins Keypad keypad = Keypad( makekeymap(keys), rowpins, colpins, ROWS, COLS ); // The accepted card IDs and their PIN codes. First 12 character: card ID, last 4 character: PIN code char* codes[] = {"010B4CF292261234", "010B4CED58F37899", "010B11C56FB19024", "010B1147E8B41290", "010B11C5F12F7085", "010B112F3F0B0963", "010B11481C4F7412", "010B1148095A3254", "010B1147F3AF6325", "010B114806551589", "010B1147FEA28563", "010B11C56DB33574", "010B4CF0D5637412", "010B4CF26DD96521", "010B4CE9B9164589", NULL; 41

The software - 3 The mandatory setup () function: void setup() { Serial.begin(9600); Serial1.begin(9600); // set up serial port 0 to 9600 bps (for debug) // set up serial port 1 to 9600 bps (RFID reader connected here) pinmode(rfidresetpin, OUTPUT); digitalwrite(rfidresetpin, LOW); delay (100); digitalwrite(rfidresetpin, HIGH); // set RFID Reset pin to output // RFID reset, we generate a rising edge. Set it to low... // wait a bit // raise it to high. pinmode(ledpin, OUTPUT); // set the pin of the built-in LED to output lcd.begin(16, 2); lcd.print("touch the card!"); // or display has 16 columns and 2 rows // write message to the display 42

The software - 4 The mandatory loop () function: void loop () { while (Serial1.available()) { // If the RFID reader transmitted some data int readbyte = Serial1.read(); // Read the next character sent by the RFID reader if (state == start && readbyte == 2) { // If we are in the start state and a start of message character is received, state = rfid; // we move to the rfid state index = 0; else if (state == rfid && readbyte == 3) { // If the end of message character is received (ASCII 0x3), state = code; // we move to the state waiting for the PIN code lcd.clear(); // Clear the display, userid[index] = 0; // put a terminating 0 to the end of the card ID, lcd.print(userid); // print it to the display, lcd.setcursor (0,1); // set cursor to the beginning of the second line lcd.print("enter code"); // print a message if (state==rfid && readbyte!= 2 && readbyte!= 10 && readbyte!= 13 && index<12) // if card reader keeps sending card ID userid[index++] = readbyte; // store it char key = keypad.getkey(); if (state == code && index == 16) { userid[index] = 0; Serial.println(userID); checkcardandcode(); state = start; lcd.clear (); lcd.setcursor (0,0); lcd.print("touch card!"); else if (state == code && key) userid[index++] = key; // check if there was a key press // If we are waiting for a key, and we got the last digit (we have the 12 + 4 characters) // put a terminating 0 to the end // print it to the debug serial port // check if it correct, and open the door if it is correct // go back to the initial state // clear display // move cursor to the upper left corner // print message // if there is a key press, but this is not the last digit // store it 43

The software - 5 Checking if the card and the PIN code is valid: void checkcardandcode () { lcd.clear (); lcd.setcursor (0, 0); int ix = 0; while (codes[ix]) { if (!strcmp(userid, codes[ix])) { lcd.print ("OK!"); digitalwrite (LEDPin, 1); break; ix++; if (!codes[ix]) lcd.print ("Denied."); // clear display // move cursor to the upper left corner // check all codes stored // if there is a match // print a message // switch on the LED // we dont have to check the validity any more // if we reach the end of all stored codes, and still dont find the one given, // print bad news delay (1000); // wait 1 second digitalwrite (LEDPin, 0); digitalwrite(rfidresetpin, LOW); delay (100); digitalwrite(rfidresetpin, HIGH); // switch off the LED // RFID reset, we generate a rising edge. Set it to low... // wait a bit // raise it to high. 44

Summary We introduced the Arduino framework What kind of inputs and outputs it has How to connect various peripherals to it How to write a software to it We implemented the door lock with Arduino Built from modern components Soldering was required only to connect components We wrote the software for it 45

Outlook There exist several Arduino clones Legal, as the hardware is open source as well There are dozens of Arduino-like microcontroller boards OLIMEXINO: with AVR microcontroller DUINOMITE: PIC microcontroller MAPLE: ARM Cortex M3 processor NETDUINO: 32 bit ARM processor, can be programmed in.net environment (Visual Studio) etc... 46