Está en la página 1de 44

SERGIO HERNÁN VALENZUELA CÁMARA

CONTACTO@OPTIONSOFT.CL 2017 1
¿ QUE VAMOS APRENDER EN ESTE MÓDULO?

Construir un PiBot que es totalmente controlado


de manera remota, además de tener
incorporado una cámara, que nos permitirá ver
todo lo que está en frente de él.
Además el carro también tiene un sensor
ultrasónico, que va a permitir que podamos
medir la distancia de los objetos en frente del
robot móvil.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 2
EL PROYECTO PIBOT

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 3
MATERIALES NECESARIOS

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 4
MATERIALES NECESARIOS… CONTINUACIÓN

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 5
LISTA DE MATERIALES
Raspberry Pi - Versión 3B
Kit de Chasis de 2(viene con 3ra rueda loca) o 4 ruedas
Módulo Puente H L298N
Sensor de Distancia Ultrasónico HC-SR04
Cámara Raspberry Pi v2 o Cámara USB
Soporte para 8 pilas AA o soporte para 2 pilas de 3.7 V.
Mini Protoboard
2 resistencias , una de 1k y otra de 1k8
Jumpers - 4 hembra x hembra y 4 macho x hembra
Cable USB x Micro USB
1 convertidor de voltaje a 5 volt.
8 pilas recargables de 2500 mA o mas … o 2 pilas recargables de 3.7 Volt

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 6
KIT CHASIS #1 - ARMADO

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 7
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 8
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 9
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 10
KIT CHASIS #2 - SOLDADURAS

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 11
CONEXIÓN DE LOS MOTORES
Para conectar los motores a la Raspberry Pi, es necesario el uso de
componentes externos para proveer los recursos necesarios
para el funcionamento de los motores. Em el proyecto
utilizaremos el Módulo Puente H L298N, que viene
confeccionado en una única placa.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 12
MÓDULOS DE CÁMARA
Estan disponibles las cámaras v1 (5 megapixels), v2 (8
megapixels) y la infra roja, conocida como Pi NoIR. Esas
son cámaras específicas para la Raspberry Pi, mas
nada impide que se pueda usar una cámara USB
genérica.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 13
ALIMENTANDO LA RASPBERRY PI
comenzaremos a realizar las
conexiones del Raspberry Pi.
Comezamos con la conexión
del Módulo Puente H L298N con
las pilas y con el cable USB, que
alimentará la Raspberry Pi:
el módulo tiene 3 pines, uno para
tierra (GND), uno de alimentación
(VCC) y un pine de 5V.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 14
CONECTANDO LOS CABLES
El módulo será conectado al divisor
de tensión. El cable positivo del
divisor de tensión quedará
conectado al VCC del módulo,
y el cable negativo quedará
conectado al GND del módulo.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 15
CONEXIÓN SOPORTE DE PILAS AL DIVISOR TENSIÓN
Notar que la posición de
las pilas en la caja tienen
que estar acorde a la
polaridad de los cables y
los bornes de la caja se
conectan al divisor de
tensión
Positivo => positivo
Y negativo => negativo

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 16
MÓDULO PUENTE H L298N

Conforme las especificaciones


