lunes, 17 de agosto de 2020

Programación MotorShield Python

 Voy a explicar como fue la programacón de los movimientos del auto. El control desde la Raspberry al MotorShield y a su vez a los cuatro motores DC. 

Primero debemos tener instalado algunas de las versiones de Python 2 o 3. 

Luego es necesario descargar el siguiente codigo, ya que luego el programa va a importar el mismo:


AMSpi.py debe estar en la misma carpeta que el código que vamos a hacer.

La libreria anteriormente descargada nos va a servir mucho para tener varias herramientas para poder controlar distintos aspectos de las velocidades y direcciones de las ruedas de forma independiente sobre cada motor DC.

Y luego utilizar el siguiente código:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
   Servo Example - Example of usage ASMpi class

.. Licence MIT
.. codeauthor:: Jan Lipovský <janlipovsky@gmail.com>, janlipovsky.cz
"""

from AMSpi import AMSpi
import time
import socket
import thread
import sys

control = None

def stop(amspi,timesec):
    print("Stop")
    amspi.stop_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_2, amspi.DC_Motor_3, amspi.DC_Motor_4])

def run(amspi,timesec):
    print("Adelante")
    amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_3])
    amspi.run_dc_motors([amspi.DC_Motor_2, amspi.DC_Motor_4], clockwise=False)

def reverse(amspi,timesec):
    print("Reversa")
    amspi.run_dc_motors([amspi.DC_Motor_1, amspi.DC_Motor_3], clockwise=False)
    amspi.run_dc_motors([amspi.DC_Motor_2, amspi.DC_Motor_4])

def izquierda(amspi,timesec):
    print("Gira izquierda")
    amspi.run_dc_motors([amspi.DC_Motor_2,amspi.DC_Motor_1], clockwise=False)
    amspi.run_dc_motors([amspi.DC_Motor_4,amspi.DC_Motor_3])

def derecha(amspi,timesec):
    print("Gira derecha")
    amspi.run_dc_motors([amspi.DC_Motor_2,amspi.DC_Motor_1])
    amspi.run_dc_motors([amspi.DC_Motor_4,amspi.DC_Motor_3],  clockwise=False)

def on_message(message):
    print('mensaje recibido '+message)

    if(message == 'AD'):
       run(control, 10)

    if(message == 'AT'):
        reverse(control,10)

    if(message == 'ST'):
        stop(control,0)

    if(message == 'DE'):
        derecha(control,10)

    if(message == 'IZ'):
        izquierda(control,10)


if __name__ == '__main__':
    # Calling AMSpi() we will use default pin numbering: BCM (use GPIO numbers)
    # if you want to use BOARD numbering do this: "with AMSpi(True) as amspi:"
    with AMSpi() as amspi:
        # Set PINs for controlling shift register (GPIO numbering)
        amspi.set_74HC595_pins(21, 20, 16)
        # Set PINs for controlling all 4 motors (GPIO numbering)
        amspi.set_L293D_pins(5, 6, 13, 19)

        control = amspi

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        server_adress = ('192.168.0.28', 55555)

        sock.bind(server_adress)

        sock.listen(1)

        while True:
            print >>sys.stderr, 'waiting for a connection'
            connection, client_adress = sock.accept()

            try:
                print >>sys.stderr, 'connection from', client_adress

                while True:
                    data= connection.recv(2)
                    print >>sys.stderr, 'received "%s"' % data
                    if data:
                        print >>sys.stderr, 'sending data back to the client'
                        on_message(data)
                    else:
                        print >>sys.stderr, 'no more data from ', client_adress
                        break

            finally:
                connection.close()



Si leen el código van a encontrar una configuración especifica que yo tengo especialmente para el auto. 
Tienen que encontrar puntualmente la que ustedes necesitan, en las funciones run, reverse, izquierda derecha, en estas funciones hay que ir configurando si el motorDC1 va hacia delante solo hay que poner. 

amspi.run_dc_motors([amspi.DC_Motor_1])

En caso de que se necesite que gira hacia el otro lado, hay que cambiar la función a:

amspi.run_dc_motors([amspi.DC_Motor_1], clockwise=False)

Para poder girar hacia la derecha hice que las ruedas de la derecha vayan em reversa y las ruedas de la izquierda hacia adelante.

RaspBerry PI - MotorShield control Motor DC

Introducción


El objetivo principal que me propuse, es poder controlar con la raspberry cuatro motores DC o sea motores comunes, así con eso poder tener tracción en las cuatro ruedas y también poder usar todas las ruedas para poder hacer giros. Ademas también poder hacer que el auto sea 100% autónomo sin cables externos.

Primero en este tutorial veremos como controlar las cuatro ruedas y poder hacer giros de las mismas. 

Para poder controlar 4 motores DC (uno en cada rueda del auto)

Motor DC conectado a la Rueda

Primero es necesario tener un controlador MotorShield, el mismo puede controlar hasta cuatro motores DC o 2 servos.

Motor Shield v1

Este modelo de Motor Shield esta diseñado para ser montado sobre un arduino, pero de todas formas se puede utilizar en la Raspberry.

Conexiones


Ahora mostrare algunas imagenes de como se conecta el MotorShield a los motores y a la Raspberry

Auto de perfil
Auto de perfil


Montado de motores DC
Montado de motores DC


Conexiones en el Motorshield


Como vieron encontré un cable unidos con 10 cables juntos, para poder utilizar los 4 motores DC solo son necesarios 2 cables por motor o sea en total 8 cables, me estarían sobrando dos que no voy a utilizar. No es necesario tener este tipo de cable, con solo tener 8 cables sean separados o unidos van a resultar útiles.



Conexiones en Raspberry


Esquema de conexiones


Si bien las imágenes muestran una posible forma de conectarse, ya que se puede elegir varios números de GPIO, el que se prefiera o quede cómodo. 
En la ultima imagen se muestra el esquema de como conectar el MotorShiled a la Raspberry indicando con cada circulo de color.

MotorShield

En cuanto al MotorShield lo único que queda agregar es que necesita una fuente adicional (En la ultima imagen se muestra donde dice Extra Power). Esta conexión puede venir desde la Raspberry desde el Pin 2 o 4 , o directamente puede ser completamente externa.

Motor DC

 
En cuanto a la conexion con el Motor DC es indistinto el orden de los cables que van al Motor DC ya que lo unico que hace es orientar la corriente del motor , o sea que gira la rueda hacia un lado o hacia el otro.

Conexiòn al Motor DC


Alimentación

Como mencione anteriormente la idea es que el auto sea completamente autónomo, para eso es necesario una bateria o algún power bank que haya que tenga un amperaje de 2 o 2,5 amp. En mi caso encontré un power bank de 2,1 amp y con carga de 20000 mhs, suficiente para poder pasar corriente a la Raspberry y al MotorShield, y con una duración de 2 o 3 horas de funcionamiento

En funcionamiento




Por ultimo el código

Como vieron en el vídeo el funcionamiento del auto es perfecto, y que muy bueno. Les paso el link donde esta el código que hace que funcione el auto en la Raspberry en Python.


Mas adelante les pasare como fue que lo hice remoto por medio de Wifi y poder controlarlo desde un celular.