Ejercicios BASIC PICAXE 08

Características del microcontrolador PICAXE 08

En un programa de Basic las ordenes (Comandos) se ejecutan empezando por la primera linea y siguiendo en orden de una en una, siempre y cuando algún comando no obligue a hacer un salto de linea hacia adelante o hacia atrás.

La distribución de pines en las diferentes versiones de este microcontrolador se muestran a continuación:

PICAXE Programming Editor

Para elaborar programas en Basic utilizaremos el PICAXE Programming Editor, que se puede descargar de forma gratuita desde la página de PICAXE.

También se pueden escribir estos programas en Basic en el "Bloc de notas de Windows", guardando los archivos con extensión. bas. El Programming Editor permite muchas otras funciones, como comprobar la sintaxis (La corrección en el lenguaje utilizado), simular el funcionamiento sobre un microcontrolador concreto o cargarlo realmente sobre uno de estos microcontroladores.

El entorno del PICAXE Programming Editor tiene este aspecto:

Cuando iniciamos un nuevo programa nos aparece un espacio en blanco sobre el que escribimos en diferentes lineas numeradas. Cuando escribimos un comando correctamente nos aparece en color azul. Si se trata de una variable se muestra en color fucsia. Por último, si se trata de un comentario se muestra en color verde.

En el menú "Opciones" hemos de seleccionar el modelo de microcontrolador para el que vamos a crear el programa, ya que no todos los comandos funcionan en todos los microcontroladores, ni tienen estos tampoco la misma distribución de pines.

En el menú "Sintax" encontramos la función para comprobar la sintaxis del programa. Si todo es correcto nos da el mensaje correspondiente.

El menú "Simulate" permite simular el funcionamiento del programa en un microcontrolador concreto. A la vez que vemos como el programa salta de una linea a otra en su ejecución, también podemos ver las entradas y salidas cuando se activan.

Para poder cargar el programa sobre un microcontrolador real necesitamos un cable que conecte ordenador y microcontrolador. Una vez conectado el cable hemos de entrar en el menú "Opciones" para seleccionar el puerto de comunicaciones correspondiente.

El programa lo cargaremos mediante el botón del menú "Program".

Aprendiendo a programar con PICAXE

1.- Empezaremos con los comandos high y low.

high indica que por una de las salidas del microcontrolador enviaremos una señal eléctrica para hacer funcionar un led, un motor u otra cosa.

low indica que dejaremos de enviar una señal eléctrica por esa salida del microcontrolador.

En el PICAXE 08 las salidas (Out/Output) están en 0, 1, 2 y 4. En la placa del robot seguidor de lineas las salidas que ponen en marcha los motores de las ruedas son la 2 y la 4. En la misma placa la salida 0 se usa para el servo.

Un programa muy simple será este:

high 2

Esta orden hace que salga una señal eléctrica por la salida 2 (Pin 2). Mientras no le demos otra orden el microcontrolador seguirá enviando esta señal por este pin.

2.- Aprenderemos a esperar con el comando pause.

pause indica al microcontrolador que ha de esperar un tiempo antes de seguir a la siguiente linea del programa. La cantidad que le sigue indica el tiempo en milisegundos. 1.000 milisegundos hacen un segundo.

El siguiente programa:

high 2

pause 2000

low 2

Primero envía una señal eléctrica a la salida 2, después espera 2 segundos y después deja de enviar señal alguna a la salida 2.

3.- Ahora vamos a hacer unas luces intermitentes:

high 2

pause 2000

low 2

pause 2000

high 2

pause 2000

low 2

pause 2000

high 2

pause 2000

low 2

pause 2000

high 2

pause 2000

low 2

pause 2000

Este programa permite encender y apagar un led, conectado en el pin 2, cuatro veces y apagarlo otras tantas, esperando 2 segundos entre cada encendido y apagado. Se trata de un programa innecesariamente largo.

4.- A veces interesa repetir varias veces un mismo proceso.

goto fuerza al programa a ir a una linea que no es la siguiente. Para ello hemos de colocar etiquetas en el programa acabadas en dos puntos.

encendido:

high 2

pause 2000

low 2

pause 2000

goto encendido

Este programa enciende y apaga el led indefinidamente, esperando 2 segundos entre cada encendido y apagado.

