Arduino Uno

En construcción.png

Este artículo está en construcción.

Por esta razón, seguramente habrá lagunas en el contenido o en el formato. Por favor, antes de cambiar el contenido, consulta la página de discusión del artículo.


El Arduino Uno es una placa microcontroladora basada en el ATmega328 (datasheet). Tiene 14 pines de entrada/salida digitales (de los cuales 6 pueden ser usados como salidas PWM), 6 entradas analógicas, un resonador cerámico a 16 MHz, una conexión USB, un jack de alimentación, un ICSP, y un botón de reset. El Arduino Uno se diferencia de las placas anteriores en que no usar un chip FTDI USB-a-serial. En vez de eso incluye un ATmega16u2 (ATmega8u2 en la versión R2) programado como un convertidor USB-a-serial.

Contenido

Características

  • Microcontrolador: ATmega328
  • Voltaje de operación: 5V
  • Voltaje de entrada (recomendado): 7-12V
  • Voltaje de entrada (límite): 6-20V
  • Pines de E/S digitales: 14 (de los cuales 6 proveen salida PWM)
  • Pines de entrada analógicos: 6
  • Memoria Flash: 32KB (ATmega328) de los cuales 0.5KB los usa el bootloader
  • SRAM: 2KB (ATmega328)
  • EEPROM: 1KB (ATmega328)
  • Velocidad de reloj: 16MHz

Versiones

Revisión 2

Revisión 3

  • ATmega 16u2 reemplaza al 8u2.

Flasheo de firmware

Windows

  • Herramientas necesarias:
  • Programa Flip de Atmel.
  • Jumper (o cualquier superficie conductora para realizar un cortocircuito).
  • Proceso para el Arduino Uno R3 (revisión 3) tanto DIP como SMD:
  • Poner el Arduino Uno en DFU: para ello conectamos el arduino a un puerto USB del ordenador y ponemos el chip ATmega16u2 en DFU cortocircuitando (durante un segundo) las dos cabeceras ICSP de mas a la izquierda. El led del pin 13 (marcado con una L) parpadeará y luego se quedará fijo.
  • Abrir el programa Flip y en el menú "Device" seleccionar: Atmega16U2. Luego en "Settings -> Communication -> USB" y hacer click en "Open". Si aparece el mensaje de error "Could not open USB device" deberemos instalar manualmente los drivers DFU que vienen con el programa Flip, para ellos iremos a administrador de dispositivo, seleccionaremos el dispositivo (aparecerá como dispositivo desconocido y clickaremos en actualizar controlador seleccionando a mano la carpeta donde está instalado el programa Flip).
  • En el programa Flip seleccionar el menú "File -> Load HEX File" y elegir el firmware a grabar. Por último clickar en la opción "Run" y esperar a que el proceso finalice.
  • Para volver al firmware anterior (para volver a la funcionalidad normal del arduino y poder cargar nuevos sketchs por ejemplo), repetiremos el proceso pero esta vez deberemos seleccionar el archivo "Arduino-usbserial-atmega16u2-Uno-Rev3.hex". Si vuelve a aparecer el error "Could not open USB device" procederemos de la misma manera que antes pero esta vez elegiremos el directorio donde este instalado el programa del arduino.

Proyectos

Joystick

  • Objetivo: crear un joystick con una palanca de 2 ejes y 9 botones que el sistema operativo reconozca como un dispositivo USB-HID nativo.
  • Se utilizará un firmware "Arduino-big-joystick.hex" que soportará:
  • 8 ejes con valores de 16 bits (-32768 al 32767).
  • 40 botones.
typedef struct joyReport_t {
        int16_t axis[8];
        uint8_t button[5]; // 8 buttons per byte
    } joyReport_t;
  • Para la conexión se usarán resistencias "pull-up" por software por lo que solo deberemos unir los diferentes pines de las entradas digitales del arduino a un cable del botón y el otro cable conecarlo a GND de tal manera que siempre tendremos un valor alto en el pin correspondiente y al pulsar el botón tendremos un valor bajo.
