Advertisement
Villalba2006

POST_41

Nov 25th, 2016
1,399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.34 KB | None | 0 0
  1. [code]
  2. /*  TITULO: Robot láser controlado con un Joystick Analógico.
  3.  
  4.     AUTOR:
  5.     
  6.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  7.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  8.     - TWITTER: https://twitter.com/MarianoCampoGa
  9.     - CORREO: marianodc83@gmail.com
  10.     
  11.     
  12.     DESCRIPCIÓN DEL PROGRAMA
  13.     
  14.     Con este programa controlamos la posición del punto rojo de un láser (que he adherido a una
  15.     plataforma de dos ejes gobernada por mricro servos SG90) mediante un joystick analógico.
  16.     Descomentando dos partes del código, podremos visualizar el ángulo que tiene el láser 
  17.     respecto del eje x y del eje y, a través del monitor serie del IDE de Arduino.
  18.     
  19.    
  20.     ESQUEMA DE CONEXION
  21.     
  22.                                       +-----+
  23.          +----[PWR]-------------------| USB |--+
  24.          |                            +-----+  |
  25.          |         GND/RST2  [ ][ ]            |
  26.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |    
  27.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |    
  28.          |                             AREF[ ] |
  29.          |                              GND[ ] |
  30.          | [ ]N/C                    SCK/13[ ] |   
  31.          | [ ]IOREF                 MISO/12[ ] |   
  32.          | [ ]RST                   MOSI/11[ ]~|   
  33.          | [ ]3V3    +---+               10[ ]~|  Cable Naranja del servo_y  
  34.          | [ ]5v    -| A |-               9[ ]~|  Cable Naranja del servo_x 
  35.          | [ ]GND   -| R |-               8[ ] |  Pin SW del joystick 
  36.          | [ ]GND   -| D |-                    |
  37.          | [ ]Vin   -| U |-               7[ ] |  Pin S del módulo láser
  38.          |          -| I |-               6[ ]~|  
  39.     VRx  | [ ]A0    -| N |-               5[ ]~|  
  40.     VRy  | [ ]A1    -| O |-               4[ ] |   
  41.          | [ ]A2     +---+           INT1/3[ ]~|   
  42.          | [ ]A3                     INT0/2[ ] |   
  43.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |   
  44.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |   
  45.          |            [ ] [ ] [ ]              |
  46.          |  UNO_R3    GND MOSI 5V  ____________/
  47.           \_______________________/
  48.  
  49.   NOTAS:
  50.     
  51.    - Conexión del joystick:
  52.        - VCC del joystick --> VCC de Arduino
  53.        - GND del joystick --> GND de Arduino
  54.        - VRx --> Pin analógico A0 de Arduino
  55.        - VRy --> Pin analógico A1 de Arduino
  56.        - SW --> Pin digital 8 de Arduino
  57.    - Conexión del módulo láser:
  58.        - VCC del módulo láser --> VCC de Arduino
  59.        - GND del módulo láser  --> GND de Arduino
  60.        - S del módulo láser  --> Pin digital 7 de Arduino
  61.    - Alimentación de los micro servos de la plataforma
  62.        - Cable rojo de los micro servos --> VCC de Arduino
  63.        - Cable marrón de los micro servos --> GND de Arduino      
  64. */
  65.  
  66.   // Incluir la librería Servo
  67.   #include <Servo.h>          
  68.   
  69.   Servo servo_x; // Crear un objeto tipo Servo llamado servo_x para el movimiento X de la plataforma
  70.   Servo servo_y; // Crear un objeto tipo Servo llamado servo_y para el movimiento Y de la plataforma
  71.   
  72.   // Variables para el funcionamiento del programa
  73.   int angulo_x = 90 ;
  74.   int angulo_y = 90 ;
  75.   int valor_x = 0;
  76.   int valor_y = 0;
  77.   int potenciometro_x = A0;
  78.   int potenciometro_y = A1;
  79.   int pulsador_SW = 8 ;
  80.   int LASER = 7 ;
  81.   int encender = 0;
  82.   int anterior = 0;
  83.   int estado = 0;  
  84.   
  85.   void setup()
  86.   {
  87.     Serial.begin(9600);  // Comienzo de la comunicación serie
  88.     servo_x.attach(9) ;  // Pin digital 9 para el servo_x
  89.     servo_y.attach(10) ; // Pin digital 10 para el servo_y
  90.     
  91.     pinMode(pulsador_SW, INPUT_PULLUP) ; // Pin digital 8 como entrada PULL-UP
  92.     pinMode(LASER, OUTPUT); // Pin digital 7 como salida
  93.   }
  94.   
  95.   void loop()
  96.   {
  97.     mover_servo_x(); // Llamada a la función que mueve el eje x de la plataforma
  98.     mover_servo_y(); // Llamada a la función que mueve el eje y de la plataforma
  99.     
  100.     delay(60); // Control de la velocidad del robot
  101.     
  102.     disparo_LASER();  // Llamada a la función que enciende/apaga el láser
  103.   }
  104.   
  105.   // Función que mueve el eje x de la plataforma
  106.   void mover_servo_x()
  107.   {
  108.    // Lee el valor del potenciómetro en X
  109.     valor_x = analogRead(potenciometro_x);
  110.     
  111.     // Si la lectura es mayor de 600
  112.     if ( valor_x > 600 )
  113.     { 
  114.       if( angulo_x > 30) // Límitamos el ángulo mínimo en x a 30º
  115.       {
  116.         angulo_x--; // Disminuimos el ángulo en x un grado
  117.       }
  118.     }
  119.     
  120.     // Si la lectura es menor de 400
  121.     else if (valor_x < 400)
  122.     { 
  123.       if( angulo_x < 150) // Limitamos el ángulo máximo en x a 150º
  124.       {
  125.         angulo_x++; // Aumentamos el ángulo en x un grado
  126.       }
  127.     }
  128.     servo_x.write(angulo_x); // Movemos el servo_x
  129.   
  130.     // Descomentar únicamente para visualizar la posición del láser en el eje y.
  131.     // Serial.print("Angulo Eje X: ");
  132.     // Serial.println(angulo_x);    
  133.     // delay(100); Para visualizar los valores a través del monitor serie  
  134.   }
  135.   
  136.   // Función que mueve el eje y de la plataforma
  137.   void mover_servo_y()
  138.   {
  139.    // Lee el valor del potenciómetro en Y
  140.     valor_y = analogRead(potenciometro_y);
  141.     
  142.     // Si la lectura es mayor de 600
  143.     if (valor_y > 600)
  144.     {  
  145.       if( angulo_y < 150)  // Limitamos el ángulo máximo en y a 150º
  146.       {
  147.         angulo_y++;    // Aumentamos el ángulo en y un grado
  148.       }
  149.     }
  150.     
  151.     // Si la lectura es menor de 400
  152.     else if ( valor_y < 400 )
  153.     {  
  154.       if( angulo_y > 30) // Limitamos el ángulo mínimo en y a 30º
  155.       {
  156.         angulo_y-- ;    // Disminuimos el ángulo en y un grado
  157.       }
  158.     }
  159.     servo_y.write(angulo_y); // Movemos el servo_y
  160.   
  161.     // Descomentar únicamente para visualizar la posición del láser en el eje y.
  162.     // Serial.print("Angulo Eje Y: ");
  163.     // Serial.println(angulo_y);
  164.     // delay(100); Para visualizar los valores a través del monitor serie  
  165.   }
  166.   
  167.   // Función que enciende/apaga el láser
  168.   void disparo_LASER()
  169.   {  
  170.     estado = digitalRead(pulsador_SW); // Guardamos el estado actual del pulsador_SW
  171.       
  172.     if(estado && anterior == 0) // Comparamos el estado actual y el anterior del pulsador
  173.     { 
  174.       encender = 1 - encender;
  175.       delay(200); // Evita los rebotes del pulsador_SW
  176.     }
  177.     
  178.     anterior = estado; // Actualizamos el estado del pulsador SW
  179.     
  180.     if(encender) // Si el estado interno del pulsador pasa de "LOW" a "HIGH".
  181.     {
  182.       digitalWrite(LASER, LOW); // LÁSER apagado
  183.     }
  184.     
  185.     else // Si el estado interno del pulsador pasa de "HIGH" a "LOW".
  186.     {
  187.       digitalWrite(LASER, HIGH); // LÁSER encendido
  188.     }   
  189.   } 
  190.     
  191.  
  192. [/code]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement