Lego Mindstorms Adrián Rodríguez Vargas (alu3258) Carlos A. Rodríguez Reyes (alu3255) Scanner
Índice   <ul><li>Prototipo </li></ul><ul><li>Material </li></ul><ul><li>Código *.nqc </li></ul><ul><li>Código *.cpp </li><...
Prototipo <ul><li>Fotos </li></ul>
Material (I) <ul><li>1x  RCX </li></ul><ul><ul><li>CPU de nuestro scanner. </li></ul></ul><ul><li>3x  Motor </li></ul><ul>...
<ul><li>2x  SENSOR_LIGHT </li></ul><ul><ul><li>Usamos un sensor de luz para realizar el escaneo, ya que mediante los valor...
Código *.nqc (I) <ul><li>#define MINPOWER  1 </li></ul><ul><li>#define SEMIPOWER 4 </li></ul><ul><li>#define MAXPOWER  7 <...
Código *.nqc (II) <ul><li>task Init () { </li></ul><ul><li>OnRev(OUT_B); </li></ul><ul><li>until (SENSOR_3 == 1); </li></u...
Código *.nqc (III) <ul><li>task Movimiento () { </li></ul><ul><li>OnFwd(OUT_A+OUT_C); Wait(INTERLINEADO); </li></ul><ul><l...
Código *.cpp (I) <ul><li>#include <iostream> </li></ul><ul><li>#include <fstream> </li></ul><ul><li>#include <winbgim.h> <...
Código *.cpp (II) <ul><li>int main() { </li></ul><ul><li>InitMatriz(); </li></ul><ul><li>CrearMatriz (); </li></ul><ul><li...
Código *.cpp (III) <ul><li>void CrearMatriz() {  </li></ul><ul><li>char basura[100]; </li></ul><ul><li>int valor; </li></u...
Código *.cpp (IV) <ul><li>void waitForLeftMouseClick(){ </li></ul><ul><li>clearmouseclick(WM_LBUTTONDOWN); </li></ul><ul><...
Automatización (*.bat) <ul><li>set RCX_PORT=usb </li></ul><ul><li>nqc -d scanner.nqc </li></ul><ul><li>nqc -run </li></ul>...
Pruebas (I) <ul><li>Original Copia </li></ul>
Pruebas (II) <ul><li>Original Copia </li></ul>
Pruebas (III) <ul><li>Original Copia </li></ul>
Pruebas (IV) <ul><li>Original Copia </li></ul>
Pruebas (V) <ul><li>Original Copia </li></ul>
Funcionamiento <ul><li>Video en funcionamiento (velocidad 2x) </li></ul>
Mejoras <ul><li>Escala de grises. </li></ul><ul><li>Correspondencia de colores con umbrales. </li></ul><ul><li>Guardar el ...
Cuestiones y preguntas Más información: http://mindstorms.rovasoftware.com Contacto: Adrián Rodríguez Vargas: alu3258@etsi...
¡Gracias por vuestra atención! Adrián Rodríguez Vargas (alu3258) Carlos A. Rodríguez Reyes (alu3255)
Próxima SlideShare
Cargando en…5
×

Escáner con Lego Mindstorm

660 visualizaciones

Publicado el

Proyecto final de la asignatura de Robótica, de 3º de Ingeniería Técnica Informática de Sistemas.
Autores: Adrián Rodríguez Vargas y Carlos Alberto Rodríguez Reyes.

Publicado en: Tecnología
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
660
En SlideShare
0
De insertados
0
Número de insertados
2
Acciones
Compartido
0
Descargas
0
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Escáner con Lego Mindstorm

  1. 1. Lego Mindstorms Adrián Rodríguez Vargas (alu3258) Carlos A. Rodríguez Reyes (alu3255) Scanner
  2. 2. Índice <ul><li>Prototipo </li></ul><ul><li>Material </li></ul><ul><li>Código *.nqc </li></ul><ul><li>Código *.cpp </li></ul><ul><li>Automatización (*.bat) </li></ul><ul><li>Scanneos </li></ul><ul><li>Funcionamiento </li></ul><ul><li>Mejoras </li></ul>
  3. 3. Prototipo <ul><li>Fotos </li></ul>
  4. 4. Material (I) <ul><li>1x RCX </li></ul><ul><ul><li>CPU de nuestro scanner. </li></ul></ul><ul><li>3x Motor </li></ul><ul><ul><li>Usamos 2 motores para el movimiento del scanner a lo largo del papel. El otro motor lo usamos para mover el sensor de luz a lo ancho del papel. En el primer caso el movimiento se traslada mediante engranajes, mientras en el segundo es mediante poleas. </li></ul></ul><ul><li>Xx Piezas LEGO </li></ul><ul><ul><li>La utilización de múltiples piezas de lego resulta imprescindible. </li></ul></ul>
  5. 5. <ul><li>2x SENSOR_LIGHT </li></ul><ul><ul><li>Usamos un sensor de luz para realizar el escaneo, ya que mediante los valores que detecta distinguiremos entre blanco y negro, almacenándolo en el Datalog. El otro sensor nos servirá para detectar cuando finalizó la tarea de escaneado. </li></ul></ul><ul><li>2x SENSOR_TOUCH </li></ul><ul><ul><li>Usamos los dos sensores de choque para saber cuando el cabezal de lectura (sensor de luz) llega a cada uno de los laterales del scanner, para así invertir el sentido del motor que se encarga de este movimiento. </li></ul></ul>Material (II)
  6. 6. Código *.nqc (I) <ul><li>#define MINPOWER 1 </li></ul><ul><li>#define SEMIPOWER 4 </li></ul><ul><li>#define MAXPOWER 7 </li></ul><ul><li>#define MAXDATOS 1000 </li></ul><ul><li>#define CR 666 </li></ul><ul><li>#define DEFINICION 6 </li></ul><ul><li>#define INTERLINEADO 3 </li></ul><ul><li>#define UMBRALNEGRO 40 </li></ul><ul><li>#define TSONIDO 200 </li></ul><ul><li>task main() { </li></ul><ul><li>SetSensor(SENSOR_1,SENSOR_LIGHT); </li></ul><ul><li>SetSensor(SENSOR_2,SENSOR_LIGHT); </li></ul><ul><li>SetSensor(SENSOR_3,SENSOR_TOUCH); </li></ul><ul><li>SetPower(OUT_A, MINPOWER); </li></ul><ul><li>SetPower(OUT_B, SEMIPOWER); </li></ul><ul><li>SetPower(OUT_C, MINPOWER); </li></ul><ul><li>CreateDatalog(MAXDATOS); </li></ul><ul><li>start Init; </li></ul><ul><li>start Fin; </li></ul><ul><li>} </li></ul>
  7. 7. Código *.nqc (II) <ul><li>task Init () { </li></ul><ul><li>OnRev(OUT_B); </li></ul><ul><li>until (SENSOR_3 == 1); </li></ul><ul><li>Off(OUT_B); </li></ul><ul><li>start Escanear; </li></ul><ul><li>stop Init; </li></ul><ul><li>} </li></ul><ul><li>task Escanear () { </li></ul><ul><li>OnFwd(OUT_B); Wait(40); </li></ul><ul><li>until (SENSOR_3 == 1){ </li></ul><ul><li>AddToDatalog(SENSOR_2); Wait(DEFINICION); </li></ul><ul><li>} </li></ul><ul><li>AddToDatalog(CR); </li></ul><ul><li>Off(OUT_B); </li></ul><ul><li>OnRev(OUT_B); Wait(30); </li></ul><ul><li>until (SENSOR_3 == 1); </li></ul><ul><li>Off(OUT_B); </li></ul><ul><li>start Movimiento; </li></ul><ul><li>stop Escanear; </li></ul><ul><li>} </li></ul>
  8. 8. Código *.nqc (III) <ul><li>task Movimiento () { </li></ul><ul><li>OnFwd(OUT_A+OUT_C); Wait(INTERLINEADO); </li></ul><ul><li>Off(OUT_A+OUT_C); </li></ul><ul><li>start Escanear; </li></ul><ul><li>stop Movimiento; </li></ul><ul><li>} </li></ul><ul><li>task Fin () { </li></ul><ul><li>until(SENSOR_1 < UMBRALNEGRO); </li></ul><ul><li>Off(OUT_A+OUT_B+OUT_C); </li></ul><ul><li>PlayTone(262, 40); Wait(TSONIDO); </li></ul><ul><li>stop Escanear; </li></ul><ul><li>stop Movimiento; </li></ul><ul><li>stop main; </li></ul><ul><li>} </li></ul>
  9. 9. Código *.cpp (I) <ul><li>#include <iostream> </li></ul><ul><li>#include <fstream> </li></ul><ul><li>#include <winbgim.h> </li></ul><ul><li>using namespace std; </li></ul><ul><li>const int FILAS = 640; </li></ul><ul><li>const int COLUMNAS = 480; </li></ul><ul><li>const int ALTOVENTANA = 800; </li></ul><ul><li>const int ANCHOVENTANA = 600; </li></ul><ul><li>const int FACTORAMPLIACION = 10; </li></ul><ul><li>const int UMBRAL = 45; </li></ul><ul><li>const int CR = 666; </li></ul><ul><li>const int VALORCENTRADO = 50; </li></ul><ul><li>int MatrizImagen[FILAS][COLUMNAS]; </li></ul><ul><li>void InitMatriz(); </li></ul><ul><li>void CrearMatriz(); </li></ul><ul><li>void waitForLeftMouseClick(); </li></ul>
  10. 10. Código *.cpp (II) <ul><li>int main() { </li></ul><ul><li>InitMatriz(); </li></ul><ul><li>CrearMatriz (); </li></ul><ul><li>initwindow(ALTOVENTANA, ANCHOVENTANA); </li></ul><ul><li>for (int i=1; i <= FILAS; i++) </li></ul><ul><li>for (int j=1; j <= COLUMNAS; j++) </li></ul><ul><li>if (MatrizImagen[i][j] == 1) </li></ul><ul><li>putpixel (j+VALORCENTRADO, i+VALORCENTRADO, 15); </li></ul><ul><li>waitForLeftMouseClick(); </li></ul><ul><li>closegraph(); </li></ul><ul><li>return 0; </li></ul><ul><li>} </li></ul><ul><li>void InitMatriz() { </li></ul><ul><li>for (int i=1; i <= FILAS; i++) </li></ul><ul><li>for (int j=1; j <= COLUMNAS; j++) </li></ul><ul><li>MatrizImagen[i][j] = 0; </li></ul><ul><li>} </li></ul>
  11. 11. Código *.cpp (III) <ul><li>void CrearMatriz() { </li></ul><ul><li>char basura[100]; </li></ul><ul><li>int valor; </li></ul><ul><li>ifstream fich(&quot;datalog.txt&quot;); </li></ul><ul><li>fich >> basura >> basura; </li></ul><ul><li>int i = 1; </li></ul><ul><li>int j = 1; </li></ul><ul><li>while (!fich.eof ()) { </li></ul><ul><li>fich >> basura >> basura >> valor; </li></ul><ul><li>if (valor <= 45) { </li></ul><ul><li>for (int k=i; k<=i+FACTORAMPLIACION-1;k++) </li></ul><ul><li>for (int l=j; l<=j+FACTORAMPLIACION-1;l++) </li></ul><ul><li>MatrizImagen[k][l] = 1; </li></ul><ul><li>} </li></ul><ul><li>j = j+FACTORAMPLIACION; </li></ul><ul><li>if (valor == CR) { </li></ul><ul><li>i = i+FACTORAMPLIACION; </li></ul><ul><li>j = 1; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  12. 12. Código *.cpp (IV) <ul><li>void waitForLeftMouseClick(){ </li></ul><ul><li>clearmouseclick(WM_LBUTTONDOWN); </li></ul><ul><li>const int DELAY = 42; </li></ul><ul><li>int x, y; </li></ul><ul><li>while (!ismouseclick(WM_LBUTTONDOWN)){ </li></ul><ul><li>delay(DELAY); </li></ul><ul><li>} </li></ul><ul><li>getmouseclick(WM_LBUTTONDOWN, x, y); </li></ul><ul><li>} </li></ul>
  13. 13. Automatización (*.bat) <ul><li>set RCX_PORT=usb </li></ul><ul><li>nqc -d scanner.nqc </li></ul><ul><li>nqc -run </li></ul><ul><li>pause </li></ul><ul><li>del datalog.txt </li></ul><ul><li>nqc -Rdatalog.txt -datalog_full </li></ul><ul><li>generapic.exe </li></ul>Formato DATALOG Uploading Datalog…………………….. Sensor 2: 53 Sensor 2: 54 : Variable 0: 666 Sensor 2: 38 : Ejecución programa C++: Convierte los datos del DATALOG en la imagen, usando una matriz en el proceso. Descarga y ejecución programa NQC: Descarga en la torre RCX el programa mediante IR y ejecutamos el código, comenzando el proceso de scan. Generación fichero DATALOG
  14. 14. Pruebas (I) <ul><li>Original Copia </li></ul>
  15. 15. Pruebas (II) <ul><li>Original Copia </li></ul>
  16. 16. Pruebas (III) <ul><li>Original Copia </li></ul>
  17. 17. Pruebas (IV) <ul><li>Original Copia </li></ul>
  18. 18. Pruebas (V) <ul><li>Original Copia </li></ul>
  19. 19. Funcionamiento <ul><li>Video en funcionamiento (velocidad 2x) </li></ul>
  20. 20. Mejoras <ul><li>Escala de grises. </li></ul><ul><li>Correspondencia de colores con umbrales. </li></ul><ul><li>Guardar el valor del sensor sin haberlo procesarlo. </li></ul><ul><li>Alimentador de folios. </li></ul>
  21. 21. Cuestiones y preguntas Más información: http://mindstorms.rovasoftware.com Contacto: Adrián Rodríguez Vargas: alu3258@etsii.ull.es Carlos A. Rodríguez Reyes: alu3255@etsii.ull.es
  22. 22. ¡Gracias por vuestra atención! Adrián Rodríguez Vargas (alu3258) Carlos A. Rodríguez Reyes (alu3255)

×