Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
___________________________
27D.- Bluetooth y HC-12 SI4463. 433 MHz. App Inventor.
p9AA_bluetooth_radiofrecuencia.aia
- Este tutorial es la continuación de 27D_BT_HC-12_SI4463.htm, en este caso vamos a conectar el módulo HC-12 al móvil mediante un cable OTG y un módulo conversor USB-UART.
- También necesitaremos la extensión SerialOTG.aix que podemos obtener en:
https://github.com/rkl099/Appinventor-SerialOTG/blob/main/com.SerialOTG.aix
___________________________
- Configuración del módulo mediante los comandos AT.
- Para configurarlo el debemos conectar el terminal SET al pin 9 del Arduino.
- Vamos a configurar el módulo a FU4 con 1200, canal 050.
- En este modo podremos conseguir la máxima distancia (1800 m), aunque solo podremos enviar paquetes de unos 32 bytes cada 2 segundos.
- Al configurarlo como FU4 automáticamente se establece en 1200.
AT
AT+RX
AT+V
AT+FU4
AT+C050
AT+B1200
- Mediante el siguiente programa podemos configurar con los comandos AT.
- Inicialmente está puesto a 9600, en el momento que cambies a modo FU4 se cambiará a 1200, por lo cual si quieres modificar la configuración deberás cambiar en este programa los 9600 a 1200.
- Para configurar el Monitor Serie debe estar en "Ambos NL & CR"
jConfiguracion_AT.ino Para HC-12 |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // TX to pin_10. RX to pin_11 of Arduino.
void setup() {
Serial.begin(9600); // 9600 viene por defecto. 1200 en modo FU4
HC12.begin(9600); // 9600 viene por defecto. 1200 en modo FU4
pinMode(9, OUTPUT); // SET to pin_9 of Arduino.
}
void loop() {
if(Serial.available()) {
String command = Serial.readStringUntil('\n');
digitalWrite(9, LOW);
delay(100);
Serial.println(command);
HC12.println(command); // Importante println
digitalWrite(9, HIGH);
}
if (HC12.available()){
String retorno = HC12.readStringUntil('\n');
Serial.println(retorno);
}
}
|
- Código para configurar el Bluetooth HC-06.
- Para configurar el Monitor Serie debe estar en "Nueva Línea"
jConfiguracion_AT.ino Para Bluetooth HC-06 |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // TX to pin_10. RX to pin_11 of Arduino.
void setup() {
Serial.begin(9600); // 9600 viene por defecto. 1200 en modo FU4
HC12.begin(9600); // 9600 viene por defecto. 1200 en modo FU4
pinMode(9, OUTPUT); // SET to pin_9 of Arduino.
}
void loop() {
if(Serial.available()) {
String command = Serial.readStringUntil('\n');
digitalWrite(9, LOW);
delay(100);
Serial.println(command);
HC12.print(command); // Importante print
digitalWrite(9, HIGH);
}
if (HC12.available()){
String retorno = HC12.readStringUntil('\n');
Serial.println(retorno);
}
}
|
___________________________
1.- El móvil con el HC-12 envía una secuencia de números. Arduino los muestra en una pantalla OLED y en el Monitor Serie.
- Creamos una aplicación para el móvil que genera un secuencia de números.
- Mediante la extensión SerialOTG enviamos esos números al puerto USB del móvil.
- En el puerto USB del móvil conectamos un cable OTG, éste lo conectamos a un conversor USB - UART y este conversor lo conectamos a un módulo HC-12 que actuará como transmisor.
- En el Arduino conectamos el otro módulo HC-12 que actuará como receptor.
___________________________
- Conversores USB - UART (Rx/Tx). Cable OTG.
- Aquí tenemos varios conversores USB - UART, nos servirán para convertir la información USB que sale del móvil a UART (Rx/Tx) para suministrársela al módulo HC-12.
- Vamos a utilizar el CP2102. También necesitaremos un cable OTG como indico en la imagen.
___________________________
- Conexiones con pantalla OLED.
- Podemos alimentar al Arduino receptor con una batería, pilas,.... y de esta manera podemos salir a un campo para comprobar distancias.
- También podemos conectarlo al ordenador.
- Si no tienes pantalla OLED, conecta el Arduino al ordenador y observa los números en el Monitor Serie.
___________________________
- Código para el receptor con pantalla OLED.
- Utilizaremos la librería U8g2.zip
- He puesto dos códigos, el de la derecha está más simplificado.
jReceptor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#include <U8g2lib.h>
#include <SPI.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
char rx_byte2 = 0;
String rx_str2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
u8g2.begin();
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(5,32,rx_str2.c_str()); // 31,24
u8g2.sendBuffer();
// int doble = 2 * rx_str2.toInt();
// HC12.println(doble); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
|
jReceptor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include <U8g2lib.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
#include <SoftwareSerial.h>
SoftwareSerial HC12(10, 11) ; // HC12(TX,RX)
void setup() {
// Serial.begin(1200);
HC12.begin(1200);
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(30,31,"****");
u8g2.sendBuffer();
}
void loop() {
if(HC12.available()) {
String texto = HC12.readStringUntil('\n');
// Serial.print(texto);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(30,31,texto.c_str());
u8g2.sendBuffer();
// String retorno = "R: " + texto;
// HC12.println(retorno); // Return
}
}
|
|
_________________________
- Código para el receptor con pantalla LCD.
- Si en vez de poner una pantalla OLED quieres poner una LCD, este sería el código.
- Las pantallas LCD se ven mejor que las OLED pero consumen más energía.
- En este código, si el mensaje enviado tiene más de16 caracteres, se muestran en dos filas.
jBluetooth_Receptor_LCD.ino |
// Juan A. Villalpando
// kio4.com
#include <SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
char rx_byte2 = 0;
String rx_str2 = "";
String fila1 = "";
String fila2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
lcd.begin(16,2);// Columnas y filas de LCD.
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
fila1 = rx_str2.substring(0,16);
fila2 = rx_str2.substring(16,32);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(fila1);
lcd.setCursor(0,1);
lcd.print(fila2);
// HC12.println(rx_str2); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
|
|
___________________________
- Diseño.
___________________________
- Bloques.
- Si en el Temporizador ponemos el bloque falso, escribimos un texto y pulsamos el Botón de EnviarTexto, se enviará el texto.
- Si ponemos el bloque cierto, automáticamente se irán enviando una secuencia de números 1, 2, 3, 4,...
___________________________
___________________________
___________________________
2.- El Arduino con el HC-12 envía una secuencia de números. El móvil con otro HC-12 recibe esos números y los muestra en su pantalla.
- Las conexiones de los elementos son las mismas que las que hemos visto anteriormente.
jEmisor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include SoftwareSerial.h>
SoftwareSerial HC12(10,11); // HC12(TX,RX)
#include <U8g2lib.h>
#include <SPI.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
char rx_byte2 = 0;
String rx_str2 = "";
void setup() {
Serial.begin(9600);
HC12.begin(9600);
u8g2.begin();
}
void loop() {
if (HC12.available() > 0) {
rx_byte2 = HC12.read();
rx_str2 += rx_byte2;
if (rx_byte2 == '\n') {
// Serial.print(rx_str2);
// Elimina último caracter, '\n'
rx_str2 = rx_str2.substring(0, rx_str2.length() - 1);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(5,32,rx_str2.c_str()); // 31,24
u8g2.sendBuffer();
// int doble = 2 * rx_str2.toInt();
// HC12.println(doble); // Devuelve el valor.
rx_str2 = "";
}
}
}
|
_______________________________________
3.- Pruebas a larga distancia. FU4. 1800 metros.
- Una vez visto el alcancen en el modo FU3, que debe ser unos 1000 metros, vamos a comprobar el mismo código en el modo FU4, para ver si llegamos a los 1800 metros.
- Para lograr esa distancia deben verse los dos dispositivos, no debe haber árboles, edificios,... entre uno y otro.
- Al configurarlo en el modo FU4 se establecerá automáticamente una velocidad de 1200 bps, lo que hará que los datos se desplacen por el aire a 5000 bps. En este modo el receptor tendrá una sensibilidad de -117 dBm. El consumo 16 mA. Si añadimos al Arduino tendremos un consumo de unos 60 mA. El espaciado entre el envío de un dato y otro será de más de 1 segundo.
- Para ello cargamos en los dos Arduinos el programa de configuración, el que he llamado Configuracion_AT.ino y está al principio de esta página.
- Para ponerlos en el modo FU4, recuerda que debes conectar el terminal SET del módulo HC12 al pin 9 del Arduino.
AT
AT+RX
AT+FU4
AT+RX
Atención, ahora no veremos los datos en el Monitor Serie, ya que el modo FU4 ha cambiado sus baudios automáticamente a 1200. Para volver a verlo, vamos al código de Configuracion_AT.ino y cambiamos estas líneas:
void setup() {
Serial.begin(1200);
HC12.begin(1200);
}
- Ponemos al Monitor Serie a 1200.
AT+RX
OK+B1200
OK+RC001
OK+RP:+20dBm
OK+FU4
- Cuidado con esto de las velocidades, puede ocurrir que no veas nada en el Monitor Serie y es porque no has cambiado correctamente los baudios.
- Ya lo tenemos en modo FU4, ahora modificamos un poco los códigos del Emisor y Receptor, ponemos las velocidades a 1200. Quitamos el cable SET.
- Cargamos el código del Emisor y Receptor en el Arduino correspondiente. Salimos al campo a medir distancia.
- En la aplicación del móvil, en la extensión OTG debemos cambiar la velocidad BaudRate a 1200.
___________________________
1.- El móvil con el HC-12 envía una secuencia de números. Arduino los muestra en una pantalla OLED. Utilizamos dos Arduinos.
p10A_OTG_CP2102_HC12.aia
- El móvil envía mediante el cable OTG y el conversor una secuencia de números al Arduino con el Emisor.
- El Receptor toma esos números y los muestra en la pantalla OLED.
jEmisor_OLED.ino |
#include <SoftwareSerial.h>
SoftwareSerial HC12(10, 11) ; // HC12(TX,RX)
SoftwareSerial FTDI(2,3); // FTDI(TX,RX)
String texto;
String retorno;
int x = 100;
void setup() {
HC12.begin(1200);
Serial.begin(1200);
FTDI.begin(1200);
}
void loop() {
if(FTDI.available()) {
texto = FTDI.readStringUntil('\n'); // from App by FTDI
HC12.println(texto);
}
/** // Retorno
if(HC12.available()> 0) {
retorno = HC12.readStringUntil("\n"); // from App by FTDI
Serial.println(retorno);
// FTDI.println(retorno);
}
*/
// x = x + 1;
// String t = (String) x + " "; // Debe tener 15 bytes. 12 espacios.
// HC12.println(t);
// delay(1000);
}
|
jReceptor_OLED.ino |
// Juan A. Villalpando
// kio4.com
#include <U8g2lib.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
#include <SoftwareSerial.h>
SoftwareSerial HC12(10, 11) ; // HC12(TX,RX)
void setup() {
// Serial.begin(1200);
HC12.begin(1200);
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(30,31,"****");
u8g2.sendBuffer();
}
void loop() {
if(HC12.available()) {
String texto = HC12.readStringUntil('\n');
// Serial.print(texto);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso28_tr);
u8g2.drawStr(30,31,texto.c_str());
u8g2.sendBuffer();
// String retorno = "R: " + texto;
// HC12.println(retorno); // Return
}
}
|
- Corrientes en el Arduino
https://electronics.stackexchange.com/questions/67092/how-much-current-can-i-draw-from-the-arduinos-pins#:~:text=According%20to%20the%20v2.,max%20current%20rating%20of%2050mA.
________________________________
|