Advertisement
Villalba2006

POST_69

Nov 29th, 2016
3,706
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.87 KB | None | 0 0
  1. /*  TITULO: Control del motor a pasos unipolar 28BYJ-48 mediante el driver ULN2003
  2.  
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  6.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  7.     - TWITTER: https://twitter.com/MarianoCampoGa
  8.     - CORREO: marianodc83@gmail.com
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Con este programa seremos capaces de controlar tanto el sentido y velocidad de giro como la posición
  14.     del eje del motor a pasos unipolar 28BYJ-48 a través del módulo driver ULN2003, siempre que previamente
  15.     hayamos hechos las conexiones oportunas de las que el conjunto requiere y hayamos cargado el programa
  16.     correctamente en nuestro Arduino. El programa consta de 5 estados de movimiento posibles que comandaremos
  17.     a través de un interruptor táctil capacitivo TTP224 de 4 Vías de la siguiente manera:
  18.     - Botón 1 -> El eje del motor a pasos se mueve una vuelta en sentido horario y con velocidad rápida
  19.     - Botón 2 -> El eje del motor a pasos se mueve una vuelta en sentido antihorario y con velocidad rápida
  20.     - Botón 3 -> El eje del motor a pasos se mueve media vuelta en sentido horario y con velocidad lenta
  21.     - Botón 4 -> El eje del motor a pasos se mueve media vuelta en sentido horario y con velocidad lenta
  22.     - Si no pulsamos ningun botón, el eje del motor a pasos permanece en reposo.
  23.     Si abrimos el monitor serie podremos observar los correspondientes mensajes sobre el estado de movimiento
  24.     o no del eje del motor a pasos en cada momento.
  25.  
  26.  
  27.     ESQUEMA DE CONEXION
  28.    
  29.                                       +-----+
  30.          +----[PWR]-------------------| USB |--+
  31.          |                            +-----+  |
  32.          |         GND/RST2  [ ][ ]            |
  33.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |  
  34.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |  
  35.          |                             AREF[ ] |
  36.          |                              GND[ ] |
  37.          | [ ]N/C                    SCK/13[ ] |  
  38.          | [ ]IOREF                 MISO/12[ ] |  
  39.          | [ ]RST                   MOSI/11[ ]~|  "INI4" del modulo driver ULN2003
  40.          | [ ]3V3    +---+               10[ ]~|  "INI3" del modulo driver ULN2003
  41.          | [ ]5v    -| A |-               9[ ]~|  "INI2" del modulo driver ULN2003
  42.          | [ ]GND   -| R |-               8[ ] |  "INI1" del modulo driver ULN2003
  43.          | [ ]GND   -| D |-                    |
  44.          | [ ]Vin   -| U |-               7[ ] |  "OUT 1" del interruptor táctil capacitivo TTP224 de 4 Vías
  45.          |          -| I |-               6[ ]~|  "OUT 2" del interruptor táctil capacitivo TTP224 de 4 Vías
  46.          | [ ]A0    -| N |-               5[ ]~|  "OUT 3" del interruptor táctil capacitivo TTP224 de 4 Vías
  47.          | [ ]A1    -| O |-               4[ ] |  "OUT 4" del interruptor táctil capacitivo TTP224 de 4 Vías
  48.          | [ ]A2     +---+           INT1/3[ ]~|  
  49.          | [ ]A3                     INT0/2[ ] |  
  50.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  51.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  52.          |            [ ] [ ] [ ]              |
  53.          |  UNO_R3    GND MOSI 5V  ____________/
  54.           \_______________________/
  55.  
  56.   NOTAS:
  57.    - La alimentación y la masa del interruptor táctil capacitivo TTP224 de 4 Vías van directamente
  58.      conectadas a +3,3VDC y GND de nuestro Arduino respectivamente (también acepta la salida de +5VDC)
  59.    - La alimentación y la masa del modulo driver ULN2003 van directamente conectadas a +5VDC y GND
  60.      de nuestro Arduino respectivamente, aunque acepta una alimentación de hasta +12VDC.
  61. */
  62.  
  63.   // Declaración de las variables para los pines del módulo driver ULN2003
  64.   int IN1 = 8;    // Pin digital para el pin IN1 del módulo driver ULN2003 (Cable Azul)
  65.   int IN2 = 9;    // Pin digital para el pin IN2 del módulo driver ULN2003 (Cable Rosa)
  66.   int IN3 = 10;   // Pin digital para el pin IN3 del módulo driver ULN2003 (Cable Amarillo)
  67.   int IN4 = 11;   // Pin digital para el pin IN4 del módulo driver ULN2003 (Cable Naranja)
  68.  
  69.   int velocidad_motor;  // Variable para fijar la velocidad motor (mínimo 900ms)
  70.   int pasos; // Variable que almacena el número de pasos a ejecutar (512 por vuelta completa)
  71.   // Matriz para las 8 señales de la secuencia en modo "Half-step"
  72.   int secuencia[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
  73.  
  74.   // Declaración de las variables para el interruptor táctil TTP224
  75.   int horario_rapido = 7; // Pin digital para la salida OUT1 del interruptor táctil TTP224
  76.   int antihorario_rapido = 6; // Pin digital para la salida OUT2 del interruptor táctil TTP224
  77.   int media_horario_lenta = 5; // Pin digital para la salida OUT3 del interruptor táctil TTP224
  78.   int media_antihorario_lenta = 4; // Pin digital para la salida OUT4 del interruptor táctil TTP224
  79.  
  80.   // Declaración de las variables internas de control del programa
  81.   int imprimo = 1;
  82.   int boton = 0;
  83.   int paro = 1;
  84.   int i;
  85.  
  86.   void setup()
  87.   {
  88.     Serial.begin(9600); // Comienzo de la comunicación con el monitor serie
  89.    
  90.     pinMode(horario_rapido, INPUT); // Pin digital 7 como entrada
  91.     pinMode(antihorario_rapido, INPUT); // Pin digital 6 como entrada
  92.     pinMode(media_horario_lenta, INPUT); // Pin digital 5 como entrada
  93.     pinMode(media_antihorario_lenta, INPUT); // Pin digital 4 como entrada
  94.    
  95.     pinMode(IN1, OUTPUT); // Pin digital 8 como salida
  96.     pinMode(IN2, OUTPUT); // Pin digital 9 como salida
  97.     pinMode(IN3, OUTPUT); // Pin digital 10 como salida
  98.     pinMode(IN4, OUTPUT); // Pin digital 11 como salida  
  99.   }
  100.  
  101.   void loop()
  102.   {
  103.     // Si pulsamos el botón 1 del interruptor táctil capacitivo TTP224...
  104.     if(digitalRead(horario_rapido) == HIGH)
  105.     {
  106.       completa_rapido();
  107.       boton = 1;
  108.     }
  109.    
  110.     // Si pulsamos el botón 2 del interruptor táctil capacitivo TTP224...
  111.     if(digitalRead(antihorario_rapido) == HIGH)
  112.     {
  113.       completa_rapido();
  114.       boton = 2;
  115.     }
  116.    
  117.     // Si pulsamos el botón 3 del interruptor táctil capacitivo TTP224...
  118.     if(digitalRead(media_horario_lenta) == HIGH)
  119.     {
  120.       media_lento();
  121.       boton = 3;
  122.     }
  123.    
  124.     // Si pulsamos el botón 4 del interruptor táctil capacitivo TTP224...
  125.     if(digitalRead(media_antihorario_lenta) == HIGH)
  126.     {
  127.       media_lento();
  128.       boton = 4;
  129.     }
  130.    
  131.     // Se evalúa el botón que hemos pulsado para así ejecutar el movimiento correspondiente
  132.     switch(boton)
  133.     {
  134.       // El eje del motor a pasos permanece en reposo
  135.       case 0:
  136.         if(paro == 1)
  137.         {
  138.           Serial.print("Motor a pasos detenido !!!\n");      
  139.           paro = 0;
  140.         }
  141.         break;
  142.      
  143.       // El eje del motor a pasos gira una vuelta completa en sentido horario con velocidad rápida
  144.       case  1:
  145.         if(imprimo == 1)
  146.         {
  147.           Serial.print("Una vuelta completa rapida en sentido horario !!!\n");
  148.           imprimo = 0;
  149.         }    
  150.         // Giro en sentido horario
  151.         for(i=0; i <= pasos; i++)
  152.         {
  153.           horario();
  154.         }    
  155.         control();
  156.         break;
  157.      
  158.       // El eje del motor a pasos gira una vuelta completa en sentido antihorario con velocidad rápida  
  159.       case 2:
  160.         if(imprimo == 1)
  161.         {
  162.           Serial.print("Una vuelta completa rapida en sentido antihorario !!!\n");
  163.           imprimo = 0;
  164.         }    
  165.         // Giro en sentido antihorario
  166.         for(i=0; i <= pasos; i++)
  167.         {
  168.           antihorario();
  169.         }    
  170.         control();
  171.         break;
  172.      
  173.       // El eje del motor a pasos gira media vuelta en sentido horario con velocidad lenta  
  174.       case 3:
  175.         if(imprimo == 1)
  176.         {
  177.           Serial.print("Media vuelta lenta en sentido horario !!!\n");
  178.           imprimo = 0;
  179.         }    
  180.         // Giro en sentido horario
  181.         for(i=0; i <= pasos; i++)
  182.         {
  183.           horario();
  184.         }    
  185.         control();
  186.         break;
  187.  
  188.       // El eje del motor a pasos gira media vuelta en sentido antihorario con velocidad lenta
  189.       case 4:
  190.         if(imprimo == 1)
  191.         {
  192.           Serial.print("Media vuelta lenta en sentido antihorario !!!\n");
  193.           imprimo = 0;
  194.         }    
  195.         // Giro en sentido antihorario
  196.         for(i=0; i <= pasos; i++)
  197.         {
  198.           antihorario();
  199.         }    
  200.         control();
  201.         break;
  202.     }
  203.   }
  204.  
  205.   // Función para el giro del eje del motor a pasos en sentido horario
  206.   void horario()
  207.   {
  208.     for(int i = 7; i >= 0; i--)
  209.     {
  210.       activa_salidas(i);
  211.       delayMicroseconds(velocidad_motor);
  212.     }
  213.   }
  214.  
  215.   // Función para el giro del eje del motor a pasos en sentido antihorario
  216.   void antihorario()
  217.   {
  218.     for(int i = 0; i < 8; i++)
  219.     {
  220.       activa_salidas(i);
  221.       delayMicroseconds(velocidad_motor);
  222.     }
  223.   }
  224.  
  225.   // Función que configura una vuelta del eje del motor a pasos con velocidad rápida
  226.   void completa_rapido()
  227.   {
  228.     pasos = 512; // Vuelta completa del eje del motor a pasos
  229.     velocidad_motor = 900; // Velocidad rápida
  230.   }
  231.  
  232.   // Función que configura media vuelta del eje del motor a pasos con velocidad lenta
  233.   void media_lento()
  234.   {
  235.     pasos = 256; // Media vuelta del eje del motor a pasos
  236.     velocidad_motor = 4000; // Velocidad lenta
  237.   }
  238.  
  239.   // Función que inicializa las variables internas de control del programa
  240.   void control()
  241.   {
  242.     boton = 0;
  243.     imprimo = 1;
  244.     paro = 1;
  245.   }
  246.  
  247.   // Función que realiza la secuencia de excitación de las bobinas del motor a pasos
  248.   void activa_salidas(int salida)
  249.   {
  250.     digitalWrite(IN1, bitRead(secuencia[salida], 0));
  251.     digitalWrite(IN2, bitRead(secuencia[salida], 1));
  252.     digitalWrite(IN3, bitRead(secuencia[salida], 2));
  253.     digitalWrite(IN4, bitRead(secuencia[salida], 3));
  254.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement