ESP8266-12E (NodeMCU) – Entradas y Salidas Digitales.

Salidas digitales de control ESP8266 NodeMCU

Primero se debe configurar el GPIO que se desea controlar como SALIDA. Hay que utilizar la función pinMode() de la siguiente manera:

pinMode(GPIO, OUTPUT);

Para controlar una salida digital, solo se necesita utilizar la función digitalWrite(), que acepta como argumentos, el GPIO (número int) al que se refiere y el estado, ya sea HIGH o LOW.

digitalWrite (GPIO, ESTADO);

La Guía de referencia de GPIO ESP8266 muestra los GPIO  más adecuados para usar como salidas.

ESP8266-NodeMCU-kit-12-E-pinout-gpio-pin

ESP8266 NodeMCU Leer entradas digitales

Primero, configure el GPIO que desea leer como ENTRADA, usando la función pinMode() de la siguiente manera:

pinMode(GPIO, INPUT);

Para leer una entrada digital, como un botón, hay que utilizar la función digitalRead(), que acepta como argumento el GPIO (número de entero) al que se refiere.

digitalRead(GPIO);

Ejemplo de proyecto

Para mostrar cómo usar entradas y salidas digitales, construiremos un ejemplo de proyecto simple con un botón pulsador y un LED. Leeremos el estado del pulsador y encenderemos el LED como se ilustra en la siguiente figura.

led_pushbutton
Botón ESP32 presionado o no para encender y apagar el LED

Diagrama esquemático

Antes de continuar, se debe montar un circuito con un LED y un botón pulsador. Conectaremos el LED al GPIO 5 y el pulsador al GPIO 4.

led_button_esp32_bb

Código

Copiar el siguiente código en su IDE de Arduino.

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin
const int ledPin =  5;    // the number of the LED pin

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH
  if (buttonState == HIGH) {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off
    digitalWrite(ledPin, LOW);
  }
}

Cómo funciona el código

En las siguientes dos líneas, se crea variables para asignar pines:

const int botonPin = 4;
const int ledPin = 5;

El botón está conectado a GPIO 4 y el LED está conectado a GPIO 5. Al usar Arduino IDE con ESP32, 4 corresponde a GPIO 4 y 5 corresponde a GPIO 5.

A continuación, se crea una variable para mantener el estado del botón. Por defecto, es 0 (no presionado).

int botonEstado = 0;

En setup(), se inicializa el botón como INPUT y el LED como OUTPUT. Para eso, se usa la función pinMode() que acepta el pin al que te refieres y el modo: INPUT o OUTPUT.

pinMode(botonPin, INPUT);
pinMode(ledPin, OUTPUT);

En loop() es donde lee el estado del botón y configura el LED en consecuencia.

En la siguiente línea, lee el estado del botón y lo guarda en la variable buttonState. Como hemos visto anteriormente, utiliza la función digitalRead().

buttonState = digitalRead(buttonPin);

La siguiente instrucción if verifica si el estado del botón es HIGH. Si es así, enciende el LED usando la función digitalWrite() que acepta como argumento el ledPin y el estado HIGH.

if (buttonState == HIGH) {
        digitalWrite(ledPin, HIGH);
}

Si el estado del botón no es HIGH, se apaga el LED. Simplemente se establece LOW como segundo argumento en la función digitalWrite().

else {
     digitalWrite(ledPin, LOW);
}

ESP8266 NodeMCU PWM con Arduino IDE – Dim LED (salida analógica)

Vamos a ver cómo generar señales PWM con ESP8266 NodeMCU usando Arduino IDE. Como ejemplo, atenuaremos el brillo del LED cambiando el ciclo de trabajo con el tiempo.

Para generar una señal PWM en los pines ESP8266 con Arduino IDE, use analogWrite(pin, valor). El valor es un número entero entre 0 y 255.

Para las versiones de ESP8266 anteriores a la 3.0, el rango predeterminado está entre 0 y 1023. El rango de PWM se puede cambiar llamando a analogWriteRange(new_range).

ESP8266 NodeMCU PWM (modulación de ancho de pulso)