técnicas, el Módulo Puente H
L298N tiene la capacidad de
controlar 2 motores DC
(Direct Current, o corrente
contínua, entre 5V y 35V). En el
proyecto, utilizamos motores
simples de 5V, mas se tiene la
opci’on de controlar motores mas
potentes con el mismo módulo.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 17
CONECTANDO LOS MOTORES AL MÓDULO PUENTE H L298N
Hay 2 controles de motores en el módulo, uno a
cada lado. Cada control tiene dos entradas,
OUTA y OUTB en el primer control, OUTC y OUTD
en el segundo control. OUTA y OUTC son las
entradas para mover el respectivo motor para
adelante, y OUTB y OUTD son las entradas para
mover el respectivo motor para atrás.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 18
CONECTANDO A LA RASPBERRY PI
En esta parte necesitamos poner mas atención.
El módulo tiene 4 pines, INA, INB, INC e IND,
cada uno relacionado a una entrada del
control (OUTA, OUTB, OUTC y OUTD,
respectivamente) necesitamos conectarlos
al GPIO del Raspberry Pi. los pines del
módulo (INA, INB, INC e IND) serán
conectados a los pines 11, 13, 16 e 18.
Esos pines fueron escogidos por sus
posiciones en el GPIO. Los pines 11 y 13
serán responsables por el motor de la
izquierda, para los movimentos hacia
adelante y atrás, respectivamente. Así como
los pines 16 (adelante) y 18 (atrás), serán
responsables por el motor de la derecha.
Con esto en mente, podemos conectar todo en
ambiente físico. Ahora podemos iniciar la
programación de nuestro PiBot.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 19
CONECTANDO A LA RASPBERRY PI…CONTINUACIÓN

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 20
POLARIDAD DE LOS MOTORES
Con el carro ya armado, tenemos que notar un detalle, como el
módulo está debajo del carro, cuando lo volcamos, dejándolo de
pie, los motores quedan invertidos. Luego, si se armó siguiendo la
explicación, cada motor debe estar conectado a su control
opuesto. Hecho esto, podemos finalmente testear el drone.
Una nueva herramienta: pigs
Em los cursos anteriores, utilizamos em la línea de comando la
herramienta gpio. Ahora veremos una nueva, la herramienta pigs.
Para utilizarla, primero debemos cargarla, ejecutando el siguiente
comando:
sudo pigpiod

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 21
DEFINIENDO LAS SALIDAS CON PIGPIOD
Ahora definimos los outputs, tal como hicimos Ahora podemos definir los 4
com la herramienta gpio. Vamos a colocar
los 4 pines de GPIO en OUT, la diferencia es puertos para OUT:
que esta herramienta no trabaja con el
número físico de la placa y si con el número
de GPIO. A contibuación la relación de los pigs m 17 1
pines: pigs m 27 1
Motor de la Izquierda
pigs m 23 1
• Pine 11: GPIO 17 (Para adelante) pigs m 24 1
• Pine 13: GPIO 27 (Para atrás)
El flag m es para mode. El
Motor de la Derecha número 1 representa OUT
• Pino 16: GPIO 23 (Para frente) y 0 representa IN.
• Pino 18: GPIO 24 (Para trás)

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 22
TESTEANDO LA POLARIDAD DE LOS MOTORES
Con la salida en output, podemos escribir en los puertos, utilizando
el flag w, de write(ASEGURE EL CARRO PARA QUE NO SE ARRANQUE).
Primero, vamos a testear el motor de la izquierda, para adelante:
pigs w 17 1
Tenemos que estar atentos a la rotación del motor, de la rueda, pues su
polaridad puede de estar invertida. Em el caso de que el motor este
yendo para atrás, y no para adelante, basta invertir los cables de su
control, invirtiendo su polaridad.

Para desconectar el puerto, utilizamos el número 0 en lugar de 1:


pigs w 17 0

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 23
Podemos testear también el motor de la derecha:
pigs w 23 1

Em el caso de que la polaridad este invertida, ese es el momento


de invertir los cables.

Con las polaridades correctas, todo debe estar funcionando


correctamente, tanto los movimientos para adelante como
para atrás. A partir de los próximos capítulos vamos a
implementar todo el script en Python que va a controlar el
drone.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 24
INTERACTUAR CON GPIO A TRAVÉS DE PIGS
A través de pigs, podemos interactuar directamente con
GPIO. De esta manera, para leer el status de GPIO17 la
sintaxis correcta es:
pigs r 17
O:
pigs read 17

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 25
RECORDANDO EL COMANDO GPIO
En el módulo anterior, usamos el comando gpio para controlar los GPIOs de
Raspberry Pi. En este curso estamos usando la herramienta pigs, mas nada
impide que continue usando la herramienta gpio. Queda a su criterio.
Para escribir, debemos primero definir el GPIO como salida:
gpio -g mode 7 out
El comando arriba define el GPIO7 como salida. Usamos el flag -g para usar el
esquema de numeración BCM.
Para escribir el valor HIGH al GPIO7, utilizamos:
gpio -g write 7 1
Análogamente, podemos leer el status de un GPIO:
gpio -g read 7

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 26
CONTROL DEL DRONE VIA PYTHON
vamos a crear una carpeta llamada pibot, que será donde estarán
guardados los scripts que vayamos generando:

mkdir pibot
cd pibot

Dentro de esta pasta, vamos a crear el archivo control.py. Para


