Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Microcontroladores y Sus Aplicaciones en La Robotica PDF
Microcontroladores y Sus Aplicaciones en La Robotica PDF
TECNOLOGÍA INDUSTRIAL
MICROCONTROLADORES Y SUS
APLICACIONES EN ROBÓTICA
LADO IZQUIERDO
DEL MICROBOT
LADO DERECHO
DEL MICROBOT
PARALLAX
CONTINOUS ROT ATION
www.parallax.com
GND
+5V
CONTROL
Vdd = 5V
Vss = 0 V
20 ms
1,7 ms
GIRO TRIGONOMÉTRICO
A VELOCIDAD MÁXIMA
©J.Garrigós
DPTO. DE TECNOLOGÍA I.E.S. ANDRÉS DE VANDELVIRA Pag. 0
© J.Garrigós
MICROCONTROLADORES Y SU APLICACIÓN EN ROBÓTICA
ÍNDICE.
ÍNDICE. _____________________________________________________________ 0
ÍNDICE. _____________________________________________________________ 1
1. INTRODUCCIÓN A LA NOCIÓN DE MICROCONTROLADOR.____________ 3
2. ARQUITECTURA INTERNA DE LOS MICROCONTROLADORES PIC. ____ 4
3. PRINCIPALES CARACTERÍSITICAS DEL MÓDULO OEM BS2_IC Y EL
PIC16C57____________________________________________________________ 6
4. INTRODUCCIÓN AL LENGUAJE PBASIC._____________________________ 8
4.1 LOS LENGUAJES UTILIZADOS POR LOS MICROCONTROLADORES _____ 8
4.2. LOS MODULOS BASIC STAMP DE PARALLAX __________________________ 9
4.3. EDITOR PBASIC _____________________________________________________ 11
4.4. OPERACIONES ARITMÉTICAS Y LÓGICAS EN PBASIC ________________ 12
4.4.1. PROGRAMAS DE EJEMPLO CON OPERACIONES MATEMÁTICAS _____________13
4.5. ORGANIZACIÓN DE LA MEMORIA RAM DE DATOS DEL BS2___________ 16
4.6. INSTRUCCIONES PBASIC ____________________________________________ 17
4.6.1. INSTRUCCIONES DE ENTRADA/SALIDA DIGITALES ________________________17
4.6.2. INSTRUCCIONES PARA BUCLES REPETITIVOS _____________________________17
4.6.3. INSTRUCCIONES DE SALTO ______________________________________________18
4.6.4 .INSTRUCCIONES NUMÉRICAS ____________________________________________18
4.6.5. INSTRUCCIONES DE E/S SERIE ASÍNCRONA________________________________18
4.6.6. INSTRUCCIONES DE E/S SERIE SÍNCRONA_________________________________18
4.6.7. INSTRUCCIONES DE E/S ANALÓGICA _____________________________________18
4.6.8. INSTRUCCIONES DE CONTROL DE TIEMPO ________________________________18
4.6.11. INSTRUCCIONES DE ACCESO A LA EEPROM ______________________________18
4.6.12. INSTRUCCIONES DE DEPURACIÓN DEL PROGRAMA _______________________18
5. PRACTICA 1: CONTROLANDO UN LED Y UN ZUMBADOR. ____________ 19
6. VARIABLES EN PBASIC. ___________________________________________ 20
6.1. VARIABLES DE NOMBRES FIJOS EN PBASIC. _________________________ 20
6.2. DECLARACIÓN DE VARIABLES DEL BS2 _____________________________ 20
6.3. DECLARACIÓN DE ARRAYS DE VARIABLES (Matrices)_________________ 22
6.4. MODIFICADORES (ALIAS) DE LAS VARIABLES. _______________________ 23
7. CONSTANTES EN PBASIC _________________________________________ 24
7.1 DECLARACIÓN DE CONSTANTES EN PBASIC__________________________ 24
8. PRACTICA2: INTERMITENCIA DE UN DIODO LED. __________________ 25
9. DIRECCIONAMIENTO DIGITAL DE ENTRADAS SALIDAS CONSIDERANDO
EL MAPA DE MEMORIA._____________________________________________ 26
10. PRACTICA 3: CONFIGURACIÓN DE ENTRADAS-SALIDAS Y SALTO
CONDICIONAL. _____________________________________________________ 27
11. PRACTICA 4: PROGRAMACION DE ECUACIONES LÓGICAS CON
OPERADORES BOLEANOS. __________________________________________ 28
12. PRACTICA 5: CUENTA ATRÁS MEDIANTE DISPLAY DE 7 SEGMENTOS. 33
MEMORIAS
Buses
CPU
E/S
Procesador
Memoria de programa
Memoria de datos
Recursos auxiliares
MEMORIA MEMORIA
DE PROCESADOR DE
PROGRAMA DATOS
Esquema simplificado
del módulo OEM BS2
frecuencia externa de
funcionamiento de un
temporizador que posee el
PIC. Cuando no se usa es
temporizador conviene
conectar esta patita a
positivo para reducir el
consumo.
Las restantes
patillas del chip son
líneas de entrada y salida
por las que el
microcontrolador recibe o
envía la información
correspondiente al
procesamiento del
programa. Las conexiones RA0-RA3 son 4 patitas bidireccionales, de nivel
TTL de la puerta A para la conexión de periféricos externos. RB0-RB7 son
8 líneas bidireccionales TTL de la puerta B y RC0-RC7 son 8 líneas
bidireccionaes TTL, pertenecientes a la puerta C.
La memoria
EEPROM que utiliza
el módulo OEM-
BS2_IC es la
denominada
24LC16B, en la que
se almacena el
programa en PBASIC
recibido desde el PC.
Las características
más importantes de
esta memoria son:
Capacidad: 2KB
Ciclos de escritura/lectura: 1 millón
Velocidad de escritura: 10 ms
Frecuencia de funcionamiento: 400 KHz
Tensión de funcionamiento: de 2,5 a 5,5 VDC
W1= 34
W2= 12
W3= W1 + W2
DEBUG ?W3
W1= 65535
W2= 12
W3= W1 + W2
DEBUG ?W3
W1= 199
W2= 100
W3= W1 + W2
W4= W2 –W1
DEBUG ?W3
DEBUG ?W4
W1= 199
W2= 100
W3= W1 + W2
W4= W2 –W1
DEBUG SDEC ?W3
DEBUG SDEC ?W4
W1= 50
W2= 3
W3= W1 / W2
W4= W1 //W2
DEBUG ?W3
DEBUG ?W4
W1= 175
W2= 2
W3= 400
W4= -5
W5= W1 * W2
W6= W1 * W3
W7= W3 * W4
DEBUG ?W5
DEBUG ?W6
DEBUG SDEC?W7
W1= 2560
W2= 27
W3= W1 * W2
DEBUG DEC5 ?W3, CR
W4= W1 ** W2
DEBUG DEC5 ?W4
6. VARIABLES EN PBASIC.
6.1. VARIABLES DE NOMBRES FIJOS EN PBASIC.
Las variables son los nombres dados a los lugares donde se
guardan los datos en forma temporal. Una variable es un símbolo que
contiene un cierto valor. Ese valor puede ser cambiado bajo el control del
programa y, por lo tanto, el valor de las variables puede cambiar, pero su
nombre no.
Practica de control
Se propone al lector la siguiente práctica:
Se pretende controlar dos LEDs conectados a los pins 0 y 1 y
un zumbador conectado a la patilla 3 mediante un interruptor conectado al
pin 5, de forma que se cumpla la siguiente secuencia:
Si el pin 5 está a nivel bajo luce el diodo LED1 conectado en el pin
0 durante 100 ms estando los pins 1 y 3 a cero (LED2 y zumbador
apagados).
Donde:
• nombre_variable y tamaño es el mismo de las declaraciones de
variables. El nuevo elemento es (n), y le dice PBASIC cuanto espacio
reservar para la misma variable del tamaño especificado.
FOR INDICE = 0 TO 4
DEBUG ?FRUTAS(INDICE),CR
NEXT
STOP
cuerpo_humano=%1101101010011000
7. CONSTANTES EN PBASIC
7.1 DECLARACIÓN DE CONSTANTES EN PBASIC
Las llamadas constantes pueden ser creadas de manera similar a
las variables. A veces, puede ser más conveniente utilizar un nombre de
constante en lugar de un número.
La sintaxis es la siguiente:
nombre_constante CON valor_numerico
Donde:
nombre_constante es el nombre que usted le asignara a la variable
no debe ser mayor de 32 caracteres, puede contener una secuencia
de letras combinadas con números también acepta el guión largo
“_”. En PBASIC, los nombre_constante no son sensibles a
mayúsculas y minúsculas.
valor_numerico es un valor de (0-65535).
‘Declaración de constantes
pinLED CON 0 ‘Establecemos a la variable pinLED la constante 0
Intervalo CON 500 ‘Retardo en milisegundos entre estados del LED
De este modo podemos configurar los pines como entradas o como salidas y
después asignamos un 0 o un 1 lógico a las direcciones previamente configuradas:
Ejemplo:
DIODOS LED
GND
o P0=1
P6 P5 P4 P1
o P1=0
o P4=1
o P5=0
o P6=1
Si el bit 7 está a 1 el estadio del
circuito será:
o P0=1
o P1=0
o P4=0
o P5=1
o P6=0
Cada uno de los depósitos está controlado por una electroválvula: Ea para el depósito
del agua, En para el depósito de la naranja y El para el depósito del limón.
Ea En El
Botonera
a n l
Vaso
Pulsador NC
Ea a * n * l a * n * l a * n * l
Ecuación de la electroválvula de la naranja:
Como se aprecia en la tabla de la verdad, la electroválvula de la naranja sólo se activa
en un estado que se corresponde con los siguientes valores de las variables de entrada:
a=1, n=1 y l=0
En a * n * l
Ecuación de la electroválvula del limón:
De forma similar al caso anterior, tal y como se aprecia en la tabla de la verdad, la
electroválvula del limón sólo se activa en un estado que se corresponde con los siguientes
valores de las variables de entrada:
a=1, n=0 y l=1
En a * n * l
3ª Fase. Simplificación de ecuaciones.
En este caso las ecuaciones de las electroválvulas de la naranja y limón no pueden
simplificarse, puesto que sólo tienen un sumando. Con respecto a la ecuación de la
electroválvula del agua, considerando la propiedad del álgebra de Boole que indica que A+A=A
obtenemos:
Ea a * n * l a * n * l a * n * l
Ea a * n * l a * n * l a * n * l a * n * l
Sacando factor común del primer y segundo sumando y del tercero y cuarto
respectivamente, y simplificando tenemos:
Ea a * n * ( l l ) a * l * ( n n )
Ea a * n a * l
Ea a * ( n l )
n l
b) Dibujamos un uno en cada uno de los cuadros que se corresponden con los tres
sumandos de la ecuación de partida de la electroválvula del agua:
Ea a * n * l a * n * l a * n * l
n l
a l n l
l l
Lazo A: a * l a l l l
Lazo B: a * n
Ea a * l a * n Lazo A Lazo B
Ea a * ( n l )
Sea cual sea el método utilizado, llegamos a la conclusión que las ecuaciones
simplificadas de nuestro problema son:
Ea a * ( n l )
En a * n * l
El a * n * l
4ª Fase. Representación del circuito eléctrico y de puertas lógicas:
Será este el momento, que en este caso particular, elegiremos para colocar el pulsador
del vaso.
Circuito eléctrico:
Pulsador del vaso
a a a
n l n n
l l
Ea En El
INICIO:
' REALIZAMOS UNA OPERACIÓN XOR CON LAS VARIABLES DE LOS PULSADORES PARA OBTENER SUS
NEGADAS
P_agua_negada=P_agua^1
P_naranja_negada=P_naranja^1
P_limon_negada=P_limon^1
' EN CASO DE NO CUMPLIRSE NINGUNA DE LAS ECUACIONES DEL AUTOMATISMOS PONEMOS A CERO
TODAS LAS SALIDAS
salida_Ea=0
salida_En=0
salida_El=0
GOTO INICIO 'Provocamos un salto incondicional a la etiqueta inicio para su ejecución recursiva
GOTO INICIO
ESQUEMA DE CONEXIONADO
P_Naranja
P_Limón
P_Agua
DIODOS LED
El En Ea
+5V
GND
P2 P1 P0
Las resistencias conectadas en serie con los displays tienen la función de limitar la
tensión y la corriente aplicada a los LED.
Dado que el display es de ánodo común, habrá que introducir un cero lógico ( 0V ) en el
cátodo del diodo LED que se desee iluminar. Bajo estás premisas, y puesto que en la presente
práctica se pretende realizar una cuenta atrás, en la siguiente tabla se representan los valores
de los bits que habrá que aplicar a los cátodos de los LED para representar cada uno de los
números.
NÚMERO P7 P6 P5 P4 P3 P2 P1 P0
VISUALIZADO dp g f e d c b a
5 1 0 0 1 0 0 1 0
4 1 0 0 1 1 0 0 1
3 1 0 1 1 0 0 0 0
2 1 0 1 0 0 1 0 0
1 1 1 1 1 1 0 0 1
0 1 1 0 0 0 0 0 0
Para programar esta práctica se emplearán tres nuevas instrucciones cuya descripción
es la que se indica:
FREQOUT Pin, Duración, Frecuencia : Mediante esta instrucción se saca por el pin
indicado una onda casi senoidal de la frecuencia indicada y con una duración dada en
milisegundos por el parámetro Duración.
Ejemplo: FREQOUT 12, 10, 2000 genera por el pin 12 una frecuencia sinusoidal de
2000 Hz durante 20 ms
DATA Valor : Guarda el parámetro Valor en una posición de la memoria de la
EEPROM, que se puede identificar con una etiqueta.
Ejemplo: MEN DATA %00000000 guarda en la posición de la EEPROM etiquetada
como MEN el valor binario 00000000.
READ Dato, Destino: Lee el valor que contiene la posición de la memoria EEPROM
definida por el parámetro Dato y lo deposita en la variable Destino.
Ejemplo: READ MEM, Conta lee el calor contenido en la posición MEM de la
EEPROM y lo deposita en la variable Conta.
Montaje práctico.
La figura nos muestra la disposición de elementos de la práctica.
Programa
Esquema de conexión
ARRAY
Un array no es más que una agrupación de elementos (variables, datos,…) de forma
ordenada. Cada elemento que pertenece al array tiene asociado un índice, el cual permite
hacer referencia al dato en cuestión.
Ejemplo:
Automóvil VAR Byte(10) crea 10 variables de tipo byte que van desde Automóvil(0) a
Automóvil(9)
Tamaño Nº máximo
Dada la forma en que los arrays se disponen en la memoria
de elementos
hay límites de tamaño para cada tipo:
BIT 208
NIB 52
BYTE 26
DCD
WORD 13
Devuelve la potencia en base 2 de un rango de exponentes
entre el 0 y el 15.
En otras palabras :
B0 = DCD 4 ‘ Muestra el B0= como %0001 0000
Es decir, determina la posición del bit de la variable
que se pondrá a 1 comenzando a contar desde 0, cuyo
valor representado en decimal es 24=16
La nomenclatura es:
Variable_destino =DCD nºbit
En el siguiente ejemplo de programación se
puede observar los distintos valores que va tomando
una variable (W1 para el ejemplo) desde 0 a 15, que es
representado en forma binaria y decimal.
<<y>>
Los operadores <<y>> desplazan hacia la izquierda (<<), o hacia la derecha (>>), los bits de la
variable, el número de veces indicado a la derecha del operador. Los bits desplazados se dejan
en 0.
Nomenclatura: variable<< nbits_a _desplazar
Ejemplo:
valor CON %100101101111
W1 = VALOR << 4
DEBUG BIN16 W1, CR ‘Muestra el resultado 1001011011110000
Corre la cifra 4 lugares hacia la izquierda y rellena hacia la derecha cuatro lugares con ceros.
PROGRAMA
'DECLARACIÓN DE CONSTANTES
TIEMPO CON 100 'Cargamos la variable TIEMPO con el valor constante 100 (ms)
'DECLARACIÓN DE VARIABLES
MI_ARRAY VAR Byte(8) 'Declaramos un array de 8 Bytes
INDEX VAR Byte 'Declaración de una variable de tipo Byte
DIRL=%11111111 'Direccionamos el byte bajo como salidas (Bits 0 a 7)
P7 P6 P5 P4 P3 P2 P1 P0
Imagen y esquema de conexión del
montaje:
P8
Esto funciona siempre y cuando hagamos esta conmutación más allá de 30 veces por
segundo. A partir de allí. El "parpadeo" del LED se empezará a notar y el ojo humano captará
ese parpadeo. En el caso de un motor, éste se moverá en una forma pulsante. La idea general
del PWM es esta, solo que soluciona este problema de tiempo. La forma de lograrlo es dejar el
pulso fijo en el tiempo y variar su amplitud. Si se define un pin como salida, por medio de un
controlador sólo se puede obtener un voltaje de 0 voltios o de 5 voltios, pero si se logra cambiar
rápidamente la salida de una señal baja a una señal alta el resultado es un tren de pulsos de
modo que estarían la mitad del tiempo fuera y la otra mitad dentro, cuando se define el Duty
(anchura del pulso positivo) a la mitad, el voltaje medio sería entre 0 y 5V (2.5V)
1 1
f 30 Hz T 0,0333 s T 33,3 ms
f 30
El esquema anterior representa un pulso con
un ciclo positivo de servicio igual al 50% es decir, la
mitad del período está a 0 y la otra mitad está a Vcc.
Lo que se hace con PWM es variar dinámicamente el ciclo positivo de manera que el
tiempo de alta disminuya o aumente y en proporción inversa, el de baja aumente o disminuya
dependiendo de si queremos un LED más atenuado o más brillante, o un motor más lento o
más rápido, respectivamente.
El driver L293B
El L293B es un circuito integrado que contiene cuatro drivers cuya misión es la de
amplificar las señales que se aplican a los motores de corriente continua y paso a paso. Para
controlar un motor de corriente continua se emplean únicamente dos de los drivers, uno para
la señal de cada borne. Dichas señales en esta práctica procederán de los pines 14 y 15 del
microcontrolador, tal y como se refleja en la figura siguiente:
A= Pin 14 B=Pin 15
La instrucción PWM
La instrucción PWM pin, duty, nºciclos: genera una onda modulada de anchura de
pulsos por el pin indicado. La anchura de cada pulso viene determinada por “duty” (0-255) y el
número de pulsos generados se ha de especificar en “nºciclos” en un valor correspondiente
entre 0 y 255.
Cada ciclo tiene una duración de 1 ms, pudiendo valer duty desde 0 a 255 ms.
Los pines utilizados para el PWM se deben configurar como salidas durante la
ejecución del programa, pasando a ser entrada al terminar la instrucción a fin de evitar daños
en el microcontrolador.
Tal y como se puede apreciar se han montado dos LED para indicar el sentido de giro
del motor, que vendrá determinado por el estado del pin 8.
Programa
‘DECLARACION DE VARIABLES
VELOCIDAD VAR Byte
'DECLARACIÓN DE CONSTANTES
DIODO_I CON 12
DIODO_D CON 11
PWM 14, VELOCIDAD, 50 'Damos en el pin 14, 50 pulsos de 1ms la consigna de velocidad leida en los interruptores
DEBUG ?VELOCIDAD, CR 'Mostramos por pantalla el valor decimal de la variable velocidad
GOTO INICIO
VELOCIDAD=INL 'Cargamos en la variable VELOCIDAD el valor en la entrada del BYTE bajo (bits 0 al 7)
PWM 15, VELOCIDAD, 50 'Damos por el pin 15, 50 pulsos de 1ms la consigna de velocidad leida en los interruptores
DEBUG ?VELOCIDAD, CR 'Mostramos por pantalla el valor decimal de la variable velocidad
Para ayudar a una mejor presentación de los datos en pantalla, la instrucción DEBUG
admite el uso de caracteres de control indicados en la tabla siguiente:
X VAR Byte
X =65
DEBUG SHEX ? X, "MUESTRA EL VALOR HEXADECIMAL DE X EN PANTALLA CON SIGNO -de 1 a 4 dígitos-
"
PAUSE 2000 'ESPERA 2 SEGUNDOS
DEBUG CLS 'BORRA LA PANTALLA
DEBUG SBIN ? X, "MUESTRA EL VALOR BINARIO DE X EN PANTALLA CON SIGNO -de 1 a 16 dígitos-"
PAUSE 2000 'ESPERA 2 SEGUNDOS
DEBUG CLS 'BORRA LA PANTALLA
La instrucción DEBUG podemos utilizar el código ASCIL, en vez del SÍMBOLO. Por
ejemplo:
Como es natural hay que alimentar el circuito integrado con + 5V (VDD) a la patilla 14 y
GND (VSS) a la patilla 7 de dicho C.I.
+ 5V
Sensor de
contacto 1 2 3 4
Pin 7
derecho
+ 5V
5 6 13 12
Pin 8
Sensor de
contacto
izquierdo
DEBUG CRSRXY, 0, 3,"P7 = ", BIN1 IN7," P8 = ", BIN1 IN8 'Visualiza en columna 0, fila 3 los datos
PAUSE 50 ' espera 50 ms
La ventana Debug Terminal muestra el estado de los sensores (en la figura esta
activado el del lado derecho).
Se propone al lector, que elabore un programa que permita contar el número de veces
que se activan cada uno de los sensores de contacto y cuando alguno de ellos llegue a 10
muestre el mensaje “EL SENSOR DE CONTACTO DERECHO (IZQUIERDO) SE HA
ACTIVADO 10 VECES” , a la vez que lo resetea y activa de nuevo el bucle.
Ejemplo: Imaginemos que deseamos marcar el número 967 21 03 11 a través del pin 8
DTMFOUT 8, [9,6,7,2,1,0,3,1,1]
Si se desea retardar el paso de marcar, para acomodar una línea telefónica ruidosa se
podrían utilizar los valores opcionales OnTime y OffTime.
LÍNEA
Vcc = + 12 V TELEFONICA
IC
1k / 1W
600
10 / 1W 600 100 nF / 100V
A1
ENTRADA DE PULSOS
DESDE EL PIC
Transformador
1N4007
A2
1 nF / 100V
10 / 1W
ACTIVACIÓN DEL RELÉ RB = 2200
DESDE EL PIC BD135
VRB IB V BE Zener 3,9V
1N5228BCT-ND
El propósito de los
arreglos de filtración del esquema
eléctrico anterior es alisar la alta
frecuencia del PWM, dejando salir solamente el audio de una frecuencia más baja detrás.
Eliminándoles algunos armónicos generados.
Los circuitos demostrados aquí son solamente un punto de partida; se puede diseñar o
utilizar un filtro paso bajo activo alrededor de los 2 Khz.
Tabla de frecuencia para generar lo DTMF
1029 Hz 1336 Hz 1477 Hz 1663 Hz
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D
En caso de
que se desee
interpretar estas
señales, existe en
el mercado una
gama de circuitos
integrados que se
llaman DTMF
Decoder. Se puede
ver un ejemplo en
la s figura.
Tecla Q1 Q2 Q3 Q4
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
0 1 0 1 0
* 1 0 1 1
# 1 1 0 0
A 1 1 0 1
B 1 1 1 0
C 1 1 1 1
D 0 0 0 0
El siguiente programa nos muestra la posición del bit más significativo de la variable
VALOR. Los resultados de salida se pueden ver en la ventana Debug Terminal
VALOR = %00000100
DEBUG DEC2 NCD VALOR, CR ' MUESTRA LA POS. 3
VALOR = %00100100
DEBUG DEC2 NCD VALOR, CR ' MUESTRA LA POS. 6
VALOR = %01100100
DEBUG DEC2 NCD VALOR, CR ' MUESTRA LA POS. 7
VALOR = %00000000
DEBUG DEC2 NCD VALOR, CR ' MUESTRA LA POS. 0
VALOR = %100010001000
DEBUG DEC2 NCD VALOR, CR ' MUESTRA LA POS. 12
DEBUG DEC2 I,"-",BIN16 SALIDA,"-",DEC5 SALIDA, CR 'Se muestra en pantalla el valor de I , el valor de
'la variable SALIDA en BINARIO y el valor de la
'variable SALIDA en DECIMAL con formato de 5 dígitos
PAUSE 500 'Se hace una pausa de 0,5 seguntos antes de repetir el bucle
NEXT
STOP 'Fin de programa
Se puede hacer una ligera variación del programa anterior para hacer un complemento
a 1 del valor binario anteponiendo el símbolo ~ al operador DCD, con lo que la salida sería:
AUX VAR Nib 'Declaramos la variable AUX con valor nible 2^4 (0 a 15
DIRL=%11111111 ‘Declaramos el byte bajo –bits 0 al 7 – como salidas
inicio:
FOR AUX=0 TO 5 'Se establece un contador de 6 bucles 0 a 5
PAUSE 75 'Pausa de 75 ms
OUTL=~DCD AUX 'Asignamos al byte bajo (bit0 al bit7, ambos incluidos) el complemento a 1 de 2^AUX
IF IN9=1 THEN fin 'Establecemos una salida del bucle en caso de que la entrada 9 se ponga a 1
NEXT
GOTO INICIO
FIN:
PAUSE 2000
STOP
a
b
c
d
e
f
g
+5V
GND
P9
Índice es una variable/constante o expresión tipo Byte (0 a 255) que especifica la cantidad de
etiquetas a la que se puede redireccionar la ejecución del programa.
Etiqueta son las direcciones de referencia o bloque donde apuntará el programa
DEBUG CRSRXY,0, 3, "Seleccione una Fruta del [0 - 2]", CR 'Se sitúa el cursor a la coordenada 0,3
SERIN 16, 16468, [DEC1 indice] 'asigna a la variable índice el valor decimal introducido por teclado
'16 (significa que utilizaremos el puerto de programación) y 16468 que se
'transmitirán 8 bits a 9600 baudios sin paridad
BRANCH indice,[Uva, Pera, Manzana]
DEBUG CLS
DEBUG CRSRXY, 0, 3,"No ha seleccionado correctamente"
PAUSE 1500
DEBUG CLS
GOTO Principal
Uva:
DEBUG CRSRXY,2, 4,"Ha seleccionado Uva......" 'CRSRXY situa el cursor en la coordenada 2,4
GOTO Principal
Pera:
DEBUG CRSRXY,2, 4,"Ha seleccionado Pera....."
GOTO Principal
Manzana:
DEBUG CRSRXY,2, 4,"Ha seleccionado Manzana.."
GOTO Principal
INICIO:
OUT8=0 ' Pone a cero el LED que indica teléfono descolgado
OUT11=0 ' Pone a cero el transistor de activación del relé
OUTL=$FF ' Pone a cero el byte bajo de los LED del display
AUX=NCD IND ' La variable AUX toma un valor de 1 a 4 que se corresponde con el bit
' de mayor peso puesto a 1 en el nibble D -bit12, bit13, bit14 y bit 15
DEBUG ?AUX ' Nos muestra en pantalla el valor adoptado por la variable AUX
BRANCH AUX,[INICIO, UNO, DOS, TRES, CUATRO] ' Si AUX vale cero se va a la etiqueta INICIO. Si el bit 12
' está a 1 y los bits 13, 14 y 15 están a cero salta a la
' etiqueta UNO. Si el bit de mayor peso puesto a 1 fuera el
' bit 13 saltaría a la etiqueta DOS y así sucesivamente.
UNO: OUTL=%11111001 ' Muestra un 1 en el display de ánodo común
GOSUB DESCOLGAR ' Salta a la subrutina DESCOLGAR
DTMFOUT 10,[6,7,6,0,1,6,3,0,6] ' Marca por la patilla 10 el número de teléfono indicado
GOTO CONVERSACION ' Direcciona la ejecución del programa a la etiqueta CONVERSACION
CONVERSACION: ' Etiqueta que nos indica que la línea telefónica está abierta tras el marcado del número
FOR vueltas=0 TO 5 ' Ejecuta un bucle FOR NEXT para juego de luces de gusano girando
PAUSE 150 ' Espera 150 ms
OUTL=~DCD vueltas ' Asigna al byte bajo bit0 al bit 7 el complemento a 1 (~) de 2^vueltas.
' El complemento a 1 se hace por ser el display de ánodo común y necesitar ceros
' en las entradas a,b,c,d,e,f,g para su activación
IF IN9=1 THEN INICIO 'Si pulsador=1 cortamos la conversación y para la ejecución del bucle
NEXT
GOTO CONVERSACION
DESCOLGAR:
OUT8=1 ' Pone a 1 el LED indicando teléfono descolgado
OUT11=1 ' Activa el transistor que activa el relé de cierre de la línea telefónica
PAUSE 2000 ' Espera 2 segundos
DTMFOUT 10,[0] ' Marca un 0 por el pin 10 entendiendo que estamos en un lugar con centralita telefónica
PAUSE 1500 ' Espera 1,5 segundos a que la centralita nos de tono de marcado
RETURN ' Retorna la ejecución del programa al punto de inicio de la subrutina
LÍNEA
Vcc = + 12 V TELEFONICA
I C
1k / 1W
600
10 / 1W 600 100 nF / 100V
A1
ENTRADA DE PULSOS
DESDE EL PIC
Transformador
1N4007
A2
1 nF / 100V
10 / 1W
ACTIVACIÓN DEL RELÉ RB = 2200
DESDE EL PIC BD135
VRB IB V BE Zener 3,9V
1N5228BCT-ND
+5V
GND
P15 P14 P13 P12
P9
Colgar
P8
22. SERVOMOTORES
Los servomotores son motores de corriente continua que incorporan un circuito
electrónico que permite controlar de forma sencilla y segura la dirección, la velocidad y la
duración del giro de sus ejes mediante impulsos eléctricos. El eje de un servo puede ser
posicionado con un ángulo determinado en función de una señal de control codificada. Mientras
que la señal codificada esté presente en la entrada de control, el servo mantendrá la posición
angular del engranaje. Cuando la señal de control cambie, la posición angular del eje del servo
también cambiará. En la práctica, se usan servos para posicionar superficies de control como el
movimiento de palancas, timones, sistemas de posicionamiento y control, radio control, y por
supuesto, en robótica.
En general los servos suelen girar determinados ángulos, siendo corriente ± 90º
respecto a su posición de reposo. A fin de tener un mejor par motor el eje de utilización está
acoplado al eje del motor mediante una reductora de engranajes.
En la imagen se
muestra un servo de
rotación continua de
PARALLAX y un
servomotor FUTABA
S3003 que permite un giro
de ± 90º respecto a su
posición de reposo.
Los servos Futaba y Parallax que utilizaremos en este curso y tienen las siguientes
características:
Tensión de alimentación máxima = 6 V dc
Velocidad de rotación con alimentación a
5 V dc y sin carga = 60 r.p.m.
Momento = 3,4 kg*cm
Peso = 45 gramos
Medidas (Longitud x Ancho x Alto ) =
40,5 x 20 x 38 mm
180º 90º 0º
No obstante, en la
práctica los valores indicados
pueden tener ciertas variaciones,
es por ello que los motores
disponen de potenciómetros de
regulación para establecer la
posición de reposo. Para ello,
introduciremos a la entrada de
control una onda cuadrada de
periodo 20 ms, de forma que en
cada periodo se produzca un
pulso e 1,5 ms. En estas
condiciones el eje debe estar
parado, por lo cual regularemos
mediante un destornillador de
cabeza plana un potenciómetro
hasta que se aprecie que el eje del motor no se mueve.
1 ms
5000 * 2 s * 10 ms
1000 s
Para utilizar este comando se debe declarar previamente como salida el pin por donde
se van a generar los pulsos. Por otro lado, la polaridad del pulso dependerá también del estado
lógico anterior en que se encuentra el pin de salida. De este modo, si el pin se encuentra a
nivel lógico bajo, el pulso será positivo, pero si se encuentra a nivel lógico alto el pulso será
negativo. Esto último se puede apreciar en los siguientes ejemplos.
INICIO:
P=50 ' Asignamos a p valor de 0
FOR x=1 TO 9 'Hacemos bucles sumando 50 unidades al valor 750 iniciales hasta llegar a los
'1200 de limite máx que se corresponden con los 180º tras las pruebas
PULSOUT servo,750+p 'La primera vez que recorre el bucle el pulso es 750+50=800
PAUSE 20 'Esperamos 20 milisegundos
DEBUG ? 700+p 'Muestra en pantalla el valor del pulso
p=p+50 ' Incrementamos el valor de la variable P con cada pasada del bucle
PAUSE 1000 ' Paramos el eje 1 segundo
NEXT
PAUSE 2000
PAUSE 2000
GOTO inicio
Futaba
S3003
+5V
GND
GND
+5V
NOTA: A efectos prácticos y dado que la duración del pulso es pequeña en relación al
periodo se suelen considerar, en cada ciclo, intervalos de 20 ms a nivel bajo a los que
se suma el tiempo del pulso. Esto mismo es lo que se muestra en la siguiente figura:
PARALLAX PARALLAX
CONTINOUS ROT ATION CONTINOUS ROT ATION
www.parallax.com www.parallax.com
GND GND
+5V +5V
CONTROL CONTROL
Vdd = 5V Vdd = 5V
Vss = 0 V Vss = 0 V
20 ms 20 ms
1,3 ms 1,7 ms
Para calcular la velocidad de giro se debe calcular a través de una regla de tres, a fin
de realizar una primera aproximación, aunque serán las condiciones particulares de cada
montaje las que condicionarán la regulación deseada para cada caso.
El número de pulsos a indicar en el comando PULSOUT, en función del tiempo del tiempo
necesario de pulso a nivel alto, puede calcularse mediante la expresión:
Finalmente y
considerando la práctica 8
(Control de sensores de
contacto) y las instrucciones
de control de los
servomotores de rotación
continua se propone al lector
la elaboración de un
programa que permita al
robot construido en las
prácticas (ver imagen) la
navegación autónoma de
forma que al detectar
obstáculo se pare, vuelva
hacia atrás un par de
segundos y gire al lado contrario al sensor de contacto activado para salvar el obstáculo.
Los receptores de IR que usaremos en las prácticas llevan incorporados unos filtros
ópticos que permiten únicamente el paso de luz infraroja de longitudes de onda próximas a los
980 nm. Además, incorporan un filtro electrónico que impide el paso de señales cuya
frecuencia no esté comprendida entre los 25 kHz y los 55 kHz aproximadamente (ver la gráfica
anterior para un detector de IR de 38 kHz ). Se
puede apreciar que el detector es más sensible a
las frecuencias próximas a su valor nominal o
asignado. De este modo, se consigue que el
detector sea inmune a otras frecuencias de
emisión como la luz diurna o la del alumbrado
artificial. Todo lo anterior, a efectos prácticos,
influye en la forma de enfocar el emisor al
receptor (ángulo enfoque) y en la distancia de
emisión-recepción. En el caso particular de los
pequeños robot móviles, se suelen emplear estos
dispositivos para detectar objetos, de modo que,
el receptor capte la onda previamente emitida al
ser rebotada por un objeto .
Los esquemas eléctricos de conexión de estos componentes son los que se muestran
en los siguientes circuitos:
+ 5V
Pin .- Puede ser una variable o una constante (0 -15) y especifica el pin de salida de los tonos
generados.
Periodo.- Puede ser variable o constante y especifica la duración de un ciclo entre 0 y 65535
(2^16). Su unidad es el milisegundo
Frec1.- Puede ser una constante o variable y especifica la frecuencia en Hz del primer tono. Su
valor puede variar entre 0 y 32767 Hz (2^15)
Frec2.- Puede ser una constante o variable y especifica la frecuencia en Hz del segundo tono.
Su valor puede variar entre 0 y 32767 Hz (2^15)
En caso de especificar los dos parámetros Freq1 y Freq2 se obtiene una onda
resultante de la mezcla de ambas frecuencias con el periodo indicado.
GND
GND
+ 5V
+ 5V
a las siguientes condiciones:
1
1
1. Ánodo del Diodo emisor de IR del
2
1000
220
220
0
3. Salida del receptor de IR del lado
izquierdo conectado a través de
una resistencia de 220 ½ W al
Pin 14
4. Salida del receptor de IR del lado
izquierdo conectado a través de
una resistencia de 220 ½ W al
Pin 1
El mismo montaje del esquema eléctrico anterior, incluyendo el patillaje, puede
apreciarse en la siguiente imagen montado sobre un BOT con una tarjeta HomeWork.
DEBUG CRSRXY, 0, 3,"DER =" , BIN1 DET_DER, " IZQ =", BIN1 DET_IZQ 'Muestra en coordenadas 0, 3 información
PAUSE 100
LOOP
Dado que el transistor puede trabajar en la región activa con un conversor analógico
digital (CAD) como el ADC0831 de 8 bits podríamos tener una resolución de hasta 256
valores que nos permitirían detectar todo un abanico de colores, en todo caso, salvo que se
adjunte un anexo con posterioridad a estos apuntes, de momento únicamente trabajaremos
con dos estados posible detección de negro o blanco
(colores claros).
Área marcada
Vista superior
Dado que el CNY70 es un dispositivo Vcc=+5V
que trabaja en región activa del transistor se
obtiene una salida analógica función de la
cantidad de luz reflejada. Para obtener una
82
Área marcada
En las distintas pruebas realizadas en
HEF 40106
el prototipo construido los resultados han sido K C
PIC
adecuados cuando la distancia de la línea a la
VISTA SUPERIOR
10 k
2,5 mm.
LADO IZQUIERDO
DEL MICROBOT
LADO DERECHO
DEL MICROBOT
LADO DERECHO
DEL MICROBOT
Vcc=+5V
Instalación de los sensores de IR CNY 70
82
tendremos un 1 lógico.
Si por el contrario la superficie en la que LADO DERECHO
A E DEL MICROBOT
esta reflejada la luz infrarroja es de color
negro ( oscuro) el transistor Área marcada
HEF 40106
entenderemos que esta en corte lo que K C
PIN 4
significa que la entrada de la puesta VISTA SUPERIOR
10 k
DEL CNY 70
estará a 5V, es decir, a 1 lógico. Dado
que la puerta lógica es un inversor, en
este caso, a su salida tendremos un 0 Vcc=+5V
En definitiva, con el montaje de la figura podemos concluir que en los pines del
microcontrolador tendremos:
Si la superficie sobre la que está situado el CNY 70 es clara tendremos un 1 lógico.
Si la superficie sobre la que esta situado el CNY 70 es oscura o negra tendremos un 0
lógico.
Para probar el correcto de funcionamiento de los sensores ópticos CNY 70 utilizaremos el
siguiente programa:
' Visualizar las líneas de E/S conectadas a los SENSORES OPTICO-REFLEXIVOS CNY 70 .
' {$STAMP BS2}. ' Directiva para indicar la version de Basic Stamp
' {$PBASIC 2.5}. 'directiva usada para indicar la versión de PBASIC
Con el programa anterior la ventana DEBUG Terminal mostrará los siguientes resultados:
Sensor del lado derecho sobre superficie blanca y el izquierdo sobre negra
Sensor del lado izquierdo sobre superficie blanca y el derecho sobre negra
Como ejercicio, se propone al lector que realice un programa que permita al microbot
seguir una línea negra y se pare si dicha línea se corta.