fbpixel
Comando un controlador serie Maestro con Raspberry Pi

Comando un controlador serie Maestro con Raspberry Pi

Cuando se trata con varios servomotores y se necesita un número adicional de salidas para operar su robot (para controlar Hexana, por ejemplo), una solución práctica es usar un controlador en serie como el Mini Maestro de Pololu.

Prerrequisito: Programación en Raspberry Pi, Control de un servo con Raspberry Pi

Material

  • Computadora
  • Raspberry Pi3 (o Zero) + monitor + teclado
  • Cable USB mini B para conectar Maestro a la computadora
  • Cable de puente F / F x4
  • Controlador en serie Mini Maestro x1
  • Servomotor x1 o más

Descripción general del controlador serie Maestro

Cuando se utilizan varios motores en un proyecto, generalmente el número de salidas necesarias excede la capacidad de la placa Arduino. En ese caso, es necesario usar un controlador de servo (que puede controlar hasta 32 servomotores) que se comunican con Arduino mediante un puerto serie y transmiten el PWM a los servomotores.

El que utilizamos en este ejemplo es un tablero Maestro propuesto por Pololu. Existe en diferentes formatos 4,12, 18 y 24 canales.

Con esta solución, la placa principal (Arduino o Raspberry Pi) envía órdenes al controlador (Maestro) a través del puerto serie que aplica potencia y comandos a los servomotores.

Esto presenta varias ventajas:

  • proteger el material separando el circuito de alta potencia del circuito lógico
  • reducir el costo al reducir el número de entrada / salida del microcontrolador principal
  • utilizando una placa diferente para comunicarse con el servocontrolador

Más información sobre el controlador serie Mini Maestro en el sitio web de Pololu.

Configuración y prueba del controlador serie Maestro

Para configurar el controlador serie Maestro, debe descargar los controladores y el software para Windows (o Linux). Puede encontrar la guía de instalación siguiendo los enlaces de Windows y Linux.

Una vez que el Centro de control Maestro y los controladores estén instalados, conecte el maestro a su computadora.

Cuando el controlador está conectado, su ID aparecerá en la parte superior derecha. Puede encontrar y modificar los parámetros de comunicación en la pestaña “Serial Settings”.

Puede probar el controlador serie Maestro y sus servomotores en la pestaña “Status”.No olvide alimentar sus servomotores con una fuente de alimentación externa.

Los servomotores pueden tener diferentes parámetros. Puede modificar los parámetros de salida de Maestro en la pestaña “Configuración de canales”. Debe probar los parámetros que mejor se adaptan a sus servos.

Esquema

El controlador Maestro está alimentado por la salida 5V del Raspberry Pi. Los pines 8 (GPIO14 / UART0_TXD) y 10 (GPIO15 / UART0_RXD) del Raspberry están conectados al pin RX y TX del Maestro respectivamente.

El cableado se puede adaptar fácilmente a los otros miembros de la familia Mini Maestro siguiendo los esquemas de pines.

Configuración de Raspberry Pi

Compruebe que el módulo PySerial esté instalado en Raspberry

En la terminal, ingrese:

$ python -m pip install pyserial

Luego clone el repositorio del módulo Maestro:

$ git clone https://github.com/FRC4564/Maestro

Para comunicarse con la placa Maestro, necesita un puerto serie. Puede verificar los puertos disponibles ingresando el comando:

$ dmesg | grep tty

En la Raspberry Pi3, el módulo bluetooth incorporado utiliza el puerto serie /dev/ttyAMAO. Utilizamos el puerto serie /dev/ttySO para comunicarnos con el Mini Maestro.

Código

Para comandar el controlador en serie con Raspberry, se debe enviar una secuencia de bytes a través del puerto en serie. El siguiente código permite al usuario enviar un comando de posición a los diversos canales de un Mini Maestro con el terminal Raspberry.

Para esto utilizamos el módulo Maestro.py descargado previamente (https://github.com/FRC4564/Maestro). Copie y pegue la carpeta en la misma carpeta que el código.

Primero, el puerto serie para comunicarse con el Maestro está intiliazied. Luego, escribimos una función que recibe datos del monitor en serie y los convertimos en servocomando.

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import Maestro.maestro as maestro
import time

#define servo
servo = maestro.Controller(ttyStr='/dev/ttyS0')
min_imp=2000
max_imp=10000
step_imp=100

if __name__ == '__main__' :
	#infinite loop
	while 1:
		  #user input
		  msg=raw_input("Enter servo id and command: YxZZZZ:  \n")

		  #convert msg into id and cmd
		  sep=msg.find("x")
		  m1=msg[:sep]
		  m2=msg[sep+1:]
		  servoId=int(m1)
		  servoCmd=int(m2)

		  #saturate input
		  servoId=min(max(0,servoId),6);
		  servoCmd=min(max(min_imp,servoCmd),max_imp);

		  print(msg)
		  print("servoId : {}    servoCmd : {} \n".format(servoId,servoCmd))

		  servo.setTarget(servoId,servoCmd)
		  time.sleep(0.1)

	servo.close

No dude en dejar un comentario o escribir un mensaje if you have any issue regarding your serial controller.

Aplicaciones

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Comando un controlador serie Maestro con Arduino

Comando un controlador serie Maestro con Arduino

Cuando se trata con varios servomotores y se necesita un número adicional de salidas para operar su robot (para controlar Hexana, por ejemplo), una solución práctica es usar un controlador en serie como el Mini Maestro de Pololu.

Requisito previo: Programming with Arduino, Communicate with ArduinoControl a servo with Arduino

Material

  • Computadora
  • Arduino UNO
  • Cable USB para conectar la placa a la computadora
  • Cable USB mini B para conectar Maestro a la computadora
  • 3x cable de puente M / M
  • Controlador en serie Mini Maestro x1
  • 1 o varios servomoteurs

Descripción general del controlador serie Maestro

Cuando se utilizan varios motores en un proyecto, generalmente el número de salidas necesarias excede la capacidad de la placa Arduino. En ese caso, es necesario usar un controlador de servo (que puede controlar hasta 32 servomotores) que se comunican con Arduino mediante un puerto serie y transmiten el PWM a los servomotores.

El que utilizamos en este ejemplo es un tablero Maestro propuesto por Pololu. Existe en diferentes formatos 4,12, 18 y 24 canales.

Con esta solución, la placa principal (Arduino o Raspberry Pi) envía órdenes al controlador (Maestro) a través del puerto serie que aplica potencia y comandos a los servomotores.

Esto presenta varias ventajas:

  • proteger el material separando el circuito de alta potencia del circuito lógico
  • reducir el costo al reducir el número de entrada / salida del microcontrolador principal
  • utilizando una placa diferente para comunicarse con el servocontrolador

Más información sobre el controlador serie Mini Maestro en el sitio web de Pololu.

 

Configuración y prueba del controlador serie Maestro

Para configurar el controlador serie Maestro, debe descargar los controladores y el software para Windows (o Linux). Puede encontrar la guía de instalación siguiendo los enlaces de Windows y Linux.

Una vez que el Centro de control Maestro y los controladores estén instalados, conecte el maestro a su computadora.

Cuando el controlador está conectado, su ID aparecerá en la parte superior derecha. Puede encontrar y modificar los parámetros de comunicación en la pestaña “Serial Settings”.

Puede probar el controlador serie Maestro y sus servomotores en la pestaña “Estado”. No olvide alimentar sus servomotores con una fuente de alimentación externa.

Los servomotores pueden tener diferentes parámetros. Puede modificar los parámetros de salida de Maestro en la pestaña “Channel Settings”. Debe probar los parámetros que mejor se adaptan a sus servos.

Esquema

El Arduino se puede alimentar con una fuente de alimentación de 7 a 12V o mediante el puerto USB de la computadora. La lógica Maestro se alimenta con la salida de 5V del Arduino y los servomotores deben alimentarse con una batería externa. Si el voltaje nominal de los servomotores y el voltaje de la batería son demasiado diferentes, necesitará usar un regulador de voltaje (por ejemplo: una batería LiPo de 2 celdas suministra 7.4V mientras que el voltaje nominal del servomotor SG90 es 5V).

Los pines 2 (Rx) y 3 (Tx) están conectados respectivamente a los pines TX y RX del controlador serie Maestro.

El cableado se puede adaptar fácilmente a los otros miembros de la familia Mini Maestro siguiendo los esquemas de pines.




 

Código básico para usar el controlador serie Maestro

Para comandar el controlador en serie con un Arduino, se debe enviar una secuencia de bytes a través del puerto en serie. El siguiente código permite al usuario enviar un comando de posición a los diversos canales de un Mini Maestro con el monitor serie Arduino.

Primero, el puerto serie para comunicarse con el Maestro está intiliazied.

#include <Maestro.h>
Maestro maestro(2,3);

Luego, escribimos una función que recibe datos del monitor en serie.

void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c;
   }
 }
}

