Beruflich Dokumente
Kultur Dokumente
Estaqu:Inicio(/) Arduino(/arduino)
(ArduQuest)ProyectodeejemploparalainiciacinalaprogramacinenArduinoconprogramacinporbloques(Scratch)yporcdigo
ConelfindequepuedasconoceralgunosaspectosdeiniciacinenlaprogramacinconArduino,seplanteaesteproyectoquepretendecrear 8
unpequeodispositivoquepermitaunusuarioresponderaunaspreguntasusandobotones.Eldispositivoinformarsilarespuestaala
preguntaencorrectaono.Adems,elusuariopodrseleccionarlapreguntaalaquedesearesponderpudiendoelegirelnmerodelapregunta.
ArduQuest en funcionamiento
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.
ObservaeneltutorialArduinoButton(https://www.arduino.cc/en/Tutorial/Button),lamaneradeconectarunbotnalaplacaArduino,
yelcdigocorrespondienteparaencenderelled(ojo,quenoapareceenelcircuito,yaqueusaelledintegradoenlaplacaqueeslomismoquetener
unledenelpin13).
Laprogramacinporbloquesparaesecdigopodrasersimilaralsiguiente,considerandoquesehatenidoquecrearlavariablebuttonStateenla
seccinData&Blocks.
CopiaypegaelcdigoquehastaahorahageneradolaaplicacinmBlockparanoempezardecero.Deesecdigopuedessuprimirlaslneasque
incluyenotraslibreras(#include....)yaquedemomentoslovanasernecesariaslasinstruccionesbsicasdeArduino(puedesaprendermssobre
librerasenArduinoLibraries(https://www.arduino.cc/en/Reference/Libraries)).Tambinpuedeseliminarlasvariablesangle_radyangle_deg
quesedeclaranparafacilitarlaconversindengulos,queenesteproyectonosevaautilizar.
Utilizaeliconodesubidadelcdigoalaplaca,paracomprobarqueelentornodeprogramacinestbienconectadoalaplaca,yqueelcdigo
siguefuncionandocorrectamente.
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.
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).
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