domingo, 31 de enero de 2016

Stepper motor with Raspberry Pi

In this practice, we have to control a stepper motor with our Raspberry Pi.
Things we need:
- 1 stepper motor
- 1 controler for the stepper motor
- 1 raspberry pi
- Wires

What we have to do in this practice is to connect all the wires on their possitions:
-The pins of the controller of Vcc and GND go to the same names, in the raspberry.
-The pin 1 of the controller go to the pin 11 of the raspberry (GPIO17).
-The pin 2 of the controller go to the pin 15 of the raspberry (GPIO22).
-The pin 3 of the controller go to the pin 16 of the raspberry (GPIO23).
-The pin 4 of the controller go to the pin 18 of the raspberry (GPIO24).


In our case, we will use the motor in Full Step, so this is the order of the coils that we are going to use:
D C B A
1  0  0  1
1  0  1  0
0  1  1  0
0  1  0  1
To increase the precision, the coils of our stepper motor are divided inside in 8 coils each one. Those coils are called "poles". This makes 32 steps needed to do a lap. Moreover, the motor has a reduction gear of 1/64 to increase even more the precision. This makes 32*64=2048 steps to do a complete turn.

Here, we can see the full code with comments:



#!/usr/bin/python3
#-*- coding: utf-8 -*-

#La primera linea es para poder leer el programa desde el bash de python y para decirle donde se encuentran las librerias.
#La segunda linea es para que el programa pueda leer bien los caracteres españoles (tildes, eñes...)

#Importamos librerias
import sys #Importamos las librerias del sistema
import time #Importamos la libreria de tiempo
import RPi.GPIO as GPIO #importamos los puertos de la raspberry

#Usamos BCM GPIO para referenciar los pines por el numero del GPIO en vez del numero del pin
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)  #Para desactivar los warnings

#Definimos los GPIO empleados
#Pines fisicos 11, 15, 16, 18
#GPIO17, GPIO22, GPIO23, GPIO24
StepPins=[17,22,23,24]

#Configuramos todos los pines como salida
for pin in StepPins:
    print ("Setup pins",pin)
    GPIO.setup(pin,GPIO.OUT) #Establecemos el pin como salida
    GPIO.output(pin, False) #Inicializamos la salida a 0

#Definimos la secuencia de trabajo. en nuestro caso, FULL STEP
Seq=[[1,0,0,1],
     [1,1,0,0],
     [0,1,1,0],
     [0,0,1,1]]

StepCount=len(Seq)  #Nos devuelve el nº de elementos de la lista
WaitTime=0.0020     #Variable que nos limitara la velocidad (teoricamente, 0.0018)
StepCounter=0       #Se utilizara para señalizar el nº del paso (hay 4 pasos)

#Start main loop
try:
    numerovueltas=int(input('Dime el numero de vueltas: '))
    n=0
    while n<numerovueltas:
        for i in range(0,numerovueltas*2038): #Segun el fabricante, es en torno a 2048 vueltas
            for pin in range(0,4): #La variable 'pin' contendrá el orden del valor
                xpin=StepPins[pin]
                if Seq[StepCounter][pin]!=0: #El primer corchete se refiere a cada valor de la lista y el segundo a cada valor de la lista de dentro
                    GPIO.output(xpin,True) #Si el valor del pin en la matriz de arriba (StepCounter) es 1 para ese pin, se le da ese valor y si es 0, se le da el valor de 0
                else:
                    GPIO.output(xpin,False)

            StepCounter+=1

            #Reiniciamos para cargar el siguiente paso
            if (StepCounter>=StepCount):
                StepCounter=0

            #Introducimos la espera entre pasos
            time.sleep(WaitTime)
            n=n+1
            if n%2038==0:
                print('Vuelta',n/2038)

GPIO.cleanup()
time.exit()
sys.exit()
       
except KeyboardInterrupt:
    print('Programa Interrumpido')
    GPIO.cleanup()
time.exit()
sys.exit()



If you want to get the code, you can download it from here:
https://drive.google.com/folderview?id=0B20kHfrc3NnpbzZOS2lGYnRQYTQ&usp=sharing

No hay comentarios:

Publicar un comentario