Por razones prácticas, solo enviamos un comando desde el monitor. Se necesita una función para separar la ID del servo del valor de posición usando el carácter “x”.

void convertMsgToCmd(){
   if (msg.length() >0) {
     Serial.println(msg);
     sep = msg.indexOf('x');     
     m1 = msg.substring(0, sep); //get servo id
     m2 = msg.substring(sep+1, msg.length()); //get servo pos
     
     servoId=-1;
     servoPos=-1; 
    
     char carray1[6]; //magic needed to convert string to a number
     m1.toCharArray(carray1, sizeof(carray1));
     servoId = atoi(carray1);
     
     char carray2[6];
     m2.toCharArray(carray2, sizeof(carray2));
     servoPos = atoi(carray2);
      
     msg="";
 }
}
.

Finalmente, enviamos esos datos al Maestro utilizando elPololu protocol, que se resume mediante una secuencia de bytes que contiene la selección del protocolo, la ID de la placa, la selección del comando y el valor de posición.

void setTarget(unsigned char servo, unsigned int target){
  /* envoie la séquence de commande au contrôleur série Maestro pour actionner le servomoteur*/
  const int deviceId = 0x0C; //controller ID 12
  const int startByte = 0xAA; // Protocol selection
  const int targetCmd = 0x04; // Command ID
  
  maestro.write(startByte); //start byte
  maestro.write(deviceId); //device id
  maestro.write(targetCmd); //command number
  maestro.write(servo); //servo number
  maestro.write(target & 0x7F); // Send first 4bits
  maestro.write((target >> 7) & 0x7F); // Send last 4bits
  delay(3);
}

 

Todos juntos obtenemos el siguiente código:

/*----------------------------------------------------------------------------------------
 Ce programme permet de piloter différents servomoteurs à l'aide du moniteur série.
 Tapez YxZZZZ dans le terminal
 Y entre 0 et 5 pour Mini Maestro 6 voies (selon Maestro)
 ZZZZ entre 4000 et 8000 (selon servomoteur)

 Ex: Tapez 0x6000 dans le moniteur série

  Materiel:
  - 1x servomoteur ou plus
  - 1x Mini Maestro
  - 1x Arduino
  
 Auteur: Xavier Wiedmer
 http://www.aranacorp.com
 
----------------------------------------------------------------------------------------*/
#include "SoftwareSerial.h"
SoftwareSerial maestro(2,3);

String msg, m1, m2;
int sep, servoId=-1, servoPos=-1;


void setup() {
 Serial.begin(9600);
 pinMode(2, INPUT);
 pinMode(3, OUTPUT);
 maestro.begin(9600);
 Serial.println("Waiting for command (YxZZZZ): ");
}

void loop() {

 readSerialPort();
 convertMsgToCmd();
 
    //Apply command to servo
    if (servoId>=0 && servoPos>=0 && servoId<18 && servoPos>=500 && servoPos<=10000) {
     
       setTarget(servoId, servoPos);
       Serial.print("Command ");
       Serial.print(servoPos);
       Serial.print( " sent ");
       Serial.print("to servo ");
       Serial.println(servoId);
   
   servoId=-1;
   servoPos=-1;
   Serial.println("Waiting for command ... ");
 }
}

void setTarget(unsigned char servo, unsigned int target){
  /* envoie la séquence de commande au contrôleur série Maestro pour actionner le servomoteur*/
  const int deviceId = 0x0C; //controller ID 12
  const int startByte = 0xAA; // Protocol selection
  const int targetCmd = 0x04; // Command ID
  
  maestro.write(startByte); //start byte
  maestro.write(deviceId); //device id
  maestro.write(targetCmd); //command number
  maestro.write(servo); //servo number
  maestro.write(target & 0x7F); // Send first 4bits
  maestro.write((target >> 7) & 0x7F); // Send last 4bits
  delay(3);
}

void readSerialPort(){
  /*Permet de lire une commande provenant du terminal Arduino*/
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c;
   }
 }
}

void convertMsgToCmd(){
  /*convertit le message provenant du terminal en commande à envoyer au contrôleur série*/
   if (msg.length() >0) {
     Serial.println(msg);
     sep = msg.indexOf('x');
     // expect a string like 0x0021 containing the two servo positions      
     m1 = msg.substring(0, sep); //get servo id
     m2 = msg.substring(sep+1, msg.length()); //get servo pos
     
     servoId=-1;
     servoPos=-1; 
    
     char carray1[6]; //magic needed to convert string to a number
     m1.toCharArray(carray1, sizeof(carray1));
     servoId = atoi(carray1);
     
     char carray2[6];
     m2.toCharArray(carray2, sizeof(carray2));
     servoPos = atoi(carray2);
      
     msg="";
 }
}

 

