# Movimiento

# 2 Movimiento

El primer contacto con este robot va a ser controlar el movimiento.

<p class="callout info">Nomenclatura: Hacia delante es donde está la cámara.</p>

![](https://libros.catedu.es/uploads/images/gallery/2022-03/embedded-image-kxf3tpij.gif)

[Giphy GIF by NASA](https://giphy.com/gifs/PoTqqMdi36IGA/html5)

# 2.1 Motores

Vamos a empezar por la parte importante de un rover:

![](https://libros.catedu.es/uploads/images/gallery/2022-03/embedded-image-oghyfsow.gif)

[NASA/JPL-Caltech](https://mars.nasa.gov/resources/25691/perseverance-wiggles-a-wheel/)

Los motores estan gobernados con los siguientes GPIO

<table id="bkmrk-interfaces-puertos-g"><thead><tr><th>Interfaces</th><th>Puertos GPIO de la Raspberry Pi</th></tr></thead><tbody><tr><td>IN1</td><td>P12</td></tr><tr><td>IN2</td><td>P13</td></tr><tr><td>ENA</td><td>P6</td></tr><tr><td>IN3</td><td>P20</td></tr><tr><td>IN4</td><td>P21</td></tr><tr><td>ENB</td><td>P26</td></tr></tbody></table>

Luego una de las primeras líneas que hay que poner en nuestros programas es traducir esos números a letras para que sea más facil utilizarlos en el código, y definir esos pines como pines de salida que van a gobernar a los motores:

```Python
import RPi.GPIO as GPIO

IN1=12;IN2=13;ENA=6;IN3=20;IN4=21;ENB=26

GPIO.setmode(GPIO.BCM);GPIO.setwarnings(False)
GPIO.setup(IN1,GPIO.OUT);GPIO.setup(IN2,GPIO.OUT);GPIO.setup(IN3,GPIO.OUT);GPIO.setup(IN4,GPIO.OUT)
GPIO.setup(ENA,GPIO.OUT);GPIO.setup(ENB,GPIO.OUT)
```

## ¿Qué significan IN1 IN2 IN3 IN4 ?

<table id="bkmrk-in1-in2-in3-in4-desc"><thead><tr><th>IN1</th><th>IN2</th><th>IN3</th><th>IN4</th><th>Descripción</th></tr></thead><tbody><tr><td>1</td><td>0</td><td>0</td><td>1</td><td>Motores hacia delante</td></tr><tr><td>0</td><td>1</td><td>1</td><td>0</td><td>Motores hacia atrás</td></tr><tr><td>0</td><td>0</td><td>0</td><td>1</td><td>Giro derecha</td></tr><tr><td>1</td><td>0</td><td>0</td><td>0</td><td>Giro izquierda</td></tr><tr><td>0</td><td>0</td><td>0</td><td>0</td><td>Stop</td></tr></tbody></table>

## ¿Y qué significa ENA ENB?

ENA y ENB es la velocidad de los motores A y B respectivamente.

Su valor tiene que ser analógico pero los GPIO son digitales, así que tienen que ser señales PWM.

Si vamos a poner una frecuencia de 500Hz y una velocidad media, el código que tenemos que poner al principio de nuestro programa es:

```Python
PWMA = GPIO.PWM(ENA,500);PWMB = GPIO.PWM(ENB,500)
PWMA.start(50);PWMB.start(50)
```

### Bueno, pero ... ¿Cómo son las conexiones?

En el AlphaBot están conectados los pines IN1 IN2 IN3 IN4 ENA ENB en los pines de un chip L298P que hace de driver a los motores (nunca conectes un motor a un GPIO de la Raspberry[ ya lo sabes](https://catedu.github.io/raspberry-muy-basico/2-gpio.html)) ![](https://libros.catedu.es/uploads/images/gallery/2022-03/embedded-image-pxrwv40u.png)

## Vale... ¿Y cómo se utiliza?

Podemos definir en nuestros programas unas funciones para simplificar código para utilizar los motores hacia delante, detrás y giros:

```Python
def FORDWARD():
    GPIO.output(IN1,GPIO.HIGH);GPIO.output(IN2,GPIO.LOW);GPIO.output(IN3,GPIO.LOW);GPIO.output(IN4,GPIO.HIGH)
def BACKWARD():
    GPIO.output(IN1,GPIO.LOW);GPIO.output(IN2,GPIO.HIGH);GPIO.output(IN3,GPIO.HIGH);GPIO.output(IN4,GPIO.LOW)
def LEFT():
    GPIO.output(IN1,GPIO.LOW);GPIO.output(IN2,GPIO.LOW);GPIO.output(IN3,GPIO.LOW);GPIO.output(IN4,GPIO.HIGH)
def RIGHT():
    GPIO.output(IN1,GPIO.HIGH);GPIO.output(IN2,GPIO.LOW);GPIO.output(IN3,GPIO.LOW);GPIO.output(IN4,GPIO.LOW)
def STOP():
    GPIO.output(IN1,GPIO.LOW);GPIO.output(IN2,GPIO.LOW);GPIO.output(IN3,GPIO.LOW);GPIO.output(IN4,GPIO.LOW)
```

# 2.2 Fichero VARIABLES.py

Debido a que vamos a utilizar varias variables que serán comunes a varias librerías que también vamos a crear, vamos a crear un fichero común a todos, de momento será este:

Cuando queramos incorporar estas variables pondremos esta instrucciónde Python **from VARIABLES import \***

[VARIABLES.py](https://github.com/JavierQuintana/AlphabotPython/)

---

```Python
import RPi.GPIO as GPIO

DataMotorR = 7
DataMotorL = 8

IN1=12
IN2=13
ENA=6
IN3=20
IN4=21
ENB=26

##############CONFIGURACION GPIO ENTRADAS SALIDAS ####
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(IN1,GPIO.OUT)
GPIO.setup(IN2,GPIO.OUT)
GPIO.setup(IN3,GPIO.OUT)
GPIO.setup(IN4,GPIO.OUT)
GPIO.setup(ENA,GPIO.OUT)
GPIO.setup(ENB,GPIO.OUT)

GPIO.setup(DataMotorR,GPIO.IN)
GPIO.setup(DataMotorL,GPIO.IN)


########################### VELOCIDAD DE LOS MOTORES
PWMA = GPIO.PWM(ENA,500)
PWMB = GPIO.PWM(ENB,500)
```

# 2.3 Libreria MOVIMIENTOS.py

Para simplificar nuestros programas podemos hacer una librería propia.

Esta librería la vamos a llamar **[MOVIMIENTOS.py](https://github.com/JavierQuintana/AlphabotPython/)** y su contenido sería lo visto en las páginas anteriores, añadiendo las variables definidas en **VARIABLES.py**:

```Python
import RPi.GPIO as GPIO

from VARIABLES import *


###########################FUNCIONES#######################
def FORDWARD(vel):
    GPIO.output(IN1,GPIO.HIGH)
    GPIO.output(IN2,GPIO.LOW)
    GPIO.output(IN3,GPIO.LOW)
    GPIO.output(IN4,GPIO.HIGH)
    PWMA.start(vel)
    PWMB.start(vel)

def BACKWARD(vel):
    GPIO.output(IN1,GPIO.LOW)
    GPIO.output(IN2,GPIO.HIGH)
    GPIO.output(IN3,GPIO.HIGH)
    GPIO.output(IN4,GPIO.LOW)
    PWMA.start(vel)
    PWMB.start(vel)

def LEFT(vel):
    GPIO.output(IN1,GPIO.LOW)
    GPIO.output(IN2,GPIO.LOW)
    GPIO.output(IN3,GPIO.LOW)
    GPIO.output(IN4,GPIO.HIGH)
    PWMA.start(vel)
    PWMB.start(vel)

def RIGHT(vel):
    GPIO.output(IN1,GPIO.HIGH)
    GPIO.output(IN2,GPIO.LOW)
    GPIO.output(IN3,GPIO.LOW)
    GPIO.output(IN4,GPIO.LOW)
    PWMA.start(vel)
    PWMB.start(vel)

def STOP():
    GPIO.output(IN1,GPIO.LOW)
    GPIO.output(IN2,GPIO.LOW)
    GPIO.output(IN3,GPIO.LOW)
    GPIO.output(IN4,GPIO.LOW)
```

# 2.4 Baile

Vamos a realizar un sencillo programa para romper el hielo, vamos a imitar los movimientos de la Sojourner

![](https://libros.catedu.es/uploads/images/gallery/2022-03/embedded-image-h46dycqs.gif)

*[Crédito de imagen: Proyecto Mars Pathfinder](https://spaceplace.nasa.gov/mars-sojourner/sp/)*

Unos movimientos delante, atrás, derecha, izquierda y paro utilizando la librería anterior:

<iframe allowfullscreen="allowfullscreen" height="314" id="bkmrk--1" src="//www.youtube.com/embed/WAycuDaKB0Q" width="560"></iframe>

## Solución

- Ponemos el fichero MOVIMIENTOS.py [que hemos visto](https://libros.catedu.es/books/rover-marciano-alphabot-rasbperry-y-python/page/23-libreria-movimientospy "2.3 Libreria MOVIMIENTOS.py") en la misma carpeta que vamos a crear este programa.
- En este programa importamos la librería de MOVIMIENTOS.py.
- Vamos llamando a las distintas funciones de movimientos, fijamos la velocidad al 50%, insertando entre ellas un tiempo de retraso de la librería time de 1 segundo.

¿Te atreves? Sino, mira la solución:

[![image-1647867821028.png](https://libros.catedu.es/uploads/images/gallery/2022-03/scaled-1680-/image-1647867821028.png)](https://libros.catedu.es/uploads/images/gallery/2022-03/image-1647867821028.png)   
Fichero [2-6-Baile.py](https://github.com/JavierQuintana/AlphabotPython/)

# 2.5 Movimientos con tecla

Ahora vamos a hacer lo mismo, pero gobernado por el teclado:

- PARAR = tecla ESPACIO
- ADELANTE=FORDWARD = f
- ATRAS=BACKWARD = b
- DERECHA=RIGHT = r
- IZQUIERDA=LEFT = l

<iframe allowfullscreen="allowfullscreen" height="314" id="bkmrk--1" src="//www.youtube.com/embed/fb6w5yQB_AM" width="560"></iframe>

### Solución

- Ponemos el fichero MOVIMIENTOS.py [que hemos visto](https://libros.catedu.es/link/5730) en la misma carpeta que vamos a crear este programa.
- En este programa importamos la librería de MOVIMIENTOS.py.
- Vamos llamando a las distintas funciones de movimientos según la tecla pulsada, fijamos la velocidad al 30% para que nos de tiempo de gobernarlo, por pantalla va saliendo el mensaje del estado.
- Todo dentro de un bucle de manera que si pulsamos la tecla espacio sale del buble no sin antes parar el robot.

¿Te atreves a hacerlo tú solo? Venga!! no le des tantas vueltas

![](https://libros.catedu.es/uploads/images/gallery/2022-03/embedded-image-avupvh3z.gif)

[From Gifer](https://gifer.com/en/6ZTm)

Sino, mira la solución:

[![image-1647868576174.png](https://libros.catedu.es/uploads/images/gallery/2022-03/scaled-1680-/image-1647868576174.png)](https://libros.catedu.es/uploads/images/gallery/2022-03/image-1647868576174.png)  
Fichero [2-7-Movimientos-Teclas.py](https://github.com/JavierQuintana/AlphabotPython/blob/master/Movimientos-tecla.py)