Hola a todos, soy nuevo y estoy empezando ha programar en c++.
Estoy haciendo un programa con el que "dibujar" un recorrido en la consola, el programa lee ese recorrido y lo procese para transformarlo en instrucciones para un robot en la vida real (con arduino). Y me gustaría saber si hay algún operador, función o librería que sea capaz de detectar ese recorrido, o al menos de ayudarme a hacer una función que lo detecte.
Gracias por adelantado :D
Dibujar un recorrido en la consola. Explica mejor qué tipo de datos va a recibir el programa. ¿Va a recibir datos del tipo "ADELANTE 5", va a recibir un "mapa" del recorrido tipo
XXX
XX X
X X
XXXX
Hola, perdón por haber tardado en responder :laugh:.
En el anterior mensaje no explique bien lo que quería hacer aqui, tienes el codigo con comentarios. Aun no esta terminado, me falta conectar el c++ y el arduino (algo que no se como hacer todavia) pero lo del recorrido ya esta hecho.
#include<stdio.h> //Declara las librerias, variables y definiciones
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#include<list>
#include<iostream>
using namespace std;
#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80
bool fina = false; //Esta variable pone fin al programa si es necesario
int recorrido[20]; //En este array se almacena el recorrido en forma de numeros
void gotoxy(int x, int y) //Funcion para situar el cursor en el lugar deseado
{
HANDLE hCon;
hCon = GetStdHandle (STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X =x;
dwPos.Y =y;
SetConsoleCursorPosition(hCon, dwPos);
}
void OcultarCursor()//Oculta el cursor
{
HANDLE hCon;
hCon = GetStdHandle (STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 2;
cci.bVisible = false;
SetConsoleCursorInfo (hCon,&cci);
}
class Inicio //Es el objeto que se mueve por el camino
{
private:
int x, y;
public:
Inicio(int _x,int _y): x(_x), y(_y){}
void pintar();
void mover();
};
void Inicio::mover()//Esta es la funcion mas importante, permite hacer el camino y lo traduce a numeros
{ int i;
if(kbhit() && recorrido[20] == 0)//Detecta si se a presionado una tecla y si la ultima cifra del recorrido es cero
{
char tecla = getch();
if(tecla == ARRIBA )//Detecta que flecha se a pulsado(en este caso arriba)
{
y--;
for(i=0;i<21;i++)//En este for se recorre el arreglo y se guarda el numero correspondiente en el siguiente hueco distinto a cero
{
if(recorrido[i] == 0)
{
recorrido[i] = 72;
break;
}
}
}
if(tecla == IZQUIERDA )
{
x--;
for(i=0;i<21;i++)
{
if(recorrido[i] == 0)
{
recorrido[i] = 75;
break;
}
}
}
if(tecla == DERECHA )
{
x++;
for(i=0;i<21;i++)
{
if(recorrido[i] == 0)
{
recorrido[i] = 77;
break;
}
}
}
if(tecla == ABAJO )
{
y++;
for(i=0;i<21;i++)
{
if(recorrido[i] == 0)
{
recorrido[i] = 80;
break;
}
}
}
gotoxy(x,y); printf("*");//Imprime un asterisco para que la trayectoria sea visible
gotoxy(0,0);//Situa el cursor en la esquina superior izquierdaa
for(i=0;i<21;i++)//Imprime la secuencia en el margen
{
cout<< recorrido[i]<<"\n";
}
}
if(recorrido[20] != 0)//Comprueba si la ultima cifra del recorrido es distinta de cero, en tal caso, el programa le manda la secuencia al robot
{
fina = true;
gotoxy(0,0); printf("Se ha completado la trayectoria, puedes mandar los datos al robot");
}
}
void Inicio::pintar()//Pone el primer objeto para que sea visible
{
gotoxy(x,y); printf("%c",223);
}
int main()
{
OcultarCursor();
int recorrido[20];
int i;
for(i=0;i<21;i++)//Despues de mandar la secuencia al robot vuelve el recorrido a cero para poder volver a utilizarla
{
recorrido[i]=0;
}
Inicio In(60,60);
In.pintar();
while(!fina)//Inicia el bucle que permite la creacion del recorrido
{
In.mover();
}
return 0;
}
En primer lugar:
En un array de 20 elementos, el índice va desde 0 hasta 19. Por tanto, los for son incorrector. Seberían ser:
for(int i=0; i<20; i++)
También el if debería ser:
if(kbhit() && recorrido[19] == 0)
Luego, como detalle: Sería más conveniente que guardases la cantidad de recorrido en un entero, y te ahorras estos for:
for(i=0;i<21;i++)//En este for se recorre el arreglo y se guarda el numero correspondiente en el siguiente hueco distinto a cero
{
if(recorrido[i] == 0)
{
recorrido[i] = 72;
break;
}
}
Como último detalle, si programas C++, es preferible utilizar las librerías de C++:
stdlib.h pasa a llamarse cstdlib
stdio.h -> cstdio
(windows.h y conio.h se quedan así)
Y bueno. Me has dejado desconcertado. En la pregunta inicial, preguntas cómo "detectar el recorrido". Con ese programa, tienes el array de movimientos, que es lo que necesitas, ¿no?
Si, después de publicar el mensaje empece a darle vueltas mi di cuenta de que en vez de analizar el recorrido del objeto podía almacenar en una cadena cada pulsación de las teclas
como números y luego asignar esos números a un movimiento determinado.
Lo siento, no entiendo a que te refieres con almacenar los movimientos en un entero, tenerlos en un arreglo me permite tenerlos secuenciados.
Otra cosa, al poner cstdlib y cstdio me salta un error
Ahora tengo problemas con la comunicación serial por que no tengo ni idea de como funciona.
Decía de guardar un entero con el último índice almacenado. Actualmente, calculas la cantidad de movimientos almacenados con un for. En vez de hacer eso, mejor guardar sin más un entero.
En cuanto a la conexión serie, Arduino da una clase C++ para que la uses si quieres.
Para usarla, pues tiene funciones simples tipo Write y Read, no tiene más.
Si quieres, aquí tengo un programa funcional para conectar Arduino con programa C++:
https://github.com/ivancea/Arduino-Interpreter/tree/master/C++%20App (https://github.com/ivancea/Arduino-Interpreter/tree/master/C++%20App)
Me podrías explicar como usar tu programa. Porque sinceramente no tengo ni idea de que hacer con él.
Umh bueno. Hay la aprte de Arduino, que le metes al Arduino sin más:
https://github.com/ivancea/Arduino-Interpreter/blob/master/arduino_program.c (https://github.com/ivancea/Arduino-Interpreter/blob/master/arduino_program.c)
Y la parte de C++, que tienes que compilar. Si quieres, puedes usas un IDE, puedes hacer un proyecto, como más te guste.
El programa lo único que tiene es un intérprete de comandos, para poner cosas como:
pinmode 5 OUTPUT
digitalwrite 5 HIGH
Desde ls consola del programa, con el Arduino conectado.
Pero bueno, era más que nada para que vieras cómo implementar en tu proyecto la clase Serial (serial.h y serial.cpp).
Si quieres, aquí hay una fuente oficial en la cual usan la clase:
http://playground.arduino.cc/Interfacing/CPPWindows (http://playground.arduino.cc/Interfacing/CPPWindows)
Aunque bueno, no me gusta porque mezclan mucho C con C++ xD
Lo siento, debo de ser un plasta :-\ pero yo me refiero a como unir todos esos códigos,
el de arduino lo he copiado al Arduino IDE y los archivos h los he puesto con las demás librerías pero el resto no se que hacer con ello.
Y donde se cambian las opciones para compilar con -std=c++11?
Vale, lo de Arduino listo.
Ahora los otros. Si usas un IDE para compilar C++, puedes crear un proyecto, agregar esos 5 archivos, y compilar, sin más.
Si no lo logras, dime: ¿Qué IDE utilizas para compilar C++? (No hablo del de Arduino)
Si compilas desde línea de comandos, sería (Con GCC, no sé cual es tu compilador):
g++ -std=c++11 -c functions.cpp -o functions.o
g++ -std=c++11 -c serial.cpp -o serial.o
g++ -std=c++11 -c main.cpp -o main.o
g++ functions.o serial.o main.o -o main.exe
Mi compilador es codebloks,
te refieres a agregar los archivos como new files y copiar el texto no?
Primero creas un proyecto de C++.
Luego, agregas los archivos al proyecto. Para ello, puedes abrir los archivos con Code::Blocks, y dar click derecho sobre la pestaña de cada archivo -> Agregar al proyecto.
Una vez hecho eso, compilar. Para ello, antes, dale click derecho al proyecto en la barra de la izquierda -> Build options.
Ahí, verás una lista de checkboxes. Marca una que pone: "Have g++ use the C++11 ISO C++ language standar [-std=c++11]". Y compila.
Por cierto. En el main, hay unas opciones al principio:
/// OPTIONS
const uint32_t maxDigitalPin = 13;
const uint32_t maxPin = 19;
const string port = "\\\\.\\COM22";
Si usas Arduino UNO, deja las primeras como están.
El port, es donde está conectado el Arduino. Si abres el IDE de Arduino, abajo a la derecha te pone en cual está. Modifica el número (COM22 -> COM3, por ejemplo)
Por que no me deja añadir archivos al proyecto?
file:///C:/Users/david/Downloads/pantallazo%20(1).webp
Esto es un screenshot, pero al pulsar add files no hace nada
Para poner una imagen tendrás que subirla a un servidor web.
Pero lo dicho. Crear un proyecto, tenerlo abierto, abrir el archivo, click derecho, añadirlo.
(http://i.imgur.com/uacYFpG.png)
Al agregarlo, automáticamente aparecerá a la izquierda.
Vale, lo tengo todo ya preparado pero al darle al boton de compilar me salta esto
fatal error: iostream: No such file or directory|
Amh pff. ¿Compilaste alguna vez con Code::Blocks algo en C++?
¿Puedes pasar captura del proyecto? Como la que pasé yo, más o menos, que se vea esa zona. Usa https://imgur.com (https://imgur.com) por ejemplo.
Si, pero hasta ahora solo habia compilado archivo simples, no proyectos.
(http://i.imgur.com/xDq54ka.png)
MOD EDIT: Imagen adaptada a lo usado en el foro.
Al crear el proyecto pusiste "Console application", y luego elegiste "C++"?
No, elegi empty project
Pues eso, elige proyecto de consola, y luego, elige C++.
Sinó, tendrías que configurar el proyecto a mano, y es más lioso.