Biblioteca para gestionar el controlador serie Maestro

 

Cuando se utilizan placas Maestro en varios proyectos, las reglas de las reglas de comunicación se pueden implementar fácilmente en una biblioteca para reutilizarlas en todos sus proyectos (más información aquí https://www.pololu.com/docs/0J40/all). Puede escribir su propia biblioteca o usar la escrita por Ryan Mulligan en Github.

Para crear una biblioteca, necesitamos escribir dos archivos y guardarlos en Documentos \ Arduino \ bibliotecas \ Maestro.

Archivo Maestro.h

/*****************************************************************\
* Library header : Maestro.h
* Author : X.Wiedmer
* Version : v00
* Date : 05/03/2015
* Revision : 
*   v01 - 05/03/2015
* Description :
* Library to setup Maestro board
* www.aranacorp.com
\*****************************************************************/

#ifndef Maestro_h
#define Maestro_h
// Libraries
#include "Arduino.h"
#include "SoftwareSerial.h" 

/******************************************************************\
* CLASS DESCRIPTION
\******************************************************************/
class Maestro
{
  public:
    Maestro(int pinRx, int pinTx);
	 //~Maestro();
    void setTarget(unsigned char servo, unsigned int target);
    void stop(unsigned char servo);
    void begin(unsigned int baudrate);
    
  private:
    int _pinRx;
    int _pinTx;
    int _id;
    SoftwareSerial *_maestroSerial;
};

#endif

Archivo Maestro.cpp

/*****************************************************************\
* Library : Maestro.cpp
* Author : X.Wiedmer
* Version : v00
* Date : 05/03/2015
* Revision : 
* 	v01 - 05/03/2015
* Description :
* Library to setup Maestro board
* www.aranacorp.com
\*****************************************************************/

//Libraries
#include "Arduino.h"
#include "Maestro.h"
#include "SoftwareSerial.h"

// Parameters
#define DELAY_WRITE 3
//set up maestro configuration
#define deviceId 0x0C //12
#define startByte 0xAA //
// Command list
#define targetCmd 0x04 //


/******************************************************************\
* PRIVATE FUNCTION: Constructor
*
* PARAMETERS:
* ~ void
*
* DESCRIPTIONS:
* object constructor 
\******************************************************************/
Maestro::Maestro(int pinRx, int pinTx)
{
  pinMode(pinRx, INPUT);
  pinMode(pinTx, OUTPUT);
  _pinRx = pinRx;
  _pinTx = pinTx;
  _maestroSerial = new SoftwareSerial(pinRx,pinTx);
}

/******************************************************************\
* PRIVATE FUNCTION: begin
*
* PARAMETERS:
* ~ baudrate (serial port speed)
*
* DESCRIPTIONS:
* Initialize serial port 
\******************************************************************/
void Maestro::begin(unsigned int baudrate)
{
  _maestroSerial->begin(baudrate);
}
/******************************************************************\
* PRIVATE FUNCTION: setTarget
*
* PARAMETERS:
* ~ servo ID number, target specified with integer
*
* DESCRIPTIONS:
* Send sequence of command so that the maestro board send the right
* pwm value to set servo to the desired position
\******************************************************************/
void Maestro::setTarget(unsigned char servo, unsigned int target)
{
  _maestroSerial->write(startByte); //start byte
  _maestroSerial->write(deviceId) ; //device id
  _maestroSerial->write(targetCmd); //command number
  _maestroSerial->write(servo); //servo number
  _maestroSerial->write(target & 0x7F); // Send first 4bits
  _maestroSerial->write((target >> 7) & 0x7F); // Send last 4bits
  delay(DELAY_WRITE);
}

/******************************************************************\
* PRIVATE FUNCTION: stop
*
* PARAMETERS:
* ~ servo ID number
*
* DESCRIPTIONS:
* Send sequence of command so that the maestro send nothing to the
* the servo
\******************************************************************/
void Maestro::stop(unsigned char servo)
{
  _maestroSerial->write(startByte); //start byte
  _maestroSerial->write(deviceId) ; //device id
  _maestroSerial->write(targetCmd); //command number
  _maestroSerial->write(servo); //servo number
  _maestroSerial->write((byte)0x00); // Send first 4bits
  _maestroSerial->write((byte)0x00); // Send last 4bits
  delay(DELAY_WRITE);
}

Lo que cede al siguiente código:

/*----------------------------------------------------------------------------------------
 Ce programme permet de piloter différents servomoteurs à l'aide du moniteur série.
 Tapez YxZZZZ dans le terminal
 Y entre 0 et 5 pour Mini Maestro 6 voies (selon Maestro)
 ZZZZ entre 4000 et 8000 (selon servomoteur)

 Ex: Tapez 0x6000 dans le moniteur série

  Materiel:
  - 1 servomoteur ou plus
  - 1x Mini Maestro
  - 1x Arduino
  
 Auteur: Xavier Wiedmer
 http://www.aranacorp.com
 
----------------------------------------------------------------------------------------*/

#include <Maestro.h>
Maestro maestro(2,3);

String msg, m1, m2;
int sep, servoId=-1, servoPos=-1;

/************** Main Program **************/
void setup() {
 Serial.begin(9600);
 maestro.begin(9600);
 Serial.println("Waiting for command (YxZZZZ): ");
}

void loop() {

 readSerialPort();
 convertMsgToCmd();
 
    //Apply command to servo
    if (servoId>=0 && servoPos>=0 && servoId<18 && servoPos>=500 && servoPos<=10000) {
     
       maestro.setTarget(servoId, servoPos);
       Serial.print("Command ");
       Serial.print(servoPos);
       Serial.print( " sent ");
       Serial.print("to servo ");
       Serial.println(servoId);
   
   servoId=-1;
   servoPos=-1;
   Serial.println("Waiting for command ... ");
 }
}

/************** Functions **************/
void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c;
   }
 }
}

void convertMsgToCmd(){
   if (msg.length() >0) {
     Serial.println(msg);
     sep = msg.indexOf('x');
     
     m1 = msg.substring(0, sep); //get servo id
     m2 = msg.substring(sep+1, msg.length()); //get servo pos
     
     servoId=-1;
     servoPos=-1; //declare as number  
    
     char carray1[6]; //magic needed to convert string to a number
     m1.toCharArray(carray1, sizeof(carray1));
     servoId = atoi(carray1);
     
     char carray2[6];
     m2.toCharArray(carray2, sizeof(carray2));
     servoPos = atoi(carray2);
      
     msg="";
 }
}

No dude en dejar un comentario o escribir un mensaje si tiene algún problema con respecto a su controlador en serie.

Aplicaciones

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Comunicarse con Arduino

Comunicarse con Arduino

La forma más fácil de comunicarse con Arduino es usar el puerto serie. También es la herramienta más poderosa para probar y depurar su código.

