Show Posts
Pages: [1] 2 3
1  International / Español / VirtualWire y ServoTimer2 ((( Problemas con el Servo ))) on: April 17, 2014, 04:39:49 am
Hola Amigos.

Tengo un problema y seguro que algunos de vosotros me puede ayudar a resolver.

Tengo un emisor y un receptor realizado con VirtualWire, todo me fucniona perfectamente, mando dos datos analogicos y dos digitales, cuando hago la lectura en el puerto serie del receptor todo me funciona correctamente, la variación de los datos analógicos que yo comando en mi emisor, son leido y interpretados perfectamente e mi emisor, hasta ahi todo ok.

Utilizo esos datos para encender dos leds en el caso de las lecturas digitales y otras dos analogicas, estas últimas las utilizo para controlar la intensidad de un led y el parpadeo de otro y perfecto, todo me funciona correctamente, aquí esta el codigo el cual gobierna el receptor.

 /* es decir 2 bytes para el Data0, otros dos para Data1, otros dos para Data2 y otros dos para Data3 */
  uint8_t Buffer_Size = 8; /* declara el tamaño del array para recibir los datos */
  unsigned int Data0; /* Declara las variables para el volcado de datos de recepción (unsigned int de 8 bits) */
  unsigned int Data1;
  unsigned int Data2;
  unsigned int Data3;
  uint8_t RxBuffer[Buffer_Size]; /* declara el array para la recepción de datos */
  /* Condicional ¿se ha recibido el mensaje?*/
  if (vw_get_message(RxBuffer, &Buffer_Size)) {
    Data0 = RxBuffer[0] << 8 | RxBuffer[1];
    Data1 = RxBuffer[2] << 8 | RxBuffer[3];
    Data2 = RxBuffer[4] << 8 | RxBuffer[5];
    Data3 = RxBuffer[6] << 8 | RxBuffer[7];
    Serial.print("Analogue pin A0: ");
    Serial.print(Data0);
    Serial.print(" "); Serial.print(Data1);
    Serial.print(" "); Serial.print(Data2);
    Serial.print(" "); Serial.println(Data3);
    // Non-blocking
    /* Almacena el dato recibido en un byte high y low */
    /* Output this data to the UART (imprime en la consola ese mensaje) */
    /* Output this data to the UART (imprime en consola el dato recibido*/
    if (Data2 == 0) {
      digitalWrite(8, LOW);  /* si el Data2 correspondiente a la entrada digital del emisor es 0, apaga el LED 13 */
    }
    if (Data2 == 1) {
      digitalWrite(8, HIGH);  /* si el Data2 correspondiente a la entrada digital del emisor es 1, enciende LED 13 */
    }
    if (Data3 == 0) {
      digitalWrite(12, LOW);
    }
    if (Data3 == 1) {
      digitalWrite(12, HIGH);
    }

    {

      Data0 = map(Data0, 0, 800, 0, 254 ); // aumento del brillodel led (0 a 5v) en funcion de Data1
      analogWrite(analogPin, Data0);
      delay(15);

    }

    if (Data1 > 0) {

      Data1 = map(Data1, 1023, 0, 0, 255); // parpadeo led en funcion de la lectura en Data0
      digitalWrite(10, HIGH);
      delay(Data1);
      digitalWrite(10, LOW);
      delay(Data1);
    }
    else {
      digitalWrite(10, LOW);
    }
    Serial.print(Data1);

  }
}


Pues bien, ahora es donde expongo mi problema ya que cuando utilizo mi Data0 que antes utilizaba para gobernar el incremento de intensidad de luz de un led y funciona perfectamente, cuando empleo esta Data0 para gobernar mi servo con la librería ServoTimer2, el servo me oscila mucho,
a pesar de que hago lectura en el monitor serie y leo lecturas correctas que van de 0 a 1023 y si mapeo tambien tengo lecturas perfectas, pero sin embargo el servo oscila, sobre todo en valores altos. Sabeis que esta pasando y como puedo solucionarlo ??????



    {

        val=map(Data0,0,1023,0,180);  // con 0 se posiciona en 0º -- con 180 se posiciona en 180º
        myservo.write(val); 

    }

    if (Data1 > 0) {

      Data1 = map(Data1, 1023, 0, 0, 255); // parpadeo led en funcion de la lectura en Data0
      digitalWrite(10, HIGH);
      delay(Data1);
      digitalWrite(10, LOW);
      delay(Data1);
    }
    else {
      digitalWrite(10, LOW);
    }
    Serial.print(Data1);

  }
}


