Retomamos la documentación de los prototipos con el prototipo de escudo para Arduino UNO:
Historia
Este proyecto surge como una forma práctica de aplicar los conocimientos que el alumnado de segundo de mantenimiento electrónico ha adquirido a lo largo del primer curso de forma que puedan realizar todo el proceso completo de diseño de placa de circuito impreso, soldadura y testeo en un proyecto con dificultad acotada y con el objetivo de darle un posterior uso por otros grupos a las placas realizadas.
Objetivos
El objetivo de este proyecto, ya realizado con el alumnado del grupo de segundo de mantenimiento electrónico del año 2020-2021, era fabricar un escudo o “shield”, en este caso para el Arduino UNO (https://store.arduino.cc/products/arduino-uno-rev3/), del estilo del escudo de la imagen (https://store.arduino.cc/collections/shields/products/proto-shield-rev3-uno-size), pero con características personalizadas.
Requisitos funcionales
Los requisitos funcionales para este shield eran que debía tener:
-
Capacidad para montar una minibreadboard de las de 170 puntos.
-
Pantalla Oled LCD 128×64 0.96″ SSD1306 I2C.
-
Conexión inalámbrica por medio del módulo NRF24101 (usa 5 pines digitales). Ojo, que este funciona a 3,3V.
-
Zócalos para la conexión del módulo sensor de temperatura y humedad DHT11.
-
Estos tres elementos: pantalla, antena inalámbrica y sensor DHT11, deben poder apagarse con tres microinterruptores que irían montados en un módulo que controlaría su entrada de alimentación.
-
Todos los pines no usados del Arduino se dejarían disponibles en zócalos hembra listos para que se puedan pinchar cables unifilares y usar la minibreadboard como placa de desarrollo de prototipos, además de alguna conexión a 5V y 0V.
-
En la serigrafía de la placa habría que colocar el logo del instituto y la indicación de qué es cada pin.
Diseño de PCB (Printed Circuit Board)
Teniendo en cuenta las medidas de cada elemento, se procede al diseño de la PCB que cumpla con los requisitos.
El esquemático que se realizó fue este:
Que contiene un error, ya que la alimentación del módulo NRF-24L01 debe estar entre 1,9V y 3,6V; es decir, el interruptor debe tomar la alimentación del pin de 3,3V y no del de 5V. Después haremos una chapuza para arreglarlo, porque de esto nos dimos cuenta una vez mandado a fabricar.
El layout resultante fue este:
Una vez mandado a fabricar, el resultado es el siguiente (parte frontal y trasera):
Y vamos ahora a arreglar el fallo. Recordemos que el fallo ha sido no acordarse de que la alimentación del módulo inalámbrico era de 3,3V y por tanto ha habido que hacer una chapuza por debajo con un regulador de tensión SMD de 3,3V colocado estratégicamente.
Veamos sobre el propio material la modificación que hay que hacer en el anverso de la placa para que quede operativa (hay que asegurarse con el polímetro de que la línea ha quedado cortada):
Ahí se ve el corte que hay que hacer con un cúter o similar y así aislar el pin central inferior del pack de interruptores.
Por debajo de la placa hay que fabricar un puente entre el pin 1 y 3 de la fila inferior de interruptores y además soldar con la patilla 1 del regulador de tensión (Vin, que son 5V).
La patilla 2, la central, se puede cortar o dejar, no estorba.
La patilla 3 (Vout, de 3,3V) va soldada al pin 2 de la fila inferior de interruptores (en la foto se ve regular).
La patilla grande que queda al otro extremo (Tab) se suelda a una tierra cercana, la que correspondería al sensor de humedad y temperatura montado en el zócalo de 3 pines.
Entre las dos fotos siguientes nos podemos hacer una idea de cómo queda.
Consejos para hacer las soldaduras y para el “arreglo”
-
Colocar los pines macho sobre un Arduino y sobre estos el shield.
- Hacer las soldaduras de los extremos de cada hilera de pines, comprobar que están rectos y bien y seguir con el resto. Haced zoom en mis soldaduras, se ven bien las que hay sobre el regulador. Así es cómo hay que intentar que queden todas: brillantes, convexas y sin exceso de estaño.
-
Luego seguir con todos los zócalos hembra donde corresponda siguiendo la misma indicación: primero fijar un pin, corregir si es necesario y seguir con los demás.
- Colocar los interruptores con la orientación adecuada (¡antes cortar la pista! Y asegurarse de que queda cortada comprobando con polímetro) y soldar los pines correspondientes.
-
Hacer el puente con un cablecito y paciencia.
-
Colocar el regulador (se puede fijar con la ayuda de un clip o un compañero que lo sujete perfectamente con unas pinzas o un alicate de punta fina.
-
Soldar la hilera doble de pines al módulo inalámbrico NRF24L01 siguiendo las mismas indicaciones del punto 1 para que quede bien alineado. Para esta operación, cuanto más fina sea la punta del soldador, mejor. El espacio es muy escaso. Mucho ojo con los excesos de estaño.
-
Colocar y atornillar los separadores de placa con sus tuercas y tonillos.
-
Colocar los elementos sueltos en su posición: pantalla OLED, módulo inalámbrico y placa de prototipos.
-
Enchufarlo y probar.
Tiempo aproximado de puesta en marcha: 1 hora y media.
Lista de componentes (para cada escudo)
- 2 Espaciadores de placa hembra-macho 10mm M2
- 2 Tornillos para espaciadores M2
- 2 Tuerca para espaciadores M2
- 1 Header hembra 2 pines una fila
- 1 Header hembra 3 pines una fila
- 2 Header hembra 4 pines una fila
- 1 Header hembra 8 pines dispuestos en 2 filas de 4
- 1 Header hembra 10 pines una fila
- 1 Header macho 40 pines una fila
- 1 PCB mandada a fabricar en China a partir del diseño
- 1 Placa miniprotoboard 170 puntos
- 1 Pantalla OLED LCD 128×64 0.96″ SSD1306 I2C
- 1 Módulo de antena inalámbrica NRF24101
- 1 Módulo DIP 3 microinterruptores con distancia entre pines de 2,54mm.
- 1 Módulo sensor de temperatura y humedad DHT11.
Resultado final
Aunque no lo parezca, debajo tiene un Arduino UNO.
Líneas futuras
- Rehacer el diseño para arreglar el problema con la alimentación del módulo de antena.
- Añadir leds SMD para indicar la activación de cada microinterruptor.
- Quitar la breadboard y añadir otros componentes de testeo que puedan resultar interesantes.
- Realizar una versión para Arduino NANO.
Código para probar la comunicación
Esto hay que hacerlo usando 2 dispositivos, uno como transmisor y el otro como receptor (comentando o descomentando lo que sea necesario en el código) . Así testearemos la pantalla y la antena.
Hacen falta varias librerías: Adafruit_GFX, Adafruit_SSD1306, nRF24L01, RF24.
// Inclusión de librerias
#include
#include
#include
#include // https://github.com/adafruit/Adafruit-GFX-Library
#include // https://github.com/adafruit/Adafruit_SSD1306
#include
#include
#include
Adafruit_SSD1306 display(128, 64, &Wire);
const int pinCE = 9;
const int pinCSN = 10;
RF24 radio(pinCE, pinCSN);
// Single radio pipe address for the 2 nodes to communicate.
const uint64_t pipe = 0xE8E8F0F0E1LL;
char dataTX[16] = "1,2,3" ;
char dataRX[16];
boolean transmitiendo = true;
void setup() { // Código que se ejectua una única vez, en el arranque
logo_begin(); // Logo
delay(3000);
Serial.begin(9600); // Puerto serie con el PC (sólo para test)
Serial.println(F("Starting..."));
pantalla_iniciando(); // OLED: "Iniciando..."
if (transmitiendo) {
//TRANSMISIÓN
radio.begin();
radio.openWritingPipe(pipe);
}
else {
//RECEPCIÓN
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
}
}
void loop() { // Bucle que se ejecuta cíclicamente
// Visualización dato en pantalla
display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0); display.print("HOLA MUNDO");
if (transmitiendo) {
//TRANSMISIÓN
char txHeader[16] = "TX:" ;
radio.write(txHeader, sizeof txHeader);
radio.write(dataTX, sizeof dataTX);
display.setTextSize(2);
display.setCursor(6, 29); display.print(" ");
display.print(txHeader); display.print(dataTX);
delay(1000);
}
else
{
//RECEPCIÓN
if (radio.available())
{
radio.read(dataRX, sizeof (dataRX) );
char rxHeader[16] = "RX:" ;
Serial.println(rxHeader);
Serial.println(dataRX);
display.setTextSize(2);
display.setCursor(6, 29); display.print(" ");
display.print(rxHeader); display.print(dataRX);
}
}
display.display();
}
void logo_begin(void) { // Pantalla: logo incial
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Dirección 0x3C para 128x32
display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE);
display.setCursor(2, 11); display.println("probando OLED"); display.display();
}
void pantalla_iniciando(void) { // Pantalla: Texto "Iniciando..."
display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0); display.println(" Iniciando... "); display.display();
}