Material

  • Ordenador
  • Arduino UNO x2
  • Jumper cable M/M x3

Comunicación con el monitor serie

Las funciones de la biblioteca en serie para saber:

  • Serial.begin() para inicializar la velocidad de comunicación. La comunicación no funcionará si esto no es correcto
  • Serial.print() and Serial.println() para enviar cadenas. El último con un final de línea ‘\ n’
  • Serial.write() para enviar un byte a la vez
  • Serial.available() para verificar si hay datos en el búfer
  • Serial.read() para recibir los datos del puerto

Cargue el siguiente código para probar la comunicación entre la computadora y el Arduino.

char cmd="";
char old_cmd;
boolean enable=false;


void setup(){
  // Initialize serial port
  Serial.begin(9600);
  Serial.println("ENTER Commands:");        
}

void loop(){
  old_cmd=cmd;
  if (Serial.available()){ // Verify that data are available
    cmd=Serial.read();  // Read data on serial port
  } 
  
  if(cmd!=old_cmd){
    if(cmd=='O'){
      Serial.println("Set to ON"); // Send data to serial port
      enable=true;
    }else if(cmd=='F'){
      Serial.println("Set to OFF"); // Send data to serial port
      enable=false;
    }
  }

   if(enable){
      Serial.println("System is running");
      delay(200);
    }
}

Si escribe O, en la barra de comandos del monitor, debería ver la siguiente pantalla:

Comunicación entre dos Arduinos

Es posible utilizar el puerto serie (Rx0,Tx1) utilizado por el puerto USB para comunicarse entre dos placas Arduino. Para ello, basta con conectar las clavijas de la siguiente manera

  • Arduino 1 Rx -> Arduino 2 Tx
  • Arduino 1 Tx -> Arduino 2 Rx
  • Arduino 1 GND -> Arduino 2 GND

PRECAUCIÓN: Si se utilizan placas diferentes, los niveles de tensión pueden no ser compatibles. En este caso, debes utilizar un convertidor de tensión. Consulta la documentación de cada placa.

Como hemos dicho, los pines 0 y 1 son utilizados por el puerto USB. Para evitar conflictos con el monitor de serie, veremos la biblioteca SoftwareSerial que utiliza otros pines del microcontrolador. Los siguientes ejemplos también son posibles con el puerto serie de hardware. Sólo tienes que sustituir “ArduinoSlave” y “ArduinoMaster” por “Serial” en los siguientes códigos.

En general, las técnicas de intercambio de datos que se comentan a continuación son aplicables a todas las comunicaciones en serie.

Comunicación entre dos Arduinos con SoftwareSerial

Es posible comunicarse entre diferentes dispositivos utilizando un puerto serie como dos Arduinos. Uno será programado como “Maestro” (dar órdenes) y el otro como “Esclavo” (recibir orden y reaccionar).

Un puerto serie está definido por dos cables y una velocidad de comunicación. La biblioteca SoftwareSerial.h se utiliza para definir puertos serie. En este ejemplo, elegimos los pines 2 y 3 como pin de recepción (RX) y transmisión (TX) respectivamente (SoftwareSerial ArduinoSlave (2,3);). La velocidad de comunicación es de 9600bps (ArduinoSlave.begin (9600);

ATENCIÓN : Aquí utilizamos los pines 2 y 3 del Arduino UNO. Dependiendo del microcontrolador utilizado, los pines utilizados para la comunicación en serie pueden ser diferentes. Especialmente para las placas Arduino Mega, Micro, Leonardo. Comprueba la documentación.

Para establecer una comunicación correcta, los paneles deben identificarse adecuadamente y mostrarse en los siguientes esquemas.

En nuestro ejemplo, la placa maestra envía datos y la placa esclava los recibe y los devuelve.

Código “maestro”

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
char cmd="";
char old_cmd;
char answer="";
char old_answer;

void setup(){
  Serial.begin(9600);
  Serial.println("ENTER Commands:");
  ArduinoSlave.begin(9600);            
}

void loop(){
  old_cmd=cmd;
  old_answer=answer;
  //Read command from monitor
  if (Serial.available()){
    cmd=Serial.read();
  } 
  //Read answer from slave
  if (ArduinoSlave.available()){
    answer=ArduinoSlave.read();
  } 
  //Send data to slave
  if(cmd!=old_cmd){
    Serial.print("Master sent : ");
    Serial.println(cmd);
    ArduinoSlave.write(cmd);
  }
  //Send answer to monitor
  if(answer!=old_answer){
    Serial.print("Slave received : ");
    Serial.println(answer);
  }
}

Código “esclavo”

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);
char cmd="";
char old_cmd;

void setup(){
  ArduinoMaster.begin(9600);    
}

void loop(){
  old_cmd=cmd;
  // Read data from master
  if (ArduinoMaster.available()){
    cmd=ArduinoMaster.read();
  } 
  // Send answer to master
  if(cmd!=old_cmd){
    ArduinoMaster.write(cmd);
  }
}

En el monitor en serie de la placa maestra, debería ver la respuesta de la placa esclava.

Con este código puede enviar y recibir un byte a la vez. Los caracteres se codifican siguiendo la tabla ASCII. Consulte la tabla ASCII para ver cómo están codificados. Algunos caracteres no se pueden enviar, como “°” o acentos “é”.

Juega con datos

ara algunos proyectos, necesitará obtener más información sobre los diferentes tipos de valor. Una solución rápida es convertir el valor en una cadena y enviarlo con la función print ().

Código maestro

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
String msg;

void setup(){

  Serial.begin(9600);
  Serial.println("ENTER Commands:");
  ArduinoSlave.begin(9600);
                
}

void loop(){
  //Read command from monitor
  readSerialPort();
  
  //Send data to slave
  if(msg!=""){
    Serial.print("Master sent : ");
    Serial.println(msg);
    ArduinoSlave.print(msg);
    msg="";
  }

}

void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c; //add to String
   }
 }
 Serial.flush(); //clean buffer
}

Código esclavo

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);
String msg;

void setup(){
  Serial.begin(9600);
  ArduinoMaster.begin(9600);    
}

void loop(){
  readMasterPort();
  
  // Send answer to master
  if(msg!=""){
    ArduinoMaster.print(msg);
    Serial.print("Master sent : " );
    Serial.println(msg);
    msg=""; 
  }
}

void readMasterPort(){
 while (ArduinoMaster.available()) {
   delay(10); 
   if (ArduinoMaster.available() >0) {
     char c = ArduinoMaster.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
     Serial.println(msg);
   }
 }
 ArduinoMaster.flush();
}

Con este código puede enviar cualquier tipo de datos.

Una vez que la comunicación está configurada correctamente y las placas pueden intercambiar datos, puede pensar en cómo usarlo.

