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