Test Foro de elhacker.net SMF 2.1

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

#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>

int
set_interface_attribs (int fd, int speed, int parity)
{
       struct termios tty;
       memset (&tty, 0, sizeof tty);
       if (tcgetattr (fd, &tty) != 0)
       {
               error_message ("error %d from tcgetattr", errno);
               return -1;
       }

       cfsetospeed (&tty, speed);
       cfsetispeed (&tty, speed);

       tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;     // 8-bit chars
       // disable IGNBRK for mismatched speed tests; otherwise receive break
       // as \000 chars
       tty.c_iflag &= ~IGNBRK;         // disable break processing
       tty.c_lflag = 0;                // no signaling chars, no echo,
                                       // no canonical processing
       tty.c_oflag = 0;                // no remapping, no delays
       tty.c_cc[VMIN]  = 0;            // read doesn't block
       tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

       tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl

       tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
                                       // enable reading
       tty.c_cflag &= ~(PARENB | PARODD);      // shut off parity
       tty.c_cflag |= parity;
       tty.c_cflag &= ~CSTOPB;
       tty.c_cflag &= ~CRTSCTS;

       if (tcsetattr (fd, TCSANOW, &tty) != 0)
       {
               error_message ("error %d from tcsetattr", errno);
               return -1;
       }
       return 0;
}

void
set_blocking (int fd, int should_block)
{
       struct termios tty;
       memset (&tty, 0, sizeof tty);
       if (tcgetattr (fd, &tty) != 0)
       {
               error_message ("error %d from tggetattr", errno);
               return;
       }

       tty.c_cc[VMIN]  = should_block ? 1 : 0;
       tty.c_cc[VTIME] = 5;            // 0.5 seconds read timeout

       if (tcsetattr (fd, TCSANOW, &tty) != 0)
               error_message ("error %d setting term attributes", errno);
}


y para usarlo char *portname = "/dev/ttyUSB1";
int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0)
{
       error_message ("error %d opening %s: %s", errno, portname, strerror (errno));
       return;
}

set_interface_attribs (fd, B115200, 0);  // set speed to 115,200 bps, 8n1 (no parity)
set_blocking (fd, 0);                // set no blocking

write (fd, "hello!\n", 7);           // send 7 character greeting

usleep ((7 + 25) * 100);             // sleep enough to transmit the 7 plus
                                    // receive 25:  approx 100 uS per char transmit
char buf [100];
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