Foro de elhacker.net

Informática => Electrónica => Mensaje iniciado por: aecp95 en 15 Agosto 2017, 02:22 am



Título: Arduino, C++ , Puerto Serial o USB y Linux
Publicado por: aecp95 en 15 Agosto 2017, 02:22 am
Buenas noches, estoy trabajando en un trabajo final para el cole y estamos viendo c++ y linux y tengo que presentar algo para fin de año que se maneje por el serial, USB o Paralelo, queria saber como puedo hacer para controlar el arduino con alguno de esos puertos, quisiera leer una temperatura desde un lm35 y accionar un led dependiendo de la temperatura. Dispongo de una arduino 1, estuve buscando algo relacionado en la red pero no encuentro mucho. Muchas gracias y disculpen las molestias!


Título: Re: Arduino, C++ , Puerto Serial o USB y Linux
Publicado por: engel lex en 15 Agosto 2017, 02:39 am
si tienes un arduino uno, el ya tiene conexión usb, y por medio de el se comunica en protocolo serial... con buscar en google "ejemplos arduino serial" tienes bastante para probar...

sobre el led con el lm35, es simplemente un analogRead a tu respectivo puerto conectado y comparar con tu umbral, si es mayor cambias el puerto del led a encendido

lee el material sobre lo basico de arduino, esto que propones es literalmente explicación de entrada... y si te trancas en algo o tienes una duda puntual, hazla en este mismo tema


Título: Re: Arduino, C++ , Puerto Serial o USB y Linux
Publicado por: aecp95 en 15 Agosto 2017, 02:43 am
pero el proyecto tiene que ser implementando c/c++, si entiendo lo de los umbrales, lo único que no entiendo es como enviar datos y recibir por c/c++ desde el puerto serial de linux.
Lo que me gustaría es que me facilitaran algún ejemplo o libreria para comenzar a trabajar desde linux.

P/D: No puedo utilizar el terminal de linux


Título: Re: Arduino, C++ , Puerto Serial o USB y Linux
Publicado por: engel lex en 15 Agosto 2017, 03:06 am
ahh perfecto, eso está mas claro!


el leer serial te puede dar algunos dolores de cabeza al principio porque es una conexión en stream

fijate este tema... es en C

el auto usa esto

Código
  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <string.h>
  4. #include <termios.h>
  5. #include <unistd.h>
  6.  
  7. int
  8. set_interface_attribs (int fd, int speed, int parity)
  9. {
  10.        struct termios tty;
  11.        memset (&tty, 0, sizeof tty);
  12.        if (tcgetattr (fd, &tty) != 0)
  13.        {
  14.                error_message ("error %d from tcgetattr", errno);
  15.                return -1;
  16.        }
  17.  
  18.        cfsetospeed (&tty, speed);
  19.        cfsetispeed (&tty, speed);
  20.  
  21.        tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
  22.        // disable IGNBRK for mismatched speed tests; otherwise receive break
  23.        // as \000 chars
  24.        tty.c_iflag &= ~IGNBRK;         // disable break processing
  25.        tty.c_lflag = 0;                // no signaling chars, no echo,
  26.                                        // no canonical processing
  27.        tty.c_oflag = 0;                // no remapping, no delays
  28.        tty.c_cc[VMIN]  = 0;            // read doesn't block
  29.        tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout
  30.  
  31.        tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
  32.  
  33.        tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
  34.                                        // enable reading
  35.        tty.c_cflag &= ~(PARENB | PARODD);      // shut off parity
  36.        tty.c_cflag |= parity;
  37.        tty.c_cflag &= ~CSTOPB;
  38.        tty.c_cflag &= ~CRTSCTS;
  39.  
  40.        if (tcsetattr (fd, TCSANOW, &tty) != 0)
  41.        {
  42.                error_message ("error %d from tcsetattr", errno);
  43.                return -1;
  44.        }
  45.        return 0;
  46. }
  47.  
  48. void
  49. set_blocking (int fd, int should_block)
  50. {
  51.        struct termios tty;
  52.        memset (&tty, 0, sizeof tty);
  53.        if (tcgetattr (fd, &tty) != 0)
  54.        {
  55.                error_message ("error %d from tggetattr", errno);
  56.                return;
  57.        }
  58.  
  59.        tty.c_cc[VMIN]  = should_block ? 1 : 0;
  60.        tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout
  61.  
  62.        if (tcsetattr (fd, TCSANOW, &tty) != 0)
  63.                error_message ("error %d setting term attributes", errno);
  64. }

y para usarlo
Código
  1. char *portname = "/dev/ttyUSB1";
  2. int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
  3. if (fd < 0)
  4. {
  5.        error_message ("error %d opening %s: %s", errno, portname, strerror (errno));
  6.        return;
  7. }
  8.  
  9. set_interface_attribs (fd, B115200, 0);  // set speed to 115,200 bps, 8n1 (no parity)
  10. set_blocking (fd, 0);                // set no blocking
  11.  
  12. write (fd, "hello!\n", 7);           // send 7 character greeting
  13.  
  14. usleep ((7 + 25) * 100);             // sleep enough to transmit the 7 plus
  15.                                     // receive 25:  approx 100 uS per char transmit
  16. char buf [100];
  17. int n = read (fd, buf, sizeof buf);  // read up to 100 characters if ready to read




aquí hay otra solución... una librería en C++ para leer serial

http://libserial.sourceforge.net/ (http://libserial.sourceforge.net/)


aquí un ejemplo de uso en
lectura
https://github.com/crayzeewulf/libserial/blob/master/examples/read_port.cpp (https://github.com/crayzeewulf/libserial/blob/master/examples/read_port.cpp)
un ejemplo de uso de escritura
https://github.com/crayzeewulf/libserial/blob/master/examples/write_port.cpp (https://github.com/crayzeewulf/libserial/blob/master/examples/write_port.cpp)












asegurate de tener permisos de lectura y escritura agregando tu usuario al respectivo grupo del puerto serial usb (usualmente dialout)




Título: Re: Arduino, C++ , Puerto Serial o USB y Linux
Publicado por: PalitroqueZ en 15 Agosto 2017, 03:07 am
documentación y proyectos sobre arduino hay por cantidades industriales en la red.

te pongo algunos:

http://www.internetdelascosas.cl/2012/05/04/midiendo-temperatura-con-arduino-y-lm35/
http://www.enerzuul.es/?p=459
https://www.arduino.cc/en/Tutorial/TemperatureWebPanel
https://www.luisllamas.es/medir-temperatura-con-arduino-y-sensor-lm35/

el usb lo puedes manejar mediante un puerto serial virtual (clase CDC) que ya viene resuelto en el Arduino IDE