Enviar y recibir valor del sensor

Un buen ejemplo de una aplicación es cambiar el brillo de un LED conectado a la placa Slave usando un sensor conectado a la placa Master. A medida que obtenemos los datos en forma de una cadena, tenemos que convertirlos en un entero. La función para realizar la conversión es atoi (). El valor PWM del LED está entre 0 y 255, el valor del sensor entre 0 y 1023 debe convertirse a la función map ().

Código maestro para leer y enviar el valor del sensor

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
String answer;
String msg;
int intVal=0,oldIntVal=0;

void setup(){

  Serial.begin(9600);
  Serial.println("ENTER Commands:");
  ArduinoSlave.begin(9600);
                
}

void loop(){
  //Read sensor
  intVal=analogRead(A0);
  //Read answer from slave
  readSlavePort();
  
  //Send data to slave
  if(oldIntVal!=intVal){
    Serial.print("Master sent : ");
    Serial.println(intVal);
    ArduinoSlave.print(intVal);
    oldIntVal=intVal; 
  }
  //Send answer to monitor
  if(answer!=""){
    Serial.print("Slave LED PWM value : ");
    Serial.println(answer);
    answer="";
  }
  delay(1000);
}

void readSlavePort(){
  while (ArduinoSlave.available()) {
   delay(10);  
   if (ArduinoSlave.available() >0) {
     char c = ArduinoSlave.read();  //gets one byte from serial buffer
     answer += c; //makes the string readString
   }
 }
}

Código esclavo para recibir y usar el valor del sensor

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);

#define ledPin 11

String msg="";
int ledVal=0;
int intVal=0,oldIntVal=0;

void setup(){
  Serial.begin(9600);
  ArduinoMaster.begin(9600);
  pinMode(ledPin,OUTPUT);    
}

void loop(){
  readMasterPort();
  convertMsgToCmd();
  // Send answer to master
  if(intVal!=oldIntVal){
    Serial.print("Master sent : " );
    Serial.println(intVal);

    ledVal=map(intVal,0,1023,0,255);
    Serial.print("led value : ");
    Serial.println(ledVal);
    ArduinoMaster.print(ledVal);
    analogWrite(ledPin,ledVal);
    oldIntVal=intVal; 
  }
}

void readMasterPort(){
 while (ArduinoMaster.available()) {
   delay(10); 
   if (ArduinoMaster.available() >0) {
     char c = ArduinoMaster.read();  //gets one byte from serial buffer
     
     msg += c; //makes the string readString
   }
 }
 ArduinoMaster.flush();
}

void convertMsgToCmd(){
   if (msg.length() >0) {
    Serial.print("message length : ");
    Serial.println(msg.length());
    
     char carray1[6]; //magic needed to convert string to a number
     msg.toCharArray(carray1, sizeof(carray1));
     intVal = atoi(carray1);
     
     msg="";
 }
}

Enviar y recibir dos valores de sensor

Para recibir diferentes valores, la idea es definir un separador. En este caso, usamos el carácter “x”. Luego, simplemente ubique el carácter en la cadena usando la función indexOf ().

Código maestro para leer y enviar dos valores de sensor

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
String answer;
String msg;
int intVal1=0,oldIntVal1=0;
int intVal2=0,oldIntVal2=0;


void setup(){
  Serial.begin(9600);
  Serial.println("ENTER Commands:");
  ArduinoSlave.begin(9600);
                
}

void loop(){
  //Read sensors
  intVal1=analogRead(A0);
  intVal2=analogRead(A1);
  
  //Send data to slave
  if(oldIntVal1!=intVal1 || oldIntVal2!=intVal2 ){
    Serial.print("Master sent : ");
    Serial.print(intVal1);
    Serial.print("x");
    Serial.println(intVal2);
    
    ArduinoSlave.print(intVal1);
    ArduinoSlave.print("x");
    ArduinoSlave.print(intVal2);
    oldIntVal1=intVal1;
    oldIntVal2=intVal2;
  }
  delay(1000);
  //Read answer from slave
  readSlavePort();
  
  //Send answer to monitor
  if(answer!=""){
    Serial.println("Slave received : ");
    Serial.println(answer);
    answer="";
  }
  
}

void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
   }
 }
 Serial.flush();
}

void readSlavePort(){
  while (ArduinoSlave.available()) {
   delay(10);  
   if (ArduinoSlave.available() >0) {
     char c = ArduinoSlave.read();  //gets one byte from serial buffer
     answer += c; //makes the string readString
   }
 }
}

Código esclavo para recibir dos valores de sensor

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);

String msg="",m1="",m2="";
int num1=-1,num2=-1;
int sep;

void setup(){
  Serial.begin(9600);
  ArduinoMaster.begin(9600);
}

void loop(){
  readMasterPort();
  convertMsgToMultiCmd();
  // Send answer to master
  if(num1!=-1 && num2!=-1){
    Serial.print("Sensor 1 : " );
    Serial.println(num1);

    Serial.print("Sensor 2 : " );
    Serial.println(num2);

    ArduinoMaster.print("Sensor 1 : " );
    ArduinoMaster.println(num1);

    ArduinoMaster.print("Sensor 2 : " );
    ArduinoMaster.println(num2);
    num1=-1;
    num2=-1;
  }
}

void readMasterPort(){
 while (ArduinoMaster.available()) {
   delay(10); 
   if (ArduinoMaster.available() >0) {
     char c = ArduinoMaster.read();  //gets one byte from serial buffer
     
     msg += c; //makes the string readString
   }
 }
 ArduinoMaster.flush();
}


void convertMsgToMultiCmd(){
   if (msg.length() >0) {
    Serial.print("message length : ");
    Serial.println(msg.length());
     sep = msg.indexOf('x');
     //Serial.println(sep);    
     m1 = msg.substring(0, sep); //get servo id
     m2 = msg.substring(sep+1, msg.length()); //get servo pos 
    
     char carray1[6]; //magic needed to convert string to a number
     m1.toCharArray(carray1, sizeof(carray1));
     num1 = atoi(carray1);
     
     char carray2[6];
     m2.toCharArray(carray2, sizeof(carray2));
     num2 = atoi(carray2);
      
     msg="";
 }
}

Enviar y recibir múltiples datos

Es posible que en su aplicación necesite intercambiar una gran cantidad de datos entre dos tarjetas. En este caso, debe cambiar ligeramente la función de conversión. En nuestro ejemplo, suponemos que queremos controlar el estado de un led, la velocidad y la dirección de un motor.

Código maestro para enviar múltiples datos

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
String answer;
String msg;
int intVal1=0,oldIntVal1=0;
int intVal2=0,oldIntVal2=0;


void setup(){

  Serial.begin(9600);
  Serial.println("ENTER Commands:");
  ArduinoSlave.begin(9600);
                
}