Los GPIO ESP8266 se pueden configurar para generar 0 V o 3,3 V, pero no pueden generar voltajes intermedios. Sin embargo, puede generar voltajes de nivel medio «falsos» mediante la modulación de ancho de pulso (PWM), que es la forma en que producirá niveles variables de brillo LED para este proyecto.

Si alterna el voltaje de un LED entre ALTO y BAJO muy rápido, sus ojos no pueden seguir el ritmo con el que el LED se enciende y se apaga; simplemente verá algunas gradaciones en el brillo.

Básicamente, así es como funciona PWM, produciendo una salida que cambia entre ALTO y BAJO a una frecuencia muy alta.

El ciclo de trabajo es la fracción del período de tiempo en el que el LED se establece en ALTO.

Un ciclo de trabajo del 50 por ciento da como resultado un brillo del LED del 50 por ciento, un ciclo de trabajo de 0 significa que el LED está completamente apagado y un ciclo de trabajo de 100 significa que el LED está completamente encendido. Cambiar el ciclo de trabajo es la forma de producir diferentes niveles de brillo.

analogWrite()

Para producir una señal PWM en un pin dado, se utiliza la siguiente función:

analogWrite (pin, valor);

  • pin: PWM se pueden uasr los pines de 0 a 16
  • value: se debe estar en el rango de 0 a PWMRANGE, que es 255 por defecto. Cuando el valor es 0, PWM está deshabilitado en ese pin. Un valor de 255 corresponde al 100 % del ciclo de trabajo

Se puede cambiar el rango de PWM llamando al:

analogWriteRange(nuevo_rango);

De forma predeterminada, la frecuencia PWM de ESP8266 es de 1 kHz. Puede cambiar la frecuencia PWM con:

analogWriteFreq(nueva_frecuencia);

Los valores válidos son de 100 Hz a 40000 Hz.

Esquema:

Conectar un LED a su ESP8266 como se muestra en el siguiente diagrama esquemático. Estamos conectando el LED a GPIO 2, pero puede usar cualquier otro GPIO adecuado.

ESP8266_PWM_bb

Código

const int ledPin = 2; 

void setup() {
  
}

void loop() {
  // increase the LED brightness
  for(int dutyCycle = 0; dutyCycle < 255; dutyCycle++){   
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(1);
  }

  // decrease the LED brightness
  for(int dutyCycle = 255; dutyCycle > 0; dutyCycle--){
    // changing the LED brightness with PWM
    analogWrite(ledPin, dutyCycle);
    delay(1);
  }
}

Introducción a ESP8266 NodeMCU

El ESP8266 es un sistema Wi-Fi en un chip (SoC) producido por Espressif Systems. Es ideal para proyectos de IoT y domótica.

Tabla de contenido

  • Presentación de NodeMCU ESP8266.
  • ESP8266 Datos técnicos.
  • ESP8266 frente a ESP32
  • Placas de desarrollo ESP8266
  • Kit ESP8266-12E NodeMCU
  • Guía de asignación de pines ESP8266 GPIO

    ¿Cómo programar el ESP8266?
    ESP8266 con Arduino IDE
    Cargue el código al ESP8266 usando Arduino IDE
    Los mejores recursos para comenzar con el ESP8266

Sigue leyendo

Leyendo la emisora Turnigy 9x

mready-01_1__4

Una señal PPM (Pulse Position Modulation) integra todos los canales del receptor y emisor en una sola señal. Así usando sólamente un pin podemos leer los 9 canales de la radio.

La idea es leer las señales de radio con un Arduino.

Sigue leyendo

Coche de Carreras Red Bull

Descripción del proyecto:

Vamos a hacer un coche de carreras que hará dos pruebas y

Autores:

-David Guillen y Rubén Sánchez

  • Rubén: rubennsanchezz21@gmail.com

  • David: guillenlorenzodavid@gmail.com

Año en el que se realiza el proyecto en diciembre 2022

Materiales Necesarios:

PIEZAS STL
MOTOR 1000Kv
ESL 30C
4 RUEDAS
NFR RADIO
ARDUINO NANO 1 MANDO 6 RODAMIENTOS 812*3’5
SERVO