editar el archivo, podemos usar los editores de texto vi o nano, o
también utilizar la interfaz gráfica de Raspberry Pi vía VNC, como
vimos en el anterior módulo.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 27
CONTROL DEL DRONE VIA PYTHON #2
Vamos comenzar importando las bibliotecas neceaárias:
import RPi.GPIO as GPIO
import time
import getch
La novedad es la biblioteca getch, que va leer los inputs del teclado y los
transformará en comandos para el PiBot. Veremos mas detalles luego.
Ahora vamos usar como referencia en el script el esquema físico de GPIO. Vamos
remover también los mensajes de alerta:
import RPi.GPIO as GPIO
import time
import getch
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 28
CONTROL DEL DRONE VIA PYTHON #3
Ahora hacemos el mapeamiento de los pines, dando nombre a los mismos:
import RPi.GPIO as GPIO
import time
import getch
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
A_DERECHA = 16
A_IZQUIERDA = 11
R_DERECHA = 18
R_IZQUIERDA = 13

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 29
CONTROL DEL DRONE VIA PYTHON #4
Ahora creamos una función que defina como salida, o sea, como OUTPUT:
import RPi.GPIO as GPIO
import time
import getch
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
A_DERECHA = 16
A_IZQUIERDA = 11
R_DERECHA = 18
R_IZQUIERDA = 13
def setup_motor():
GPIO.setup(A_DERECHA, GPIO.OUT)
GPIO.setup(A_IZQUIERDA, GPIO.OUT)
GPIO.setup(R_DERECHA, GPIO.OUT)
GPIO.setup(R_IZQUIERDA, GPIO.OUT)
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 30
CONTROL DEL DRONE VIA PYTHON #5
Con los motores inicializados, podemos mover el PiBot. Vamos a crear dos funciones, una que mueve
el PiBot para adelante y otra para la derecha. Comenzamos con la función que mueve el drone
para adelante. Ella colocará los dos pines responsables del movimento de ir adelante en alta,
aguardará 0.4 segundos y colocará los pinos en baja nuevamente.
Para crear la función que mueve el drone para la direita, necesitamos mover solamente el motor de
la izquierda para adelante:
def mover_adelante():
GPIO.output(A_DERECHA, GPIO. HIGH)
GPIO.output(A_IZQUIERDA, GPIO. HIGH)
time.sleep(0.4)
GPIO.output(A_DERECHA, GPIO. LOW)
GPIO.output(A_IZQUIERDA, GPIO. LOW)
def mover_derecha():
GPIO.output(A_IZQUIERDA, GPIO. HIGH)
time.sleep(0.2)
GPIO.output(A_IZQUIERDA, GPIO. LOW)

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 31
CONTROL DEL DRONE VIA PYTHON #6
Capturando teclas digitadas
Ya creamos las funciones que mueven el PiBot para adelante y para la
derecha. Como ejercicio tendrán(estudiantes) que
implementar las funciones para mover o drone hacia atrás
y a la izquierda. Ahora vamos a leer los comandos del teclado, las
teclas que sean digitadas. Vamos a definir que las
teclas W, A, S y D van a mover drone
para adelante, izquierda, atrás y derecha, respectivamente.
Como todavía no tenemos las funciones que mueven el drone para atrás
y para la izquierda, solo vamos a capturar las teclas W y D. Vamos
acapturar la tecla digitada a través de la función getch(), de la
biblioteca del mismo nombre:

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 32
CONTROL DEL DRONE VIA PYTHON #7

def leer_teclado(): # lectura del teclado


while True:
tecla_comando = getch.getch()
if tecla_comando == 'w':
mover_adelante()
if tecla_comando == 'd':
mover_derecha()

setup_motor()
leer_teclado()

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 33
CONTROL DEL DRONE VIA PYTHON #8
Necesitamos instalar el módulo getch en el Raspberry Pi, a través
del siguiente comando:
sudo pip3 install getch
Con el módulo ya instalado, corremos el script:
python3 ~/pibot/control.py
Notar que el terminal queda "trabado", eso porque el script queda
esperando los comandos del teclado. Si tecleamos W, el drone
irá para adelante, y D hará que el PiBot se mueva para la
derecha.
NOTA: Si nunca vió pip3, no se preocupe. El pip3 es nada mas que un gerenciador de paquetes,
mas exclusivo del mundo Python. En otras palabras, el pip3 es el apt-get del mundo Python.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 34
SENSOR ULTRASÓNICO
La función en el PiBot será medir la distancia de los objetos que estan en frente
del drone. Eso ayuda, pues a partir del momento en que estamos piloteando
el PiBot remotamente, perdemos esa referencia de distancia:
Podemos notar que sensor tiene 4 pines, los ya conocidos de alimentación y
tierra, VCC y GND, respectivamente, y los pines Trigger y Echo. Su
funcionamiento es simple, el emite un pulso, en una frecuencia que no es
audible a nuestros oídos, que choca en el objeto y vuelve, calculando así la
distancia recorrida, luego la distancia del objeto que está en frente del sensor.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 35
SENSOR ULTRASÓNICO
Además del sensor, también utilizaremos dos resistencias, una de 1k y otra
de 1k8:

¿ Para qué usar dos resistencias ? El sensor trabaja con 5V, cuando envía una
información de vuelta para el Raspberry Pi, que trabaja con 3.3V, puede
acabar quemando la placa. Para que eso no ocurra, vamos hacer un circuito
sencillo, llamado divisor de tensión, conectamos la resistencia de 1k al
pine Echo, y su su otra punta conectamos la resistencia de 1k8 a tierra, así
como se ve em la imagen de abajo:

El punto de encuentro de las dos