void loop(){
  //Read command from monitor
  readSerialPort();
 
  //Read answer from slave
  readSlavePort();
  
  //Send data to slave
  if(msg!=""){
    Serial.print("Master sent : ");
    Serial.println(msg);
    ArduinoSlave.print(msg);
    msg="";
  }
  
  //Send answer to monitor
  if(answer!=""){
    Serial.print("Slave received : ");
    Serial.println(answer);
    answer="";
  }
  delay(1000);
}

void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
   }
 }
 Serial.flush();
}

void readSlavePort(){
  while (ArduinoSlave.available()) {
   delay(10);  
   if (ArduinoSlave.available() >0) {
     char c = ArduinoSlave.read();  //gets one byte from serial buffer
     answer += c; //makes the string readString
   }
 }
}

Código esclavo para recibir y usar múltiples datos

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);

String msg="";
int ledVal=0;
int sep;
String data[3];
unsigned int data_count=0;

void setup(){
  Serial.begin(9600);
  ArduinoMaster.begin(9600);
}

void loop(){
  readMasterPort();
  convertMsgToMultiCmd();

  //Use data
  if(data_count==3){
    for(int i=0;i<(data_count+1);i++){
      switch(i){
        case 0: //led status
          if(data[0]=="ON"){
            Serial.println("Switch led ON");
          }else if(data[0]=="OFF"){
            Serial.println("Switch led OFF");
          }else{
            Serial.println("Led wrong command");
          }
        break;
        case 1: //motor PWM
           Serial.print("Set motor power to : ");
           Serial.println(stringToInt(data[1]));
        break;
        case 2: //motor direction
           if(data[2]=="forward"){
            Serial.println("Motor direction forward");
          }else if(data[2]=="backward"){
            Serial.println("Motor direction backward");
          }else{
            Serial.println("Motor wrong command");
          }
        break;
        
      }
    }
    data_count=0;
  }
  
}

void readMasterPort(){
 while (ArduinoMaster.available()) {
   delay(10); 
   if (ArduinoMaster.available() >0) {
     char c = ArduinoMaster.read();  //gets one byte from serial buffer
     
     msg += c; //makes the string readString
   }
 }
 ArduinoMaster.flush();
}


void convertMsgToMultiCmd(){
  
   if (msg.length() >0) {
    data_count=0;
    Serial.print("Master sent : ");
    Serial.println(msg);//Serial.println(msg.length());
    do{
      sep = msg.indexOf('x');
       // expect a string like 0x0021 containing the two servo positions      
       String m1 = msg.substring(0, sep); //get servo id
       msg = msg.substring(sep+1, msg.length()); //get servo pos 
      data[data_count]=m1;
      data_count++;
    } while(sep!=-1);
    
    Serial.println("data received : "); 
    for(int i=0;i<(data_count+1);i++) Serial.println(data[i]); 
     msg="";
 }
}

int stringToInt(String s){
     char carray1[6]; //magic needed to convert string to a number
     s.toCharArray(carray1, sizeof(carray1));
     return atoi(carray1);
}

Una vez que pueda recibir y separar los datos, puede usarlos como desee. Convierta a valor de sensor entero o use una cadena específica para activar acciones.

Con este conocimiento básico, debería poder comunicarse entre sí como un serial servo controller, Bluetooth module u otro microcontrolador como Raspberry Pi .

Si tiene dificultades para establecer una comunicación entre dos dispositivos o si desea decir algo más, deje un comentario o envíenos un mensaje.

Aplicaciones

Fuentes

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Tu Arduino se comunica con el módulo HC-05

Tu Arduino se comunica con el módulo HC-05

Tu tarjeta electronica Arduino puede comunicarse con otros dispositivos (smartphone, computadora u otros microcontroladores) a través de Bluetooth usando un módulo HC-05 (Maestro / Esclavo). Esto permite conectar la tarjeta Arduino a otro sistema para enviar y recibir datos. La comunicación a través de Bluetooth permite, por ejemplo, controlar un robot a través de una aplicación de smartphone, recuperar las mediciones de un sensor en tu computadora o permitir que dos robots se comuniquen entre ellos.

Materiales

  • Computadora
  • Tarjeta Arduino UNO x2
  • Cable USB para conectar el Arduino a la computadora x2
  • Modulo Bluetooth HC-05 ZS-040 x2 (o 1x HC-06 y 1x HC-05) 
  • Cables Dupont M/F

Presentacion del modulo Bluetooth HC-05

El módulo Bluetooth HC-05 tiene 6 pines para realizar la conexión.

  • Fuente de alimentación VCC pin. Normalmente conectado al pin 5V del Arduino.
  • Masa GND. Normalmente conectado al pin GND del Arduino.
  • Pin de recepción RX. Normalmente conectado al pin de transmisión Arduino (TX)
  • Pin de transmisión TX. Normalmente conectado al pin de recepción Arduino (RX)
  • Estado devuelve 1 cuando el módulo está conectado
  • La llave o la EN deben estar encendidas para ingresar al modo de configuración y no deben estar conectadas para estar en modo de comunicación.

La característica especial del módulo Bluetooth HC-05 es que se puede usar en modo esclavo (en este caso es equivalente a un módulo HC-06 y se usa de la misma manera o en modo maestro, lo que significa que puede conectarse de manera autónoma a otro módulo Bluetooth (HC-06, HC-05 en modo esclavo u otro) sin acción externa.

Diagrama de cableado para la configuración


CUIDADO:

  • usamos los pin 2 y 3 de Arduino Uno. Dependiendo del microcontrolador, algunos pines pueden no ser compatibles con la comunicación SoftwareSerial. Especialmente, Arduino Mega, Micro y Leonardo. Consultar la documentacion.
  • La lógica del módulo Bluetooth es 3.3V, se recomienda usar un puente divisor de voltaje para reducir el voltaje de 5V Arduino

Configuracion del modulo HC-05

La configuración del módulo Bluetooth puede ser interesante para verificar el funcionamiento correcto del módulo y para modificar sus parámetros, especialmente cuando se quiere usar el módulo en modo maestro. El módulo debe estar encendido pero no emparejado, y el pin Clave / EN debe recibir alimentación a 3 V cuando el módulo está encendido. Cuando el módulo está en modo de configuración, el LED se ilumina durante dos segundos cada dos segundos.

Abra el monitor de serie de Arduino y asegúrese de que la opción de final de línea muestre “Nueva linea” y que la velocidad en baudios esté establecida en 9600.

Tenga en cuenta que el módulo Bluetooth HC-05 ingresa al modo AT con una velocidad de comunicación (velocidad en baudios) de 38400 bps.

Codigo de configuracion

El siguiente código se utiliza para modificar los parámetros del módulo HC-05 (nombre, código PIN, velocidad de comunicación (velocidad en baudios), etc.) y para encontrar información como el número de versión del firmware.

#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
#define baudrate 38400

String msg;

SoftwareSerial hc05(rxPin ,txPin);

void setup(){
  pinMode(rxPin,INPUT);
  pinMode(txPin,OUTPUT);
  
  Serial.begin(9600);
  Serial.println("ENTER AT Commands:");
  hc05.begin(baudrate);
}

void loop(){
    readSerialPort();
    if(msg!="") hc05.println(msg);
    
    if (hc05.available()>0){
      Serial.write(hc05.read());
    }
}

void readSerialPort(){
  msg="";
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
   }
 }
}

