Control remoto Mbot Ranger Enlace Bluetooth con HC_08 y Lora E32 ttl-100

En construcción….

Comunicación Serie

Para comunicar la placa Me con otros dispositivos disponemos del puerto 5 que esta conectado interiormente con el Serial2 (Tx2/Rx2) de la placa Me Auriga.

Con un cable RJ25 vamos a cortar uno de los extremos para disponer de cuatro hilos correspondientes a la conexión Serial2. Los extremos se conectarán a cuatro terminaciones hembra que permita la conexión con el módulo bluetooth Hc_08.

Previamente configuraremos el módulo como “esclavo” a la velocidad de 115200 Bd.

Conexión dupont con 4 hilos; con TX2-RX2-GND-+5v

Prepararemos otro módulo HC-08 configurado como master que ira conectado a un arduíno Nano que hará de control remoto para probar, por ejemplo, el movimiento del Ranger

Si no se quiere utilizar el Bluetooth, quitaremos el modulo y tendremos los cuatro hilos listos para conectar con otro puerto serie directamente.

Independientemente del código utilizado ,en el void setup() del sketch del arduino Nano, tendremos que incluir las ordenes de emparejamiento:

#include <SoftwareSerial.h>

SoftwareSerial hc_8(3,2);

void setup()
{
 
  hc_8.begin(115200);

  hc_8.println(String("AT+RESET"));
  delay(1000);
  hc_8.println(String("AT"));
  delay(1000);
  hc_8.println(String("AT+INQ"));
  delay(1000);
  hc_8.println(String("AT+CONN1"));
  delay(1000);

}

De esta forma se emprejarán con seguridad y estarán listos para intercomunicarse.

PRÁCTICA DE CONTROL DE MOVIMIENTO DEL MBOT RANGER CON ENLACE BT HC_08

Vamos a controlar el Ranger con un minijoystick conectado a un arduíno Nano y un enlace BT con HC-08

SKETCH EN ARDUINO NANO

#include <SoftwareSerial.h>

SoftwareSerial hc_8(3,2);

void setup()
{
 
  hc_8.begin(115200);

//PROTOCOLO DE EMPAREJAMIENTO CON SCANEO DE TRES DISPOSITIVOS 
  

hc_8.println("AT+RESET");
  delay(1000);
   hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN1");
delay(5000);
hc_8.println("AT+RESET");
  delay(1000);
  hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN2");
delay(5000);
   hc_8.println("AT+RESET");
  delay(1000);
  hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN3");
delay(5000);


}

void loop(){
CONFIGURACIÓN EJE X Y EJE Y DEL MINIJOYSTICK
 int  vrx=map(analogRead(A0),0,1023,0,5);
 int  vry=map(analogRead(A3),0,1023,0,5);
if (vrx>=4) {// PONGO 4 Y NO 5 PARA ASEGURARME
      hc_8.println(String("L"));
      delay(100);
}
else if(vrx<=1){//  IGUAL MANERA ME ASEGURO UN NIVEL BAJO POR DEBAJO DE 1,PUES SI PONGO 0 PODRÍA NO ACTIVARSE
  hc_8.println(String("R"));
      delay(100);
}
 if (vry>=4) {
      hc_8.println(String("B"));
      delay(100);
}
else if(vry<=1){
  hc_8.println(String("F"));
      delay(100);
} 
}

SKETCH DE LA PLACA ME AURIGA

#include <RobotMovil.h>

RobotMovil robot(46,47,10,49,48,11);// ver el pineado de motores encoder M1 y M2
char btcode;

void setup()
{
  Serial2.begin(115200);// activamos el puerto de comunicaciones Serial2 que esta en el puerto 1
}

void loop()
{
  if (Serial2.available()>0)
  {
    btcode=Serial2.read();
  }
  switch (btcode)
  {
    case 'F':
      robot.forward(100,100,100);
      break;
    case'B':
      robot.reverse(100,100,100);
      break;
    case 'R':
      robot.rotate(50);
      break;
    case 'L':
      robot.rotate(-50);
      break;
    default:
      robot.brake(0);
      btcode='X';
  }
}

EMPAREJAMIENTO MEDIANTE PULSADOR

#include <SoftwareSerial.h>

SoftwareSerial hc_8(3,2);


void pair(){
  hc_8.println("AT+RESET");
  delay(1000);
   hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN1");
delay(5000);
hc_8.println("AT+RESET");
  delay(1000);
  hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN2");
delay(5000);
   hc_8.println("AT+RESET");
  delay(1000);
  hc_8.println("AT+INQ");
  delay(2000);
  hc_8.println("AT+CONN3");
delay(5000);
}

void setup(){
 pinMode(4, INPUT);
 hc_8.begin(115200);

}

void loop(){
if (digitalRead(4)==LOW){
  pair();
}
}