5.- Existen otras formas de repetir procesos.

Los comandos do y loop indican el principio y el fin de un proceso que se ha de repetir indefinidamente.

do

high 2

pause 2000

low 2

pause 2000

loop

6.- Algunas veces solamente queremos repetir un proceso un número limitado de veces.

Los comandos for y next indican el principio y el fin de un proceso que se ha de repetir un número determinado de veces.

La variable b0 se va incrementando de uno en uno, partiendo de 1 hasta llegar a 20. Cuando b0 vale 20 el proceso se para

for b0=1 to 20

high 2

pause 2000

low 2

pause 2000

next

7.- El microcontrolador puede tomar decisiones.

Los comandos if y then permiten que el programa tome una decisión en función de las características que tenga la lectura de una de las entradas del mismo. En el PICAXE08 los pines que pueden utilizarse para recoger información de entradas digitales son los pines 1, 2, 3 y 4. En el caso de la placa del robot seguidor de linea los pines 1 y 3 son los reservados a los sensores de infrarrojos que detectan si el coche va sobre la linea.

principal:

if pin1=0 then gosub encender

goto principal

encender:

high 2

pause 2000

low 2

pause 2000

return

Los comandos gosub y return permiten saltar hacia un subprograma y volver, una vez ejecutado este, a la siguiente linea desde la que se había saltado.

En el programa anterior cuando se cumple que pin1 tiene valor 0, es decir que por ese pin no se recibe señal, el programa salta al subprograma encender:, que realiza un encendido y posterior apagado de la salida 2. Una vez ejecutado el subprograma se vuelve al programa principal:.

8.- Algunos comandos nos facilitan la tarea.

El comando symbol nos permite renombrar una variable o un valor numérico (Constante) mediante una cadena de caracteres. Se utilizan letras mayúsculas.

Sobre la base del programa del ejercicio 7 podemos hacer lo siguiente:

symbol ENTRADA_1=pin1

symbol SALIDA_2=2

principal:

if ENTRADA_1=0 then gosub encender

goto principal

encender:

high SALIDA_2

pause 2000

low SALIDA_2

pause 2000

return

9.- El microcontrolador puede tomar más de una decisión seguida.

En este programa se revisan varias posibilidades que se pueden dar para decidir una u otra cosa.

symbol ENTRADA_1=pin1

symbol SALIDA_2=2

symbol SALIDA_4=4

principal:

if ENTRADA_1=0 then

low SALIDA_4

high SALIDA_2

end if

if ENTRADA_1=1 then

low SALIDA_2

high SALIDA_4

end if

goto principal

En función de cual sea el valor de la ENTRADA_1 se procede a encender la SALIDA_2 o la SALIDA_4. Al final de cada orden condicional hemos de colocar el comando end if.

10.- Se pueden simplificar las órdenes que toman decisiones.

Las dos órdenes condicionales del programa anterior las podemos agrupar en una utilizando el comando else , que significa "siempre que no se cumpla la condición se ha de hacer esto".

symbol ENTRADA_1=pin1

symbol SALIDA_2=2

symbol SALIDA_4=4

principal:

if ENTRADA_1=0 then

low SALIDA_4

high SALIDA_2

else

low SALIDA_2

high SALIDA_4

end if

goto principal

11.- Las variables se utilizan para almacenar información.

PICAXE dispone de 14 variables de uso general etiquetadas de b0 a b13. Estas variables pueden almacenar números enteros entre 0 y 255, pero no pueden guardar números o fracciones negativas. Todas estas variables se ponen a 0 cuando se reinicia el programa.

Cuando sobrepasan sus límites por arriba o por debajo se reinician, es decir, cuando se superan los valores 0 o 255 el microcontrolador realiza lo siguiente:

254 + 3 = 1

2 - 3 = 255

Para almacenar valores mayores de 255 se pueden combinar dos variables para crear una nueva variable capaz de almacenar números enteros entre 0 y 65335. Estas nuevas variables son 7, se etiquetan desde W0 a W6, y se asocian a las 14 variables iniciales de la siguiente manera:

w0 = b1 : b0

w1 = b3 : b2

w2 = b5 : b4

w3 = b7 : b6

w4 = b9 : b8

w5 = b11 : b10