Material Comprado:

Motor A2212/13T 1000KV

imagen
ESC 30C
4 RUEDAS
NFR RADIO
ARDUINO NANO 1
MANDO
6 RODAMIENTOS 8123’5 MR128ZZ
SERVO

Material en 3D:

Piezas STL

Diagrama del circuito:

1- Primera prueba :

Carrera de obstaculos

Otto Femboy

Autor: Gala García Pérez

Año: 2022-2023

Proyecto:

En este proyecto voy ha hacer un robot otto para luchar en una competición de sumo. Las reglas para la competición son:

·Los robots se pondrán en marcas previamente puestas en el tatami.

·Quien logre tumbar o sacar del tatami a su contrincante gana.

·En esta competición se puede añadir modificaciones a los robots para tirar o empujar a su adversario mas fácilmente.

·Todos tienen que separarse del tatami al menos un metro.

·En caso de no poder tumbar o sacar al contrincante, servira con hacer que toquen la linea negra del tatami.

·Todos los robots serán puestos en la misma posición. Sigue leyendo

SUMO

DESCRIPCIÓN DEL SUMO

El objetivo de este proyecto es crear un robot que tenga la capacidad de poder moverse hacia los lados sin ningún problema al igual que avanzar y retroceder.Por otra parte nuestro sumo debe de tener la potencia para poder combatir con otro sumo de alguno de nuestros compañeros de clase.

-COMPONENTES DEL GRUPO (CORREOS,FOTO,AÑO DEL  PROYECTO)

Antonio Garcia  antgarort@alu.edu.gva.es

Diego González   diegongar77@gmail.com

Este proyecto se empezó a realizar el 25-11-2022

DIVISIÓN DEL TRABAJO

En el comienzo de este proyecto hemos empezado juntos y nos hemos dividido el trabajo entre Antonio y yo.

A partir de las dos primeras sesiones de organizar y de realizar el word de este proyecto, tanto Antonio como yo nos encargamos del tinkercad al igual que en el word donde nos pusimos de acuerdo sobre lo que teníamos que redactar.Antonio en su ordenador consulta en google las medidas de los servos para después yo en el modelador 3D encajen todas las piezas debidamente.Tras la verificación de nuestro profesor,confirmando todas las medidas y el posicionamiento de estas, le mandamos nuestro proyecto por piezas por gmail para que el las imprimas en 3D.Una vez nosotros ya tenemos las piezas impresas procedemos a montar cada una de las piezas para que tome forma nuestro robot.

El fin era de que cada uno sepa hacer su parte para asi poder avanzar con el proyecto de una forma progresiva y sin prisa ya que este es u proyecto a largo plazo.

Competencias Sumo Robot – Educación Urbana

-MATERIAL

-sg90,  2 servos 360º

índice

-sg90, 2 servos 180º

img_341_a5a1570bcf75651a91f8894db99bffe0_1

-Arduino nano

arduino-nano

-Shield nano

UNO-Shield-Nano-Shield-para-placa-de-expansi-n-NANO-3-0-y-UNO-R3-duemilanove.jpg_Q90.jpg_

– 4 pilas

-Bluetooth

-Sensor distancia

índicere

MATERIAL COMPRADO

-2 servos 360º

-2 servos 180º

-Arduino nano

-Shield nano

-4 pilas

-Bluetooth

-Sensor distancia

MATERIAL 3D

Modelado superior de la cabeza

Modelado inferior de la cabeza

REGLAS

CÓDIGO

COCHE DE CARRERAS

(Esta es una foto provisional. Una vez finalizado el proyecto adjuntaremos la foto del coche de carreras original, que explicaremos cómo realizar paso por paso a continuación)


Descripción del proyecto:

La intención de nuestro proyecto es crear un coche de carreras de tipo todoterreno. Este deberá superar un circuito con obstáculos para competir contra otro coche con las mismas características.

Usaremos este blog para documentar el proceso, explicar diseño, construcción y programación del vehículo para que puedas ejecutar el mismo proyecto; adjuntaremos las piezas y materiales utilizados.