Enlace mediante módulo Lora As32/ttl-100

VEHICULO

#include <RobotMovil.h>
#include <MeAuriga.h>
//#include <Wire.h>
int pos1;
int pos2;
int pos3;
MeUltrasonicSensor ultraSensor(PORT_6);

RobotMovil robot(46,47,10,49,48,11);// ver el pineado de motores encoder M1 y M2
MePort port10(PORT_10);
MePort port9(PORT_9);
Servo servo1;  
Servo servo2;  
Servo servo3;
int16_t servo1pin =  port10.pin1();//conecta el servo1 al PORT_10 SLOT1 
int16_t servo2pin =  port10.pin2();//conecta el servo2 al PORT_10 SLOT2 
int16_t servo3pin =  port9.pin1();//conecta el servo3 al PORT_9 SLOT 1
int PIN_temperatura = A0;
float temperatura;
int i=0;

void setup(){
    Serial.begin(9600);
  
  servo1.attach(servo1pin);  
  servo2.attach(servo2pin); 
  servo3.attach(servo3pin);
  Serial2.begin(115200);
  Serial3.begin(115200);
  pos1=90;
  pos2=90;
  pos3=90;
   
 }

void loop(){
int back=map(analogRead (A12),0,1023,0,6);
  int ultrasound=ultraSensor.distanceCm();
 
while (ultrasound<=20){
  Serial3.println("tone100");
    delay(250);
     Serial2.println("!!F!!");
    robot.reverse(50,50,200);
  
   break;
     }
while (back==0){
Serial3.println("tone100");
    delay(250);
    Serial2.println("!!B!!");
    delay(250);
  robot.forward(50,50,200);
    break;
   
 }
     float v_temperatura = analogRead (PIN_temperatura);
  // Calcula o valor da temperatura
  temperatura = 1.0 / (log(v_temperatura/(1023-v_temperatura)) / 3375.0 + 1/298.15) - 273.15;
  String Rx=Serial2.readStringUntil('\n');
  
 while((Rx).indexOf("D4")!=-1) {
  delay(250);
        Serial2.println(temperatura);
    delay(500);
   break;
 }
while((Rx).indexOf("D6")!=-1) { 
    delay(250);
    Serial2.print(ultrasound);
     delay(500);
   break; 
  }
  if ((Rx).indexOf("M8")!=-1) {
      for (pos1 = pos1; pos1 >= 45; pos1  -= 1){
        servo1.write(pos1);
       delay(50);
        }
        for (pos2 = pos2; pos2 <= 135; pos2 += 1){
          delay(50);
         servo2.write(pos2);
        }
           
         for (pos3 = pos3; pos3 <=90; pos3 += 1){
        delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 >=90; pos3 -= 1){
        delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 <= 90; pos3 += 1){
          delay(5);
         servo3.write(pos3);
         }
       
  
         
            
          }
  
 if ((Rx).indexOf("M9")!=-1) {
      for (pos1 = pos1; pos1 <= 90; pos1  += 1){
        servo1.write(pos1);
       delay(50);
        }
        for (pos2 = pos2; pos2 >= 90; pos2 -= 1){
          delay(50);
         servo2.write(pos2);
        }
           
         for (pos3 = pos3; pos3 <=90; pos3 += 1){
        delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 >=90; pos3 -= 1){
        delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 <= 90; pos3 += 1){
          delay(5);
         servo3.write(pos3);
         }
       
  
         
            
          } 
  
     
  if ((Rx).indexOf("J8F")!=-1) {
    robot.forward(200,200,15); 
    for (pos3 = pos3; pos3 >=90; pos3 -= 1){
        //delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 <= 90; pos3 += 1){
          //delay(5);
         servo3.write(pos3);
         }
   
 } 
   if ((Rx).indexOf("J8B")!=-1) {
    robot.reverse(200,200,15);
     for (pos3 = pos3; pos3 >=90; pos3 -= 1){
        //delay(50);
         servo3.write(pos3);
            }
             for (pos3 = pos3; pos3 <= 90; pos3 += 1){
          //delay(5);
         servo3.write(pos3);
         } 
   }
       if ((Rx).indexOf("J8R")!=-1) {
      robot.rotate(15);
             for (pos3 = pos3; pos3 >= 45 ; pos3 -= 1){
         // delay(10);
         servo3.write(pos3);
         Serial.println(i); 
             }   
      
    }

if ((Rx).indexOf("J8L")!=-1) {
   robot.rotate(-15);
      for (pos3 = pos3; pos3 <= 135; pos3 += 1){
          //delay(10);
         servo3.write(pos3);
                     Serial.println(i);
                
    } 
  
  }
    
}

CONTROL REMOTO

#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
SoftwareSerial lora(2,13);
Adafruit_SSD1306 oled(128,64, &Wire,-1);