w6 = b13 : b12

El byte más significativo de w0 es b1, y el byte menos significativo de w0 es b0.

Los bytes b0 y b1 (w0) se descomponen en variables de bit individuales. Estas variables de bits se pueden usar para almacenar valores que sólo necesiten un único bit (0 o 1).

b0 = bit7: bit6: bit5: bit4: bit3: Bit2: bit1: bit0

b1 = bit 15: Bit14: bit13: bit 12: bit11: bit10: Bit9: bit8

12.- Guardando información en variables.

El comando let permite guardar un valor en una variable, tal como vemos a continuación:

let b0=0

do

b0=b0+10

debug

loop

A la variable bo se le asigna un valor inicial igual a 0, posteriormente se va incrementando su valor en 10 unidades. Cuando la variable b0 alcanza el valor 255 vuelve a iniciar el contador. El comando debug muestra en pantalla los valores de las variables.

13.- Entra en juego el azar.

El comando random permite asignar un valor aleatorio a una variable.

principal:

random w0

if pin1 =1 then

let pins = b1

pause 100

end if

goto principal

El comando random asigna un valor aleatorio a la variable w0. Siempre que el valor de entrada de pin1 sea 1, el comando let pins determina los valores de encendido o apagado de todas las salidas del microcontrolador, en función del valor de w0. Este programa lo podemos simular en el PICAXE Programming Editor para otros microcontroladores de más de 8 pines.

14.- Otro programa que juega con las salidas del microcontrolador.

Veamos como actúa este programa:

principal:

random w0

b2=bit0

if b2=0 then

high 2

else

low 2

end if

b3=bit1

if b3=0 then

high 4

else

low 4

end if

goto principal

En la variable w0 se guarda el valor aleatorio generado por el comando random. Posteriormente, en la variable b2 se guarda el valor del bit0 de la variable w0. En función de cual sea el valor de b2 se enciende o se apaga el pin 2 de salida. Se repite el proceso con el valor del bit1 y del pin 4 de salida.

15.- Jugando con variables.

Este programa va aumentando el valor de b0 hasta que llega a 20. En ese momento una orden condicional hace saltar al subprograma decrementar: y de esta forma va apagando y encendiendo el pin de salida 2.

incrementar:

b0=b0+1

if b0>19 then goto decrementar

high 2

goto incrementar

decrementar:

b0=b0-1

if b0<1 then goto incrementar

low 2

goto decrementar

16.- Jugando con dos variables.

En un programa similar al anterior utilizamos dos variables b0 y b1 que se van incrementando o decrementando y una tercera variable b2 que es la suma de las dos primeras. La orden condicional incluye dos condiciones separadas por el operador lógico or, lo que indica que basta que se cumpla cualquiera de las dos para que se aplique el comando then.

incrementar:

b0=b0+2

b1=b1+1

b2=b0+b1

if b2>49 or b0>19 then goto decrementar

high 2

goto incrementar

decrementar:

b0=b0-2

b1=b1+1

b2=b0+b1

if b2<30 or b0<1 then goto incrementar

low 2

goto decrementar

17.- Comunicándonos con el microcontrolador mediante infrarrojos.

Los comandos infrain2 e infra se utilizan para leer la salida de infrarrojos de un mando a distancia (Codificación de SONY). El valor se guarda en la variable b13 y puede variar entre 0 y 127.

do

infrain2

debug b13

if infra = 1 then

high 2

low 4

end if

if infra = 2 then

low 2

high 4

end if

loop

18.- Utilizando los operadores lógicos (and, or).

19.- Controlar el movimiento de un servomotor.

