Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

¿Qué es un módulo de comunicación inalámbrica de largo alcance y cómo puede utilizarlo en sus proyectos con Arduino? En este artículo, exploraremos las capacidades del módulo HC-12 y cómo puede integrarse con la plataforma Arduino para establecer comunicación a larga distancia. ¡Descubra todo lo que necesita saber sobre esta potente herramienta de comunicación inalámbrica!

En este tutorial de Arduino, aprenderá a utilizar el módulo de comunicación serie inalámbrico HC-12, que permite la comunicación inalámbrica de larga distancia entre múltiples placas Arduino a distancias de hasta 1,8 km. Para obtener más detalles, puede ver el siguiente vídeo o leer el tutorial escrito a continuación.

descripción general

Para este tutorial, creé dos ejemplos básicos que explican cómo conectar el módulo HC-12 y establecer una comunicación básica entre dos Arduinos, y un ejemplo adicional donde uso un acelerómetro en el primer Arduino para determinar la posición del paso a paso en el segundo. Controla Arduino de forma inalámbrica.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Módulo de comunicación inalámbrica HC-12

Primero, echemos un vistazo más de cerca al módulo de comunicación serie inalámbrico HC-12. Aquí hay algunas especificaciones:

  • Su banda de frecuencia de trabajo inalámbrica va desde 433,4 MHz hasta 473,0 MHz
  • Tiene un total de 100 canales con una gradación de 400 kHz entre cada canal
  • La potencia de transmisión oscila entre -1 dBm (0,79 mW) y 20 dBm (100 mW).
  • La sensibilidad de recepción está entre -117 dBm (0,019 pW) y -100 dBm (10 pW).

Estos valores en realidad dependen de la velocidad en baudios serial y inalámbrica seleccionada, como se muestra en la tabla.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

El>

Arduino y HC-12

Ahora conectemos el módulo HC-12 al Arduino y hagamos el primer ejemplo. Aquí está el diagrama del circuito. El voltaje de funcionamiento del módulo es de 3,2 V a 5,5 V y se recomienda utilizar un condensador de desacoplamiento y una fuente de alimentación externa para un funcionamiento más estable. Sin embargo, para los tres ejemplos de este tutorial, utilicé el puerto USB de la PC como fuente de energía y no tuve problemas con él.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Conecté>

Puede obtener los componentes necesarios para este tutorial de Arduino en los siguientes enlaces:

  • Módulo de comunicación inalámbrica HC-12……….. Amazon / Banggood / AliExpress
  • Placa Arduino…………………………………………………… Amazon / Banggood / AliExpress
  • Cables de puente y placa de pruebas………………………… Amazon / Banggood / AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Ejemplo 01 – Código Arduino


Aquí está el código Arduino para el primer ejemplo, comunicación básica entre los dos módulos mediante el monitor serie.