Las piezas de la estructura del coche que utilizaremos será hecha con impresoras 3D, diseñaremos las piezas a través de TinkerCad.  Se adjuntarán a medida que las vayamos elaborando.

Autores: (nombres, correos, foto, y año en el que se hace el proyecto)

  • Raúl Manzano y Claudia González.
    • Raúl: raulcillo01@gmail.com
    • Claudia: claukj2005@gmail.com

Año en el que se realiza el proyecto: (noviembre) curso de 2022-2023.


Material necesario:

motor    30c

MOTOR 1000K                                                                    ESL 30C

IMG_20210510_122836               ardino nano

4 RUEDAS                                                                              ARDUINO NANO *1

arduino-robot-car-joystick                                     Captura de pantalla 2021-06-13 a las 6.53.10

MANDO                                                                                  6 RODAMIENTOS 8*12*3’5

servos 360º              Stunning Bigery (1)

SERVO                                                                PIEZAS STL

NFR RADIO

Material comprado:

MOTOR 1000K
ESL 30C
4 RUEDAS
NFR RADIO
ARDUINO NANO 1
MANDO
6 RODAMIENTOS 8*12*3’5  MR128ZZ
SERVO

Material en 3D:

https://www.tinkercad.com/things/3Vrl9beTmSK -> Mediante este link adjunto podrás acceder al diseño de nuestro proyecto en curso, a medida que vamos avanzando en la elaboración y fabricación de sus piezas se irá actualizando, añadiendose una a una, las cuáles están postradas a continuación (TODAS LAS PIEZAS DE LAS IMÁGENES DISPONIBLES EN EL LINK).

Stunning Bigery (1)IMG_20230201_113410

IMG_20230201_113455              IMG_20230203_092920


Diagrama del circuito:

La prueba que hemos acordado, conjuntamente con el otro equipo que va a realizar el proyecto de un coche de carreras, es una prueba de obstáculos con tiempo limitado.

En esta prueba los coches saldrán al mismo tiempo, desde la misma altura y en la misma dirección.

Deberán seguir dos recorridos paralelos, que serán iguales para que estén en igualdad de condiciones. Deben superar una serie de obstáculos lo más rápido posible para ganar al contrincante.

Los dos coches dispondrán del mismo tiempo para completar el circuito realizado, será limitado y acordado por los dos equipos en el momento de la creación del recorrido.

Aquel coche que exceda el tiempo acordado para completar la carrera, quedará automáticamente descalificado. Ganará su contrincante y sus correspondientes creadores.

El coche que consiga alcanzar en primer lugar la meta del circuito, ganará. Siempre y cuando no sobrepase el tiempo acordado.

Código:

EL CÓDIGO DEL RECEPTOR:

// Librerías
#include <RF24.h> // Driver de Radio – Módulos nRF24L01+
#include <Servo.h>

// definimos el servo dirección
#define PIN_VELO 2
#define PIN_DIRE 3
#define RECTO 80
#define MAXDER 115
#define MINIZQ 45

// Pines RF24L01
#define PIN_CE 9
#define PIN_CSN 10

int velo, dire;

const byte direccion[5] =  {‘c’, ‘a’, ‘n’, ‘a’, ‘1’};
RF24 radio(PIN_CE, PIN_CSN);

int datos[2];

Servo velocidad, direc;

// Configuración
void setup() {
  velocidad.attach(PIN_VELO, 1000, 2000);
  velocidad.writeMicroseconds(900); // send “stop” signal to ESC.
  delay(4000);

  direc.attach(PIN_DIRE);
  direc.write(RECTO);

  // Configuración Consola – Depuración
  Serial.begin(9600);

  // Inicializa Sistema RF sobre el bus SPI
  if (!radio.begin()) {
    Serial.println(F(«¡¡¡El Hardware de Radio no responde!!!»));
    while (1) {
    } // Bucle infinito
  }

  // Modo Lectura > Pipe 1 + Dirección
  radio.openReadingPipe(1, direccion);

  // Serial.println(«escuchando»);
  // Sistema RF en Recepción – RX Mode
  radio.startListening();
}

void loop() {
  // Enlace TX / RX
  boolean radioOK = radio.available();
  delay(100);
  //Serial.println(«escuchando»);
  // Datos Recibidos > Sistema RF
  if (radioOK) {
    // Leer Datos > Estructura
    radio.read(datos, sizeof(datos));
    velo = datos[0];
    dire = datos[1];
    // Depuración – Datos recibidos

    Serial.print(F(«V: «));
    Serial.print(velo);
    Serial.print(F(» – D:»));
    Serial.print(dire);
    Serial.println();

    if (dire >= MINIZQ && dire <= MAXDER) {
      direc.write(dire);
    }
    if (velo >= 0 && velo <= 180) {
      velocidad.write(velo);

    }
  }
}

EL CÓDIGO DEL EMISOR ES:

#include <nRF24L01.h>
#include <RF24.h>
#include <SPI.h>

#define CE_PIN 9
#define CSN_PIN 10

int x_axis = A0;
int y_axis = A1;
int velo, dire;

const byte direccion[5] = {‘c’, ‘a’, ‘n’, ‘a’, ‘1’};
RF24 radio(CE_PIN, CSN_PIN);

int datos[2];

void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(direccion);
}

void loop() {
velo = analogRead(y_axis);
dire = analogRead(x_axis);
velo = map (velo, 510, 1015, 0, 180);
dire = map (dire, 0, 1024, 45, 115);
if (velo < 0)
velo = 0;
else if (velo > 180)
velo = 180;

//Para comprobaciones, luego comentar
Serial.print(«Velocidad : «);
Serial.print(velo);
Serial.print(» Dirección = «);
Serial.println(dire);

datos[0] = velo;
datos[1] = dire;

bool ok = radio.write(datos, sizeof(datos));
// mostramos por el puerto serial los datos enviados
// luego lo comentaremos no será necesario
if (ok) {
Serial.print(«Datos enviados: X=»);
Serial.print(datos[0]);
Serial.print(» , Y= «);
Serial.print(datos[1]);
}
else {
Serial.println(«no se ha podido enviar y entregar»);
}
delay(100);
}

AVIÓN

DESCRIPCIÓN DEL PROYECTO

El objetivo de este proyecto es crear un avión que vuele por radio control utilizando 1 Arduino Uno.cap1

AUTORES

  • Daniel Lysenko.
  • Kilian Escudero.
  • Jorge Santamaría.
  • Javier Morales.

Material necesario

MATERIALES

  • Cinta de aluminio.
  • Varillas de vidrio.

PARTES COMPRADAS

  • Bateria 11,1Voltios y de 5 Voltios.

bateriaIMG_20230510_113837

sg90

  • Arduino Uno R3 (mando y avión).

ArduinoUNO

Various-modules-based-on-the-NRF24L01-chip-768x446

  • 2 Ruedas delanteras (3,2 cm)

processed-78e0323c-cb30-4e30-ae71-747d603da97f_kk0ZOpUR processed-bd7bd7ec-3214-4abc-b0a5-2a81485b2a66_WvEMVg54

  • 1 Rueda trasera (2,5 cm)

processed-869caf33-dd31-4233-ad4c-36bb668cdd06_zWmWbRxI processed-5c08da15-f1de-4e9e-b952-db7039311e86_DL0xaVfK

  • Mando shield joystick

shieldexplica


MATERIAL EN 3D

  • Morro del avión

morro

  • Cola avión

colaavión

  • Ala del avión

alaavión

  • Avión

avion1 avion2

  • Mando

Captura de pantalla 2023-04-17 a las 8.46.10


DIAGRAMA DEL PROYECTO

Código del mando (emisor):

#include <RF24.h>
#include <nRF24L01.h>
#include <RF24_config.h>
#include <printf.h>

//Declaremos los pines CE y el CSN
#define CE_PIN 9
#define CSN_PIN 8

//Variable con la dirección del canal por donde se va a transmitir
byte direccion[5] ={‘p’,’l’,’a’,’n’,’e’};
//creamos el objeto radio (NRF24L01)
RF24 Radio(CE_PIN, CSN_PIN);

//vector con los datos a enviar
float datos[4];

