2.1 Arduino Uno:es una plataforma de creación de electrónica de código abierto, la cual está basada en hardware y software libre, flexible y fácil de utilizar para los creadores y desarrolladores.
2.2 Sensor Óptico:Detectan la presencia de una persona o de un objeto que interrumpen el haz de luz que le llega al sensor.
2.3 Morreductor: Los reductores ó motorreductores son apropiados para el accionamiento de toda clase de máquinas y aparatos que necesitan reducir su velocidad en una manera segura y eficiente. Las transmisiones de fuerza por correa, cadena o trenes de engranajes que aún se usan para la reducción de velocidad presentan una regularidad perfecta tanto en la velocidad como en la potencia transmitida, mayor eficiencia en la transmisión de la potencia suministrada por el motor.
2.4 Llantas:
2.5 Rueda loca:
3. Evidencia del trabajo:
4. OBSERVACIONES:
Al momento de realizar las conexiones nos faltaron cables hembras por lo que se opto por alambres de cobre delgados para la conexiones.
Uno de nuestro sensores no podía ser calibrado para la distancia entre el suelo y la base del carro debido a que la rueda loca era muy grande.
Se busco una guía en Internet para realizar la programación.
5. CONCLUSIONES:
Al finalizar el laboratorio de logro armar el circuito de nuestro carro gracias a las simulaciones en tinkercad.
Se logro concluir que para poner una guía para que el carro siga su rutina es necesario colocar una cinta negra o algún material oscuro.
Se logro comprender las diferentes funciones de los códigos en la programación
Los int (enteros) son el tipo de datos primario para el almacenamiento de números.
Void Setup:
El setup es la primera función en ejecutarse dentro de un programa en Arduino. Es, básicamente, donde se «setean» las funciones que llevará a cabo el microcontrolador.Aquí es donde establecemos algunos criterios que requieren una ejecución única. Por ejemplo, si nuestro programa va a usar comunicación serial, en el setup establecemos el comando Serial.begin para indicarle al programa que vamos a iniciar la comunicación serial.Si vamos a utilizar un pin determinado como salida de voltaje, usamos el pinMode para indicarle a Arduino que determinado pin funcionará como salida, usando el parámetro OUTPUT.
Serial.begin:
Establece la velocidad de datos en bits por segundo (baudios) para la transmisión de datos en serie.
PinMode:
Configura el pin especificado para que se comporte como entrada o salida.
Void loop:
Loop en inglés significa lazo o bucle. La función loop en Arduino es la que se ejecuta un número infinito de veces. Al encenderse el Arduino se ejecuta el código del setup y luego se entra al loop, el cual se repite de forma indefinida hasta que se apague o se reinicie el microcontrolador.
DigitalRead:
Lee el valor de un pin digital especificado, ya sea HIGH o LOW.
Serial.print:
Imprime datos en el puerto serie como texto ASCII legible para humanos. Este comando puede tomar muchas formas. Los números se imprimen utilizando un carácter ASCII para cada dígito. Los flotadores se imprimen de manera similar como dígitos ASCII, por defecto con dos decimales. Los bytes se envían como un solo carácter. Los caracteres y las cadenas se envían tal cual. Por ejemplo-
Serial.print(78) da "78"
Serial.print(1.23456) da "1.23"
Serial.print('N') da "N"
Serial.print("Hello world.") da "Hola mundo".
If:
La if es una declaración que verifica si hay una condición y ejecuta la declaración o el conjunto de declaraciones en curso si la condición es 'verdadera'.
Else if:
Permite un mayor control sobre el flujo de código que el básico if declaración, al permitir múltiples pruebas para agruparse. Se else ejecutará una cláusula (si es que existe) si se if produce la condición en la declaración false. El else puede proceder con otra if prueba, de modo que se puedan ejecutar múltiples pruebas mutuamente excluyentes al mismo tiempo.
DigitalWrite:
Escriba un HIGH o un LOW valor en un pin digital.
Si el pin se ha configurado como OUTPUTcon pinMode (), su voltaje se establecerá en el valor correspondiente: 5V (o 3.3V en placas de 3.3V) para HIGH, 0V (tierra) para LOW.
Si el pin está configurado como INPUT, digitalWrite () habilitará (HIGH) o deshabilitará (LOW) el pullup interno en el pin de entrada. Se recomienda configurar pinMode () a INPUT_PULLUP para habilitar la resistencia de pull-up interna. Vea el tutorial Digital Pins para más información.
Si no se establece la pinMode () a OUTPUT, y conectar un LED a un pin, al llamar digitalWrite (HIGH), el LED puede aparecer tenue. Sin una configuración explícita pinMode (), digitalWrite () habrá habilitado la resistencia pull-up interna, que actúa como una gran resistencia limitadora de corriente.
Código para arduino:
int IR1 = 0;
int IR2 = 0;
//////////variables de PWM
int motor2A = 5;
int motor2B = 6;
//////////variables de los motores
int motor1A = 4;
int motor1B = 7;
void setup() {
Serial.begin(9600);/////////Establece la velocidad de datos en bits por segundo(9600)
pinMode(2, INPUT);/////////sensor 1
pinMode(3, INPUT);/////////sensor 2
////////////salidas motor normales
pinMode (motor1A, OUTPUT);
pinMode (motor1B, OUTPUT);
///////////salidas motor PWM
pinMode (motor2A, OUTPUT);
pinMode (motor2B, OUTPUT);
}
void loop() {
IR1 = digitalRead(2);
IR2 = digitalRead(3);
Serial.print(IR1);//////Imprime datos en el puerto serie(IR1)
Serial.print(IR2);//////Imprime datos en el puerto serie(IR2)
/////////////sentencias
if (IR1 == 0 && IR2 == 0) {
parar();
}
else if (IR1 == 0 && IR2 == 1) {
derecha();
}
else if (IR1 == 1 && IR2 == 0) {
izquierda();
}
else if (IR1 == 1 && IR2 == 1) {
avanzar();
}
delay(200);
}
//////////////funciones
void avanzar() {
digitalWrite(motor1A, 1);
digitalWrite(motor1B, 1);
digitalWrite(motor2A, 150);
digitalWrite(motor2B, 150);
}
void derecha() {
digitalWrite(motor1A, 0);
digitalWrite(motor1B, 1);
digitalWrite(motor2A, 0);
digitalWrite(motor2B, 150);
}
void izquierda() {
digitalWrite(motor1A, 1);
digitalWrite(motor1B, 0);
digitalWrite(motor2A, 150);
digitalWrite(motor2B, 0);
}
void parar() {
digitalWrite(motor1A, 0);
digitalWrite(motor1B, 0);
digitalWrite(motor2A, 0);
digitalWrite(motor2B, 0);
}
Imagen de la simulación en Tinkercad:
Vídeo:
Conclusiones:
El programa arduino trabaja con lenguaje C++ esto hace que el método al momento de realizar el código sea mas sencillo.
Los comandos usados para el código son sencillos y prácticos, no obstante cada uno tiene una forma de sintaxis.
El programa tinkercad es una plataforma virtual capaz de simular un circuito, nos ayudo con la simulación para el carro
Los robot-tortuga son muy populares y trabajar con ellos resulta
divertido. Por ese motivo su uso se está extendiendo en los centros
educativos y en el mundo de los aficionados. Aunque sus
posibilidades son muy amplias, normalmente los proyectos para los
que se utilizan caen dentro de una de estas tres categorías:
1. Seguir el trazado de una línea.
2. Evitar obstáculos en el camino.
3. Recorrer un laberinto.
Proteus pone a nuestra disposición un completo modelo eléctrico de
un robot-tortuga que incluye motores y sensores gobernados por una
placa Arduino. Y nos lo presenta dentro de un mundo de ‘realidad
virtual’ intencionadamente simple pero, a la vez, muy flexible en el
que es posible ver la evolución de nuestro robot-tortuga y simular
todos sus movimientos.
Controlar nuestro robot-tortuga utilizando el Diseñador Gráfico se
simplifica enormemente mediante la utilización de los “métodos de
alto nivel” que podemos incorporar dentro del flujograma que
contiene la lógica de control. Alternativamente, es posible obtener
una mayor flexibilidad y escribir programas tan complejos como
deseemos utilizando la programación en el lenguaje C disponible con
los equipos Arduino. Y, por supuesto, independiente del modo de
programación seleccionado, Proteus pone a nuestra disposición un
amplio y potente conjunto de herramientas de depuración y
simulación con lo que podemos asegurarnos de que nuestro
programa se comportará como realmente deseamos que lo haga,
antes de proceder a cargar el código dentro de nuestro robot-tortuga
del mundo real.
Actualmente, Proteus incorpora dos modelos completos para la
simulación de dos robot-tortuga con amplia presencia en el mercado:
2.- Vídeo
Simulación
3.-Conclusiones
Logramos realizar la simulación en proteus exitosa mente aplicando una programación diferente a lo que vimos antes.
Realizamos e identificamos los componente de un diagrama de flujo.
El LM35 es un circuito electrónico sensor que puede medir temperatura. Su salida es analógica, es decir, te proporciona un voltaje proporcional a la temperatura. El sensor tiene un rango desde −55°C a 150°C. Su popularidad se debe a la facilidad con la que se puede medir la temperatura. Incluso no es necesario de un microprocesador o microcontrolador para medir la temperatura. Dado que el sensor LM35 es analógico, basta con medir con un multímetro, el voltaje a salida del sensor.
Para convertir el voltaje a la temperatura, el LM35 proporciona 10mV por cada grado centígrado. También cabe señalar que ese sensor se puede usar sin offset, es decir que si medimos 20mV a la salida, estaremos midiendo 2°C.
"El sensor DS18B20"
El DS18B20 es un sensor de temperatura en el cual se lleva la conversión analógico a digital dentro del encapsulado, facilitando el resultado de dicha conversión a través de una interfaz digital llamada 1-wire.
El sensor de temperatura DS18B20 se puede encontrar en diversas formas, entre las cuales destacamos 2 que son bastante comunes:
El encapsulado TO-92 (usado comúnmente en transistores).
El sensor tipo sumergible, que es fabricado por terceros utilizando sensores en encapsulado TO-92 colocados dentro de una cubierta impermeable de acero inoxidable.
2.- Vídeo
Simulación
Código
Ejercicio 1
Ejercicio Final
3.-Conclusiones
Logramos realizar las lecturas en puertos analógicos, resolviendo los ejercicios planteados en el laboratorio.
Utilizamos y configuramos el sensor de temperatura LM35.
Realizamos una lectura analógicas en la pantalla LCD.
Laboratorio 12 "Manejo
del Timer y las Interrupciones"
1.- Marco teórico
Temporizador contador PIC
Un temporizador contador PIC es un registro que aumenta su valor en una unidad con cada 4 ciclos de reloj al cual se encuentre funcionando el micro controlador PIC, si por ejemplo la frecuencia del oscilador es de 4MHz, entonces el ciclo de trabajo del microcontrolador PIC será de 1us, por lo que el temporizador contador PIC aumentará su valor de uno en uno en cada micro segundo; por ejemplo cuando el temporizador aumenta su valor en 10 unidades habrán transcurrido 10us.
El temporizador contador PIC puede aumentar sus valores de 0 a 255 si es de 8 bits como el timer0, o de 0 a 65535 si es de 16 bits como el timer1, cada vez que estos registros alcanzan su máximo valor se reinician, volviendo a contar desde su valor mínimo hasta su máximo, ademas pueden ser programados para provocar interrupciones.
Para el uso del temporizador contador PIC se cuenta además con un grupo de registros mediante los cuales se puede lo puede configurar de acuerdo a las necesidades que se tengan.
El registro temporizador contador PIC TMR1 puede ser utilizado para tareas de comparación, captura y el registro TMR2 es utilizado para la obtención de señales de modulación de ancho de pulso o PWM, siendo para ello necesario el uso de otros registros.
2.- Vídeo
Simulación
Código
3.-Conclusiones
Se utilizo 3 pulsadores para incrementar los segundos, minutos y darle a la cuenta regresiva haciendo la función de un temporizador.
Para congelar el temporizador en cero minutos y ceros segundos se utilizó la relación condicional de que si minutos es igual a -1, se detenga el temporizador.
Se debe usar un delay después de presionar cada pulsador, esto con la finalidad de evitar falsos disparos.
El LCD o pantalla de cristal líquido es un dispositivo empleado para la visualización de contenidos o información de una forma gráfica, mediante caracteres, símbolos o pequeños dibujos dependiendo del modelo.
En este caso vamos a emplear un LCD de 16x2, esto quiere decir que dispone de 2 filas de 16 caracteres cada una. Los píxeles de cada símbolo o carácter, varían en función de cada modelo.
¿DDRAM y CGROM?
Son las dos zonas de memoria del LCD.
La memoria DDRAM(Data Display Ram): corresponde a una zona de memoria donde se almacenan los caracteres que se van a representar en pantalla. Es decir es la memoria donde se almacenan los caracteres a mostrar con su correspondiente posición.
La memoria CGROM es una memoria interna donde se almacena una tabla con los caracteres que podemos visualizar en el lcd. En la imagen podemos ver un ejemplo de la tabla con un contenido de 192 caracteres.
La memoria CGRAM(Character Generator Ram): en ella se pueden almacenar nuestros propios caracteres.
La librería del LCD:
Para poder visualizar los caracteres o símbolos en el LCD es necesario que en el programa de código fuente a emplear, incluyamos la librería de este. En este caso empleamos la librería "lcd.c", la cual hemos modificado. Siempre que utilicemos una librería de este tipo tendremos que analizarla para saber cuales son los pines de control y los pines para el Bus de datos, en este caso podemos observar que están definidos al comienzo de la misma. #define LCD_ENABLE_PIN PIN_D0 #define LCD_RS_PIN PIN_D1 #define LCD_RW_PIN PIN_D2 #define LCD_DATA4 PIN_D4 #define LCD_DATA5 PIN_D5 #define LCD_DATA6 PIN_D6 #define LCD_DATA7 PIN_D7
En el resto de la librería se puede encontrar todas las estructuras necesarias así como las funciones que nos permiten utilizar nuestro LCD. Podemos encontrar funciones como : lcd_init: inicializa el lcd. lcd_gotoxy: establece la posicion de escritura en el lcd. lcd_putc: nos muestra un dato en la siguiente posición del lcd, podemos emplear funciones como \f para limpiar el display, \n cambio a la segunda línea, \b mueve una posición atrás. lcd_getc(x,y): devuelve caracteres a la posición x,y. Otras funciones: lcd_send_nibble(BYTE n),lcd_send_byte(BYTE address, BYTE n).
Aquí se puede ver un ejemplo de una sencilla programación en una Pic control, y muestra de datos en el LCD, son datos inespecíficos que no muestran ninguna información.
2.- Vídeo
Simulación
Código
3.-Conclusiones
Se utilizo el comando "lcd_gotoxy" para poder establecer y escribir en el LCD teniendo en cuenta las filas.
Para hacer la condición de bucle en el buzzer utilizamos la función for.
Realizamos un habilitador y des habilitador en el programa a evaluar,
Laboratorio 10 "Programación
con Display de 7 segmentos"
1.- Marco teórico
TIPOS DE VARIABLES
Enteros
Los enteros son el tipo de dato más primitivo en C. Se usan
para representar números enteros. Pero siempre se pueden encontrar otras
aplicaciones para los números enteros. En general se pueden usar para
representar cualquier variable discreta.
Los tipos de datos enteros son: short, int, long y long
long, cada uno representando un número entero de un tamaño o capacidad
determinado. Según el compilador y la plataforma de hardware, cada uno de estos
tipos de dato puede ocupar desde 1 byte hasta 8 bytes en memoria (para más
detalles busca en la referencia).
Además, el lenguaje C hace la distinción de si el entero es
con signo (signed) o sin signo (unsigned). En caso de que no se declare si es
con signo o sin signo, se toma con signo.
Algunos ejemplos de declaraciones de enteros:
int a;
unsignedint a;
signedlong a;
signedlonglong a =10000000;
Todos los números son representados en memoria mediante una
cadena de bits. En el caso de los números con signo, el bit más significativo
es el que se usa para representar el signo. La representación de los números
negativos se realiza mediante el complemento a dos, que es una técnica que
permite operar con los números negativos de forma lógica.
A modo de ejemplo, la representación en memoria del número
-8 en una variable de 2 bytes, entera, con signo, sería la siguiente:
1111111111111000
Reales
Los tipos de datos que representan a los números reales, ya
que utilizan un sistema de representación basado en la técnica de coma
flotante, que permite operar con números reales de diversas magnitudes,
mediante un número decimal llamado mantisa y un exponente que indica el orden
de magnitud.
El tipo de dato flotante en lenguaje C sólo tiene dos
tamaños: el float y el double, que son 4 bytes y 8 bytes respectivamente. Se
los puede utilizar tanto para representar números decimales, como para
representar números enteros con un orden de magnitud muy grande.
La forma de declarar una variable flotante es escribiendo en
una línea uno de los tipos de datos flotantes y a continuación el nombre de la
variable y tal vez algún valor que se les quiera dar.
Algunos ejemplos:
floata;
doublea=1e23;
doublea=3.1416;
floata=4e-9;
doublea=-78;
Hay que tener en
cuenta que aunque los valores flotantes son más convenientes para algunas
aplicaciones, hay casos en los que se prefieren los enteros. Esto se debe a que
los números flotantes no necesariamente tienen soporte de hardware, en
particular en las plataformas integradas. Una alternativa que se utiliza en
estas situaciones es interpretar los enteros como decimales de forma que 150 se
interprete como 1.5 y 2345 como 23.45.
2.- Vídeo
Simulación
Código
3.-Conclusiones
Reconocimos los comandos del software de programación de CCS C COMPILER.
Realizamos la simulación en ISIS PROTEUS del mismo programa.
Identificamos y programamos el display de 7 segmentos.
Laboratorio 9 "Programación básica con bucles de control"
1.- Marco teórico
BUCLES DE CONTROL
La estructura condicional if ... else
En la gran mayoría de los programas será necesario tomar decisiones
sobre qué acciones realizar. Esas decisiones pueden depender de los datos que
introduzca el usuario, de si se ha producido algún error o de cualquier otra
cosa.
La estructura condicional if ... else es la que nos permite
tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría
llamar la estructura "si...si no", es decir, "si se cumple la
condición, haz esto, y si no, haz esto otro".
Un ejemplo sencillo sería el siguiente (no se trata de un
programa completo, sino tan sólo una porción de código):
if (edad <18)
printf("No puedes acceder.\n");
else
printf("Bienvenido.\n");
La estructura condicional abierta y cerrada switch ...
case
La estructura condicional switch ... case se utiliza cuando
queremos evitarnos las llamadas escaleras de decisiones. La estructura if nos
puede proporcionar, únicamente, dos resultados, uno para verdadero y otro para
falso. Una estructura switch ... case, por su parte, nos permite elegir entre
muchas opciones. Ejemplo:
#include<stdio.h>
#include<stdlib.h>
intmain(void){
intdia;
printf("¿Qué número de día de la semana es?");
scanf("%i",&dia);
switch(dia){
case1:
printf("Lun, Lunes");
break;
case2:
printf("Mar, Martes");
break;
case3:
printf("Mier, Miercoles");
break;
case4:
printf("Jue, Jueves");
break;
case5:
printf("Vie, Viernes");
break;
case6:
printf("Sab, Sabado");
break;
case7:
printf("Dom, Domingo");
break;
default:
printf("No existe");
}
return0;
}
La estructura anterior, de realizarse con sentencias if,
necesitaría cuatro de ellas, resultando un enorme bloque muy difícil de leer.
En la mayoría de los casos, además, la sentencia switch proporciona una
ganancia en velocidad del código, pues permite al compilador trabajar en base a
que se trata de una decisión múltiple para una única variable, cosa que con
sentencias if el compilador no tiene por qué detectar.
El bucle while
El bucle while sirve para ejecutar código reiteradas
veces.
while(/*condicion*/){
/* Código */
}
La condición debe de ser una expresión lógica, similar a la
de la sentencia if. Primero se evalúa la condición. Si el resultado es
verdadero, se ejecuta el bloque de código. Luego se vuelve a evaluar la
condición, y en caso de dar verdadero se vuelve a ejecutar el bloque. El bucle
se corta cuando la condición da falso.
Ejemplo: imprimir los números de 0 a 99:
inti=0;
while(i<100){
printf("%d\n",i);
i=i+1;
}
Inicialmente se declara que la variable i tiene un valor de
0. Al iniciar el bucle, se cumple la condición i < 100, por lo que se
procede a la instrucción de imprimir dicho número (cero, en el caso inicial).
Posteriormente i cambiará su valor de uno en uno por la instrucción i = i + 1 y
seguidamente dicho valor nuevo, será evaluado en la condicion while hasta que i
llegue al valor 100, donde debido a la condicional, éste será un valor falso,
dando fin al código.
El bucle for
El bucle for es un bucle muy flexible y a la vez muy potente
ya que tiene varias formas interesantes de implementarlo, su forma más
tradicional es la siguiente:
Inicialización: en esta parte se inicia la variable que
controla el bucle y es la primera sentencia que ejecuta el bucle. Sólo se
ejecuta una vez ya que solo se necesita al principio del bucle.
Expresión condicional: al igual que en el bucle while, esta
expresión determina si el bucle continuará ejecutándose o no.
Incremento: es una sentencia que ejecuta al final de cada
iteración del bucle. Por lo general, se utiliza para incrementar la variable
con que se inicio el ciclo. Luego de ejecutar el incremento, el bucle revisa
nuevamente la condición, si es verdadera tiene lugar una ejecución más del
cuerpo del ciclo, si es falsa se termina el ciclo y así.
2.- Vídeo
Simulación
Código
3.-Conclusiones
Reconocimos los comandos del software de programación de CCS C COMPILER.
Realizamos la simulación en ISIS PROTEUS del mismo programa.
Realizamos un programa para el funcionamiento de un semáforo tomando como base el ejemplo del laboratorio.