for (i=0; i < NUMBUTTONS; i++)
  {
    pinMode(buttons[i], INPUT);
    digitalWrite(buttons[i], HIGH);
  }
  • Hardware: para este proyecto en concreto se han utilizado los siguiente botones y joystick.
  • 1 x Sanwa Button OBSN-24
  • 8 x Sanwa Buttons OBSN-30
  • 1 x Sanwa Ball Top Joystick JLF-TP-8YT
  • Conexión del joystick: el cable del joystick está compuesto por 5 cables (negro, marrón, rojo, naranja y amarillo). Conectaremos el cable negro a uno de los pines GND del arduino y cada uno de los demás cables a un pin digital.
  • Negro: GND.
  • Marrón: ARRIBA.
  • Rojo: ABAJO.
  • Naranja: IZQUIERDA.
  • Amarillo: DERECHA.
  • Conexión de los botones: por cada uno de los botones conectaremos una terminación a GND y la otra a un pin digital (desde el 2 hasta el 10).
  • Sketch (basado en big_joystick_demo.ino): los botones están colocados desde el pin 0 al pin 8. Las direcciones del joystick desde el pin 2 al 10.
/* Arduino USB Joystick HID demo */

/* Author: Darran Hunt
 * Released into the public domain.
 */

#define NUM_BUTTONS	40
#define NUM_AXES	8	       // 2 ejes, X, Y

typedef struct joyReport_t {
    int16_t axis[NUM_AXES];
    uint8_t button[(NUM_BUTTONS+7)/8]; // 8 botones por byte
} joyReport_t;

joyReport_t joyReport;

void setup(void);
void loop(void);
void setButton(joyReport_t *joy, uint8_t button);
void clearButton(joyReport_t *joy, uint8_t button);
void sendJoyReport(joyReport_t *report);

void setup() 
{
    Serial.begin(115200);

    // Botones
    pinMode(2, INPUT); // 1
    digitalWrite(2, HIGH);
    pinMode(3, INPUT); // 2
    digitalWrite(3, HIGH);
    pinMode(4, INPUT); // 3
    digitalWrite(4, HIGH);
    pinMode(5, INPUT); // 4
    digitalWrite(5, HIGH);
    pinMode(6, INPUT); // 5
    digitalWrite(6, HIGH);
    pinMode(7, INPUT); // 6
    digitalWrite(7, HIGH);
    pinMode(8, INPUT); // 7
    digitalWrite(8, HIGH);
    pinMode(9, INPUT); // 8
    digitalWrite(9, HIGH);
    pinMode(10, INPUT); // 9
    digitalWrite(10, HIGH);
    
    // Joystick
    pinMode(14, INPUT); // Abajo
    digitalWrite(14, HIGH);
    pinMode(15, INPUT); // Arriba
    digitalWrite(15, HIGH);
    pinMode(16, INPUT); // Derecha
    digitalWrite(16, HIGH);
    pinMode(17, INPUT); // Izquierda
    digitalWrite(17, HIGH);

    for (uint8_t ind=0; ind<8; ind++)
	joyReport.axis[ind] = 0;

    for (uint8_t ind=0; ind<sizeof(joyReport.button); ind++)
        joyReport.button[ind] = 0;
}

// Send an HID report to the USB interface
void sendJoyReport(struct joyReport_t *report)
{
    Serial.write((uint8_t *)report, sizeof(joyReport_t));
}

// Activar un boton
void setButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] |= 1 << bit;
}

// Apagar un boton
void clearButton(joyReport_t *joy, uint8_t button)
{
    uint8_t index = button/8;
    uint8_t bit = button - 8*index;

    joy->button[index] &= ~(1 << bit);
}

void loop() 
{    
    uint8_t ind = 0;
  
    if (digitalRead(14) == LOW) // Abajo
        joyReport.axis[1] = 32767;
    else if (digitalRead(15) == LOW) // Arriba
        joyReport.axis[1] = -32768;
    else
        joyReport.axis[1] = 0;
    
    if (digitalRead(16) == LOW) // Derecha
        joyReport.axis[0] = 32767;
    else if (digitalRead(17) == LOW) // Izquierda
        joyReport.axis[0] = -32768;
    else
        joyReport.axis[0] = 0;
        
    for (uint8_t btn=2; btn<11; btn++) {
        if (digitalRead(btn) == LOW)
            setButton(&joyReport, ind);
        else
            clearButton(&joyReport, ind);
        ind ++;
    }
        
    sendJoyReport(&joyReport);

    delay(50);
}
  • Fotos del montaje final:

Enlaces