void J8(){
  int  vrx=map(analogRead(A0),0,1023,0,5);
 int  vry=map(analogRead(A1),0,1023,0,5);
if (vrx>=4) {
      lora.println("J8L");
      oled.clearDisplay();
       oled.setCursor(0,30);
     oled.print("J8L");
     oled.display();
  
}
else if(vrx==0){
  lora.println("J8R");
  oled.clearDisplay();
       oled.setCursor(90,30);
     oled.print("J8R");
     oled.display();
     
}
 if (vry>=4) {
      lora.println("J8B");
      oled.clearDisplay();
       oled.setCursor(50,50);
     oled.print("J8B");
     oled.display();
  
}
else if(vry==0){
  lora.println("J8F");
  oled.clearDisplay();
       oled.setCursor(50,0);
     oled.print("J8F");
     oled.display();
    
} 
}
void J9(){
  int  vrx=map(analogRead(A3),0,1023,0,5);
 int  vry=map(analogRead(A2),0,1023,0,5);
if (vrx>=4) {
      lora.println("J9L");
      oled.clearDisplay();
       oled.setCursor(0,30);
     oled.print("J9L");
     oled.display();
  delay(250);
}
else if(vrx==0){
  lora.println("J9R");
  oled.clearDisplay();
       oled.setCursor(90,30);
     oled.print("J9R");
     oled.display();
   delay(250);
}
 if (vry>=4) {
      lora.println("J9B");
      oled.clearDisplay();
       oled.setCursor(50,50);
     oled.print("J9B");
     oled.display();
     delay(250);
}
else if(vry==0){
  lora.println("J9F");
  oled.clearDisplay();
       oled.setCursor(50,0);
     oled.print("J9F");
     oled.display();
  delay(250);
} 
}


void setup(){
  Serial.begin(9600);
   oled.begin(SSD1306_SWITCHCAPVCC,0x3C);//inicialización de pantalla en direccion 0x3c
   oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(WHITE);
  oled.setCursor(30,30);
           oled.print("LORA RC");
     oled.display();
    
     pinMode(4, INPUT_PULLUP);
     pinMode(5, INPUT_PULLUP);
     pinMode(6, INPUT_PULLUP);
     pinMode(7, INPUT_PULLUP);
     pinMode(8, INPUT_PULLUP);
     pinMode(9, INPUT_PULLUP);
     pinMode(11,OUTPUT);//M1
     pinMode(12,OUTPUT);//M0
 lora.begin(115200);

digitalWrite(11,LOW);//M1
digitalWrite(12,LOW);//M0
}


void loop(){
 if (digitalRead(4)==0) {
   oled.clearDisplay();
   oled.setCursor(50,10);
              oled.println("Temp");
              oled.display();
       lora.println("D4");
      delay(500);
 }
              if (lora.available()>0){ 
   String rx=lora.readStringUntil('\n');
    oled.clearDisplay();
     oled.setCursor(45,35);
    oled.print(rx);
         oled.display();
    delay(1000);
    
 }
 
 J8();
 J9();
 if (digitalRead(8)==0){
  oled.clearDisplay();
   oled.setCursor(60,30);
              oled.print("M8");
              oled.display();
       lora.println("M8");
      delay(10);
 }
  if (digitalRead(9)==0){
  oled.clearDisplay();
   oled.setCursor(60,30);
              oled.print("M9");
              oled.display();
       lora.println("M9");
        delay(10);
     
 }
 
if (digitalRead(5)==0){
  oled.clearDisplay();
   oled.setCursor(60,30);
              oled.print("D5");
              oled.display();
       lora.println("D5");
      delay(500);
}
if (digitalRead(6)==0){
  oled.clearDisplay();
   oled.setCursor(60,30);
              oled.print("D6");
              oled.display();
       lora.println("D6");
       delay(500);
}
if (digitalRead(7)==0){
  oled.clearDisplay();
   oled.setCursor(60,30);
              oled.print("D7");
              oled.display();
       lora.println("D7");
      delay(500);
}

}

Nano On Board

#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>

#define PIN        13 
#define numleds 8 

Adafruit_NeoPixel pixels(numleds, PIN, NEO_GRB + NEO_KHZ800);

SoftwareSerial nano(11,12);
String Rx;
void setup() {
  nano.begin(115200);
pixels.begin();

}

void loop() {
  Rx=nano.readStringUntil('\n');
  //noTone(6);
  if ((Rx).indexOf("tone100")!=-1) {
    int i=0;
while (i<7) {
tone(6,700,100);
 delay(25);
  noTone(6);
  delay(25);
  i++;
pixels.setPixelColor(i, pixels.Color(25, 0,0));
    pixels.show(); 
    delay(25);
    
}
  
  
  }
   pixels.clear(); // Set all pixel colors to 'off'
 pixels.show(); 
  
  
    }
  

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »