INTELLECTUAL OUTPUT 5
heise@idd.uni-hannover.de
All rights reserved. The content of the publication may be used for educational and other non-commercial
purposes on the condition of using the following name as source in every reproduction: „Erasmus+ Project
Robot4All“.
Leibniz Universität Hannover
PROJECTS WEBSITE:
PROJECT LEADERSHIP:
LAYOUT:
Institut für Didaktik der Demokratie
PROJECT MANAGEMENT:
Richard Heise
Mareike Heldt
Prof. Dr. Dirk Lange
This project has been funded with support from the European Commission. This communication reflects the
views only of the author, and the Commission cannot be held responsible for any use which may be made of the
informationcontainedtherein.ProjectNumber:2017-1-DE02-KA202-004274
www.robovet.eu
1
Greece
LEIBNIZ UNIVERSITÄT HANNOVER
Germany Coordinator
( )
CYPRUS COMPUTER SOCIETY
Cyprus
CIVIC COMPUTING
CDIMM MARAMURES FOUNDATION
2 EK PEIRAIA
EMPHASYS CENTRE
United Kingdom
Romania
Cyprus
WOMEN IN DIGITAL INITIATIVES LUXEMBOURG ASBL
I.E.S. MARÍA MOLINER
Spain
Luxemburg
2
03
03
04
19
38
12
05
Lección5:Arduinobásico........................................................................................................................................
Organización .............................................................................................................................................................
Lección6:Arduinoavanzado...................................................................................................................................
Introducción .............................................................................................................................................................
Lección4:IntroducciónaArduinoyRobótica........................................................................................................
Anexo .........................................................................................................................................................................
Lista de materiales ...................................................................................................................................................
ÍNDICE
3
El objetivo de este curso es crear circuitos robóticos y controlarlos de forma eficiente mediante programación,
utilizandolasplataformasArduinoyTinkercad
Arduino es una plataforma de electrónica de código abierto basada en un hardware y software fáciles de usar.
Arduino nació como una herramienta sencilla de prototipado rápido, pensada para alumnos sin conocimientos de
electrónica y programación. Tan pronto como llegó a una comunidad más extensa, la placa de Arduino empezó a
cambiar para adaptarse a las nuevas necesidades y retos, diferenciando su oferta, desde simples placas de 8 bits a
productosparaaplicacionesIoT,impresión3D,ydiseñosempotrados.El software estambiéndecódigoabiertoyva
creciendomediantecontribucionesdeusuariosdetodoelmundo.
Las placasdeArduino soncapacesdeleerentradas–luzenunsensor,undedoenunbotón,ounmensajedeTwitter
– y convertirlos en una salida – activar un motor, encender un LED, publicar algo online- Puedes ordenar a tu placa
qué hacer enviando al microcontrolador de la placa un conjunto de instrucciones. Para ello se utiliza el lenguaje de
programciónArduinoyelSoftwareArduino.
Hoy en día las habilidades robóticas son esenciales en la mayoría de los procesos industriales y de ingeniería de
nuestro modo de vida. Por lo tanto, para ser capaces de crear, controlar y modificar estos prototipos, debemos
mejorarelcurrículoderobóticadenuestrosalumnosintroduciéndoles enestecampo.
Gruposobjetivo:
Ÿ ProfesoresdeF.P.interesadosenrobóticaytecnologíasdelainformación
Ÿ AlumnosdeF.P.conmenoresoportunidades.
Los ejercicios están pensados para ser montados físicamente utilizando una protoboard y diferentes
componentes electrónicos, pero pueden ser simplemente simulados, aunque se pierde la diversión y la práctica
delmontajeelectrónico.
Los ejercicios están organizados en tres bloques: las lecciones 4, 5 y 6. En cada uno de los tres bloques hay
diferentes ejemplos en orden de complejidad creciente, desde los muy básicos hasta los muy avanzados. La
mayoría de los ejercicios están enlazados a una solución online en Tinkercad, donde se puede ver el circuito de
hardwareasociadoalasolución,asícomoelcódigo,ysepuedesimularelfuncionamientodelcircuito.
INTRODUCCIÓN
ORGANIZACIÓN
4
Los ejercicios están pensados como una forma de introducir diferentes elementos que se pueden usar en un
robot (diodos, sensores, LCDs, etc.) en un entorno de simulación sencillo, y simultáneamente hacer la transición
asuusoenhardwarereal.Lametodologíasugeridaparautilizarestosejercicioseslasiguiente:
Ÿ BuscarenTinkercadcircuitossimilaresytrabajarsobreellos.
Ÿ Trabajarenlosejerciciosdelalección4,primeroatravésdelasimulaciónenTinkercadydespuésmontando
loscircuitosyprogramandoelArduinoUNO.
Ÿ Trabajar en los ejercicios proporcionados con el Kit Elegoo Robot Car, montar el robot y usar los diferentes
sensoresyacturadores.
Ÿ BuscarenTinkercadcircuitossimilaresytrabajarsobreellos.
Ÿ Trabajarenlosejerciciosdelalección5,primeroatravésdelasimulaciónenTinkercadydespuésmontando
loscircuitosyprogramandoelArduinoUNO.
Ÿ Trabajarenlosejerciciosdelalección6.
Ÿ 3xresistenciasde220ohm.
Ÿ ArduinoUNOconATMEGA328P.
Ÿ 2xpotenciómetrode10K.
Ÿ 3x resistenciasde10K.
Ÿ RMD6300 lectordetarjetasRFID.
Ÿ MicromotorDC.
Ÿ Protoboard,puedeserunapequeñacomo estaomejorunagrandecomoesta.
Ÿ TiradeLEDRGB.
Ÿ L293 driverdemotores.
Ÿ MosfetcanalN.
Ÿ 3micropulsadores.
Ÿ ArduinoyunoArduinoyunshieldparaArduinouno.
Ÿ SensordetemperaturaLM35.
Ÿ Parallax ping sensor de distancia de ultrasonidos. Es un sensor caro y se utiliza en estos ejemplos porque
estámodelizadoenTinkercad,peropuederemplazarse,conmínimoscambios,porelHC-SR04queesmucho
másbarato.
Ÿ Leds:rojo,verdeyamarillo.
Ÿ RFIDtokens.
Ÿ Micro-servo.
LISTA DE MATERIALES
5
LECCIÓN 4: INTRODUCCIÓN
A ARDUINO Y ROBÓTICA
Ÿ CrearcircuitoselementalesconArduino.
Ÿ Familiarizarseconlaprogramaciónutilizandobloques.
Ÿ ConstruircircuitosbásicosconTinkercad.
1.Blink(parpadeo)
Despuésdecompletarestalecciónlosalumnosdebensercapacesde:
Ÿ EscribirprogramasenpequeñosprogramassencillosenC++ utilizandolasestructurasmáselementales.
Objetivos:
Ÿ Utilizardispositivoselectrónicoscomoresistencias,leds,protoboards,…
Ÿ LeeryentenderprogramasbásicosenC++
Ejercicios
Ÿ Blink(parpadeo):https://www.tinkercad.com/things/ejt30quxU9d
Ÿ Trafficlight(semáforo):https://www.tinkercad.com/things/cdgx8jSsFSo
Ÿ Seguirlasecuenciadeinstruccionesdeunprogramabásicoydeducirlosresultadosdesalida.
Ÿ Switchon/offalight(encender/apagarunaluz):https://www.tinkercad.com/things/lTBPtStOWzM
Ÿ Utilizandobloques(pseudocódigo)escribirunprogramaquehagaqueelledparpadeeunavezporsegundo.
Ÿ SimularelcircuitoenTinkercad.
Ÿ Usando Tinkercad circuits, crear un circuito con Arduino UNO, una protoboard y un led conectado al pin
digital8deArduino.
Ÿ Comparar los bloques con el código generado por Tinkercad (seleccionar la opción block+text y Tinkercad
generaráelcódigo).
Ÿ Montarelcorrespondientecircuitoreal,programarloconArduinoIDEyprobarlo.
Ÿ ¿Cuáleselvalordelaresistenciayporqué?
6
Circuito:
LassalidasdeArduinoson5Vcuandoestánanivelalto.ElledcuandoestáencendidotieneunaVledcercanaa2V,por
lo tanto Vr=5V-Vled=3V. Si queremos que el led luzca bien, utilizaremos una corriente de 15mA, por lo tanto
R=3V/15mA=200ohm.
Bloques:
Code:
delay(500); //During500milliseconds
voidloop()
{
digitalWrite(8,HIGH); //ON
}
{
digitalWrite(8,LOW); //OFF
pinMode(8,OUTPUT);
voidsetup()
delay(500); //During500milliseconds
}
Los bloques corresponden al contenido del loop().
Se ejecutará en un bucle infinito.
7
Circuito:
Ÿ SimularelcircuitoenTinkercad.
Ÿ Comparar los bloques con el código generado por Tinkercad (seleccionar la opción block+text y Tinkercad
generaráelcódigo).
https://www.tinkercad.com/things/ejt30quxU9d
2.TrafficLight(semáforo)
Ÿ Usando Tinkercad circuits, crear un circuito con Arduino UNO, una protoboard, y tres leds (rojo, amarillo y
verde)conectadosalospines2,3,4.
Ÿ Usando bloques escribir un programa que implemente un semáforo: la luz verde estará encendida durante
20s,luegolaluzamarillaparpadeará10vecesyluegolaluzrojaestaráencendidadurante20s.
Ÿ Montarelcorrespondientecircuitoreal,programarloconArduinoIDEyprobarlo.
8
Bloques:
Código:
voidsetup()
digitalWrite(3,LOW);
pinMode(3,OUTPUT);
digitalWrite(2,LOW);
digitalWrite(4,LOW);
pinMode(2,OUTPUT);
digitalWrite(2,HIGH); //Green
delay(20000); //during 20s
{
{
pinMode(4,OUTPUT);
}
voidloop()
9
}
digitalWrite(4,HIGH);
digitalWrite(3,LOW);
Circuito:
digitalWrite(3,HIGH); //yellowON
digitalWrite(3,LOW); //yellowOFF
delay(500); //during500milliseconds
delay(20000); //during20s
Ÿ Usando Tinkercad circuits, crear un circuito con Arduino UNO, una protoboard, un led y un micropulsador
paraencender/apagar.
Ÿ Montarelcorrespondientecircuitoreal,porogramarloconArduinoIDEyprobarlo.
for(intcounter=0;counter<10;++counter) //blink10times
digitalWrite(2,LOW); //RED
delay(500); //during500milliseconds
{
}
https://www.tinkercad.com/things/cdgx8jSsFSo
3.Switchon/offalight(encender/apagarunaluz)
Ÿ Usandobloquesescribirunprogramaqueespereaqueelusuariopulseelpulsadorycambieelestadodelled
(encendido/apagado).
Ÿ SimularelcircuitoenTinkercad.
Ÿ CompararlosbloquesconelcódigogeneradoporTinkercad(seleccionarblocks+textyTinkercadgeneraráel
código).
10
while(digitalRead(2)==1){} //waitrelease
{
delay(20); //Waitfor20millisecondstoavoidreboundswhenpressing
Bloques:
Código:
intstate=0;
{
voidsetup()
pinMode(2,INPUT);
pinMode(8,OUTPUT);
}
voidloop()
{
if(digitalRead(2)==1)
11
}else
{
{
}
}else
}
delay(20); //Waitfor20millisecondstoavoidreboundswhenreleasing
{
if(state==1)
state=0;
if(state==0)
{
}
https://www.tinkercad.com/things/lTBPtStOWzM
}
state=1;
digitalWrite(8,LOW);
digitalWrite(8,HIGH);
12
LECCIÓN 5:
ARDUINO BÁSICO
Ÿ Montarelcorrespondientecircuitorealenprotoboard,programarloconArduinoIDEyprobarlo.
Ÿ Usando Tinkercad circuits, crear un circuito con un Arduino UNO, una protoboard y un LCD. Mostrar “Hello
world”enelLCD.
Ÿ SimularelcircuitoenTinkercad.
Ÿ ¿Paráquéeselpotenciómetro?
Circuito:
1.LCD
Ÿ LCD:https://www.tinkercad.com/things/h6c7oCjkj7L
Ÿ Controldeunservo:https://www.tinkercad.com/things/9qYj2rVm0jD
Ÿ EscribirprogramasbásicosenArduinoutilizandolibreríasconclasesyobjetosdeC++.
Objetivos:
Despuésdecompletarestalección,losalumnosdebensercapacesde:
Ÿ UsarunLCDenArduinoparamostrarmensajesalusuario.
Ÿ DiferenciarentreelusoanalógicoydigitaldelasentradasysalidasenArduino.
Ejercicios
Ÿ Medidadetemperatura:https://www.tinkercad.com/things/8h3Z9DviRtp
Ÿ TablaASCII:https://www.tinkercad.com/things/icWyROFaZr9
Ÿ Usardiferentestiposdesensoresyactuadores(sensoresdetemperatura,sensoresdedistancia,servomotores).
Ÿ MedidadedistanciaconelsensorParallaxping:https://www.tinkercad.com/things/kDk54zrw28W
13
LiquidCrystallcd(rs,en,d4,d5,d6,d7);
}
lcd.setCursor(0,1);
lcd.print(millis()/1000);
Ÿ UsandoTinkercadcircuits,crearuncircutoconArduinoUNO,unaprotoboardyunLCD.MostrarlatablaASCII
completaenelLCD.
Ÿ Montarelcircuitorealcorrespondiente,programarlousandoArduinoIDEyprobarlo.
#include<LiquidCrystal.h>
Código:
lcd.print("hello,world!");
voidloop(){
//setthecursortocolumn0,line1
lcd.begin(16,2);
voidsetup(){
//setuptheLCD'snumberofcolumnsandrows:
constintrs=13,en=11,d4=7,d5=6,d6=5,d7=4;
//PrintamessagetotheLCD.
//(note:line1isthesecondrow,sincecountingbeginswith0):
//printthenumberofsecondssincereset:
}
https://www.tinkercad.com/things/h6c7oCjkj7L
2.TablaASCII
Ÿ SimularelcircuitoenTinkercad.
14
Circuito:
lcd.print("ASCIItable");
Código:
#include<LiquidCrystal.h>
constintrs=13,en=11,d4=7,d5=6,d6=5,d7=4;
LiquidCrystallcd(rs,en,d4,d5,d6,d7);
voidsetup()
{
lcd.begin(16,2);
}
voidloop()
{
delay(3000);
lcd.print(msg);
}
lcd.setCursor(0,0);
delay(500);
{
sprintf(msg,"Ascii:%iChar:%c",i,i);//printscodeandcharacter
}
lcd.clear();
for(inti=32;i<256;i++)//fromblankspacetoendofasciitable
charmsg[20];
https://www.tinkercad.com/things/icWyROFaZr9
15
3. Medidadetemperatura
voidsetup()
}
{
charmsg[20];
lcd.setCursor(0,0);
//setuptheLCD'snumberofcolumnsandrows:
LiquidCrystallcd(rs,en,d4,d5,d6,d7);
lcd.print(msg);
{
constintrs=13,en=11,d4=7,d5=6,d6=5,d7=4;
Usando un sensor LM35 se deberá mostrar la temperatura actual en un LCD. Consultar la documentación sobre
elLM35en: http://www.ti.com/lit/ds/symlink/lm35.pdf.Comosepuedecomprobar,elsensordaunatensiónde
10mV/ºC.
Circuito:
Código:
#include<LiquidCrystal.h>
lcd.begin(16,2);
voidloop()
inttemp=analogRead(0)*500/1023;//10mV/ºC->converttoºC
sprintf(msg,"Temp=%d%cC",temp,178);//createthetextstringtosendtotheLCD
}
https://www.tinkercad.com/things/8h3Z9DviRtp
16
4. MidiendodistanciasconelsensorParalaxPing
Código:
}
LiquidCrystallcd(rs,en,d4,d5,d6,d7);
Circuito:
constintrs=13,en=11,d4=7,d5=6,d6=5,d7=4;
constintping=2;
https://www.parallax.com/product/28015.
#include<LiquidCrystal.h>
Utilizar el sensor Ping de Paralax para medir distancia y mostrarla en cm el LCD. Se hará en Tinkercad y se
simulará. Se montará el circuito real correspondiente y se probará. En caso de no disponer del sensor Ping de
Parallax,sepuedehacerlasmodificacionesnecesariasparahacerelcircuitousandoelsensorHC-SR04,peroen
estecasoseusaráunpinparatriggeryotroparaecho.Documentacióndelsensor:
voidsetup()
{
lcd.begin(16,2);
voidloop()
{
17
intdistance=duration/58;
longduration=pulseIn(ping,HIGH);
//Calculatingthedistance
lcd.print("Distance:");
lcd.print(distance);
Se va a controlar la posición de un servo de acuerdo con la posición de un potenciómetro. Se conectará el
potenciómetro de forma que de un valor entre 0 y 5V en el pin A3. Se conectará el servo al pin D9 y se controlará
generandounaseñalPWMenesepinutilizandolaclaseServo.
5. Controldeunservo
}
lcd.setCursor(0,1);
//Triggerpinstartlow
pinMode(ping,OUTPUT);// Output
digitalWrite(ping,LOW);
delayMicroseconds(2);
//Generationofa10usHIGHpulseastrigger
delayMicroseconds(10);
digitalWrite(ping,LOW);
digitalWrite(ping,HIGH);
//Readingtheechoduration
pinMode(ping,INPUT);// settoinputforecho
https://www.tinkercad.com/things/kDk54zrw28W
18
#include<Servo.h>
voidsetup()
Código:
Servoservo;
#definepinPotentiometerA3
{
servo.attach(9);
voidloop()
}
{
intpotentiometer=analogRead(pinPotentiometer);
servo.write(position);
}
intposition=map(potentiometer,0,1023,0,180);
Circuito:
https://www.tinkercad.com/things/9qYj2rVm0jD
19
LECCIÓN 6:
ARDUINO AVANZADO
Ÿ EntenderyusarestructurascomplejasenC++yclasesyobjetoscomplejos.
Ejercicios:
Objetivos:
Ÿ Montarelcorrespondientecircuitoreal,programarloconArduinoIDEyprobarlo.
Ÿ Efectosluminosos.
1.ControlPWM
Circuito:
Ÿ UsarcombinacionescomplejasdehardwareysoftwareenArduino.
Ÿ ComunicarArduinoconotrosplataformasycrearsolucionesmixtasdehardware/software.
Ÿ ControlPWM:https://www.tinkercad.com/things/hm05Kl1ERG5
Ÿ ControldeaccesosconArduinoYun:https://github.com/fperal/AccessControl
Ÿ CrearlibreríasenC++confunciones,clasesyobjetos.
Ÿ Entender los esquemáticos y utilizarlos como una guía para montar circuitos utilizando Arduino y hardware
diverso.
Ÿ Usando Tinkercad circuits, crear un circuito con Arduino UNO, una protoboard, un LCD, un driver y un motor
DC. Deberá tener tres botones: uno fijará la rotación en el sentido de las agujas del reloj, otro fijará la rotación
en sentido contrario a las agujas del reloj y el otro parará el motor. Tendrá un potenciómetro que fijará la
velocidaddelmotor.
Ÿ SimularelcircuitoenTinkercad.
Despuésdecompletarestasesión,losalumnosdebensercapacesde:
20
#defineclockwise0
#defineButtonStop17
#defineenable3
{
Código:
constintrs=13,en=11,d4=7,d5=6,d6=5,d7=4;
LiquidCrystallcd(rs,en,d4,d5,d6,d7);
#definecounterclockwise1
#definestop2
#defineMotorPositive9
#include<LiquidCrystal.h>
#defineMotorNegative10
#defineButtonCW15
#defineButtonCCW16
voidSetMotorDirection(intdir);
voidSetMotorSpeed(intpercent);
voidsetup()
//setuptheLCD'snumberofcolumnsandrows:
pinMode(enable,OUTPUT);
pinMode(MotorNegative,OUTPUT);
lcd.begin(16,2);
pinMode(ButtonCW,INPUT);
pinMode(ButtonCCW,INPUT);
}
pinMode(MotorPositive,OUTPUT);
pinMode(ButtonStop,INPUT);
21
if(digitalRead(ButtonCW))
{
voidloop()
{
{
intspeed=analogRead(A0)/10;
lcd.setCursor(0,0);
lcd.setCursor(0,0);
lcd.print("Dir:CCW ");
if(digitalRead(ButtonStop))
SetMotorSpeed(speed);
lcd.setCursor(0,0);
}
lcd.setCursor(0,1);
lcd.print("Dir:stop ");
}
}
SetMotorDirection(stop);
SetMotorDirection(counterclockwise);
SetMotorDirection(clockwise);
lcd.print(speed);
{
lcd.print("Dir:CW ");
if(digitalRead(ButtonCCW))
}
lcd.print("Speed:");
lcd.print(" ");
22
digitalWrite(MotorPositive,LOW);
break;
{
analogWrite(enable,percent*2.55);
voidSetMotorDirection(intdir)
{
switch(dir)
{
digitalWrite(MotorPositive,HIGH);
digitalWrite(MotorNegative,LOW);
caseclockwise:
voidSetMotorSpeed(intpercent)
}
casecounterclockwise:
digitalWrite(MotorNegative,HIGH);
digitalWrite(MotorPositive,HIGH);
casestop:
}
}
break;
digitalWrite(MotorNegative,HIGH);
2.Efectosluminosos
Documentación:
lVamosausarlaclasefastLEDparahacervariosefectosdeluzconunatiradeledsdecolor.
break;
Ÿ Fastledclass
Ÿ RGBledstrip
Ÿ Fastledbasicusage
https://www.tinkercad.com/things/hm05Kl1ERG5
23
}
for(inti=0;i<NumLeds;i++)
}
Código:
#include"FastLED.h"
{
for(inti=0;i<NumLeds;i++)
voidloop()
delay(100);
voidsetup()
#defineDATA_PIN6
//redincreasinggradient
randomSeed(analogRead(0));
leds[i].red=i;FastLED.show();
#defineNumLeds30
{
FastLED.addLeds<NEOPIXEL,DATA_PIN>(leds,NumLeds);
{
{
leds[i]=CRGB::Black;FastLED.show();delay(30);
CRGBleds[NumLeds];
//whitesweep
leds[i]=CRGB::White;FastLED.show();delay(30);
//clearingred
for(inti=0;i<NumLeds;i++)
//colorgradient
}
24
delay(100);
//greeincreasinggradient
{
leds[i].red=0;FastLED.show();
}
for(inti=0;i<NumLeds;i++)
{
leds[i].green=i;FastLED.show();
}
delay(100);
//clearinggree
for(inti=0;i<NumLeds;i++)
{
leds[i].green=0;FastLED.show();
delay(100);
}
delay(100);
for(inti=0;i<NumLeds;i++)
leds[i].blue=i;FastLED.show();
//clearingblue
{
//blueincreasinggradient
for(inti=0;i<NumLeds;i++)
{
delay(100);
}
leds[i].blue=0;FastLED.show();
}
25
{
green=random(255);
inttime=millis();
leds[led].red=red;
red=random(255);
blue=random(255);
Ÿ El programa leerá los tokens a través del RMD6300, que estará conectado al puerto serie de Arduino,
comprobarásieltokenestáautorizado,yabrirálapuertaencasoafirmativo.
FastLED.show();
}while(millis()<(time+5000)); //during5seconds
leds[led].green=green;
do
}
leds[led].blue=blue;
led=random(NumLeds);
//randomcolorsoneachled
intred,green,blue,led;
Ÿ El Arduino Yun mantendrá un archivo con una lista de los usuarios autorizados y los tokens, y otro archivo
conunlogdelosaccesos.
Documentation:
3.ControldeaccesosconArduinoYun
Ÿ El objetivo de este ejercicio es controlar el acceso a un lugar controlando una cerradura eléctrica mediante
tokensRFIDyunlectorRMD6300utilizandounArduinoYun.
Ÿ RMD6300
Ÿ RFIDtokens
26
Circuito:
27
////////////////////////////////////////////////////////////////////////////////////////////
//
// ArduinoprogramusesRMD6300toreadRFIDtokens
// RFIDYun
// LininopartstoresRFIDvalidnumbersinafilenamedusers
// usersformatissimilarto/etc/passwd:onelineforeachuser
// lineformatisRFIDid:username
// RFIDidisa7digitnumber
#include<FileIO.h>
#include<Bridge.h>
//DEBUGuses"serial"console.Ifitisnotavailableitfreezesatthebeginningoftheprogram
//AltSoftSerialworkbetterthansoftwareserial(betterperformance)
unsignedlongintlongCalcCode(char*tag);
//SoftwareSerialRFID(2,8);//(RX=2,TX=8)
//#defineDEBUG
//FILEDEBUGusesaccesslogfiletologbuttonapenaswellasrfidlogin
unsignedcharHexToNum(unsignedchardigit);
//itusesatimer
intTagCheck(unsignedlongintcode,char*tag);
StringgetTimeStamp();
#include<AltSoftSerial.h>
#defineFILEDEBUG
//#include<SoftwareSerial.h>
intReadUser(File&,char*tag,char*username);
AltSoftSerialRFID;//(RX=13,TX=5)
Código:
28
Console.begin();//startcommunicationwithethernetconsole(300bps)
#endif
#ifdefDEBUG
Console.println("Arduinostarting......");
//greenledpin8
#defineBUTTON11
//redledpin10
#defineGREEN8
#defineRED10
RFID.begin(9600);//startserialtoRFIDreader
pinMode(GREEN,OUTPUT);
voidsetup()
pinMode(RED,OUTPUT);
Bridge.begin();//startcommunicationwithlinino
{
while(!Console);//waituntilconsoleisready
/*//initializecomunicationwiththefilesysteminthelininopart
FileSystem.open("users",FILE_READ);
}
chartag[14];
intindex=0;
inti;
FileSystem.begin();
voidloop()
{
*/
29
UsersFile.close();//finishedreading,fileclosed
FileLogFile=FileSystem.open("/root/accesslog",FILE_APPEND);
FileUsersFile=FileSystem.open("/root/users",FILE_READ);
{
//createobjetsUsersFile,linkedtousersinlinino,openforreading
#endif
i=RFID.read();
tag[index++]=i;
Console.println("");//sendingLFtotheconsole(ifnotitdoesnotshow)
#ifdefDEBUG//printingthecodereadedtotheconsoleterminal
charrfid[10],user[25],userOK[25]="";
do//makingasweepofthe13bytesandputtingalltogetherinastring
}while(i!=3);
{
if(TagCheck(atol(rfid),tag))//convertstringtonumberandcheckagainsttag
{
Console.print("");
OK=1;
strcpy(userOK,user);
Console.print(i);
#ifdefDEBUG
#endif
intOK=0;
while(ReadUser(UsersFile,rfid,user)==0)//wewillsweepallusersfileuntiluserfoundorEOF
}
if(RFID.available()>13)//RFIDtokenis13byteslong,soIcheckifthereisatleast13bytes
{
}
//creatinglog,itwilladdusertotheendofthelogfile
30
Console.println("OK");
Console.println(userOK);
LogFile.print(userOK);//logaccesstofile
if(OK)
{
#ifdefDEBUG
Console.print("Hello");
#endif
LogFile.print("accessat");LogFile.println(getTimeStamp());
digitalWrite(GREEN,HIGH);
delay(2000);
}
else
{
#ifdefDEBUG
Console.println("ERROR");
#endif
digitalWrite(RED,HIGH);
delay(2000);
digitalWrite(RED,LOW);
digitalWrite(GREEN,LOW);
}
LogFile.close();
RFID.flush();
while(RFID.available())RFID.read();//flushseemnottoworkwell,soIreadalldatafromRFIDtoemptyit
//withoutthis,itreads6timeseachRFID.
delay(3000);
31
//gettingdateinsecondsfrommidnight
StringsDate=getTimeStamp();
//formatHH:MM/Oforopenthedoor
{
Stringline=CalendarFile.readStringUntil('n');
intOpenTheDoor=0;
unsignedlongintLineSeconds=3600*(line.substring(0,2)).toInt()+60*(line.substring(3,5)).toInt();
//Readinglinesfromthefile.Thelinesaremarkedwiththetimeinwichweopenorclosethedoor
StringsHours=sDate.substring(11,13);
if(sDay.toInt()<6)//frommondaytofriday
{
if(line.substring(6,7)=="O")OpenTheDoor=1;
if(line.substring(6,7)=="C")OpenTheDoor=0;
//calendarfile/root/calendar
StringsDay=sDate.substring(0,1);
StringsSeconds=sDate.substring(17,19);
unsignedlongintseconds=3600*sHours.toInt()+60*sMinutes.toInt()+sSeconds.toInt();
//andHH:MM/Cforclosethedoor
FileCalendarFile=FileSystem.open("/root/calendar",FILE_READ);
while(CalendarFile.available()>0)
{
}
if(line.length()==7&&line.substring(0,1)!="#")
StringsMinutes=sDate.substring(14,16);
{
//tranlatingHH:MMtosecondsfrommidnight
if(seconds>LineSeconds)
}
}
}
32
}
CalendarFile.close();
{
if(!digitalRead(BUTTON))//userrequesttoopenthedoor(pull-up)
{
#ifdefDEBUG
Console.println("/Open/");
#endif
#ifdefFILEDEBUG
FileLogFile=FileSystem.open("/root/accesslog",FILE_APPEND);
LogFile.print("BUTTONaccessat");LogFile.println(getTimeStamp());
#endif
digitalWrite(GREEN,HIGH);//itwillblinkopen
if(OpenTheDoor)//iftheschedulesaysthedoorshouldbeopenednow
delay(1000);
digitalWrite(RED,HIGH);
digitalWrite(GREEN,LOW);
}
if(OpenTheDoor)//iftheschedulesaysthedoorshouldbeopenednow
{
digitalWrite(GREEN,LOW);
}
digitalWrite(RED,LOW);
else
}
delay(1000);
/*
{
33
// HexToNum
// ConvertaHEXdigitinASCIIformattoanumberwithitsvalue
{
delay(9000);
//
Console.println("/Open/");
delay(1000);
#ifdefDEBUG
digitalWrite(GREEN,LOW);
#endif
#endif
{
delay(10000);
*/
}
#ifdefDEBUG
}
else
Console.println("/close/");
digitalWrite(GREEN,HIGH);//itwillblinkopen1severy10s
}
///////////////////////////////////////////////////////
//
unsignedcharHexToNum(unsignedchardigit)
if((digit>='0')&&(digit<='9'))returndigit-48;
////////////////////////////////////////////////////////
// TagCheck
//
}
if((digit>='A')&&(digit<='F'))returndigit-55;
if((digit>='a')&&(digit<='f'))returndigit-87;
34
// Checkdecimalnumberprintedontagagainsttagreaded
// byRFIDsensorinHEXformat
// code->decimalcodeprintedontag
//
{
unsignedcharHexData[4];
for (int i = 3, index = 0; i < 11; i = i + 2, index++) HexData[index] = (HexToNum(tag[i]) << 4) + HexToNum(tag[i +
1]);
//
// tag[]->characterarraycontainigtaginHEXformat
intTagCheck(unsignedlongintcode,char*tag)
unsignedlongintCalcCode=HexData[0];
CalcCode=(CalcCode<<8)+HexData[i++];//generatethecodeusinghexdigitsweights
while(i<4)
returncode==CalcCode;
////////////////////////////////////////////////////////
}
//
// ConvertRFIDsensorinHEXformattonumericformat
}
inti=0;
// code->decimalcodeprintedontag
//
checksum=checksum^HexData[i];
// longCalcCode
// asprintedintags
intchecksum=0x0A;
{
35
{
//
intchecksum=0x0A;
// Returns0ifeverythingwentOKand>0ifthereissomeerror:
unsignedlongintlongCalcCode(char*tag)
for (int i = 3, index = 0; i < 11; i = i + 2, index++) HexData[index] = (HexToNum(tag[i]) << 4) + HexToNum(tag[i +
1]);
unsignedlongintCalcCode=HexData[0];
while(i<4)
unsignedcharHexData[4];
// tag[]->characterarraycontainigtaginHEXformat
inti=0;
}
checksum=checksum^HexData[i];
CalcCode=(CalcCode<<8)+HexData[i++];//generatethecodeusinghexdigitsweights
returnCalcCode;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// ReadUser
//
}
// Readslininofileforthenexttagid
// ReturnstagIDinstringformatattagandusernamealsoinstringformatatusername
// 1->Errorreadingfile/root/users
// 2->Error:/root/usersmaybeempty?
intReadUser(File&UsersFile,char*tag,char*username)
{
if(UsersFile==0)return1;
36
if(UsersFile.available()==0)return2;//nodatafound.MaybeEOF?
chardata[25]="xx";
inti=0;
while(UsersFile.available()>0&&data[i]!='n')//readfileuntilEOForLFfound
{
tag[i++]='0';//addstringterminator
{
tag[i]=data[i];
return0;//allwentOK
// Thisfunctionreturnastringwiththetimestamp
intn=0;
{
}
i=0;
}while(data[++i]!='n');
// getTimeStamp()
// Fromhttps://www.arduino.cc/en/Tutorial/YunDatalogger
//////////////////////////////////////////////////////////////////////////////////////////////////////////
if(data[i]!='n')i++;//nextcharuntilLFfound
//
//
data[i]=UsersFile.read();
do//readusername,untilLFfound
do//readtag,until:found
username[n++]=data[i];
}
//
username[n]='0';//addendofstring
}while(data[++i]!=':');
37
time.addParameter("+%u%D%T");//parameters:Dforthecompletedatemm/dd/yy
StringgetTimeStamp()
{
Stringresult;
Processtime;
//dateisacommandlineutilitytogetthedateandthetime
//indifferentformatsdependingontheadditionalparameter
time.begin("date");
//Tforthetimehh:mm:ss
time.run();//runthecommand
//readtheoutputofthecommand
result+=c;
if(c!='n'){
}
}
while(time.available()>0){
//uforweekdaynumber(1ismonday)
charc=time.read();
}
returnresult;
https://github.com/fperal/AccessControl
38
PROTOBOARD
Una protoboard se usa para montar circuitos de forma rápida sin necesidad de soldar. Los agujeros están
interconectadoscomoseveenestaimagen.MásinformaciónenWikipedia:
https://en.wikipedia.org/wiki/Breadboard
LED
Uun Diodo Emisor de Luz (Light Emmiting Diode) es un dispositivo optoelectrónico que emite luz coloreada
cuando se polariza en directo. Debe usarse junto con una resistencia para limitar la corriente que circula por él.
Típicamente, tieneunacaídadetensiónentornoa2V.MásinformaciónenWikipedia:
https://en.wikipedia.org/wiki/Light-emitting_diode
ANEXO
39
POTENCIÓMETRO
Es un dispositivo como cualquier otro interruptor. Cierra un circuito.
MICRO PULSADORES
RESISTENCIA
https://en.wikipedia.org/wiki/Resistor
Unaresistencia(oresistor)esundispositivoqueproporcionaresistenciaeléctricaalpasodelacorriente.Hayun
códigodecoloresparaidentificarlasresistencias.MásinformaciónenWikipedia:
Es un dispositivo con tres terminales que proporciona resistencia variable. Puede utilizarse como una
resistenciavariableocomodivisordetensión.MásinformaciónenWikipedia:
https://en.wikipedia.org/wiki/Potentiometer
40
LM35
PARALLAX PING
Esunsensordedistanciaporultrasonidos.Emitepulsosdeultrasonidosa40Khzymideeltiempoentreelpulso
emitido y el reflejado y genera un pulso de 5V y duración variable proporcional a la distancia medida. Más
informaciónenlawebdeParallax::https://www.parallax.com/product/28015.
El LM35 es un sensor de temperatura integrado. Tiene tres terminales: alimentaciones y salida: La salida es
10mV/ºC.MásinformaciónenlapáginawebdeTexasInstrument:
MICRO-SERVO
Un micro-servo es un pequeño servomotor. Un servo es un tipo especial de motor controlado por una placa de
control que mantiene el motor en una posición fija. Es posible ajustar la posición con pocos grados de
precisión.La posición del servo se controla mediante el ciclo de trabajo de una señal PWM con una frecuencia
típicade50Hz(https://en.wikipedia.org/wiki/Servo_control).
41
MOSFETACANALN
https://www.electronics-tutorials.ws/transistor/tran_6.html
https://en.wikipedia.org/wiki/DC_motor
Es un driver de motor integrado para realizar un puente H. Proporciona control total sobre el motor incluyendo
controlbidireccionalyfrenado.Másinformaciónen Wikipedia:https://en.wikipedia.org/wiki/H_bridge
Un micromotor es un pequeño motor de corriente continua capaz de mover un pequeño robot. Debe conectarse
a través de un driver (como L293 o L298) porque necesita corrientes por encima de 100mA para trabajar. Un
micromotorDCnormalmenterotaavariosmilesderpmyporlotanto,parabajarsuvelocidaddegiroyaumentar
elparsueleirequipadoconunareductora,comoestedelaimagen.MásinformaciónenWikipedia:
L293
MICRO MOTOR DC
Un MOSFET es un transistor de potencia controlador por tensión de puerta normalmente usado como
interruptorcontroladorportensión.Másinformación:
42
TIRADELEDSRGB
Es una tira de leds de colores. Cada uno de los leds de la tira se puede controlar de forma individual fijando la
intensidaddecada uno delos trescomponentes decolor.La tirausada esuna tiraNeoPixel.Los ledsvan unidos
en un registro de desplazamiento y se puede fijar el color de cada uno de los componentes de color (rojo, verde y
azul) de cada led con un PWM de 8 bits de precisión (por lo tanto 24 bits/pixel). Más información en Adafruit::
https://www.adafruit.com/product/1376?length=1
LECTOR DE TARJETAS RFID RMD6300 RFID Y TOKENS RFID
El mini módulo RDM6300 125KHz está diseñado para leer códigos de tarjetas compatibles a 125Khz. Tokens de
sólolecturaotarjetasdelectura/escritura.MásinformaciónenIteadwiki:
https://www.itead.cc/wiki/RDM6300
43
ARDUINO YUN
Arduino Yun es una placa microcontrolada basada en el ATmega32u4 y el Atheros AR9331. El procesador
Atheros soporta una distribución Linux basada en OpenWrt llamada Linino OS. La placa lleva soporte Ethernet y
Wi-Fi incluido, un puerto USB-A, una ranura micro-SD, 20 pines de entrada/salida digitales (7 de ellos pueden ser
usadoscomosalidasPWMy12deelloscomoentradasanalógicas),unosciladoracristalde16Mhz,unconector
micro-USB,unconectorICSPytresbotonesdereset.
Ÿ https://store.arduino.cc/arduino-yun
Ÿ https://en.wikipedia.org/wiki/OpenWrt
Másinformación:

Tinkercad. Practicas y soluciones