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!
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
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
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)
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