Show Posts
Pages: 1 2 [3] 4 5 ... 37
31  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: September 07, 2014, 08:45:50 am
Efectivamente; el código tal y como está es para lecturas individuales. Si lo vas a poner en lecturas continuas, mejor que enviar la "r" para solicitar lectura es "escuchar" el puerto serie hasta que llegue la siguiente lectura continua correspondiente, en lugar de "trastocar" el funcionamiento continuo con una petición.
Prueba de momento lo de quitar el modo continuo, y los delays que mencionabas, a ver si obtenemos algún resultado.
Saludos.
32  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: September 07, 2014, 05:11:11 am
Hola. Envío otro código a ver si aparece el número de canal por serial. He cambiado la variable a int y simplificado la función de selección de canal. Mira a ver si efectivamente hace el switch de canales (no sé si la placa tiene algún led indicador de qué canal está seleccionado o de qué otra forma puedes comprobarlo).
Habría que echar un vistazo a los respectivos datasheets de los cuatro sensores a ver qué comandos y respuestas reciben y envían, a ver qué puede estar pasando.
Code:
#include <AltSoftSerial.h>          //Include the software serial library 
AltSoftSerial altSerial;            //Name the software serial library altSerial (this cannot be omitted) 

int s0 = 7;                         //Arduino pin 7 to control pin S0
int s1 = 6;                         //Arduino pin 6 to control pin S1

char sensordata[30];                 //A 30 byte character array to hold incoming data from the sensors
byte sensor_bytes_received=0;        //We need to know how many characters bytes have been received

char *cmd = "r";                           //Char pointer used in string parsing

float temp;                //where the final temperature data is stored

struct data
{
      char pH;
      char conductivity;
      char DO;
      char ORP;
      float temperature;
};

data data_from_sensors = {
      0, 0, 0, 0, 0};

void setup() {
      pinMode(s1, OUTPUT);              //Set the digital pin as output.
      pinMode(s0, OUTPUT);              //Set the digital pin as output.
      pinMode(2, OUTPUT);               //Set pin 2 as an output
      Serial.begin(38400);              //Set the hardware serial port to 38400
      altSerial.begin(38400);           //Set the soft serial port to 38400
}





void loop(){

      for (int i=0; i<4 ; i++)
      {   
            open_channel(i);                               //Call the function "open_channel" to open the correct data path
            altSerial.print(cmd);                         //Send the command from the computer to the Atlas Scientific device using the softserial port
            altSerial.print("\r");                        //After we send the command we send a carriage return <CR>   
            if(altSerial.available() > 0){                   //If data has been transmitted from an Atlas Scientific device
                  sensor_bytes_received=altSerial.readBytesUntil(13,sensordata,30); //we read the data sent from the Atlas Scientific device until we see a <CR>. We also count how many character have been received
                  sensordata[sensor_bytes_received]=0;           //we add a 0 to the spot in the array just after the last character we received. This will stop us from transmitting incorrect data that may have been left in the buffer
                  Serial.print("Canal ");
                  Serial.print(i);
                  Serial.print("==>");
                  Serial.println(sensordata);
            }
      }

      temp = read_temp();       //call the function “read_temp” and return the temperature in C°
      Serial.print("Temperatura==>");
      Serial.println(temp);
      delay(5000);
}


void open_channel(int channel){                                  //This function controls what UART port is opened.

      if (channel & 1){
            digitalWrite(s0, HIGH);
      } else {
            digitalWrite(s0,LOW);
      }

      if (channel & 2){
            digitalWrite(s1, HIGH);
      } else {
            digitalWrite(s1,LOW);
      }
}