Comandos de configuracion

Además del hecho de que se puede utilizar en modo maestro, el módulo Bluetooth HC-05 también le permite conocer sus parámetros guardados.

En general, si escribe en el monitor serie AT+<command>?, obtiene el valor guardado en el módulo (por ejemplo, AT + PSWD? para conocer el código PIN del módulo). Si entras en la linea AT+<command>=<Param>, Usted establece el valor del modulo (ej: AT+PWSD=0000 para modificar el codigo PIN en 0000).

Aquí hay algunos comandos básicos de AT:

  • Para probar la comunicación, escribeAT En la serie monitor del IDE de Arduino. Si todo está bien, el módulo debe responder OK.
  • Para cambiar el nombre del módulo, escribe AT+NAME=<Param> modulo. El módulo debe responder OK. (Ej: Para cambiar el nombre del módulo a tipo BTM1 escribe AT+NAME=BTM1)
  • Para cambiar el código PIN del módulo, escribe AT+PSWD=<Param> . El módulo debe responder OK. (Ej: si quieres cambiar el PIN en 0000 escribe AT+PSWD=0000)
  • AT+ROLE=<Param> para modificar la función del módulo esclavo o maestro (por ejemplo, para pasar el módulo a master AT + ROLE = 1).
  • Para cambiar la velocidad de comunicación del módulo (solo si es necesario), escriba AT+UART=<Param1>,<Param2>,<Param3>
    202/5000
    con Param1, 2 y 3 los parámetros de comunicación en serie: la velocidad de transmisión, el bit de parada y el bit de paridad respectivamente. (Por defecto, 9600,0,0 Ej .: si desea cambiar la velocidad en baudios en el tipo 115200 escribe AT+UART=115200,0,0).

Existen otros comandos AT del módulo Bluetooth HC-05 que puedes encontrar siguiendo el enlace.

PRECAUCIÓN: Existen diferentes versiones del módulo HC-05 y la lista de comandos AT y el procedimiento pueden variar. Verifique el número de serie escrito en el módulo y la versión del firmware escribiendo AT + VERSION? En nuestro caso, el módulo HC-05 está etiquetado como ZS-040 y la versión es 2.0-20100601.

N.B .: Si no funciona, compruebe la conexión, la conductividad de los cables y la velocidad de comunicación (velocidad en baudios).

No dude en dejar un comentario si tiene problemas para configurar su módulo Bluetooth HC-05.

Configuración del módulo esclavo

Para el modo esclavo, puede cambiar el nombre escribiendo AT + NAME = HC05-Slave y elegir los parámetros de comunicación y la contraseña que desee. Deberá asegurarse de que sean iguales a los del módulo maestro.

  • AT retourne OK
  • AT+NAME=HC05-Slave
  • AT+UART=9600,0,0
  • AT+ROLE=0
  • Ingrese AT + ADDR para obtener la dirección del módulo esclavo (en nuestro caso, +ADDR:98d3:32:21450e)

Para el módulo esclavo, también puedes usar un módulo HC-06.

Configuracion del Modulo Maestro

Para el modo maestro, se debe cambiar la función del módulo y elegir los mismos parámetros de comunicación que para el módulo esclavo

  • AT retorno OK
  • AT+NAME=HC05-Master
  • AT+UART=9600,0,0
  • AT+ROLE=1
  • Se debe registrar la dirección del módulo esclavo para que el módulo maestro pueda emparejarse: AT + BIND = 98d3,32,21450e (reemplace los dos puntos “:” con comas “,”)

Diagrama de cableado para la comunicación

En el modo de comunicación, el pin Clave / EN no debe estar encendido.

Cuidado:

  • Utilizamos los pines 2 y 3 de Arduino Uno. Dependiendo del microcontrolador, algunos pines pueden no soportar la comunicación en serie. Especialmente, Arduino Mega, Micro y Leonardo. Consulta la documentación.
  • Dado que el módulo Bluetooth utiliza la lógica de 3,3V, se aconseja añadir un divisor de tensión para reducir la tensión de 5V de Arduino. (resistencia 1k entre pin3 y Rx; 2k Ohm entre Rx y GND).

Codigo de comunicacion

Cuando los módulos están configurados, puede desenchufar la llave de contacto o EN, cargar los siguientes códigos en dos placas Arduino y encender su HC-05 para ingresar al modo de comunicación.

En cuanto al módulo HC-06, usamos la biblioteca SoftwareSerial.h que aquí tiene algunas funciones:

  • SoftwareSerial hc05(Rx,Tx) Para definir el puerto serie y los pines para la comunicación
  • hc05.begin()para establecer la velocidad de comunicación
  • hc05.available()para probar si los datos están disponibles en el búfer del puerto serie
  • hc05.read()para leer datos de puerto serie, un byte a la vez
  • hc05.print()para enviar una cadena en ASCII
  • hc05.write()para enviar datos, un byte a la vez.
  • hc05.flush()para vaciar los datos del buffer

Codigo Maestro

#include <SoftwareSerial.h>

SoftwareSerial ArduinoSlave(2,3);
String answer;
String msg;

void setup(){

  Serial.begin(9600);
  Serial.println(F("ENTER Commands:"));
  ArduinoSlave.begin(9600);
                
}

void loop(){
  //Read command from monitor
  readSerialPort();
  
  //Read answer from slave
   while (ArduinoSlave.available()) {
   delay(10);  
   if (ArduinoSlave.available() >0) {
     char c = ArduinoSlave.read();  //gets one byte from serial buffer
     answer += c; //makes the string readString
   }
 }
  //Send data to slave
  if(msg!=""){
    Serial.print(F("Master sent : "));
    Serial.println(msg);
    ArduinoSlave.print(msg);
    msg="";
  }
  //Send answer to monitor
  if(answer!=""){
    Serial.print(F("Slave recieved : "));
    Serial.println(answer);
    answer="";
  }
}

void readSerialPort(){
 while (Serial.available()) {
   delay(10);  
   if (Serial.available() >0) {
     char c = Serial.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
   }
 }
 Serial.flush();
}

Code Esclave

#include <SoftwareSerial.h>

SoftwareSerial ArduinoMaster(2,3);
String msg;

void setup(){
  Serial.begin(9600);
  ArduinoMaster.begin(9600);    
}