resistencias va generar 3.3V, valor que
podrá ser llevado al Raspberry Pi sin
perjudicarlo.
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 36
SENSOR ULTRASÓNICO HC-SR04
El Sensor Ultrasónico tiene los siguientes: 5V Supply (VCC), Trigger
Pulse Input, Echo Pulse Output e 0V Ground (GND).

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 37
INSTALANDO EL SENSOR
Instalamos el sensor en el drone con el siguiente esquema de pines:
VCC - Pine 4
GND - Pine 6
Echo - Pine 29
Trigger - Pine 31
Además del sensor y de las resistencias, necesitaremos de 4 jumpers
macho/hembra y de un mini protoboard. Conectamos el sensor al mini
protoboard y utilizamos los jumpers para hacer la conexión de los
pines con el GPIO del Raspberry Pi. Con relación a los
pines VCC y Trigger, ningún misterio, basta colocar los jumpers y
conectarlos a los pinos 4 y 31, respectivamente.

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 38
SERGIO HERNÁN VALENZUELA CÁMARA
CONTACTO@OPTIONSOFT.CL 2017 39
CONECTANDO EL SENSOR AL RASPBERRY PI
Conectar los jumpers en el Raspberry Pi. Los
pines VCC y Trigger son conectados a los pines 4 y 31,
respectivamente. El jumper de Echo quedará conectado al pine
29 y el de GND estará conectado al pine 6.
VCC - Pino 4
GND - Pino 6
Echo - Pino 29
Trigger - Pino 31

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 40
COMO FUNCIONA EL SENSOR
El sensor mide cuanto tiempo los pulsos demoran para chocar em
el objeto y regresar al sensor. A partir de ese tiempo es que
calculamos la distancia hasta el objeto.

El sensor nos informa el tiempo que


el pulso pasó viajando, el emite una
onda quadrada en ECHO, de mismo
tiempo de viagem del pulso (ida +
vuelta):

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 41
COMO FUNCIONA EL SENSOR #2
Para saber el tiempo de viaje del pulso , que será usado para calcular la
distancia hasta el objeto, debemos calcular el tiempo en que el ECHO queda
en HIGH. Para hacer esto, vamos a leer la entrada y actualizar el valor del
pulso inicial hasta que la señal se altere de LOW para HIGH, este será el
tiempo inicial. Vamos utilizar un loop while para verificar cuando el valor
de ECHO se altera e guardarlo en la variable pulso_inicial:
Con el tiempo inicial y el tempo final, basta hacer la diferencia y tendremos el
tiempo total de la onda cuadrada, que es el tiempo que el pulso demoró para
ir y volver hasta el objeto:
Teniendo el tiempo, podemos calcular la distancia. Para eso, necesitamos
multiplicar el tiempo por la velocidad del sonido, 343 m/s, o 34300 cm/s.
Mas como la velocidad del sonido varia conforme a la temperatura ambiente,
lo ideal es utilizar el valor de la tabla abajo que mas se aproxima a su
ambiente :

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 42
COMO FUNCIONA EL SENSOR #3
Sabiendo la velocidad y duración que del pulso, podemos fácilmente calcular la
distancia recorrida com uma sencilla fórmula:
distancia(m) = velocidad(m/s) x tempo(s)

Considerar que el pulso recorre dos veces la


misma distancia hasta el objeto, pues el
mismo tiene que ir hasta el objeto y enseguida
volver. Si queremos la distancia hasta el
objeto, debemos dividir el tempo por la mitad,
quedando:
distancia(m) = velocidad(m/s) x (tiempo(s) / 2)

SERGIO HERNÁN VALENZUELA CÁMARA


CONTACTO@OPTIONSOFT.CL 2017 43
CÓDIGO: DISTANCIA.PY
import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BOARD)

GPIO.setwarnings(False)

ECHO = 29

TRIG = 31

def setup_sensor():

GPIO.setup(ECHO, GPIO.IN)

GPIO.setup(TRIG, GPIO.OUT)

def roda_medicao():

global distancia_cm

distancia_cm = 0

while True:

time.sleep(2)

GPIO.output(TRIG, GPIO.HIGH)

time.sleep (0.000010)

GPIO.output(TRIG, GPIO.LOW)

while GPIO.input(ECHO) == 0:

pulso_inicial = time.time()

while GPIO.input(ECHO) == 1:

pulso_final = time.time()

duracao_pulso = pulso_final - pulso_inicial

distancia_cm = 34300 * (duracao_pulso/2)

distancia_cm = round(distancia_cm, 0)

print(distancia_cm, 'cm ',end="\r")

setup_sensor()
SERGIO HERNÁN VALENZUELA CÁMARA
roda_medicao() CONTACTO@OPTIONSOFT.CL 2017 44

También podría gustarte