float read_temp(void){   //the read temperature function
      float v_out;             //voltage output from temp sensor
      float temp;              //the final temperature is stored here
      digitalWrite(A0, LOW);   //set pull-up on analog pin
      digitalWrite(2, HIGH);   //set pin 2 high, this will turn on temp sensor
      delay(2);                //wait 2 ms for temp to stabilize
      v_out = analogRead(0);   //read the input pin
      digitalWrite(2, LOW);    //set pin 2 low, this will turn off temp sensor
      v_out*=.0048;            //convert ADC points to volts (we are using .0048 because this device is running at 5 volts)
      v_out*=1000;             //convert volts to millivolts
      temp= 0.0512 * v_out -20.5128; //the equation from millivolts to temperature
      return temp;             //send back the temp
33  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: September 05, 2014, 04:40:13 pm
El error exactamente es que falla la conversión de char * a char, y es que, de momento, lo que recibimos de los sensores es una cadena de caracteres (char *). Queda la tarea de leerla y extraer de ella el zumo (el valor que nos interesa).
De momento, prueba a ver imprimiendo por serial las cadenas de caracteres que envían los sensores para posteriormente saber dónde y cómo extraer el valor.
Prueba este código
Code:
#include <AltSoftSerial.h>          //Include the software serial library 
AltSoftSerial altSerial;            //Name the software serial library altSerial (this cannot be omitted) 

int s0 = 7;                         //Arduino pin 7 to control pin S0
int s1 = 6;                         //Arduino pin 6 to control pin S1

char computerdata[20];               //A 20 byte character array to hold incoming data from a pc/mac/other
char sensordata[30];                 //A 30 byte character array to hold incoming data from the sensors
byte computer_bytes_received=0;      //We need to know how many characters bytes have been received         
byte sensor_bytes_received=0;        //We need to know how many characters bytes have been received


char *channel;                       //Char pointer used in string parsing
char *cmd;                           //Char pointer used in string parsing

float temp;                //where the final temperature data is stored

const int loopPeriod = 1000;         
unsigned long timeLoopDelay = 0;

char i=0;

struct data
{
      char pH;
      char conductivity;
      char DO;
      char ORP;
      float temperature;
};

data data_from_sensors = {
      0, 0, 0, 0, 0};

void setup() {
      pinMode(s1, OUTPUT);              //Set the digital pin as output.
      pinMode(s0, OUTPUT);              //Set the digital pin as output.
      pinMode(2, OUTPUT);               //Set pin 2 as an output
      Serial.begin(38400);              //Set the hardware serial port to 38400
      altSerial.begin(38400);           //Set the soft serial port to 38400
}





void loop(){

      cmd = "r";
      for (i=0; i<4 ; i++)
      {   
            if(i==0){
                  channel="0";
            }
            if(i==1){
                  channel="1";
            }
            if(i==2){
                  channel="2";
            }
            if(i==3){
                  channel="3";
            }
            open_channel();                               //Call the function "open_channel" to open the correct data path
            altSerial.print(cmd);                         //Send the command from the computer to the Atlas Scientific device using the softserial port
            altSerial.print("\r");                        //After we send the command we send a carriage return <CR>   
            if(altSerial.available() > 0){                   //If data has been transmitted from an Atlas Scientific device
                  sensor_bytes_received=altSerial.readBytesUntil(13,sensordata,30); //we read the data sent from the Atlas Scientific device until we see a <CR>. We also count how many character have been received
                  sensordata[sensor_bytes_received]=0;           //we add a 0 to the spot in the array just after the last character we received. This will stop us from transmitting incorrect data that may have been left in the buffer
                  Serial.print("Canal ");
                  Serial.print(i);
                  Serial.print("==>");
                  Serial.println(sensordata);
            }
      }

      temp = read_temp();       //call the function “read_temp” and return the temperature in C°
      Serial.print("Temperatura==>");
      Serial.println(temp);
      delay(5000);
}


void open_channel(){                                  //This function controls what UART port is opened.

      switch (*channel) {                              //Looking to see what channel to open   

      case '0':                                      //If channel==0 then we open channel 0     
            digitalWrite(s0, LOW);                       //S0 and S1 control what channel opens
            digitalWrite(s1, LOW);                       //S0 and S1 control what channel opens 
            break;                                         //Exit switch case

      case '1':
            digitalWrite(s0, HIGH);
            digitalWrite(s1, LOW);
            break;

      case '2':
            digitalWrite(s0, LOW);
            digitalWrite(s1, HIGH);
            break;

      case '3':
            digitalWrite(s0, HIGH);
            digitalWrite(s1, HIGH);
            break;
      }
}

float read_temp(void){   //the read temperature function
      float v_out;             //voltage output from temp sensor
      float temp;              //the final temperature is stored here
      digitalWrite(A0, LOW);   //set pull-up on analog pin
      digitalWrite(2, HIGH);   //set pin 2 high, this will turn on temp sensor
      delay(2);                //wait 2 ms for temp to stabilize
      v_out = analogRead(0);   //read the input pin
      digitalWrite(2, LOW);    //set pin 2 low, this will turn off temp sensor
      v_out*=.0048;            //convert ADC points to volts (we are using .0048 because this device is running at 5 volts)
      v_out*=1000;             //convert volts to millivolts
      temp= 0.0512 * v_out -20.5128; //the equation from millivolts to temperature
      return temp;             //send back the temp

y vemos cómo es la respuesta que envían los sensores, aunque habría que mirar los datasheets de los mismos a ver qué otras respuestas puede devolvernos que haya que tener en cuenta (por ejemplo estados o errores).
Saludos.
34  International / Proyectos / Re: problemas con puerto UDP on: September 04, 2014, 05:57:10 pm
Me alegro.
Si la comunicación va a ser, como decías, unidireccional, tal vez hasta sobre el Udp.begin (prueba a ver).
Cambia el título del hilo y añádele "[SOLUCIONADO]" por si resulta de utilidad para otros.
Saludos
35  International / Proyectos / Re: problemas con puerto UDP on: September 04, 2014, 04:52:57 pm
Perdón por el fallo.
Es lo que ocurre cuando se va con prisas y no se relee lo que se escribe  smiley-confuse
Me preocupé de quitar todo lo innecesario del código y al final dejé lo importante como estaba.
Code:
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>         

// configuramos la MAC address y la IP:
byte mac[] = {
      0x90, 0xA2, 0xDA, 0x0F, 0x98, 0x93};
IPAddress ip(192, 168, 0, 2);
unsigned int localPort=5005;

IPAddress IPREMOTA(192, 168, 0, 1); //aquí iría la IP del PC
unsigned int PUERTOREMOTO= 5005;     

EthernetUDP Udp;

void setup() {
      //se inicia la comunicacion ethernet y UDP:
      Ethernet.begin(mac,ip);
      Udp.begin(localPort);
}
void loop(){
      Udp.beginPacket(IPREMOTA, PUERTOREMOTO);
      Udp.write(byte(B00000000) + Udp.write("texto"));
      Udp.endPacket();
      delay(2000);
}

Prueba de nuevo a ver si hay algún cambio en wireshark.
Saludos.
36  International / Proyectos / Re: problemas con puerto UDP on: September 04, 2014, 09:29:48 am
A ver. Te hablo sin conocer a fondo el protocolo UDP, sino examinando someramente las funciones que incluye la librería. Udp.parsePacket() realiza un análisis de un supuesto paquete UDP recibido. ¿Estás enviando en tus pruebas algún paquete UDP a Arduino? Si no es así, no tiene sentido de momento que uses ni Udp.remoteIP() ni Udp.remotePort(), pues estos datos se supone que se extraen de ese supuesto paquete recibido (la dirección y puerto del remitente de ese paquete), y si no se ha recibido nada, ambos tendrán un valor indefinido (probablemente cero). Ambos valores te servirán en un futuro para saber a quién responder cuando recibas un paquete UDP; pero si de momento no te estás comunicando con Arduino, prueba sencillamente a enviar paquetes UDP a ver si wireshark los detecta:
Code:
#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>         

// configuramos la MAC address y la IP:
byte mac[] = {
      0x90, 0xA2, 0xDA, 0x0F, 0x98, 0x93};
IPAddress ip(192, 168, 0, 2);

unsigned int localPort = 5005;     
EthernetUDP Udp;

void setup() {
      //se inicia la comunicacion ethernet y UDP:
      Ethernet.begin(mac,ip);
      Udp.begin(localPort);
}
void loop(){
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.write(byte(B00000000) + Udp.write("texto"));
      Udp.endPacket();
      delay(2000);
}

Prueba y me cuentas (de momento yo no tengo experiencia con la librería UDP, pero analizándola supongo que vayan por ahí los tiros).
37  International / Proyectos / Re: problemas con puerto UDP on: September 04, 2014, 03:36:12 am
Hola.
Una cosa es el puerto por el que escuchas, que en este caso es el 5005, y otra es el puerto al que llamas.
Prueba a ver a cambiar
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());

por
const int PUERTOREMOTO=5005
Udp.beginPacket(Udp.remoteIP(), PUERTOREMOTO);

Saludos
38  International / Software / Re: Ayuda con Tarjeta SD on: September 03, 2014, 04:34:15 pm
¿Por qué medio vas a enviar el archivo?
¿Cómo tienes pensado realizar el envío desde el PC?
La parte del arduino es "fácil":
1. Recibir el nombre del archivo y el número de bytes de tamaño.
2.Crear un archivo con ese nombre en la SD.
3.Recibir los datos del archivo y escribirlos en la SD hasta alcanzar el tamaño indicado.
4.Cerrar el archivo.
39  International / Software / Re: leer valor en una base de datos on: September 02, 2014, 06:15:28 pm
Pues si has conseguido actualizar un campo de una base de datos desde arduino, el leer otro debería resultar una tarea muy similar. Sencillamente crea otra página php a la que llame el arduino que devuelva ese valor de la base de datos. El arduino leerá el resultado y actuará en consecuencia.
De todas formas, si muestras tu código actual sería más sencillo ayudarte.
Saludos.
40  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: September 02, 2014, 06:01:55 pm
Exacto. Cuando puedas leer todo en el loop, sabiendo qué tipos de datos numéricos vamos a necesitar para guardar esos datos, podemos crear un struct que incluya todos, y que es el que va a recibir nuestro futuro device. Nos vamos acercando al meollo  smiley-grin
41  International / Español / Re: problema conexion serial on: September 02, 2014, 09:59:01 am
Hola.
Creo recordar que otra vez ayudé en un problema similar, y tal vez el problema sea que el puerto no implementa más que los pines tx y rx y el escáner "mire" también los otros para comenzar a funcionar. Prueba a ver si conectando la clavija del escáner al ordenador y puenteando los pines tx y rx al conector del arduino empiezas a recibir y enviar datos.
Si esto te funciona, tal vez continúe funcionando si desconectas después la clavija del ordenador (creo recordar que así le ocurría al otro forero).
Si el problema es el que cito, tal vez te pueda servir puentear entre sí ciertos pines (en principio los pines 7-RTS y 8-CTS)
42  International / Software / Re: Ayuda con PHP on: September 02, 2014, 09:10:22 am
Deberías esforzarte un poco más en explicar lo que quieres hacer, porque yo al menos no lo termino de entender. ¿Entiendo que quieres conectar un arduino por un lado, un servidor de php por otro, y finalmente un cliente que acceda al servidor php y envíe/reciba del arduino?
Si es así ¿Cómo  iría conectado todo? ¿Todo a una red ethernet, arduino al server por serial?
Desde luego, como te ha dicho _jose_, es imposible correr un server php en el propio arduino.
Saludos.
43  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: September 02, 2014, 06:43:34 am
¿Tienes el pin E del cacharro conectado a tierra?
¿Has cruzado los pines tx-rx del arduino respecto a los del cacharro?

Son preguntas chorras, pero muchas veces los fallos son una chorrada.

EDITO: sería interesante que mostraras cómo lo tienes actualmente conectado.
Saludos.
44  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: August 31, 2014, 06:35:04 pm
Hola.
Ya estoy de regreso por aquí, así que puedo intentar ayudarte de nuevo.
¿Siguen sin responderte los sensores?
¿Has metido algún serial.println en la funció sensors a ver qué ocurre?
45  International / Proyectos / Re: Proyecto: añadir sensores a un robot submarino on: August 12, 2014, 05:59:07 pm
El siguiente paso sería, en lugar de enviarlas por serial, tomar de las cadenas que recibimos de los dispositivos los datos numéricos propiamente dichos, que es lo que enviaremos posteriormente por i2c cuando nos lo requiera el maestro. Lo ideal sería guardar todos los datos numéricos, más el de temperatura en una estructura de datos apropiada. También podríamos enviar por i2c directamente las cadenas tal cual las recibimos de los dispositivos, pero creo que lo mejor es enviar sólo la "chicha", para no acaparar demasiado tiempo de device_loop en el master. Esta va a ser en principio lo único que haraá el esclavo en su loop: ir refrescando los datos numéricos en esa estructura. Finalmente, incluiremos la librería i2c y en la función onRequest, es decir, cuando nos lo pida el master, enviaremos esa estructura con los datos actuales. Con esto habremos finalizado en principio la programación del esclavo.

El "device" maestro creo que no debería ser muy complicado. Deberá solicitar datos al esclavo en su device_loop, e imprimirlos directamente en el monitor, si no me equivoco.

Bueno; creo que de momento hay para ir masticando, así que de momento lo dejo aquí.

Saludos.
Pages: 1 2 [3] 4 5 ... 37