El comando servo nos permite accionar un servomotor. Un servomotor es un motor que nos permite colocar su eje en cualquier posición (Girado una serie de grados en uno u otro sentido, respecto de un punto medio inicial. El primer valor numérico que acompaña al comando nos indica el pin al que está conectado el servomotor y el segundo valor la posición en la que quedará el eje. En el caso de la placa del robot seguidor de linea el pin es el 0. Los valores que indican el giro van desde 75 para el máximo giro en un sentido hasta 225 para el máximo giro en sentido contrario. El punto medio tiene el valor 125.

En el siguiente programa el comando servo nos sitúa el servomotor en dos posiciones, correspondientes a los valores 100 y 200.

inicio:

servo 0,100

principal:

servo 0,100

pause 2000

servo 0,200

pause 2000

goto principal

20.- También podemos producir sonidos.

El comando sound nos permite emitir un sonido a través de un micrófono electret usado como altavoz. El primer valor numérico indica el pin al que se conecta el micrófono, el segundo el tono y el tercero la duración en milisegundos.

tono:

sound 2,(20,50)

goto tono

21.- Otra manera de producir sonidos.

El comando tune nos permite tocar una melodía. El primer valor que acompaña al comando indica el pin al que está conectado el electret, el segundo valor indica la velocidad (Con valores entre 1 y 15). Las notas de la melodía se colocan entre paréntesis.

El siguiente programa reproduce la popular melodía del programa de dibujos animados "Doraemon". Podemos encontrar muchas más melodías en la página de PICAXE.

tune 2, 4, ($27,$40,$00,$44,$09,$44,$07,$6C,$07,$49,$07,$44,$05,$44,$02,$6C,$29,$42,$02,$45,$0B,$4B, $09,$47,$05,$6C,$05,$44,$29,$2B,$6C,$40,$02)

22.- Utilización del comando play.

El microcontrolador 08M dispone de cuatro melodías pregrabadas que se pueden reproducir con el comando play. El primer valor que acompaña al comando indica la melodía (0-3). El segundo valor indica si la melodía será acompañada con LED en los otros pines (0 = no). Las cuatro melodías son las siguientes: 0 - Happy Birthday, 1 - Jingle Bells, 2 - Silent Night y 3 - Rudolph the Red Nosed Reindeer.

melodia:

play 1,0

23.- Introducción de comentarios.

En el programa se pueden introducir comentarios que no tiene en cuenta el microntrolador, pero que proporcionan información al programador que ha de depurar o modificar el progrma. Para introducir un comentario escribimos primero un apóstrofo. El texto que le sigue es un comentario y el editor de PICAXE lo identifica con un color verde.

encendido: 'Programa que crea una luz intermitente

high 2

pause 2000

low 2

pause 2000

goto encendido

a.- Primer programa para barrera de parking.

En este programa cuando enviamos un 1 con el mando a distancia salta al subprograma subir. En él, el servo sube la barrera, espera cinco segundos y la vuelve a bajar. Una vez hecho esto vuelve al subprograma lectura.

inicio:

servo 0,43

pause 1000

lectura:

infrain2

if infra=1 then subir

goto lectura

subir:

servo 0,110

pause 5000

servo 0,43

pause 1000

goto lectura

b.- Segundo programa para la barrera.

Este segundo programa permite utilizar el mando a distancia para subir la barrera y el pulsador para bajarla.

inicio:

servo 0,43

pause 1000

lectura:

infrain2

if infra=1 then subir

goto lectura

subir:

for b1=0 to 12

high 4

pause 100

low 4

pause 100

next

high 2

servo 0,110

if input1=0 then goto bajar

pause 1000

goto subir

bajar:

servo 0,43

pause 1000

low 2

goto lectura

c).- Programa para unas luces intermitentes controladas por LDR. El sensor LDR se encuentra en el pin 1 y su valor se almacena en la variable b0. El valor de esta variable se utiliza para el comando pause.

intermitentes:

readadc 1 ,b0

debug

b0=b0+7

high 2

pause b0

low 2

pause b0

readadc 1 ,b0

debug

b0=b0+11

high 4

pause b0

low 4

pause b0

goto intermitentes

d).- Programa de control del tractor de cadenas, mediante el mando a distancia.

Dosmotores:

infrain2

if infra=1 then Encendido

if infra=2 then Derecha

if infra=3 then Izquierda

if infra=4 then Estatico

goto Dosmotores

Encendido:

high 2

high 4

goto Dosmotores

Derecha:

high 2

low 4

goto Dosmotores

Izquierda:

low 2

high 4

goto Dosmotores

Estatico:

low 2

low 4

goto Dosmotores

e.- Programa para robot seguidor de lineas con sensores CNY70.

'*********************************

'***DECLARACIÓN DE VARIABLES******

'*********************************

symbol SI=pin1 'Definimos el símbolo del sensor izquierdo

