You are on page 1of 6

(/)

Estaqu:Inicio(/) Arduino(/arduino)
(ArduQuest)ProyectodeejemploparalainiciacinalaprogramacinenArduinoconprogramacinporbloques(Scratch)yporcdigo

(ArduQuest) Proyecto de ejemplo para la iniciacin a la programacin en


Arduino con programacin por bloques (Scratch) y por cdigo (/arduino/417-
iniciacion-a-la-programacion-arduino-creando-proyecto-arduquest)

ConelfindequepuedasconoceralgunosaspectosdeiniciacinenlaprogramacinconArduino,seplanteaesteproyectoquepretendecrear 8
unpequeodispositivoquepermitaunusuarioresponderaunaspreguntasusandobotones.Eldispositivoinformarsilarespuestaala
preguntaencorrectaono.Adems,elusuariopodrseleccionarlapreguntaalaquedesearesponderpudiendoelegirelnmerodelapregunta.

ArduQuest en funcionamiento

Recursos para el aprendizaje de la programacin con Arduino


ParaquepuedasprofundizarenelaprendizajedelaprogramacinconArduinoorealizarconsultassobrealgnaspectoconcreto,terecomiendolos
siguientesenlaces:
TraduccindeArduinoNotebook(http://playground.arduino.cc/Es/ArduinoNotebookTraduccion)(tambinversinenPDF
(http://www.ardumania.es/wpcontent/uploads/2011/10/Arduino_programing_notebook_ES.pdf))
TraduccincolaborativaalespaoldelManualdeaprendizajedelaprogramacinenArduino
(http://playground.arduino.cc/uploads/Main/arduino_notebook_v11.pdf)deBryanW.Evans
Chuletaconfuncionesprincipales(https://github.com/antoniom/Acordeonarduino/blob/master/Acordeon%20Arduino.pdf?raw=true)(PDF)
GavinSmith/liffiton/FredericDufourgTraducidoporAntonioMaldonado
LanguageReference(https://www.arduino.cc/en/Reference/HomePage)
Guadereferenciaoficialdellenguaje(enIngls)
ColeccindeGuasdeiniciacinaArduino(http://playground.arduino.cc/Es/Guias)
ListaespaoladerecursosenlazadosenlawebdeArduino

Programacin grca mediantebloques (Scratch)


ParainiciarteenlaprogramacindeArduino,puedesempezarusandounaaplicacindeprogramacingrficausandobloques(basadaenScratch),
comoeselcasodemBlock,asqueinstalaesaaplicacindesdesuwebprincipal:www.mblock.cc(http://www.mblock.cc).Silodeseas,cambia
elidiomadelaaplicacinaEspaolusandoelmenLanguage>Espaol.Conestetipodeaplicacionesdeprogramacinvisualpuedesverlas
instruccionesmsimportantesquesepuedenaplicaraunaplacaArduino.

Indicaalaaplicacineltipodeplacaquevasausar,desdeelmenBoards.Tambindebersindicarelpuertoporelqueestconectadalaplacaal
ordenador,paraloquedebesusarelmenConectar>SerialPort>COMx(siendoxelnmerodepuertoUSBalqueestconectadalaplaca).

ParasimplificarelentornodelaaplicacinmBlockparaelusoquelevamosadar,cambiasumododevistausandoelmenEditar>Arduino
mode.AsegratedequetambinaparecemarcadalaopcinExtensions>Arduino.Aspodrsverslolosbloquesasociadosalaprogramacin
deArduino,yenlapartederechapodrsverelcdigocorrespondientealcdigoquedesarrollesdemaneragrficaenlapartecentral.
Encendido de una luz led
EmpiezacreandounaaplicacinqueenciendaunaluzledquepreviamentedebersconectaratuplacaArduino.Conectasupolopositivoaunodelos
pinesdigitalesyelpolonegativoaunaresistenciade220ohmiosqueasuvezseconectealatomadetierra.EnelartculoArduinoBlink
(https://www.arduino.cc/en/Tutorial/Blink),puedesverunejemplosimilardeconexin,conunavistadelcdigofuenteasociadoalencendidoy
apagadoreiteradodeunledconectadoalpin13.

ElequivalentealejemploBlinkrealizadoconmBlockseraelsiguiente:

UtilizaelbotnUploadtoArduinoquepuedesencontrarenlapartesuperiorderecha,ytraslacompilacindelcdigo,aparecerlaventanaque
informaqueelcdigosehasubidoalaplaca,ydebersverelledencencindoseyapagndosedemaneraindefinida.

Observaqueelcdigogenerado,queapareceenlapartederecha,esmuysimilaralcdigoqueaparecaeneltutorialdelawebdeArduinoqueseha
enlazadoanteriormente.TanslohacambiadoqueelvalorHIGH(alto)queseasignadadesdeelcdigo,aparececomo1,yelvalorLOW(bajo)seha
escritocomo0.LoqueocurreesquetantoHIGHcomoLOWsonconstantespredefinidasdeArduinoqueequivalenaesosvalores,porloquese
puedeutilizarunamanerauotra,aunqueesrecomendableusarlasconstantesparahacermslegibleelcdigo.

RepasaloscomentariosyeltextointroductorioqueapareceendichotutorialBlinkdelawebdeArduinoparacomprenderelfuncionamientode
cadalneadecdigo.

Encender el led al pulsar un botn


Parairdandoformaanuestroproyecto,nosinteresairconociendolamaneradeencenderunledalpulsarunbotn.

ObservaeneltutorialArduinoButton(https://www.arduino.cc/en/Tutorial/Button),lamaneradeconectarunbotnalaplacaArduino,
yelcdigocorrespondienteparaencenderelled(ojo,quenoapareceenelcircuito,yaqueusaelledintegradoenlaplacaqueeslomismoquetener
unledenelpin13).

Laprogramacinporbloquesparaesecdigopodrasersimilaralsiguiente,considerandoquesehatenidoquecrearlavariablebuttonStateenla
seccinData&Blocks.

Programar 2 botones para encender un led u otro


Ahorallegaelmomentodequehagaspruebasportmismo,colocandoentotal2botonesy2ledsalaplacaArduino,ysiguerealizandola
programacinusandolaaplicacinmBlockparaconocermejorlasinstrucciones(lossiguientesapartadoslosrealizarsusandodirectamenteel
entornodeprogramacindeArduino,escribiendodirectamenteelcdigo).
Debersprogramarlosbotonesdemaneraquealpulsarunodeellosseilumineunodelosleds,manteniendoelotroapagadoyviceversasisepulsael
otrobotn.Tenencuentaque,adiferenciadelejemplorealizadoanteriormente,cadaledcorrespondientedebermantenerseencendidoaunquese
suelteelbotn,porloquedebersguardarenunavariableunidentificadordelbotnhasidopulsado(porejemplo,asignandoaesavariableelvalor1
sisehapulsadoelprimerbotn,y2sisehapulsadoelsegundobotn).Unavezdetectadoelbotnquesehapulsado,elcdigodebepreguntarsise
hapulsadoelbotn1,encuyocasoseencenderelledcorrespondiente,yacontinuacinseharlamismapreguntaparaelbotn2encendiendoel
otroledensucaso.

Programacin desde el entorno de desarrollo (IDE) de Arduino


AhoraqueyahaspodidotenerunaideaaproximadadecmoseorganizaelcdigodeArduinoyalgunasdesusinstrucciones,utilizaapartirdeahora
elentornodeprogramacindeArduinopararealizarnuevoscambiosenelcdigodelproyecto.

CopiaypegaelcdigoquehastaahorahageneradolaaplicacinmBlockparanoempezardecero.Deesecdigopuedessuprimirlaslneasque
incluyenotraslibreras(#include....)yaquedemomentoslovanasernecesariaslasinstruccionesbsicasdeArduino(puedesaprendermssobre
librerasenArduinoLibraries(https://www.arduino.cc/en/Reference/Libraries)).Tambinpuedeseliminarlasvariablesangle_radyangle_deg
quesedeclaranparafacilitarlaconversindengulos,queenesteproyectonosevaautilizar.

Utilizaeliconodesubidadelcdigoalaplaca,paracomprobarqueelentornodeprogramacinestbienconectadoalaplaca,yqueelcdigo
siguefuncionandocorrectamente.

Mensajes de depuracin a travs del monitor Serie.


UnadelasventajasdeutilizarelentornodeprogramacindeArduinoespoderutilizarotrasherramientasmsavanzadascomoelmonitorSerie,
dondeelcdigodenuestraaplicacinpuedemostrarmensajesinformativos,quenoaparecendirectamenteenningndispositivodelaplacaArduino.
Estoseusanormalmenteparadepurarelcdigodelasaplicacionesporpartedelosprogramadoresparairconociendolosvaloresquevantomando
lasvariablesopordndevatranscurriendolaejecucindelcdigo.

Parapoderusaelmonitorserie,enelbloquedeiniciodelcdigodelaaplicacin(setup)debeshabilitarlacomunicacinindicandolavelocidadde
transmisin,queenestecasoes9600:

Serial.begin(9600)

Cadavezquedeseesmostrarunmensajeenelmonitorserie,debesefectuarunallamadaalafuncinprintdeSerial,comoenesteejemplo:

Serial.print("mimensaje\n")

Comohabrspodidoobservar,sehaaadido\nalfinaldelmensaje.Estolopuedesutilizarcadavezquedeseesintroducirunsaltodelnea,esdecir,
quesinoseindica\n,cadamensajeaparecerjustodetrsdelanterior,porloquesedificultarasuvisibilidad.

Sienlugardemostrarunmensajeconuntextoliteral,deseasmostrarelvalordeunavariable,debersindicarelnombredelavariablesinusarlas
comillas:

Serial.print(variable)

Paraverlosmensajes,abreelmonitorseriedespusdeiniciarlaejecucindelaaplicacin,usandoelmenHerramientas>Monitor
Serial.

Paraprobarestafuncionalidad,ypuedasdepurarelfuncionamientodetucdigo,aadeunmensajeSerialcuandosepulsecadabotnysigue
usndoloenlossiguientesapartadosparaconocersiestfuncionandocorrectamenteelcdigoquevayasdesarrollando.

Comprobar respuesta correcta o incorrecta


Realizaalgunasmodificacionesalcdigoquesetienehastaelmomento,paraqueunledcorrespondaaunarespuestacorrectayelotroauna
respuestaincorrecta(seraconvenienteusarunaluzverdeyrojaparacadacaso).Paraello,enunanuevavariablequedebescrear(puedesencontrar
ayudaenArduinoVariableDeclaration(https://www.arduino.cc/en/Reference/VariableDeclaration)),debesalmacenarelidentificador(12)del
botnquecorresponderalarespuestacorrectadeunahipotticapregunta.Elcdigodelaaplicacindebermodificarse,paraqueseencienda
laluzverdesisehapulsadoelbotnquesecorrespondealidentificadorquehasalmacenadoenlavariabledelarespuestacorrecta,olaluzroja
encasocontrario.Necesitarsconocerelfuncionamientodelassentenciasif(https://www.arduino.cc/en/Reference/If)eifelse
(https://www.arduino.cc/en/Reference/Else).

Compruebaqueelfuncionamientodelcdigoescorrectocambiandoelvalordelavariabledelidentificadordelarespuestacorrecta,demaneraque
sivale1seenciendelaluzverdealpulsarelbotn1,ysivale2seenciendelaluzverdealpulsarelbotn2.Laluzrojasedeberencenderalpulsarel
otrobotnencadacaso.

Paraqueelcdigovayaquedandolomslegibleposible,convieneindicarlosnmerosdelospinesusandoconstantes,demaneraqueenlugarde
indicaralgocomodigitalRead(3),seescribaporejemplodigitalRead(PIN_BOTON1),quequedamuchomsclaroyfcildemodificarsisecambian
lasconexionesdelaplaca.PuedesencontrarinformacinsobrecmodeclararconstantesenArduinoConst
(https://www.arduino.cc/en/Reference/Const).

Tambinescomnutilizarcomentariosdentrodelcdigoparaquequedemsclaralalecturadesufuncionamientoporlosprogramadores.Enlos
ejemplosvistosanteriormentehabrspodidoobservarmuchosdeesoscomentariosycmosedebenindicar.Tambinpuedesencontrarms
informacinenArduinoComments(https://www.arduino.cc/en/Reference/Comments).Asqueintroduceentucdigoloscomentariosoportunos
paraquevayaquedandoclarosufuncionamiento.

Utilizalafuncindelay(https://www.arduino.cc/en/Reference/Delay)(pausa)paraquelaslucesslopermanezcanencendidas1segundotras
pulsarunodelosbotones(sedebeenviarlasealLOWporelpincorrespondiente,paraapagarlaluzdespusdelapausa).Tenencuentaqueal
implementarestafuncionalidad,habrmomentos(lamayorpartedeltiempo)enquenohayaningunaluzencendida,porloquelavariableque
estabasutilizandoparaalmacenarelidentificadordelbotnquesehapulsadodeberalmacenarunvalorparaelcasoenquenoseencuentreningn
botnpulsado(porejemplo,elvalor0).

Zumbador para avisos sonoros de respuesta correcta o incorrecta


Conectaunzumbador(buzzer)aunodelospinesdigitalesdelaplacaArduino(laotrapatilladelzumbadoralatomadetierra)yenvaunsonido
gravesisehapulsadoelbotnincorrectoounsonidomsagudoycortosilarespuestaescorrecta.Puedesencontrarinformacinsobrecmo
enviarsonidoalzumbadorenArduinoTone(https://www.arduino.cc/en/Reference/Tone)obuscandoejemploenlawebsobreelusodela
funcintoneenArduino.

Selector de pregunta
Parahacerelproyectomsviable,puedesaadirmsdeunapreguntaalaaplicacin,conunarespuestacorrectadiferenteparacadapregunta(sino
seaadenmsbotones,slosepuedeelegirentre2posiblesrespuestasparacadapregunta).

Estosepodrahaceraadiendounpotencimetro(https://www.arduino.cc/en/Tutorial/Potentiometer)alaplaca,demaneraqueal
girarlopermitaelegirunnmerodepreguntahastaunmximodepreguntasqueseindiqueenelcdigodelaaplicacin.

Paraqueelusuarioconozcaelnmerodelapreguntasobrelaquedeberesponder,conunservomotor
(https://www.arduino.cc/en/Reference/Servo)puedeshacerunaespeciedesealador(flecha)demaneraqueeladaptadorquesecoloqueen
suejeapunteaunadeterminadazonadeunsemicrculoquecontengalosnmerosdelaspreguntas.

Hastaahoraseestabausandounavariablequecontenaelidentificadordelarespuestacorrecta,peroahorasedebepoderalmacenarmsdeuna
respuestacorrecta,porloquedebersusararrays(https://www.arduino.cc/en/Reference/Array)parapoderhacerlo.

Circuito y cdigo fuente con una posible solucin (mirar slo en caso de
emergencia )
#include<Servo.h>

constintPIN_BUTTON_A=2;
constintPIN_BUTTON_B=3;
constintPIN_LED_MAL=6;
constintPIN_LED_BIEN=7;
constintPIN_BUZZER=8;
constintPIN_SERVO=9;
constintPIN_POT_SELEC=0;

constintNUMERO_PREGUNTAS=4;

intidPreguntaSelec=1;

//Identificadoresdebotones
constintBOTON_0=0;//Nohaypulsadoningnbotn
constintBOTON_A=1;
constintBOTON_B=2;
intbotonPulsado=BOTON_0;//Iddelbotnqueestpulsado

intrespuestasCorrectas[]={
BOTON_A,
BOTON_B,
BOTON_B,
BOTON_A
};

Servoservo;

voidsetup(){
Serial.begin(9600);

pinMode(PIN_LED_BIEN,OUTPUT);
digitalWrite(PIN_LED_BIEN,LOW);
pinMode(PIN_LED_MAL,OUTPUT);
digitalWrite(PIN_LED_MAL,LOW);

servo.attach(PIN_SERVO);
}

voidloop(){
intestadoBotonA=digitalRead(PIN_BUTTON_A);
intestadoBotonB=digitalRead(PIN_BUTTON_B);

//Considerar,inicialmente,quenosehapulsadoningnbotn
botonPulsado=BOTON_0;

if(estadoBotonA==HIGH){
botonPulsado=BOTON_A;
Serial.print("BotonApulsado\n");
}

if(estadoBotonB==HIGH){
botonPulsado=BOTON_B;
Serial.print("BotonBpulsado\n");
}

if(botonPulsado!=BOTON_0){//SehapulsadoAoB
//Comprobarsilarespuestaescorrecta
if(respuestasCorrectas[idPreguntaSelec]==botonPulsado){
//Respuestaacertada
Serial.print("Respuestacorrecta\n");
tone(PIN_BUZZER,988,100);
digitalWrite(PIN_LED_BIEN,HIGH);
delay(1000);
digitalWrite(PIN_LED_BIEN,LOW);
}else{
//Respuestaincorrecta
Serial.print("Respuestaincorrecta\n");
tone(PIN_BUZZER,123,500);
digitalWrite(PIN_LED_MAL,HIGH);
delay(1000);
digitalWrite(PIN_LED_MAL,LOW);
}
}

//Moverflecha(servo)segnposicindelpotencimetro
intpotSelector=analogRead(PIN_POT_SELEC);
floatrangoPorPregunta=1024.0/NUMERO_PREGUNTAS;
intnuevoIdPregunta=potSelector/rangoPorPregunta;
if(nuevoIdPregunta!=idPreguntaSelec){
idPreguntaSelec=nuevoIdPregunta;
Serial.print("Preguntaseleccionada:");
Serial.print(idPreguntaSelec);
Serial.print("\n");

intanguloServo=180*idPreguntaSelec/NUMERO_PREGUNTAS;
//Ajustarnguloparasealaralcentrodelsector
anguloServo+=180/NUMERO_PREGUNTAS*0.5;
servo.write(anguloServo);
//Pequeaesperaparaevitarmovimientosdemasiadorpidos
delay(500);
}

}

Detalles
Categora:Arduino(/arduino)
C
Publicado:29Febrero2016
C
ltimaactualizacin:20Noviembre2016
<
Visto:2496

(http://creativecommons.org/licenses/by JavierGarcaEscobedo
ncsa/3.0/es/) (https://plus.google.com/104345622923909834485/)
Estaobraestbajouna IESNtra.Sra.delosRemedios
licenciadeCreativeCommons Ubrique(Cdiz) (https://twitter.com/javiergarbedo) (https://plus.google.com/+Javier
(http://creativecommons.org/licenses/byncsa/3.0/es/).

Regresararriba

You might also like