Go Down

Topic: Lectura XBee Receptor para poder gobernar mi mountainboard (Read 4 times) previous topic - next topic

castillo14

Creo que ahora comprendo lo que pretendes. No usas el ordenador para enviar las órdenes, usas una placa Arduino. El problema, por lo que sé es que para poder usar un Arduino como "modem" emisor de órdenes hay que quitar el chip ATMega, con lo cual no puedes programar nada, pues la placa Arduino se convierte en una simple pasarela.

De todas formas, ahora que lo pienso, nosotros leemos los datos que nos envían las placas sobre los valores de los sensores... puede ser que te pueda proponer una solución. Dame un poco de tiempo y te comento algo (casi seguro que te puedo enviar una solución pues un error que teníamos se debía a que una instrucción con el valor de un sensor "interfería" en las señales de los actuadores por ser demasiado parecida.
José Antonio Castillo Rodríguez
Responsable de diseño de producto
Functio & Ars S.L.
www.functionars.com

anonimator

Hola Castillo y demás compañeros.

Respecto al primer punto que comentas efectivamente el chip se quita, pero tan solo para usar la placa arduino como pasarela para programar los modulos Xbee como coordinador y router y una vez que están programadas mediante el software X-CTU, se insertan otra vez el chip en su zocalo y se puede usar de nuevo  como placa arduino para el uso al que esta destinada.

Efectivamente lo que pretendo es enviar desde un arduino con Xbee y recepcionar con otro arduino con Xbee y lo he conseguido mediante estos codigos que os adjunto aquí:

COORDINADOR

int val = 0;
byte mapVal = 0;
int potPin = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(potPin, INPUT);
}

void loop()
{
  val = analogRead(potPin);
  mapVal = map(val,0,1023,0,179);
  Serial.write(mapVal);
  delay(2);
}


ROUTER END



#include <Servo.h>

Servo scottServo;  // create servo object to control a servo

int servoPin = 9;  // analog pin used to connect the potentiometer

int servoValue = 0;    // variable to read the value from the analog pin

void setup()
{
  Serial.begin(9600);
  scottServo.attach(9);  // attaches the servo on pin 9 to the servo object
}
    servoValue = Serial.read();
    scottServo.write(servoValue);
    delay(2);
  }
}

Hasta aquí todo bién, el problema es que si por ejemplo le declaro una variable digital en el emisor para que lo recepcione el receptor, cuando lo lee y ejecute la orden como salida, para que actue algún contro como encender las luces de mi mountainboard, es un carácter del codigo ascill, vale pues aquí esta el problema ya que la lectura del potenciometro del emisor es de 0 a 255 y cada uno de esos valores corresponde a cada uno de los codigos ascill y siempre en algún momento coincide con el valor digital de otro actuador analógico o con el valor que hayamos declarado en la variable digital interfiriendo las lecturas.

Por esto yo quiero separar todas las lecturas analogicas y digitales en el emisor mandarlas en un paquete y recepcionarlas en el receptor desgranar ese paquete separando esas lecturas y mandarlas cada una a su pin para que cada actuador (servofreno, motor, luces, claxon...) no se mezclen y se ejecuten de manera correcta.

Si alquien tiene alguna sujerencia se lo agradezco.

:smiley-mr-green:

anonimator

Aquí os pongo unas fotos de mi proyecto que lo tengo bastante abanzado.

Inicialmente controle mediante bluetooth desde mi teléfono con android y con el programa MOBOT BT Car, el cual enviaba algún carácter ascill y mi placa arduino con el modulo bluetoothh acoplado recepcionaba las lecturas ascill y ejecutaba las ordenes, incrementando y decrementando la pontencia de motor mediante pulso, pulsado mas o menos veces según quería ir mas rapido o despacio o pulsando continuamente para ejecutar el servofreno y parar el rodaje.

Pero esta manera totalmente digital no era operativa ya que lo suyo es mediante un gatillo de aceleración y otro de frenado, es decir con señales analogicas es mas seguro, divertido y real el manejo del mountainboar, ya que tienes la sensación de todo el control en el tacto del dedo ya que si presionas mas o menos tanto para frenar como para acelerar.

Por eso voy durante tiempo estudiando como mandar esas señales de un arduino a otro.

Admito sujerencias, siempre es bueno escucar a la gente.

Cuando tenga tiempo os adjunto mas fotos con detalle.

Saludotes.

yOPERO



Hasta aquí todo bién, el problema es que si por ejemplo le declaro una variable digital en el emisor para que lo recepcione el receptor, cuando lo lee y ejecute la orden como salida, para que actue algún contro como encender las luces de mi mountainboard, es un carácter del codigo ascill, vale pues aquí esta el problema ya que la lectura del potenciometro del emisor es de 0 a 255 y cada uno de esos valores corresponde a cada uno de los codigos ascill y siempre en algún momento coincide con el valor digital de otro actuador analógico o con el valor que hayamos declarado en la variable digital interfiriendo las lecturas.



Podrías poner un ejemplo de la interferencia con valores  de al menos dos comando que coincidan. la verdad no visualizo..


Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

anonimator

Hola Yopero.

Mira en este codigo he añadido las lineas de buzzer, para cuando pulso en el emiror sobre el pin 5, envíe al receptor la orden para que la ejecute sobre también el pin 5.

if(digitalRead(botonbuzzer)== HIGH) {
    Serial.print('D'); }
 
Como ves le e asignado al botonBuzzer el carácter D y cuando actuo sobre el servo como va de 0 a 255 y corresponden a todos los caracteres ascill cuando coincide con la D me actua sobre BotonBuzzer

aquí te dejo el codigo.

Por cierto si sabes como enviar la orden para dos servos....?

COORDINADOR

int val = 0;
byte mapVal = 0;
int potPin = 0;
int botonbuzzer = 5;

void setup()
{
  Serial.begin(19200);
  pinMode(potPin, INPUT);
  pinMode(botonbuzzer, INPUT);
}

void loop()
{
  val = analogRead(potPin);{
  mapVal = map(val,0,1023,0,180);
  Serial.write(mapVal);
  delay(2);
}
{
  if(digitalRead(botonbuzzer)== HIGH) {
    Serial.print('D'); }
   
}
}


ROUTER END

#include <Servo.h>

Servo scottServo;  // create servo object to control a servo
int servoPin = 9;  // analog pin used to connect the potentiometer
int servoValue = 0;    // variable to read the value from the analog pin
int buzzer = 5;

void setup()
{
  Serial.begin(19200);
  scottServo.attach(9);
  pinMode(buzzer,OUTPUT);
}

void loop()
{
  if(Serial.available()> 0)

    servoValue = Serial.read();
    scottServo.write(servoValue);
   
   
    if(Serial.read()== 'D') {
      digitalWrite(buzzer,HIGH);
      delay(10);
      digitalWrite(buzzer,LOW); }
   
  }

Go Up