symbol SD=pin3 'Definimos el símbolo del sensor derecho

'*********************************

'***DECLARACIÓN DE CONSTANTES*****

'*********************************

symbol MI=2 'Definimos el símbolo del motor izquierdo

symbol MD=4 'Definimos el símbolo del motor derecho

'*********************************

'***INICIALIZACIÓN DE VARIABLES***

'*********************************

'*********************************

'***PROGRAMA PRINCIPAL************

'*********************************

do

if SI=0 and SD=0 then ;Condición 1: Detecta SI y SD

high MI ;Funcionan los dos motores

high MD

end if

if SI=0 and SD=1 then ;Condición 2: Sólo detecta SI

low MI ;Se activa el motor MD y se para MI

high MD

end if

if SI=1 and SD=0 then ;Condición 3: Sólo detecta SD

high MI ;Se activa el motor MI y se para MD

low MD

end if

loop

d.- Programa para robot controlado con mando a distancia.

'*******************************

'*** DECLARACIÓ DE VARIABLES ***

'*******************************

symbol SE=pin1 'definim símbol sensor esquerre

'*******************************

'*** DECLARACIÓ DE CONTANTS ***

'*******************************

symbol ME=2 'definim símbol motor esquerre

symbol MD=4 'definim símbol motor dret

'***********************************

'*** INICIALITZACIÓ DE VARIABLES ***

'***********************************

'*******************************

'*** PROGRAMA PRINCIPAL ***

'*******************************

do

infrain2 ' Espera rebem un codi(entre 0 i 127)

'i el guarda a la variable infra o b13

debug b13 'envia el valor de b13 a l’ordinador pel cable sèrie


if infra = 1 then ;si s'ha premut la tecla [2] va recte

high ME ;funcionen els dos motors

high MD

end if


if infra = 3 then ;si s'ha premut la tecla [4] gira a l'esquerra

low ME ;funciona motor dret

high MD

end if

if infra = 5 then ;si s'ha premut la tecla [6] gira a la dreta

high ME ;funciona motor esquerre

low MD

end if

if infra = 7 then ;si s'ha premut la tecla [8] s'atura.

low ME ;no va cap motor

low MD

end if

loop

e.- Programa que simula un dado electrónico.

inici:

'**********************************

' Definició de les variables

'**********************************

symbol sa=pin1 'Sensors fotoelèctrics

symbol sb=pin3

symbol N=2 'N=Sortida 2

symbol V=4 'V=Sortida 4

symbol ACC=b0

symbol i=b1

symbol j=b2 'J és la variable que emmagatzema el número de vegades que s'ha d'il·luminar la sortida N

'**********************************

'Generació d'un número del 0 al 255

'**********************************

random ACC

'**********************************

' Programa

'**********************************

if sa=0 and sb=0 then 'Si els detectors detecten moviment actua

sertxd("El valor de persones es ",#ACC,13,10) 'monitorització del valor del ràndom (opcional)

if ACC>=0 and ACC=<3 then ' Aquests 4 casos sobre 256 es la probabilitat de que quedis eliminat de la partida

high v

pause 4000

low v

goto inici

end if

'***************************************************************

'Assignació del valor de J depenent del valor de la variable acc

'***************************************************************

if acc>3 and acc<=45 then

let j=1

gosub dau

goto inici

endif

if acc>45 and acc<=87 then

let j=2

gosub dau

goto inici

endif

if acc>87 and acc<=129 then

let j=3

gosub dau

goto inici

endif

if acc>129 and acc<=171 then

let j=4

gosub dau

goto inici

endif

if acc>171 and acc<=213 then

let j=5

gosub dau

goto inici

endif

if acc>213 and acc<=255 then

let j=6

gosub dau

goto inici

endif

'****************************************************

'Subrutina dau (bucle de J)

'****************************************************

dau:

for i=1 to J

high n

pause 300

low n

pause 300

next i

return

'****************************************************

end if

goto inici

f.- Este programa nos permite controlar el tractor de cadenas con un mando a distancia.

tractor:

infrain2

if infra=1 then

high 2

high 4

endif

if infra=3 then

high 2

low 4

endif

if infra=5 then

low 2

high 4

endif

if infra=4 then

low 2

low 4

endif

goto tractor