smiley-eek
2  International / Español / Duda sobre sensor de presión afectado por los cambios de presión atmosférica on: November 18, 2013, 04:18:10 pm

Hola amigos.

Tengo una duda que os expongo a continuación ya que tengo un sensor de presión y este me hace medidas correctamente a través de A0, y lo que yo quiero es que a partir de un valor se activen y desactiven salidas, hasta aquí fácil ya que con el siguiente código todo me va ok.

if
    smiley >= 147 {
   digitalWrite(led_rojo_turbina, HIGH);
   }
   else {
    digitalWrite(led_rojo_turbina, LOW);

El problema es que el sensor es sensible a los cambios atmosféricos  ya que una de las salidas que tengo quiero que se active solo con un cambio de valor de solo dos unidades es decir que si el sensor esta midiendo 145 yo quiero que se active cuando en ese momento la lectura sea de dos unidades mas o menos, osea 147 o 143 y el problema es que si sube o baja la presión atmosférica puede que me mida los 147 disparándose el digitalWrite si ser verdad que hay dos puntos mas en ese momento.

Creo que se puede hacer algo con la orden umbral pero no estoy seguro de como hacerlo.

Saludos y gracias.
3  International / Español / Re: Señales analogicas y digitales de Tx XBee a Rx XBee, tipo array. on: July 18, 2013, 10:57:05 am
.
4  International / Español / Re: Señales analogicas y digitales de Tx XBee a Rx XBee, tipo array. on: July 04, 2013, 02:17:46 am
Ey, no hay nadie que me oriente con el tema que expongo en el post anterior ????

Gracias y saludos compañeros.

5  International / Español / Señales analogicas y digitales de Tx XBee a Rx XBee, tipo array. on: June 24, 2013, 12:55:03 pm
Hola de nuevo Compañeros.

Después de un tiempo desconectado por falta de tiempo, hoy me pico el gusanillo de volver a coger el hilo de lo que andaba tramando hace ya un tiempo.

Os cuento, tengo dos arduinos con sus respectivos xbees y comunican de maravilla, les he montado un código para poder enviar señales analogicas y digitales de uno a otro, en cuanto a las digitales me funciona todo bien, cuando pulso interruptor en el emisor, se cambia de estado de 0 a 1 y como consecuencia se me enciende el led correspondiete y se apaga al dejar de pulsar.

Pero ando un poco despistado con las analógicas ya que a pesar que en el receptor se  monitoréa correctamente lo que está pasando en el emisor, algo así:

/0,0,0,0
/0,0,0,0
/0,1,0,0     //cuando actúo en la segunda posición en el pulsador me pasa de 0 a 1 y se enciende el led.
/0,0,235,0 //cuando actúo en el poti del emisor, monitoreo esto en la tercera posición pero no consigo mover el servo.

Pues eso es lo que me pasa, las lineas que leo en el monitor serie en tiempo real me funcionan correctamente, todos los estados analogicos y digitales cambian en las posiciones correspondientes de 0 a 1 en el caso de las digitales y de 0 a 255 en las analógicas, pero en estas últimas no se como tengo que hacer para que el servo se posicione en el valor leido de 0 a 255.

aquí os dejo mi código receptor.


#include <Servo.h>

int count = 0;
int a = 0, b = 0, c = 0, d = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
int LEDpin7 = 7;
int LEDpin12 = 12;
int valorservo = 0;
Servo myservo; // crea un objeto tipo servo para controlar el servo


void setup()
{
Serial.begin(19200); // declaramos la velocidad del puerto
pinMode(LEDpin7, OUTPUT);
pinMode(LEDpin12, OUTPUT);
myservo.attach(smiley-cool; // En EduBasica el servo se conecta al pin 8

}
void loop() // entramos en el bucle
{
if (Serial.available() > 0)
{
if (count < 7) // si el dato leido es menor que 7, saca por pantalla e incrementa
{

count++; // incrementa el contador
//Serial.print(count);
switch (count) // analiza cada valor enviado por el puerto serie
{
case 1: // contador a 1 sera el primer dato
a = Serial.read(); // lee ese dato y lo asigna a a
break;
case 2: // contador a 2 sera el segundo dato
b = Serial.read(); // lee ese dato y lo asigna a b (es una ',')
break;
case 3: // contador a 3 sera el tercer dato
c = Serial.read(); // lee ese dato y lo asigna a c
break;
case 4: // contador a 2 sera el segundo dato
d = Serial.read(); // lee ese dato y lo asigna a d (es una ',')
break;
case 5: // contador a 2 sera el segundo dato
e1 = Serial.read(); // lee ese dato y lo asigna a e1 (bit analogico 2)
break;
case 6: // contador a 2 sera el segundo dato
e2 = Serial.read(); // lee ese dato y lo asigna a e2 (bit analogico 1)
break;
case 7: // contador a 2 sera el segundo dato
e3 = Serial.read(); // lee ese dato y lo asigna a e3 (bit analogico 0)
break;
}
if (a == '1') // analiza si a es 1
{
digitalWrite(LEDpin7, HIGH); // activa el led salida 7
}
else digitalWrite(LEDpin7, LOW); // en caso contrario lo desactiva
Serial.print (char(a)); // saca por pantalla el valor de a en ASCII
Serial.print (char(b)); // saca por pantalla ","
if (c == '1') // analiza si c es 1
{
digitalWrite(LEDpin12, HIGH); // activa el led salida 12
}
else digitalWrite(LEDpin12, LOW); // en caso contrario lo desactiva
Serial.print (char(c)); // saca por pantalla el valor de c en ASCII
Serial.print (char(d)); // saca por pantalla ","
Serial.print (char(e1)); // saca por pantalla bit 2 analogico
Serial.print (char(e2)); // saca por pantalla bit 1 analogico
Serial.print (char(e3)); // saca por pantalla bit 0 analogico
valorservo = char(e1)+char(e2)+char(e3);
myservo.write(valorservo);
}
else // en caso contrario salto de linea y comienza la cuenta
{
Serial.println(""); // salta a la siguiente linea en pantalla
count = 0; // pone el contador a 0
}
}
}
 smiley
6  International / Español / Re: [Problema] comunicaciones XBEE on: April 22, 2013, 05:05:08 am
Perdona por tardar en responder, tenías toda la razón, así si funciona.

Mil gracias y saludos.
7  International / Español / Re: [Problema] comunicaciones XBEE on: April 02, 2013, 09:16:14 am
Gracias por tu respuesta pero eso ya lo he probado y hace lo mismo.
8  International / Español / [Problema] comunicaciones XBEE on: March 30, 2013, 05:19:47 pm
Hola.

Necesito saber en mi código ¿por qué cuándo envío datos analógicos entre dos arduinos no responde como se esperaría?
Probado con dos arduinos uno conectados por TX RX y también, con dos uno arduinos UNO con sus correspondientes XBEE.
El emisor tiene dos pulsadores digitales y un potenciómetro analógico (pin 2 y pin 3 digital pulsador – pin A0 analógico potenciómetro).
El receptor tiene dos leds para comprobar que responden a los pulsadores del emisor (pin 7 digital led // pin 12 digital led).

Si solo actuamos sobre los pulsadores, los leds responden correctamente.
Pero al actuar sobre el potenciómetro, no se que ocurre pero no responde al código programado al 100% como inicialmente empezamos, ya que después de actuar sobre el potenciómetro los leds no se encienden cuando activamos los pulsadores del emisor. También ocurre que al actuar sobre el potenciómetro los leds parpadean secuencialmente.
Y curiosamente en el monitor del receptor todo se visualiza correctamente.

##################################################################################################

CÓDIGO del emisor

int valorAnalogicoA0 = 0;
int valorAnalogicoA1 = 0;

void setup()
  {
    Serial.begin(19200);  // declaramos la velocidad del puerto

    pinMode(2, INPUT);
    pinMode(3, INPUT);
    
  }
  
void loop()               // entramos en el bucle
  {
        valorAnalogicoA0 = analogRead(0);
        valorAnalogicoA1 = analogRead(1);
        analogWrite(6, valorAnalogicoA0/4);
        Serial.print(digitalRead(2));     // primer dato enviado (leemos el valor de la entrada 2)
        Serial.print(',');                // separamos por una coma
        Serial.print(digitalRead(3));   // tercer dato enviado (leemos el valor de la entrada 3)
        Serial.print(',');                // separamos por una coma
        Serial.println(valorAnalogicoA0/4);
      delay(100);     // retardo de 10 msegundos
  }

########################################################################

CÓDIGO del receptor

#include <Servo.h>

int count = 0;
int a = 0, b = 0, c = 0, d = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
int LEDpin7 = 7;
int LEDpin12 = 12;
int valorservo = 0;
Servo myservo; // crea un objeto tipo servo para controlar el servo


void setup()
  {
    Serial.begin(19200);  // declaramos la velocidad del puerto
    pinMode(LEDpin7, OUTPUT);
    pinMode(LEDpin12, OUTPUT);
    myservo.attach(smiley-cool;    // En EduBasica el servo se conecta al pin 8

  }
  
void loop()               // entramos en el bucle
  {
     if (Serial.available() > 0)
   {                
                if (count < 7)      // si el dato leido es menor que 7, saca por pantalla e incrementa
                  {

                    count++;            // incrementa el contador
                    //Serial.print(count);
                    
                    switch (count)      // analiza cada valor enviado por el puerto serie
                      {
                        case 1:                // contador a 1 sera el primer dato
                          a = Serial.read();   // lee ese dato y lo asigna a a                          
                          break;
                        
                        case 2:                 // contador a 2 sera el segundo dato
                          b = Serial.read();    // lee ese dato y lo asigna a b (es una ',')                        
                          break;
                        
                        case 3:                 // contador a 3 sera el tercer dato
                          c = Serial.read();    // lee ese dato y lo asigna a c                          
                          break;
                          
                        case 4:                 // contador a 2 sera el segundo dato
                          d = Serial.read();    // lee ese dato y lo asigna a d (es una ',')                        
                          break;
                        
                        case 5:                 // contador a 2 sera el segundo dato
                          e1 = Serial.read();    // lee ese dato y lo asigna a e1 (bit analogico 2)                        
                          break;
                        
                        case 6:                 // contador a 2 sera el segundo dato
                          e2 = Serial.read();    // lee ese dato y lo asigna a e2 (bit analogico 1)                        
                          break;
                          
                        case 7:                 // contador a 2 sera el segundo dato
                          e3 = Serial.read();    // lee ese dato y lo asigna a e3 (bit analogico 0)        
                          break;                        
                      }
                      
                      if (a == '1')        // analiza si a es 1
                            {
                              digitalWrite(LEDpin7, HIGH);  // activa el led salida 7
                            }
                      else digitalWrite(LEDpin7, LOW);  // en caso contrario lo desactiva                          
                      Serial.print (char(a));     // saca por pantalla el valor de a en ASCII
                      
                      Serial.print (char(b));   // saca por pantalla ","
                      
                      if (c == '1')         // analiza si c es 1
                            {
                              digitalWrite(LEDpin12, HIGH);  // activa el led salida 12
                            }
                      else digitalWrite(LEDpin12, LOW);  // en caso contrario lo desactiva
                      Serial.print (char(c));     // saca por pantalla el valor de c en ASCII
                      
                      Serial.print (char(d));   // saca por pantalla ","
                      
                      Serial.print (char(e1));   // saca por pantalla bit 2 analogico
                      
                      Serial.print (char(e2));   // saca por pantalla bit 1 analogico
                      
                      Serial.print (char(e3));   // saca por pantalla bit 0 analogico
                      
                      valorservo = char(e1)+char(e2)+char(e3);
                      myservo.write(valorservo);
                      
                  }
                else         // en caso contrario salto de linea y comienza la cuenta
                  {
                    Serial.println("");  // salta a la siguiente linea en pantalla
                    count = 0;           // pone el contador a 0
                  }
                  
   }
  }

#############################################################################################

9  International / Español / Re: Por fin correcta lectura en fortma de array por puerto serie con XBee on: February 02, 2013, 12:49:37 pm
Ahora lo que me pasa es que al recibir un 1 en cualquiera de las posiciones del array1 se me enciende el led.

Alguna idea mas???
 
Saludos.
10  International / Español / Re: Solventado--> parámetros para red Xbee (tres xbee y dos arduino) on: January 29, 2013, 04:12:24 am
Hola Chinchu.

Si ves mas abajo un post mio veras que estoy embarcado tambien en un proyecto con xbee donde mando señales analogicas y digitales poco a poco me va funcionando  pero me gustaria ver tus codigos para comparar y coger lo bueno que tengas tanto en el envio de datos como en la recepcion.

 gracias y saludos
11  International / Español / Re: Por fin correcta lectura en fortma de array por puerto serie con XBee on: January 27, 2013, 07:32:06 pm
Gracias MBrodi,  lo pruebo y te digo como me ha ido.
Saludos
12  International / Español / if(array1[3] == 1) puerto serie con XBee on: January 11, 2013, 01:33:32 pm

Por que a pesar de recibir un 1 en mi monitor serie no se me enciende el pin_rec = 12, en el cual he colocado un led con la funcion:


 if(array1[3] == 1){
    digitalWrite(pin_rec, HIGH);
  }else{
    digitalWrite(pin_rec, LOW);
  }

Alguna idea ??????????????


#include <Servo.h>

Servo servo1;
Servo servo2;
int pin_motor = 11;
int pin_rec = 12;
char array1[4] = { '0', '0', '0', '0'};
int i;
void setup()
{
 
  Serial.begin(19200);
Serial.flush();


 pinMode(pin_motor, OUTPUT);
 pinMode(pin_rec, OUTPUT);
 servo1.attach(9);
 servo2.attach(10);

}
void loop() {
   if (Serial.available() >= 4){
        for ( int i = 0; i < 4; i++)
   array1 = Serial.read();

   }
  {
   
    Serial.print(array1[0]);
    Serial.print(array1[1]);
    Serial.print(array1[2]);
    Serial.print(array1[3]);
   
     if(array1[3] == 1){
    digitalWrite(pin_rec, HIGH);
  }else{
    digitalWrite(pin_rec, LOW);
  }
   
   Serial.flush();
 
delay (40);

}
}
13  International / Español / Por fin correcta lectura en fortma de array por puerto serie con XBee on: January 07, 2013, 01:00:37 pm
Hola compañeros.

Después de mil vueltas que le he dado a mi código de lectura por puerto serie a través de los fabulosos modulos Xbees, ahora tengo una duda, cuando abro mi monitor del puerto serie en el shelch de receptor para visualizar lo que he enviado desde mi emisor, YEAh!!! ahí están mis datos ordenaditos, fabuloso NO?

Pues bien, me aparece una linea algo así   $0, 0, 0 , 0  los dos primeros ceros son datos analógicos los dos segundos son digitales, evidentemente no estoy actuando sobre ningún potenciometro o pulsador del emisor.

Osea que si actúo sobre mis potenciometros y pulsadores en mi emisor me apareceria algo así;

$255, 184, 1, 1

Es decir en el primer valor (255) estoy actuando hasta fondo sobre el potenciometro que tengo en el arduino emisor.

En el segundo valor (184) estoy actuando no tan hasta el fondo.

En el tercer valor (1) simplemente estoy actuando sobre el pulsador correspondiente al igual que en el cuarto valor.

La velocidad de refresco a tiempo casi real y digo casi por que siempre viene con un poco retardo pero inapreciable para nuestras neuronas.

AHORA es cuando pido ayuda:

¿COMO PUEDO LEER LOS DOS PRIMEROS VALORES PARA QUE ACTUEN SOBRE DOS SERVOS Y LOS SEGUNDOS VALORES PARA QUE ACTUEN ON/OFF EN LEDS???????

Ya se que puede parecer lo mas fácil pero me estoy volviendo loco al tratarse de un array no se extraer esos valores.

Saludos y Gracias.

Aqui os dejo mi codigo.-

#include <Servo.h>

Servo servo1;
Servo servo2;
int pin_motor = 13;
int pin_rec = 2;
char array1[4] = { '0', '0', '0', '0'};

void setup()
{
  Serial.begin(19200);

 pinMode(pin_motor, OUTPUT);
 pinMode(pin_rec, OUTPUT);
 servo1.attach(9);
 servo2.attach(10);

}
void loop() {
   if (Serial.available() >= 4){
        for ( int i = 0; i < 4; i++)
   array1 = Serial.read();
 
   }
  {
    Serial.print(array1[0]);
    Serial.print(array1[1]);
    Serial.print(array1[2]);
    Serial.print(array1[3]);
   
   
  Serial.flush();
 
delay (40);

}
}


14  International / Español / lectura de array en receptor Xbee on: December 17, 2012, 12:44:05 pm
Hola Compañeros.

Desde hace tiempo que ando con este código dándole forma para que me haga dos lecturas analógicas y dos digitales, empaquetándolas en un array y enviando estos datos al puerto serie para que a través de Xbee las mande a un receptor y poderlas desempaquetar en el receptor.

Pues bien, el código que mas abajo adjunto es el correspondiente al emisor y funciona correctamente ya que cuando monitoreo los datos en el monitor serie del Sketch de arduino los interpreta correctamente.

Algo así:     >0, 0, 0, 0

Los dos primeros ceros son los valores analógicos y los dos últimos ceros de los digitales.
Cuando actúo sobre los potenciómetros A0 ó A1, me varia la señal de 0 a 255 en los dos primeros ceros como comentaba antes y cuando actúo sobre los pines digitales 3 y 2 correspondientes a los pines pin_cable_verde y pin_cable_naranja me varían los ceros convirtiéndose en uno al actuar sobre ellos.

Lo que solicito en este post es que si me puede orientar alguien en como puedo leer esos datos en mi receptor ya que ando un poco desorientado, os lo agradezco de antemano.

Saludos.


int pin_cable_amarillo = A0;
int pin_cable_blanco = A1;
int pin_cable_verde = 3;
int pin_cable_naranja = 2;

int valor_sensor [] = {0, 0, 0, 0};

int i;

void setup()
{
pinMode(pin_cable_naranja, INPUT);
pinMode(pin_cable_verde, INPUT);

Serial.begin(19200);
}
void loop()
{
  //Leer los datos de las entradas analogicas y digital, y guardarlo como valores integer en el array.
valor_sensor[0] = analogRead(pin_cable_amarillo)/4;
valor_sensor[1] = analogRead(pin_cable_blanco)/4;
valor_sensor[2] = digitalRead(pin_cable_verde);
valor_sensor[3] = digitalRead(pin_cable_naranja);

 
Serial.print('>');
Serial.print(valor_sensor[0]);
Serial.print(",");

Serial.print(valor_sensor[1]);
Serial.print(",");

Serial.print(valor_sensor[2]);
Serial.print(",");

Serial.print(valor_sensor[3]);
Serial.println();
delay (50);

}

smiley-wink
15  International / Español / Re: Lectura XBee Receptor para poder gobernar mi mountainboard on: December 07, 2012, 01:44:34 pm
Buenas compañeros.

De vuelta después de unos días desconectado, es lo que tiene trabajar...

yOPERO donde te metes, necesito tus sugerencias y ayuda a si es que si estas por aqui dime ideas para seguir con mi codigo para mi proyecyo

Pages: [1] 2 3