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.

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();
}