/*    Arduino Long Range Wireless Communication using HC-12
                      Example 01
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

void setup() {
  Serial.begin(9600);             // Serial port to computer
  HC12.begin(9600);               // Serial port to HC12

}

void loop() {
  while (HC12.available()) {        // If HC-12 has data
    Serial.write(HC12.read());      // Send the data to Serial monitor
  }
  while (Serial.available()) {      // If Serial monitor has data
    HC12.write(Serial.read());      // Send that data to HC-12
  }
}Code language: Arduino (arduino)

Se utiliza el mismo código para ambos Arduinos. Podemos conectar los dos Arduino en dos ordenadores separados, pero también podemos usar un solo ordenador.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

En>

Entonces, una vez que tengamos los dos IDE de Arduino en ejecución, podemos iniciar los monitores en serie y probar si la comunicación funciona correctamente. Todo lo que ingresamos en el monitor serie se envía de un Arduino a otro.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Así> Entonces tan pronto como escribimos algo en el monitor serial y hacemos clic en el botón enviar, en el primer Arduino el bucle while con la función “Serial.available()” se vuelve verdadero y con la función “HC12.write()” enviamos los datos del monitor serial al módulo HC-12. Este módulo transmite los datos de forma inalámbrica al segundo módulo HC-12, por lo que en el segundo Arduino el bucle while con la función HC12.available() se vuelve verdadero y los datos se envían al módulo con la función Serial.write() Serial Monitor .

Podemos usar el mismo código para enviar comandos AT y configurar los parámetros del módulo. Todo lo que tenemos que hacer es conectar el pin «Set» del módulo a tierra o cualquier pin digital del Arduino y configurar el pin a un nivel lógico bajo.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Para>

Comandos AT:

1. AT – comando de prueba.

Ejemplo: envíe «AT» al módulo y el módulo devuelve «OK».

2. AT+Bxxxx: cambia la velocidad en baudios del puerto serie.

Velocidades de baudios disponibles: 1200 bps, 2400 bps, 4800 bps, 9600 bps, 19200 bps, 38400 bps, 57600 bps y 115200 bps. Valor predeterminado: 9600 bps.

Ejemplo: envíe «AT+B38400» al módulo y el módulo devuelve «OK+B19200».

3. AT+Cxxxx: cambia el canal de comunicación inalámbrica, de 001 a 100.

Estándar: Canal 001, con una frecuencia de operación de 433,4 MHz. Cada canal siguiente es 400 kHz más alto.

Ejemplo: Si queremos configurar el módulo en el canal 006, debemos enviar el comando «AT+C006» al módulo y el módulo devolverá «OK+C006». La nueva frecuencia de trabajo es 435,4 MHz.

Ejemplo 02


Ahora pasemos al segundo ejemplo. Aquí utilizamos dos botones para seleccionar diferentes canales de comunicación y ver otro método para almacenar los datos entrantes.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Nota:>

Primer código Arduino:

/*    Arduino Long Range Wireless Communication using HC-12
    Example 02 - Changing channels using push buttons - Buttons side
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

#define setPin 6
#define button1 4
#define button2 3

SoftwareSerial HC12(10, 11);         // HC-12 TX Pin, HC-12 RX Pin

byte incomingByte;
String readBuffer = "";

int button1State = 0;
int button1Pressed = 0;
int button2State = 0;
int button2Pressed = 0;

void setup() {
  Serial.begin(9600);                   // Open serial port to computer
  HC12.begin(9600);                     // Open serial port to HC12
  pinMode(setPin, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  digitalWrite(setPin, HIGH);           // HC-12 normal, transparent mode
}

void loop() {
  // ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }
  delay(100);
  // ==== Sending data from one HC-12 to another via the Serial Monitor
  while (Serial.available()) {
    HC12.write(Serial.read());
  }

  // ==== If button 1 is pressed, set the channel 01
  button1State = digitalRead(button1);
  if (button1State == HIGH & button1Pressed == LOW) {
    button1Pressed = HIGH;
    delay(20);
  }
  if (button1Pressed == HIGH) {
    HC12.print("AT+C001");               // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C001");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    button1Pressed = LOW;
  }
  
  // ====  If button 2 is pressed, set the channel 02
  button2State = digitalRead(button2);
  if (button2State == HIGH & button2Pressed == LOW) {
    button2Pressed = HIGH;
    delay(100);
  }
  if (button2Pressed == HIGH) {
    HC12.print("AT+C002"); // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C002");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);
    button2Pressed = LOW;
  }
  checkATCommand();
  readBuffer = "";                       // Clear readBuffer
}
// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(200);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Segundo código Arduino:

/*    Arduino Long Range Wireless Communication using HC-12
        Example 02 - Changing channels using push buttons
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>

#define setPin 6

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

byte incomingByte;
String readBuffer = "";

void setup() {
  Serial.begin(9600);             // Open serial port to computer
  HC12.begin(9600);               // Open serial port to HC12
  pinMode(setPin, OUTPUT);
  digitalWrite(setPin, HIGH);     // HC-12 normal mode
}

void loop() {
  // ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }
  delay(100);
  // ==== Sending data from one HC-12 to another via the Serial Monitor
  while (Serial.available()) {
    HC12.write(Serial.read());
  }
  // === If button 1 is pressed, set channel 01
  if (readBuffer == "AT+C001") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12 ("AT+C001")
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    readBuffer = "";
  }
  // === If button 2 is pressed, set channel 02
  if (readBuffer == "AT+C002") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode

    readBuffer = "";
  }
  checkATCommand();
  readBuffer = "";                       // Clear readBuffer
}
// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Descripción de códigos:

Entonces, primero debemos definir los pines y configurar el pin «Establecer» en un nivel lógico alto para que el módulo funcione en modo normal y transparente. Con el primer bucle while, almacenamos los datos entrantes en una variable de cadena para poder procesarlos mejor.

// ==== Storing the incoming data into a String variable
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
  }Code language: Arduino (arduino)

Los datos entrantes siempre llegan byte a byte. Entonces, por ejemplo, si enviamos la cadena «Test123» desde el segundo Arduino, este bucle while realizará siete iteraciones. En cada iteración, usamos la función HC12.read() para leer cada byte o carácter entrante y agregarlo a la variable de cadena llamada readBuffer.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

A>

if (button1Pressed == HIGH) {
    HC12.print("AT+C001");               // Send the AT Command to the other module
    delay(100);
    //Set AT Command Mode
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print("AT+C001");               // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    button1Pressed = LOW;
  }Code language: Arduino (arduino)

Cuando se recibe esta cadena en el segundo Arduino, ponemos el módulo HC-12 en modo de comando AT y luego escribimos la misma cadena «AT+C001» en él, configurando el módulo en el canal de comunicación número uno.

// At the second Arduino

// === If button 1 is pressed, set channel 01
  if (readBuffer == "AT+C001") {
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(100);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12 ("AT+C001")
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    Serial.println("Channel successfully changed");
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
    readBuffer = "";
  }Code language: Arduino (arduino)

Usamos el siguiente bucle while para generar el mensaje de respuesta del módulo HC-12 si el canal se ha cambiado correctamente.

while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }Code language: Arduino (arduino)

De vuelta en el primer Arduino, realizamos el mismo proceso y enviamos el comando AT al primer módulo HC-12. De la misma forma, pulsando el segundo botón configuramos el canal de comunicación número dos. Así que con este método podremos elegir con qué módulo HC-12 queremos comunicarnos en cada momento.

Al final, la función personalizada checkATCommand() comprueba si el mensaje recibido es un comando AT comprobando si la cadena comienza con «AT». En caso afirmativo, el módulo ingresa al modo de comando AT y ejecuta el comando.

// ==== Custom function - Check whether we have received an AT Command via the Serial Monitor
void checkATCommand () {
  if (readBuffer.startsWith("AT")) {     // Check whether the String starts with "AT"
    digitalWrite(setPin, LOW);           // Set HC-12 into AT Command mode
    delay(200);                          // Wait for the HC-12 to enter AT Command mode
    HC12.print(readBuffer);              // Send AT Command to HC-12
    delay(200);
    while (HC12.available()) {           // If HC-12 has data (the AT Command response)
      Serial.write(HC12.read());         // Send the data to Serial monitor
    }
    digitalWrite(setPin, HIGH);          // Exit AT Command mode
  }
}Code language: Arduino (arduino)

Comunicación inalámbrica HC-12: control de motor paso a paso mediante acelerómetro

Ahora veamos el tercer ejemplo. Aquí controlamos la posición del motor paso a paso en el segundo Arduino usando el módulo de acelerómetro en el primer Arduino.

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

El>

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

Puede>

  • Módulo de comunicación inalámbrica HC-12 ………… Amazon / Banggood / AliExpress
  • Controlador de motor paso a paso A4988………………………….. Amazon / Banggood / AliExpress
  • Motor paso a paso NEMA 17 ………………………………… Amazon / Banggood / AliExpress
  • Placa Arduino…………………………………………………….. Amazon / Banggood / AliExpress
  • Cables de puente y placa de pruebas………………………….. Amazon / Banggood / AliExpress
  • Placa GY-80 con acelerómetro ADXL345……… Amazon/AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

Tenga en cuenta aquí que ya tengo tutoriales detallados sobre cómo conectar y utilizar tanto el acelerómetro como el motor paso a paso. Por lo tanto, en este ejemplo solo explicaré la parte HC-12 del código.

Primer Arduino – código del transmisor:

/*   Arduino Long Range Wireless Communication using HC-12
     Example 03 - Stepper Motor Control using Accelerometer - Transmitter, Accelerometer
    by Dejan Nedelkovski, www.HowToMechatronics.com
*/

#include <SoftwareSerial.h>
#include <Wire.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

float angle;
int lastAngle = 0;
int count = 0;
int angleSum = 0;

//--- Accelerometer Register Addresses
#define Power_Register 0x2D
#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Y_Axis_Register_DATAY0 0x34
#define Y_Axis_Register_DATAY1 0x35
#define Z_Axis_Register_DATAZ0 0x36
#define Z_Axis_Register_DATAZ1 0x37
int ADXAddress = 0x53;  //Device address in which is also included the 8th bit for selecting the mode, read in this case.
int X0, X1, X_out;
int Y0, Y1, Y_out;
int Z1, Z0, Z_out;
float Xa, Ya, Za;

void setup() {
  HC12.begin(9600);               // Open serial port to HC12
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);

  Wire.beginTransmission(ADXAddress);
  Wire.write(Power_Register); // Power_CTL Register
  // Enable measurement
  Wire.write(8); // Bit D3 High for measuring enable (0000 1000)
  Wire.endTransmission();
}
void loop() {
  // X-axis
  Wire.beginTransmission(ADXAddress); // Begin transmission to the Sensor
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  Wire.requestFrom(ADXAddress, 2); // Request the transmitted two bytes from the two registers
  if (Wire.available() <= 2) { //
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();
    /* Converting the raw data of the X-Axis into X-Axis Acceleration
      - The output data is Two's complement
      - X0 as the least significant byte
      - X1 as the most significant byte */
    X1 = X1 << 8;
    X_out = X0 + X1;
    Xa = X_out / 256.0; // Xa = output value from -1 to +1, Gravity acceleration acting on the X-Axis
  }
  //Serial.print("Xa= ");
  //Serial.println(X_out);

  // Y-Axis
  Wire.beginTransmission(ADXAddress);
  Wire.write(Y_Axis_Register_DATAY0);
  Wire.write(Y_Axis_Register_DATAY1);
  Wire.endTransmission();
  Wire.requestFrom(ADXAddress, 2);
  if (Wire.available() <= 2) {
    Y0 = Wire.read();
    Y1 = Wire.read();
    Y1 = Y1 << 8;
    Y_out = Y0 + Y1;
    Ya = Y_out / 256.0;
  }

  // Combine X and Y values for getting the angle value from 0 to 180 degrees
  if (Y_out > 0) {
    angle = map(Y_out, 0, 256, 90, 0);
  }
  else if (Y_out < 0) {
    angle = map(Y_out, 256, 0, 90, 0);
    angle = 90 - angle;
  }
  if (X_out < 0 & Y_out < 0) {
    angle = 180;
  }
  if (X_out < 0 & Y_out >0) {
    angle = 0;
  }
  
  // float to int
  int angleInt = int(angle);
  // Makes 100 accelerometer readings and sends the average for smoother result
  angleSum = angleSum + angleInt;
  count++;
  if (count >= 100) {
    angleInt = angleSum / 100;
    angleSum = 0;
    count = 0;
    // Some more smoothing of acceleromter reading - sends the new angle only if it differes from the previous one by +-2
    if (angleInt > lastAngle + 2 || angleInt < lastAngle - 2) {
      Serial.println(angleInt);
      String angleString = String(angleInt);
      //sends the angle value with start marker "s" and end marker "e"
      HC12.print("s" + angleString + "e");
      delay(10);
      lastAngle = angleInt;
      angleSum = 0;
      count = 0;
    }
  }
}
Code language: Arduino (arduino)

Segundo Arduino – código del receptor:

/*   Arduino Long Range Wireless Communication using HC-12
     Example 03 - Stepper Motor Control using Accelerometer - Receiver, Stepper Motor

    by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SoftwareSerial.h>

SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin

char incomingByte;
String readBuffer = "";

// defines pins numbers
const int dirPin = 4;
const int stepPin = 3;
const int button = 2;

int currentAngle = 0;
int lastAngle = 0;
int rotate = 0;

void setup() {
  Serial.begin(9600);             // Open serial port to computer
  HC12.begin(9600);               // Open serial port to HC12

  // Sets the two pins as Outputs
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  // Microswitch input, with internal pull-up resistor activated
  pinMode(button, INPUT_PULLUP);
  delay(10);
  digitalWrite(dirPin, HIGH);
  boolean startingPosition = true;
  while (startingPosition) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(200);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(200);
    if (digitalRead(button) == LOW) {
      startingPosition = false;
    }
  }
  delay(100);
}
void loop() {
  readBuffer = "";
  boolean start = false;
  // Reads the incoming angle
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    delay(5);
    // Reads the data between the start "s" and end marker "e"
    if (start == true) {
      if (incomingByte != 'e') {
        readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
      }
      else {
        start = false;
      }
    }
    // Checks whether the received message statrs with the start marker "s"
    else if ( incomingByte == 's') {
      start = true; // If true start reading the message
    }
  }
  // Converts the string into integer
  currentAngle = readBuffer.toInt();
  // Makes sure it uses angles between 0 and 180
  if (currentAngle > 0 && currentAngle < 180) {
    // Convert angle value to steps (depending on the selected step resolution)
    // A cycle = 200 steps, 180deg = 100 steps ; Resolution: Sixteenth step x16
    currentAngle = map(currentAngle, 0, 180, 0, 1600); 
    //Serial.println(currentAngle); // Prints the angle on the serial monitor
    digitalWrite(dirPin, LOW); // Enables the motor to move in a particular direction
    // Rotates the motor the amount of steps that differs from the previous positon
    if (currentAngle != lastAngle) {
      if (currentAngle > lastAngle) {
        rotate = currentAngle - lastAngle;
        for (int x = 0; x < rotate; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(400);
        }
      }
      // rotate the other way
      if (currentAngle < lastAngle) {
        rotate = lastAngle - currentAngle;
        digitalWrite(dirPin, HIGH);        //Changes the rotations direction
        for (int x = 0; x < rotate; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
    lastAngle = currentAngle;  // Remembers the current/ last positon
  }
}Code language: Arduino (arduino)

Descripción de códigos:

Primero definimos los pines e inicializamos los módulos en el área de configuración. Luego leemos los valores de los ejes X e Y del acelerómetro y les asignamos un valor de 0 a 180 grados. Los valores provenientes del acelerómetro a veces pueden ser inestables o fluctuar, así que utilicé el valor promedio de cien lecturas para suavizar el resultado.

// Makes 100 accelerometer readings and sends the average for smoother result
  angleSum = angleSum + angleInt;
  count++;
  if (count >= 100) {
    angleInt = angleSum / 100;
    angleSum = 0;
    count = 0;
    // Some more smoothing of acceleromter reading - sends the new angle only if it differes from the previous one by +-2
    if (angleInt > lastAngle + 2 || angleInt < lastAngle - 2) {
      Serial.println(angleInt);
      String angleString = String(angleInt);
      //sends the angle value with start marker "s" and end marker "e"
      HC12.print("s" + angleString + "e");
      delay(10);
      lastAngle = angleInt;
      angleSum = 0;
      count = 0;
    }
  }Code language: Arduino (arduino)

Para suavizar aún más, sólo envío el nuevo valor del ángulo si difiere del anterior en 2.

Tenga en cuenta aquí que cuando envío el ángulo al módulo HC-12, también envío el carácter «s» delante y el carácter «e» después, lo que me ayuda a recibir los datos en el segundo Arduino.

En el segundo Arduino esperamos hasta que llegue el marcador de inicio “s”, luego leemos el valor del ángulo hasta que llegue el marcador de final “e”. Esto asegura que solo obtengamos el valor del ángulo.

// Reads the incoming angle
  while (HC12.available()) {             // If HC-12 has data
    incomingByte = HC12.read();          // Store each icoming byte from HC-12
    delay(5);
    // Reads the data between the start "s" and end marker "e"
    if (start == true) {
      if (incomingByte != 'e') {
        readBuffer += char(incomingByte);    // Add each byte to ReadBuffer string variable
      }
      else {
        start = false;
      }
    }
    // Checks whether the received message statrs with the start marker "s"
    else if ( incomingByte == 's') {
      start = true; // If true start reading the message
    }
  }Code language: Arduino (arduino)

Luego convertimos el valor a un número entero y asignamos el valor de 0 a 1600 pasos, que corresponde a la resolución del decimosexto paso seleccionada en el controlador paso a paso A4988. Luego giramos el motor paso a paso al ángulo actual.

Eso es todo por este tutorial de Arduino. No dude en hacer sus preguntas en la sección de comentarios a continuación.

Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12

En este tutorial de Arduino, aprenderemos a utilizar el módulo de comunicación serial inalámbrica HC-12, el cual es capaz de realizar una comunicación inalámbrica de largo alcance entre múltiples placas Arduino, con distancias de hasta 1.8 km. Puedes ver el siguiente video o leer el tutorial escrito a continuación para más detalles.

Visión general

Para este tutorial, realicé dos ejemplos básicos explicando cómo conectar el módulo HC-12 y establecer una comunicación básica entre dos Arduinos, y un ejemplo adicional donde, utilizando un sensor acelerómetro en el primer Arduino, controlo de forma inalámbrica la posición del motor paso a paso en el segundo Arduino.

Módulo de comunicación inalámbrica HC-12

Primero veamos más de cerca el módulo de comunicación serial inalámbrica HC-12. Aquí están algunas especificaciones:

  • Su banda de trabajo inalámbrica va desde 433.4 MHz a 473.0 MHz.
  • Posee un total de 100 canales con un paso de 400 kHz entre cada canal.
  • La potencia de transmisión va desde -1dBm (0.79mW) hasta 20dBm (100mW).
  • La sensibilidad de recepción va desde -117dBm (0.019pW) hasta -100dBm (10pW).

Estos valores dependen del Baud Rate seleccionado, como se muestra en la tabla. El módulo HC-12 tiene un microcontrolador que en realidad no necesita ser programado por el usuario. Para configurar el módulo, simplemente utilizamos comandos AT, que pueden ser enviados desde un Arduino, una PC o cualquier otro microcontrolador utilizando el puerto serie. Para ingresar al modo de comando AT, simplemente tenemos que establecer el pin «Set» del módulo en un nivel lógico bajo.

Arduino y HC-12

Ahora conectemos el módulo HC-12 al Arduino y hagamos el primer ejemplo. Aquí está el esquema del circuito. El voltaje de operación del módulo va desde 3.2 V hasta 5.5 V. Recomiendo usar un condensador de desacoplamiento y una fuente de alimentación externa para un trabajo más estable, aunque en los ejemplos de este tutorial utilicé la alimentación USB de la PC para los tres casos sin problemas.

Conecté el primer módulo a un Arduino UNO y el segundo módulo a un Arduino MEGA, pero por supuesto, puedes utilizar cualquier placa que desees.

Preguntas frecuentes

  1. ¿Cómo se establece la comunicación inalámbrica entre dos placas Arduino utilizando el módulo HC-12?
  2. ¿Es necesario programar el microcontrolador del módulo HC-12?
  3. ¿Cómo se configura el módulo HC-12 utilizando comandos AT?
  4. ¿Cómo se puede cambiar el canal de comunicación del módulo HC-12?
  5. ¿Qué tipo de sensores se pueden utilizar en conjunto con el módulo HC-12 para realizar proyectos más avanzados?

Para más detalles sobre la programación y conexión de los módulos HC-12 con Arduino, te invito a revisar detenidamente los códigos y esquemas proporcionados en los ejemplos de este tutorial.

5 comentarios en «Módulo de comunicación inalámbrica de largo alcance Arduino y HC-12»

  1. ¡Vaya, qué descubrimiento! No sabía que se podía lograr esa comunicación inalámbrica tan potente con Arduino y HC-12. Definitivamente, este artículo me ha abierto los ojos a nuevas posibilidades. ¡Gracias por compartir!

  2. ¡Qué genialidad! Nunca pensé que se podría lograr una comunicación inalámbrica de largo alcance con Arduino y HC-12. Definitivamente, este artículo ha ampliado mis horizontes tecnológicos. ¡Gracias por compartir esta información tan interesante!

Deja un comentario