// Arduino pin joysticks izq
const int X_pinI = 2; // analog pin connected to X output
const int Y_pinI = 3; // analog pin connected to Y output
// Arduino pin joysticks der
const int X_pinD = 0; // analog pin connected to X output
const int Y_pinD = 1; // analog pin connected to Y output

void setup(){
//inicializamos el NRF24L01
Radio.begin();
//inicializamos el puerto serie
Serial.begin(9600);

//Abrimos un canal de escritura
Radio.openWritingPipe(direccion);
}

void loop(){
//cargamos los datos en la variable datos[]
// leeremos lso joysticks

datos[0]=analogRead(X_pinI);
datos[1]=analogRead(Y_pinI);
datos[2]=analogRead(X_pinD);
datos[3]=analogRead(Y_pinD);

datos[0] = map(datos[0], 508, 1023, 0, 180);
datos[1] = map(datos[1], 0, 1020, 0, 180);
datos[2] = map(datos[2], 0, 1023, 0, 185);
datos[3] = map(datos[3], 0, 1023, 0, 185);

//enviamos los datos
bool ok = Radio.write(datos, sizeof(datos));
//reportamos por el puerto serial los datos enviados
// luego lo comentaremos no será necesario
if(ok){

   Serial.print(» Y Left»);
   Serial.println(datos[0]);

   Serial.print(» X Left»);
   Serial.println(datos[1]);

   Serial.print(» Y Right»);
   Serial.println(datos[2]);

   Serial.print(» X Right»);
   Serial.println(datos[3]);

   Serial.print(«\n\n»);

   delay(100);
   }

else{
   Serial.println(«no se ha podido enviar y recibir»);
}
delay(200);

}
 
 
Código del avión (receptor):
 

// Librerías
#include <RF24.h> // Driver de Radio – Módulos nRF24L01+
#include <Servo.h>

// definimos el servo para la velocidad
#define PIN_VELO 2

// definimos el servo para la dirección
// faltarán el resto de servos

// Pines RF24L01
#define PIN_CE 9
#define PIN_CSN 10

//Servos
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo motor;

int x_axis = A0;
int y_axis = A1;
int velo, dire;

const byte direccion[5] = {‘p’, ‘l’, ‘a’, ‘n’, ‘e’};
RF24 radio(PIN_CE, PIN_CSN);

int data[4];

Servo velocidad;

// Configuración
void setup() {
velocidad.attach(PIN_VELO, 1000, 2000);
velocidad.writeMicroseconds(900); // send “stop” signal to ESC.
delay(4000);

// Configuración Consola – Depuración
Serial.begin(9600);

// Inicializa Sistema RF sobre el bus SPI
if (!radio.begin()) {
Serial.println(F(«¡¡¡El Hardware de Radio no responde!!!»));
while (1) {
} // Bucle infinito
}

// Modo Lectura > Pipe 1 + Dirección
radio.openReadingPipe(1, direccion);
Serial.println(«escuchando»);
// Sistema RF en Recepción – RX Mode
radio.startListening();

servo1.attach(3); //s1
servo2.attach(4); //s2
servo3.attach(5); //s3
servo4.attach(6); //s4

motor.attach(2, 1000, 2000);
motor.writeMicroseconds(900); // send “stop” signal to ESC.
delay(4000);
}

void loop() {
int angulo1 = data[0] ; //Brushless
int angulo2 = data[1] ; //wings left-right
int angulo3 = data[2] ;
int angulo4 = data[3] ;

// Enlace TX / RX
boolean radioOK = radio.available();
// Datos Recibidos > Sistema RF
if (radioOK) {
// Leer Datos > Estructura
radio.read(data, sizeof(data));

servo1.write(angulo4);

motor.write(angulo1);
Serial.println(angulo1);

if (angulo3 != 90){
servo3.write(angulo3);
servo4.write(angulo3);
}
else {
servo3.write(angulo2);
servo4.write(180-angulo2);
}

servo2.write(angulo3);

}
}


PLANTEAMIENTO DEL PROYECTO

11        

Avión en proceso:

1681810523970

1681810523962

1681810523953

Avión acabado:

cap2

Esquema eléctrico del avión:

EsquemaAvion_bb