Ejercicios BASIC IMAGINA
Ejercicios
1.- En este primer programa damos la orden de encender uno de los LEDs de la placa, el correspondiente a la salida 1.
high 1
2.- Podemos hacer lo mismo con todas las salidas.
high 1
high 2
high 3
high 4
high 5
high 6
high 7
3.- A continuación vamos a hacer que se encienda un LED, se espere un tiempo y se vuelva a apagar.
high 1
wait 4
low 1
4.- Para conseguir que se encienda y se apague cíclicamente, repetimos esta acción de forma indefinida.
intermitente:
high 1
wait 1
low 1
wait 1
goto intermitente
5.- Para dos LEDs podríamos escribir algo así.
intermitente:
high 1
low 2
wait 1
low 1
high 2
wait 1
gosub intermitente
6.- Ahora comenzamos a utilizar las entradas de información del microcontrolador. En este caso los pulsadores IN 2 e IN 5.
intermitente:
if pin2=0 then encender
if pin5=0 then apagar
goto intermitente
encender:
high 1
goto intermitente
apagar:
low 1
goto intermitente
7.- También podemos conseguir que el altavoz produzca un tono.
tono:
sound B.3,(20,50)
goto tono
8.- Podemos hacer que ese tono vaya subiendo de forma paulatina. Para ello utilizamos una variable (b0) en donde vamos almacenado su valor.
tonovariable:
let b0 = b0 + 1
sound B.3,(b0,50)
goto tonovariable
9.- Este programa nos permite tocar una pequeña canción.
doraemon:
tune 3, 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)
wait 2
goto doraemon
10.- Este pequeño programa acciona dos motores.
motores:
low 4 'El motor A va hacia atrás
high 5
low 6 'El motor B va hacia atrás
high 7
11.- Con este programa podemos controlar dos motores mediante un mando a distancia.
halt A
halt B
lectura:
infrain2
if infra=1 then gosub adelante
if infra=7 then gosub atras
if infra=3 then gosub derecha
if infra=5 then gosub izquierda
goto lectura
adelante:
low 4 'El motor A va hacia atrás
high 5
low 6 'El motor B va hacia atrás
high 7
return
atras:
low 5 'El motor A va hacia atrás
high 4
low 7 'El motor B va hacia atrás
high 6
return
derecha:
low 5 'El motor A va hacia atrás
high 4
low 6 'El motor B va hacia atrás
high 7
return
izquierda:
low 4 'El motor A va hacia atrás
high 5
low 7 'El motor B va hacia atrás
high 6
return
12.- Este programa hace que gire un motor, acelerando suavemente y decelerando hasta parar, utilizando la técnica PWM. Para ello se utiliza la orden pwmout.
halt A
halt B
wait 2
forward B
pwmout pwmdiv4, C.5, 249, 200
wait 1
pwmout pwmdiv4, C.5, 249, 300
wait 1
pwmout pwmdiv4, C.5, 249, 400
wait 1
pwmout pwmdiv4, C.5, 249, 500
wait 1
pwmout pwmdiv4, C.5, 249, 600
wait 1
pwmout pwmdiv4, C.5, 249, 700
wait 1
pwmout pwmdiv4, C.5, 249, 800
wait 1
pwmout pwmdiv4, C.5, 249, 900
wait 1
pwmout pwmdiv4, C.5, 249, 1000
wait 1
pwmout pwmdiv4, C.5, 249, 900
wait 1
pwmout pwmdiv4, C.5, 249, 800
wait 1
pwmout pwmdiv4, C.5, 249, 700
wait 1
pwmout pwmdiv4, C.5, 249, 600
wait 1
pwmout pwmdiv4, C.5, 249, 500
wait 1
pwmout pwmdiv4, C.5, 249, 400
wait 1
pwmout pwmdiv4, C.5, 249, 300
wait 1
pwmout pwmdiv4, C.5, 249, 200
wait 1
13.- Con este programa podemos trazar un recorrido.
backward A
forward B
wait 1
forward A
forward B
wait 1
backward A
forward B
wait 1
forward A
forward B
wait 2
backward A
forward B
wait 1
forward A
forward B
wait 3
backward A
forward B
wait 1
forward A
forward B
wait 4
halt A
halt B
14.- Este programa nos permite repetir el arranque y paro del motor repetidas veces.
repetir:
for b1 = 1 to 5
backward A
forward B
pause 1000
halt A
halt B
pause 1000
next b1
15.- Otra manera de hacer lo mismo sería esta.
repetir:
for b1 = 10 to 0 step 2
backward A
forward B
pause 1000
halt A
halt B
pause 1000
next b1
16.- Las ordenes setint e interrupt permiten realizar una interrupción en el programa para realizar otras tareas.
halt A
halt B
setint %00100000,%00100000,C
principal:
high 2
tune 3, 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)
goto principal
interrupt:
low 2
for b0=1 to 1
high 1
pause 400
low 1
pause 400
next b0
if pinC.7 = 1 then interrupt
setint %00100000,%00100000,C
return
17.- Para realizar la interrupción con S5, pero a nivel bajo, sería de la siguiente manera.
halt A
halt B
setint %00000000,%00100000,C
principal:
high 2
tune 3, 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)
goto principal
interrupt:
low 2
for b0=1 to 1
high 1
pause 400
low 1
pause 400
next b0
if pinC.7 = 1 then interrupt
setint %00000000,%00100000,C
return
18.- También se puede hacer con el interruptor S2.
halt A
halt B
setint %00000100,%00000100,C
principal:
high 2
tune 3, 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)
goto principal
interrupt:
low 2
for b0=1 to 1
high 1
pause 400
low 1
pause 400
next b0
if pinC.7 = 1 then interrupt
setint %00000100,%00000100,C
return
19.- Con este programa podremos realizar varias operaciones a la vez (El PIVAXE 20M2 permite realizar hasta 8 operaciones en paralelo).
start0:
halt A
halt B
infrain2
if infra=0 then gosub valor0
goto start0
start1:
infrain2
if infra=1 then gosub valor1
goto start1
start2:
infrain2
if infra=2 then gosub valor2
goto start2
start3:
infrain2
if infra=3 then gosub valor3
goto start3
start4:
infrain2
if infra=4 then gosub valor4
goto start4
valor0:
high 1
pause 100
low 1
pause 100
return
valor1:
high 2
pause 200
low 2
pause 200
return
valor2:
high 3
pause 300
low 3
pause 300
return
valor3:
high 4
pause 400
low 4
pause 400
return
valor4:
high 5
pause 500
low 5
pause 500
return
20.- El comando tune no se puede ejecutar paralelamente con otros.
start0:
halt A
halt B
tune 3, 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)
pause 1000
goto start0
start1:
high 2
pause 200
low 2
pause 200
goto start1
21.- Este programa permite conectar la placa IMAGINA mediante bluetooth.
'***********************************************
'* CONTROL DE ROBOT PER BLUETOOTH A 9600BAUDS **
'************** EQUIP ROBOLOT*******************
'***************** 28/09/12 ********************
'*******************PICAXE-20M2 ****************
'*******************PLACA IMAGINA***************
'***********************************************
#picaxe 20m2
setfreq m8 'la velocitat comunicació del port sèrie és de 9600 bauds.
'per comunicar amb el terminal del Prog. Editor polsar F8.
let dirsB = %11111111 'tot el portB configurat com a sortides
let adcsetup = 0 'cap port analògic.
'*************INICIALITZACIÓ DE REGISTRES*****************************************
symbol e_serie=b11 'registre on es guarda el que rep el port sèrie passat a ascii.
w1=200 'temps que tarda en desactivar l'acció de cada tecla (500ms)
' w2=2000 'idem b0 però per les tecles turbo 2 i 0 (1000ms)
' serout b.0,T38400_32,("-Hola, sóc el robot-")
' sertxd ("-Hola, sóc el robot-") 'comprovació de prova pel terminal del Prog. Editor (F8).
'***********************************************************************************
'********************PROGRAMA PRINCIPAL*********************************************
'***********************************************************************************
inici:
serin C.3,T9600_8,b11 'llegeix buffer port sèrie entrada pinc.3
'serrxd b11 'llegeix port serie a través del cable de programació.
'sertxd ("codi enviat",#b11) 'eco de prova pel terminal del Prog. Editor.
if e_serie=97 then tecla_a 'quan es reb un 97 vol dir que s'ha enviat pel port sèrie a.
if e_serie=98 then tecla_b 'quan es reb un 98 vol dir que s'ha enviat pel port sèrie b.
if e_serie=99 then tecla_c 'quan es reb un 99 vol dir que s'ha enviat pel port sèrie c.
if e_serie=100 then tecla_d 'quan es reb un 100 vol dir que s'ha enviat pel port sèrie d.
if e_serie=101 then tecla_e 'quan es reb un 101 vol dir que s'ha enviat pel port sèrie un e.
if e_serie=102 then tecla_f 'quan es reb un 102 vol dir que s'ha enviat pel port sèrie un f.
' if e_serie=103then tecla_g 'quan es reb un 103 vol dir que s'ha enviat pel port sèrie un g.
' if e_serie=104 then tecla_h 'quan es reb un 104 vol dir que s'ha enviat pel port sèrie un h.
if e_serie=85 then teclaU 'quan es reb un 85 vol dir que s'ha enviat pel port sèrie un U.
if e_serie=68 then teclaD 'quan es reb un 68 vol dir que s'ha enviat pel port sèrie un D.
if e_serie=76 then teclaL 'quan es reb un 76 vol dir que s'ha enviat pel port sèrie un L.
if e_serie=82 then teclaR 'quan es reb un 82 vol dir que s'ha enviat pel port sèrie un R.
if e_serie=67 then teclaC 'quan es reb un 82 vol dir que s'ha enviat pel port sèrie un R.
pause 100
goto inici
'***********************************************************************************
'***************** SUBPROGRAMES ****************************************************
'***********************************************************************************
teclaU: 'endavant turbo
gosub ENDAVANT_A_B
goto inici
teclaD: 'endarrere turbo.
gosub ENDARRERE_A_B
goto inici
teclaL: 'gir esquerra 1 roda.
gosub ENDAVANT_B'motor B endavant
pause w1
gosub ATURA_A_B
goto inici
teclaR: 'gir dreta 1 roda.
gosub ENDAVANT_A 'motor A endavant
pause w1
gosub ATURA_A_B
goto inici
teclaC: 'incrementa so
gosub ATURA_A_B
goto inici
tecla_f: 'toca la cancó.
play 3,0 'Happy Birthday
goto inici
tecla_e: ' toca la cancó.
play 3,1 'Jingle Bells
goto inici
tecla_d: 'toca la cancó.
play 3,2 'Silent Night
goto inici
tecla_c: ' toca la cancó.
play 3,3 'Rudolph the Red Nosed Reindeer
goto inici
tecla_b:
tune 3, 4, (16) 'fa bocina curta.
pause b0
goto inici
tecla_a:
tune 3, 4, (4) 'fa bocina curta.
pause b0
goto inici
'***********************************************************************************
'***************** SUBRUTINES ******************************************************
'***********************************************************************************
ENDAVANT_A_B:
'if pin3=0 then goto fi_endavant 'si veu obtacle no avança.
forward A
forward B
sound B.3,(90,90) ; so agut
return
ENDARRERE_A_B:
backward A
backward B
sound B.3,(90,90) ; so agut
return
ATURA_A_B:
halt A
halt B
sound B.3,(90,90) ; so agut
return
ENDAVANT_A: 'endavant motor A(= high B.4 i low B.5).
forward A
sound B.3,(90,90) ; so agut
return
ENDAVANT_B: 'endavant motor B.
forward B
sound B.3,(90,90) ; so agut
return
ENDARRERE_A: 'endarrera motor A.
backward A
sound B.3,(90,90) ; so agut
return
ENDARRERE_B: 'endarrera motor B.
backward B
sound B.3,(90,90) ; so agut
return
ATURA_A: 'atura A.
halt A
sound B.3,(90,90) ; so agut
return
ATURA_B: 'atura B.
halt B
sound B.3,(90,90) ; so agut
return
'***********************************************************************************
'******************** FI ***********************************************************
'***********************************************************************************
22.- Con este programa y el sensor de proximidad GP2Y0D810Z en la entrada pinC.3 se pueden sortear obstáculos, aunque el sensor tiene un campo de visión muy estrecho.
halt A
halt B
setint %00000000,%00001000,C
principal:
high 1
pause 100
backward A
backward B
goto principal
interrupt:
backward A
forward B
pause 200
forward A
forward B
pause 400
low 1
pause 100
if pinC.3=0 then interrupt
setint %00000000,%00001000,C
return
23.- este es un programa para mover un motor paso a paso bipolar, primero en un sentido y después en el otro (En el caso de un motor unipolar se puede utilizar esta información).
ciclodelante:
for b1 = 0 to 10
backward A
backward B
pause 0
backward A
forward B
pause 0
forward A
forward B
pause 0
forward A
backward B
pause 0
next
cicloatras:
for b0 =0 to 11
backward A
backward B
pause 0
forward A
backward B
pause 0
forward A
forward B
pause 0
backward A
forward B
pause 0
next
goto ciclodelante
Otra versión del programa sería este.
ciclodelante:
for b1 = 0 to 10
backward A
backward B
pause 0
backward A
forward B
pause 0
forward A
forward B
pause 0
forward A
backward B
pause 0
next
cicloatras:
for b0 =0 to 10
forward A
forward B
pause 0
backward A
forward B
pause 0
backward A
backward B
pause 0
forward A
backward B
pause 0
next
goto ciclodelante
Una tercera versión sería esta.
principal:
b1=5
b0=8
ciclodelante:
for b1=b1 to b0
backward A
backward B
pause 0
backward A
forward B
pause 0
forward A
forward B
pause 0
forward A
backward B
pause 0
next
b0 =12
cicloatras:
for b1 =b1 to b0
forward A
forward B
pause 0
backward A
forward B
pause 0
backward A
backward B
pause 0
forward A
backward B
pause 0
next
24.- En este programa el movimiento se controla con los pulsadores S2 y S5.
ciclodelante:
if pin2=0 then goto cicloatras
backward A
backward B
pause 0
backward A
forward B
pause 0
forward A
forward B
pause 0
forward A
backward B
pause 0
goto ciclodelante
cicloatras:
if pin5=0 then goto ciclodelante
forward A
forward B
pause 0
backward A
forward B
pause 0
backward A
backward B
pause 0
forward A
backward B
pause 0
goto cicloatras
25.- Con este programa el motor paso a paso se controla con el mando de infrarrojos.
inicio:
b0=20
lectura:
infrain2
if infra=0 and b0<41 then gosub adelante
if infra=1 and b0>0 then gosub atras
goto lectura
adelante:
b0=b0+1
backward A
pause 1
backward B
pause 1
backward A
pause 1
forward B
pause 1
forward A
pause 1
forward B
pause 1
forward A
pause 1
backward B
pause 1
return
atras:
b0=b0-1
forward A
pause 1
forward B
pause 1
backward A
pause 1
forward B
pause 1
backward A
pause 1
backward B
pause 1
forward A
pause 1
backward B
pause 1
return
26.- Incluyendo la orden debug podemos ver cual es el valor de b0 en todo momento.
inicio:
b0=20
lectura:
debug
infrain2
if infra=0 and b0<41 then gosub adelante
if infra=1 and b0>0 then gosub atras
goto lectura
adelante:
b0=b0+1
backward A
pause 1
backward B
pause 1
backward A
pause 1
forward B
pause 1
forward A
pause 1
forward B
pause 1
forward A
pause 1
backward B
pause 1
return
atras:
b0=b0-1
forward A
pause 1
forward B
pause 1
backward A
pause 1
forward B
pause 1
backward A
pause 1
backward B
pause 1
forward A
pause 1
backward B
pause 1
return
27.- Este programa sitúa el carro movido por el motor paso a paso en un punto determinado por la entrada analógica de la LDR situada en IN1.
inicio:
b0=20
lectura:
readadc 1,b1
b2=b1/6
debug
if b2>b0 and b0<41 then gosub adelante
if b2<b0 and b0>0 then gosub atras
goto lectura
adelante:
b0=b0+1
backward A
pause 1
backward B
pause 1
backward A
pause 1
forward B
pause 1
forward A
pause 1
forward B
pause 1
forward A
pause 1
backward B
pause 1
return
atras:
b0=b0-1
forward A
pause 1
forward B
pause 1
backward A
pause 1
forward B
pause 1
backward A
pause 1
backward B
pause 1
forward A
pause 1
backward B
pause 1
return
28.- Con este programa podemos encender los led,s de la placa.
principal:
let dirsB=255
let pinsB = %11111111