Las listas o arrays nos permiten realizar programas más complejos, donde poder almacenar una serie de valores para posteriormente utilizarlos para realizar cualquier acción.
Vamos a ver cómo usar las listas para convertir al mBot en un robot que pueda almacenar pasos para ejecutarlos uno a uno posteriormente ( como funcionan los robots como el Beebot o el Escornabot)
Para realizar este programa usaremos eBlock ya que nos permite trabajar con listas tanto en modo online como compilando y subiendo el programa a la placa
Utilizamos las flechas del mando remoto incluido en el mBot, para almacenar cada una de las direcciones que queremos que ejecute y posteriormente podremos pulsar el botón central "Icono de Setting" para ejecutar las acciones almacenadas.
Para ello hemos creado una lista (array) que se llama pasos, para almacenar cada una de las direcciones pulsadas en forma de números
( Flecha arriba =1, Flecha abajo = 2, Izquierda = 3, Derecha =4 )
Se han creado las siguientes funciones de ayuda para hacer mucho más legible el programa.
#include <Arduino.h> #include <Wire.h> #include <SoftwareSerial.h> #include <MeMCore_basic.h> #include "ListLib.h" MeDCMotor motor_9(9); MeDCMotor motor_10(10); void move(int direction, int speed); void AnadirPaso(); double direccion; List<double> pasos; MeIR ir; MeBuzzer buzzer; void CaminarSiguientePaso(); double paso; void Inicializar(); double caminando; void setup(){ ir.begin(); Inicializar(); } void loop(){ if(((caminando)==(0))){ AnadirPaso(); }else{ paso += 1; if((paso) < (pasos.Count())){ CaminarSiguientePaso(); }else{ Inicializar(); } } if(ir.keyPressed(21)){ paso = 0; caminando = 1; } _loop(); } void _loop(){ ir.loop(); } void AnadirPaso() { if(ir.keyPressed(64)){ direccion = 1; } if(ir.keyPressed(25)){ direccion = 2; } if(ir.keyPressed(7)){ direccion = 3; } if(ir.keyPressed(9)){ direccion = 4; } if((direccion) > (0)){ pasos.Add(direccion); direccion = 0; buzzer.tone(262, 500); delay(20); _delay(0.2); } } void CaminarSiguientePaso() { direccion = pasos[paso]; if(((direccion)==(1))){ move(1,100); } if(((direccion)==(2))){ move(2,100); } if(((direccion)==(3))){ move(4,100); } if(((direccion)==(4))){ move(3,100); } _delay(0.6); move(1,0); _delay(0.5); } void Inicializar() { paso = 0; pasos.RemoveRange(0, pasos.Count()-1 ); caminando = 0; buzzer.tone(98, 500); delay(20); } void register_callback( uint8_t event, void (*in_main_func)() ){ } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void move(int direction, int speed) { int leftSpeed = 0; int rightSpeed = 0; if(direction == 1){ leftSpeed = speed; rightSpeed = speed; }else if(direction == 2){ leftSpeed = -speed; rightSpeed = -speed; }else if(direction == 3){ leftSpeed = -speed; rightSpeed = speed; }else if(direction == 4){ leftSpeed = speed; rightSpeed = -speed; } motor_9.run((9)==M1?-(leftSpeed):(leftSpeed)); motor_10.run((10)==M1?-(rightSpeed):(rightSpeed)); }