void loop(){
  readSerialPort();
  
  // Send answer to master
  if(msg!=""){
    Serial.print(F("Master sent : ") );
    Serial.println(msg);
    ArduinoMaster.print(msg);
    msg=""; 
  }
}

void readSerialPort(){
 while (ArduinoMaster.available()) {
   delay(10); 
   if (ArduinoMaster.available() >0) {
     char c = ArduinoMaster.read();  //gets one byte from serial buffer
     msg += c; //makes the string readString
   }
 }
 ArduinoMaster.flush();
}

Si abre los dos monitores en serie correspondientes y escribe un comando en el monitor de la tarjeta maestra, puede ver el siguiente resultado: la tarjeta maestra envía una cadena de caracteres que la tarjeta esclavo recibe y devuelve. Esto asegura que la comunicación vaya bien en ambas direcciones.

Si tiene problemas para configurar o comunicarse con su módulo Bluetooth HC-05, no dude en contactarnos o dejar un comentario.

Application

¿Y qué harías si tu placa Arduino pudiera comunicarse con otros sistemas? No dudes en respondernos en el comentario.

Source

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código

Crear una aplicación con App Inventor 2

Crear una aplicación con App Inventor 2

Aprende cómo crear una aplicación para Android de manera muy simple usando App Inventor 2.

En los campos de la robótica y los objetos conectados, una de las características más interesantes de implementar es el control remoto de un proyecto electrónico. Ya sea para mostrar las mediciones desde tu casa o para conducir un dron, una posible solución es desarrollar una aplicación de teléfono inteligente y comunicarse con un microcontrolador mediante una conexión Bluetooth. Esta aplicación se puede crear rápidamente usando el software en línea de MIT, App Inventor 2 (AI2).

Material

  • Ordenador
  • Smartphone Android con una aplicación de lector de código QR
  • Arduino UNO
  • Bluetooth HC-06
  • Cable Dupont F/M

Creación de la aplicación AI2

En este ejemplo, creamos una aplicación para habilitar una función (ON / OFF) y recuperar una medición de sensor de una placa Arduino. Este tutorial se puede aplicar para muchas otras aplicaciones.
Registrate en el sitio web App Inventor 2.

Crear un nuevo proyecto myApp

Aparece la pantalla de diseño del proyecto.

Configuracion de la aplicación AI2

Para crear el diseño de nuestra aplicación, utilizamos los objetos disponibles en las pestañas en el menú desplegable a la izquierda de la pantalla y modificamos sus parámetros que aparecen a la derecha de la pantalla.

En la interfaz del usuario, agregue un objeto de etiqueta y cámbiele el nombre a titleLbl. Contendrá el título de la aplicación myApp.

En el diseño, agregue un objeto VerticalArrangement que alinee los objetos verticalmente.

En el objeto VerticalArrangement, coloque una etiqueta btStatusLbl y luego un ListPicker btBtn que se usará para administrar la conexión Bluetooth.

Luego, agregue una etiqueta sensorLbl que contendrá el valor recibido de la placa Arduino.

Agregue un arreglo horizontal que le permita organizar y alinear objetos horizontalmente y que contendrá los botones para activar la función Arduino.

En el arreglo horizontal, agregue dos botones onBtn y offBtn.

Finalmente, en Conectividad, agregue un objeto BluetoothClient que nos permita interactuar con el dispositivo Bluetooth.

Y en Sensor, agregue dos objetos Reloj, que recibirán y enviarán datos en un intervalo de tiempo regular.

Puede personalizar su aplicación a su gusto utilizando diferentes colores, fuentes o imágenes.

Programación de la Aplicación AI2

Para programar la aplicación, AI2 propone utilizar el Scratch lo que hace posible crear un programa en forma de diagrama de bloques. Muy fácil de usar pero requiere cierta lógica de programación.
Todas las funciones están disponibles haciendo clic en los objetos en el menú desplegable a la izquierda de la pantalla. Explore las funciones de los objetos que ha agregado a la aplicación, así como las de los objetos de Variables, Texto, Matemáticas y Control que usaremos.

Cree una lista de los módulos Bluetooth disponibles en el dispositivo.

Gestione el establecimiento de la conexión y cambie el estado según la conexión.

Se define una variable global “comando” para mantener en la memoria el valor dado por el último botón presionado (ON u OFF).

Enviamos el valor de la variable de comando a través de Bluetooth, si está conectado, con una frecuencia definida por el objeto Clock1.

Para recuperar el valor del sensor enviado desde Arduino, verificamos si los datos están disponibles en el búfer con una frecuencia definida por Clock2. Luego mostramos este valor en sensorLbl.

Código completo

Una vez colocados y configurados todos los bloques en la interfaz, el código debería tener el siguiente aspecto.

Compila y comparte tu aplicación

Una vez que este programa en Scratch esté configurado correctamente y no se muestren errores, consiga una aplicación de lector de código QR y compile el programa utilizando la función Build & gt; Aplicación (proporcionar código QR para .apk)

Una vez que se haya generado el código QR, puede descargar e instalar la aplicación en su teléfono inteligente.

Puede compartir el instalador .APK para que otros puedan instalar su aplicación en un teléfono Android. Además, puede compartir su proyecto como un archivo AIA para que otros puedan usar y modificar su aplicación.
Exportar para crear el archivo AIA correspondiente en su computadora

Importar para abrir un archivo AIA en la aplicación en línea y editar el proyecto

Código Arduino

Aquí está el código para cargar en la placa Arduino para recibir y enviar datos al puerto serie.

#include <SoftwareSerial.h>

SoftwareSerial hc06(2,3);

String cmd="";
float sensor_val=0;

void setup(){
  //Initialize Serial Monitor
  Serial.begin(9600);
  //Initialize Bluetooth Serial Port
  hc06.begin(9600);
}

void loop(){
  //Read data from HC06
  while(hc06.available()>0){
    cmd+=(char)hc06.read();
  }

  //Select function with cmd
  if(cmd!=""){
    Serial.print("Command recieved : ");
    Serial.println(cmd);
    // We expect ON or OFF from bluetooth
    if(cmd=="ON"){
        Serial.println("Function is on");
    }else if(cmd=="OFF"){
        Serial.println("Function is off");
    }else{
        Serial.println("Function is off by default");
    }
    cmd=""; //reset cmd
  }
  // Simulate sensor measurement
  sensor_val=(float)random(256); // random number between 0 and 255
    
  //Write sensor data to HC06
  hc06.print(sensor_val);
  delay(100);
}


Resultado

Podemos habilitar y deshabilitar la función del Arduino y recibir datos de un sensor en la aplicación

No dude en dejar un comentario o contactarnos Si necesita ayuda para crear su aplicación o si cree que falta información en este tutorial.

Applications

Sources

Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código