{"id":5264,"date":"2022-05-13T00:11:01","date_gmt":"2022-05-12T22:11:01","guid":{"rendered":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?p=5264"},"modified":"2022-06-03T10:48:46","modified_gmt":"2022-06-03T08:48:46","slug":"scan-it","status":"publish","type":"post","link":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/","title":{"rendered":"\u00abSCAN-IT\u00bb"},"content":{"rendered":"\n<p><em>Autores:<\/em><\/p>\n\n\n\n<p><em>Erik Fern\u00e1ndez Orgaz<\/em><\/p>\n\n\n\n<p><em>Alejandro Herrera Gonz\u00e1lez<\/em><\/p>\n\n\n\n<p><em>Adri\u00e1n Leonis Garc\u00eda<\/em><\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2nk544z\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52067988843_4bee47487b_z.jpg\" alt=\"EscanerFotoGeneral\" width=\"480\" height=\"640\" \/><\/a>\n<\/div><figcaption>                                                                          <em>Imagen final del \u00abScan-It\u00bb<\/em><\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h2 class=\"wp-block-heading\"><strong>Introducci\u00f3n del proyecto<\/strong><\/h2>\n<\/div><\/div>\n\n\n\n<p>Nuestro proyecto se basa en un esc\u00e1ner 3d con varias funcionalidades las cuales son: esc\u00e1ner, cinem\u00e1tica y control manual.<\/p>\n\n\n\n<p>La implementaci\u00f3n se ha llevado acabo con: varias piezas impresas en 3d como estructura del proyecto, una placa Arduino uno R3, regulador de voltaje DC-DC, bluetooth hc-06, motor paso a paso, driver controlador motor paso a paso, lcd 16&#215;2, modulo I2C y m\u00f3dulo joystick.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementaci\u00f3n<\/strong><\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">LCD y Joystick<\/h4>\n\n\n\n<p>Primero empezamos viendo como presentar la interfaz a trav\u00e9s del m\u00f3dulo lcd, una vez que lo tuvimos claro, la implementaci\u00f3n se llev\u00f3 a cabo de la siguiente manera: Al tener el modulo I2C se utilizaron los pines A4 y A5, se utilizaron estos pines porque son los que viene por defecto en Arduino uno R3 para SCL y SDA que son las conexiones de comunicaci\u00f3n que sal\u00edan del m\u00f3dulo I2C. La librer\u00eda que se utiliz\u00f3 fue LiquidCrystal_I2C.<\/p>\n\n\n\n<p>Seguimos por c\u00f3mo implementar la navegaci\u00f3n del men\u00fa con el m\u00f3dulo joystick en funci\u00f3n de los valores que se obten\u00edan.&nbsp; En este caso la conexi\u00f3n del switch que ten\u00eda el m\u00f3dulo joystick se conect\u00f3 al pin 8 digital y se configur\u00f3 como pin de entrada y a un valor alto, los pines de los ejes X e Y se conectaron a los pines A0 y A1 porque los valores que podr\u00edan tomar no son 0 \u00f3 1 sino que est\u00e1n entre varios rangos y para poder controlarlos se necesitaba una se\u00f1al anal\u00f3gica.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2njYLs7\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52066957402_ddb03dd1e0.jpg\" alt=\"LCD_Joystick\" width=\"500\" height=\"190\" \/><\/a>\n<\/div><figcaption><em>LCD y Joystick<\/em><\/figcaption><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Problemas encontrados<\/h5>\n\n\n\n<p>El n\u00famero de conexiones hac\u00eda la placa era muy elevado, esto, se subsano instalando un m\u00f3dulo i2c para el lcd y as\u00ed minimizar el n\u00famero de conexiones.<\/p>\n\n\n\n<p>Apartado desarrollado por <strong>Alejandro Herrera Gonz\u00e1lez<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Motor Paso a Paso y Driver<\/h4>\n\n\n\n<p>De esta parte se encarg\u00f3 <strong>Adri\u00e1n Leonis Garc\u00eda<\/strong>, pero cuando surgieron los problemas a la hora de combinar el m\u00f3dulo lcd y el motor paso a paso con el driver, buscamos una soluci\u00f3n entre los tres integrantes del grupo ya que nos cost\u00f3 bastante poder encontrar el camino a la soluci\u00f3n. <\/p>\n\n\n\n<p>Una vez realizado estos dos pasos nos pusimos en marcha con el motor paso a paso y el driver controlador del mismo. Primero hicimos una demo para ver como funcionaba, una vez que entendimos como funcionaba hicimos la relaci\u00f3n de pasos con los engranajes que ten\u00edamos, en este caso fue con prueba error hasta que se consigui\u00f3. Cuando quisimos juntos lo que ten\u00edamos realizado del lcd y el motor nos dimos cuenta que el m\u00f3dulo lcd empezaba a parpadear cuando giraba el motor. Esto nos llev\u00f3 un tiempo darnos cuenta c\u00f3mo solucionarlo y mucha b\u00fasqueda en internet. La soluci\u00f3n que implementamos fue sacar el voltaje de la energ\u00eda suministrada por el Arduino en este caso 9v y pasarlo por un regulador de voltaje que convirtiera de 9v a 5v necesarios para el driver del motor paso a paso.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Problemas encontrados<\/h5>\n\n\n\n<p>La tensi\u00f3n demandada era muy elevada para poder combinarlo con el lcd se solucion\u00f3 este problema implementando un regulador de voltaje DC-DC el cual suministra la tensi\u00f3n al driver.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2nk5Goj\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52068114398_6fd5d86682.jpg\" alt=\"MotorPasoAPasoDriver\" width=\"500\" height=\"500\" \/><\/a>\n<\/div><figcaption><em>Motor Paso a Paso y Driver<\/em><\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00f3dulo Bluetooth<\/h4>\n\n\n\n<p>Parte realizada por: &nbsp;<strong>Erik Fern\u00e1ndez Orgaz.<\/strong><\/p>\n\n\n\n<p>Ahora ya solo nos quedaba el m\u00f3dulo bluetooth que tras una b\u00fasqueda exhaustiva por internet nos dimos cuenta que los comandos AT por los que se reg\u00eda el m\u00f3dulo bluetooth no nos val\u00eda para la implementaci\u00f3n que quer\u00edamos realizar. Encontramos un GitHub que pod\u00eda flashear el m\u00f3dulo haci\u00e9ndolo pasar de un hc-06 a m\u00f3dulo rn-42 de mejores prestaciones y con las funcionalidades que necesit\u00e1bamos. Una vez llevado a cabo esta operaci\u00f3n tuvimos el problema de c\u00f3mo comunicarnos con el m\u00f3dulo, nos dimos cuenta que el m\u00f3dulo trabaja con 3.3 voltios el pin de recepci\u00f3n, esto se resolvi\u00f3 con un divisor de tensi\u00f3n con resistencias de 1k ohm y 2k ohm.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2nk7HzL\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52068508650_eb188d7ff3_m.jpg\" alt=\"Bluetooth\" width=\"195\" height=\"129\" \/><\/a>\n<\/div><figcaption><em>Bluetooth HC-06<\/em><\/figcaption><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Problemas encontrados<\/h5>\n\n\n\n<p>Los comandos reconocidos por el m\u00f3dulo no eran suficiente para lo que necesit\u00e1bamos, la soluci\u00f3n fue flashear el m\u00f3dulo para que por firmware fuera un dispositivo rn-42 esto se llev\u00f3 a cabo con la ayuda de un m\u00f3dulo ftdi-usb en el cual se soldaron los pines del m\u00f3dulo ftdi-usb RTS,RSD,RI y DTR a los pines CLK, MISO, MOSI y CSB del m\u00f3dulo bluetooth respectivamente de la siguiente forma:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2nk5fFR\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52068027951_d9def9d3a1.jpg\" alt=\"ComunicacionBluetooth\" width=\"500\" height=\"250\" \/><\/a>\n<\/div><\/figure>\n\n\n\n<p>Esto nos permiti\u00f3 poder iniciar una comunicaci\u00f3n del dispositivo hc-06 al ordenador y con la utilizaci\u00f3n de las aplicaciones Bluesuite y Pstool se pudo llevar acabo el flasheo del dispositivo.<\/p>\n\n\n\n<p>Una vez realizado este paso faltaba configurar el dispositivo para que simulara un teclado y poder utilizar la tecla \u00abenter\u00bb para que hiciera una foto desde la aplicaci\u00f3n nativa de la c\u00e1mara del tel\u00e9fono, esto se llev\u00f3 a cabo con ayuda de la librer\u00eda BPLib referenciada en la bibliograf\u00eda de la presentaci\u00f3n hecha.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Esquema general de conexiones<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-photo is-provider-flickr wp-block-embed-flickr\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/flic.kr\/p\/2nk5jjh\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/live.staticflickr.com\/65535\/52068040156_0413de22d2_z.jpg\" alt=\"EsquemaGeneralComponentes\" width=\"350\" height=\"640\" \/><\/a>\n<\/div><figcaption><em>Esquema de conexiones<\/em><\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo del Software<\/h2>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>#include &lt;LiquidCrystal_I2C.h&gt;  \/\/ RH - use this library for LCD displays with I2C backpack\n#include &lt;Stepper.h&gt;\n#include &lt;SoftwareSerial.h&gt;\n\nconst int SW_pin = 8; \/\/ digital pin connected to switch output\nconst int X_pin = A0; \/\/ analog pin connected to X output\nconst int Y_pin = A1; \/\/ analog pin connected to Y output\n\nint bluetoothTx = 2;  \/\/ TX-O pin of bluetooth mate, Arduino D2\nint bluetoothRx = 3;  \/\/ RX-I pin of bluetooth mate, Arduino D3\n\nint MenuNr = 0;   \/\/ Menu number\nint PhotoNr = 2;  \/\/ The amount of photos that have to be taken\nbool Flag1 = 0;   \/\/ This flag is only active during 1 program cycle (prevents constantly adding\/subtracting 1 to the menu number when the joystick is pushed to the side) \nbool Flag2 = 0;   \/\/ This flag is only active during 1 program cycle (prevents constantly adding\/subtracting 2 to the photo number when the joystick is pushed up or down)\nbool Flag3 = 0;   \/\/ This flag is only active during 1 program cycle (prevents constantly adding\/subtracting 1 to the RPM when the joystick is pushed up or down)\nbool Flag4 = 0;   \/\/ This flag is only active during 1 program cycle (prevents constantly adding\/subtracting 1 to the turn number when the joystick is pushed to the side)\nbool Flag5 = 0;   \/\/ This flag is only active during 1 program cycle (prevents constantly adding\/subtracting 1 to the RPM when the joystick is pushed up or down)\nbool Flag6 = 0;   \/\/ This flag is only active during 1 program cycle to clear the lcd\nint SwMenu = 0;   \/\/ Switch menu (Sub menu's in the main menu's)\nbool BtnFlag = 0; \/\/ This flag is only active during 1 program cycle (prevents constantly adding of 1 to SwMenu when button is pressed)\n\n\/\/ RH - added variables for fast change &amp; cancel modes\nint FastChng = 0;  \/\/ indicates fast change value mode.  0 = off, 1 = delay mode, 2 = fast changing mode\nconst unsigned long FastDelay = 1000;  \/\/ delay mode time (before values change fast)\nconst unsigned long ShortInt = 100;  \/\/ short fast change interval\nconst unsigned long LongInt = 300;  \/\/ long fast change interval\nconst unsigned long BtnDelay = 2000;  \/\/ delay for button press to cancel operations.  Note this is an approximate delay, since stepper motor\n                                     \/\/ suspends all program execution until motor finishes its move\nunsigned long SetTime = 0; \/\/ time value for fast change &amp; button cancel modes.  Used to calculate time intervals\nbool BtnCancelFlag = 0; \/\/ This flag is used to detect when button is pressed for canceling operations\nbool MaxSwMenu = 0;  \/\/ This flag is used for detecting when the maximum SwMenu is reached\nbool CinCancelFlag = 0;  \/\/ This flag is used to trigger cinematic cancel.  1 = cancel cinematic operation\nint StepPoll = 480;  \/\/ number of motor steps to poll for cinematic cancel (at 15 rpm)\nint Cntr = 0;  \/\/ step counter for cinematic motor cancel\n\/\/ RH - end of added variables\n\nconst int stepsPerRevolution = 2048;  \/\/ change this to fit the number of steps per revolution\nint FullRev = 14336;                  \/\/ 1 full revolution of the big gear -&gt; Small-Big gear ratio is 7:1\nint rolePerMinute = 15;               \/\/ Adjustable range of 28BYJ-48 stepper is 0~17 rpm\nint PhotoTaken = 0;                   \/\/ Amount of photo's that have been taken\nint StepPerPhoto;                     \/\/ Amount of steps per photo (calculated -&gt; see MenuNr 0\/SwMenu 2)\nint TurnNr = 1;                       \/\/ Amount of turns\nint CurrentTurn = 0;                  \/\/ Stores current turn number\nint Steps = 0;                        \/\/ Amount of individual steps the stepper motor has to turn\n\nLiquidCrystal_I2C lcd(0x27, 16, 2);  \/\/ RH - use this for I2C LCD.  Assumes default address of 0x27\nStepper myStepper(stepsPerRevolution, 9, 11, 10, 12);  \/\/ Use these pins for the stepper motor\nSoftwareSerial bluetooth(bluetoothTx, bluetoothRx);\n\n\nvoid setup() {\n  \n  bluetooth.begin(115200);  \/\/ The Bluetooth Mate defaults to 115200bps\n  delay(100);\n\n  bluetooth.print(\"$$$\");\n  delay(100);\n  \n  bluetooth.println(\"C\");\n  delay(100);\n  \n  bluetooth.println(\"U,9600,N\");\n  delay(100);\n  \n  bluetooth.begin(9600);\n  \n  lcd.init();                         \/\/ RH - I2C LCD init command\n  lcd.backlight();                    \/\/ RH - I2C LCD turn backlight on\n  pinMode(SW_pin, INPUT);             \/\/Set pushbutton as input\n  digitalWrite(SW_pin, HIGH);         \/\/Set SW_pin High\n  \n  myStepper.setSpeed(rolePerMinute);  \/\/Set RPM of steppermotor\n\n  lcd.setCursor(4, 0);                \/\/Startup screen start\n  lcd.print(\"Welcome!\");              \/\/      \"\"\"\"\"      \/\/\n  lcd.setCursor(1, 1);                \/\/      \"\"\"\"\"      \/\/\n  lcd.print(\"Software: V1.6\");        \/\/      \"\"\"\"\"      \/\/\n  delay(3000);                        \/\/      \"\"\"\"\"      \/\/\n  lcd.clear();                        \/\/      \"\"\"\"\"      \/\/\n  lcd.setCursor(0, 0);                \/\/      \"\"\"\"\"      \/\/\n  lcd.print(\"Designed by\");           \/\/      \"\"\"\"\"      \/\/\n  lcd.setCursor(0, 1);                \/\/      \"\"\"\"\"      \/\/\n  lcd.print(\"Erik,Alejandro,Adrian\");         \/\/      \"\"\"\"\"      \/\/\n  delay(2000);                        \/\/      \"\"\"\"\"      \/\/\n  lcd.clear();                        \/\/Startup screen end\n}\n\nvoid loop() {\n\n  int XValue = analogRead(X_pin);     \/\/ Read the analog value from The X-axis from the joystick\n  int YValue = analogRead(Y_pin);     \/\/ Read the analog value from The Y-axis from the joystick\n  int SwValue = digitalRead(SW_pin);  \/\/ Read the digital value from The Button from the joystick\n\n  if (MenuNr &lt; 0){  \/\/This sets the min number of menu's\n    MenuNr = 0;\n  }\n  else if ( MenuNr &gt; 2){  \/\/This sets the max numbers of menu's\n    MenuNr = 2;\n  }\n  \n  if (XValue &lt; 400 &amp;&amp; Flag1 == 0 &amp;&amp; SwMenu == 0){  \/\/if the joystick is pushed to the right side and flag1 is 0 then 1 will be added to the menu number (purpose of the flag -&gt; see comment Flags above)\n    MenuNr = MenuNr + 1; \n    Flag1 = 1;\n    lcd.clear();\n  }\n\n  if (XValue &gt; 600 &amp;&amp; Flag1 == 0 &amp;&amp; SwMenu == 0){  \/\/if the joystick is pushed to the left side and flag1 is 0 then 1 will be subtracted from the menu number (purpose of the flag -&gt; see comment Flags above)\n    MenuNr = MenuNr - 1;\n    Flag1 = 1;\n    lcd.clear();\n  }\n  \n  if (XValue &gt; 399 &amp;&amp; XValue &lt; 599 &amp;&amp; Flag1 == 1){  \/\/if joystick is at neutral possition, flag1 is set to 0 (purpose of the flag -&gt; see comment Flags above)\n    Flag1 = 0;\n  }\n\n\n  if (SwValue == 0 &amp;&amp; BtnFlag == 0 &amp;&amp; MaxSwMenu == 0){  \/\/if the button is pressed and the flag is 0 -&gt; add 1 to menu \n    SwMenu = SwMenu + 1;\n    BtnFlag = 1;\n    BtnCancelFlag = 0;\n    lcd.clear();\n  }\n\n  if (SwValue == 1 &amp;&amp; BtnFlag == 1){  \/\/if the button is not pressed and the flag is 0 -&gt; Reset the flag (purpose of the flag -&gt; see comment Flags above)\n    BtnFlag = 0;\n  }\n  \n\n\n  switch (MenuNr){\n    case 0: \/\/***********************************************Menu0***********************************************\/\/\n            if (SwMenu == 0){ \/\/Menu 0 selected\n              lcd.setCursor(3, 0);\n              lcd.print(\"Escaner\");\n              lcd.setCursor(14,0);\n              lcd.print(\"-&gt;\");\n            }\n          \n            if (SwMenu == 1){ \/\/entered menu 0\n              lcd.setCursor(0, 0);\n              lcd.print(\"Nr of photo's\");\n              lcd.setCursor(7, 1);\n              lcd.print(PhotoNr);\n        \n              if (FastChng == 0) {  \/\/ RH - if not in fast change mode, update set time\n                SetTime = millis();\n              }\n              \n              if (YValue &lt; 400 &amp;&amp; Flag2 == 0){ \/\/joystick up -&gt; Add 2 to number of photo's\n                PhotoNr = PhotoNr + 2;\n                Flag2 = 1;\n                FastChng = 1;\n                lcd.clear();\n              }\n              if (YValue &gt; 600 &amp;&amp; Flag2 == 0){ \/\/joystick down -&gt; Subtract 2 from number of photo's\n                PhotoNr = PhotoNr - 2;\n                Flag2 = 1;\n                FastChng = 1;\n                lcd.clear();\n              }\n              if (YValue &gt; 399 &amp;&amp; YValue &lt; 599 &amp;&amp; Flag2 == 1){  \/\/if the Y-axis is back at it's neutral possition -&gt; Flag3 = 0 -&gt; Prevents constant adding or subtracting of 2\n                Flag2 = 0;\n                FastChng = 0;\n              }\n        \n              if (YValue &lt; 400 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick up is held for &gt; the fast delay time, then enter fast change mode\n                if ((millis() - SetTime) &gt; FastDelay) {\n                  FastChng = 2;\n                  SetTime = millis();  \/\/ update the set time\n                }\n              }\n        \n              if (YValue &gt; 600 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick down is held for &gt; the fast delay time, then enter fast change mode\n                if ((millis() - SetTime) &gt; FastDelay) {\n                  FastChng = 2;\n                  SetTime = millis();  \/\/ update the set time\n                }\n              }\n        \n              if (YValue &lt; 400 &amp;&amp; FastChng == 2) {  \/\/ RH - we are in fast change mode, so we want to update the values quickly, proportional between\n                if ((millis() - SetTime) &gt; (LongInt - (400 - YValue) * (LongInt - ShortInt) \/ 400)) {  \/\/ ShortInt and LongInt based on joystick deflection\n                  PhotoNr = PhotoNr + 2;\n                  SetTime = millis();\n                  lcd.clear();\n                }\n              }\n        \n              if (YValue &gt; 600 &amp;&amp; FastChng == 2) {  \/\/ RH - same for joystick down in fast change mode\n                if ((millis() - SetTime) &gt; (LongInt - (YValue - 600) * (LongInt - ShortInt) \/ 400)) {\n                  PhotoNr = PhotoNr - 2;\n                  SetTime = millis();\n                  lcd.clear();\n                }\n              }\n        \n              if (PhotoNr &lt; 2){    \/\/Min allowable Nr of photo's\n                PhotoNr = 2;\n              }\n              if (PhotoNr &gt; 200){  \/\/Max allowable Nr of photo's\n                PhotoNr = 200;\n              }\n            }\n        \n            if (SwMenu == 2){ \/\/Program started\n        \n              MaxSwMenu = 1;\n              \n              lcd.setCursor(0, 0);\n              lcd.print(\"Program started\");\n              lcd.setCursor(0, 1);\n              lcd.print(\"Photo Nr: \");\n              lcd.print(PhotoTaken);\n              \n              StepPerPhoto = FullRev \/ PhotoNr;  \/\/Calculate amount of steps per photo\n        \n              if (PhotoTaken &lt; PhotoNr){          \n              myStepper.setSpeed(rolePerMinute);  \/\/Set motor speed\n              myStepper.step(StepPerPhoto);       \/\/move the calculated amount of steps\n              PhotoTaken = PhotoTaken + 1;        \/\/Add 1 to photos taken\n              lcd.setCursor(0, 1);\n              lcd.print(\"Photo Nr: \");            \/\/Taking photo's\n              lcd.print(PhotoTaken);\n              delay(100);\n              bluetooth.println();                \/\/Take a photo simulating press key enter\n              delay(10000);\n              }\n        \n              if (PhotoTaken == PhotoNr){  \/\/If the amount of photos taken is equal to the amount of photos that have to be taken -&gt; Program finished\n                lcd.setCursor(0, 0);\n                lcd.print(\"Program finished\");\n                delay(3000);\n                lcd.clear();  \/\/Rest parameters\n                PhotoTaken = 0;\n                PhotoNr = 2;\n                SwMenu = 0;\n                MaxSwMenu = 0;\n                Steps = 0;\n              }\n        \n              \/\/ RH NOTE - cancelling works but delay is longer than expected since stepper motor movement is blocking\n              if (SwValue == 0 &amp;&amp; BtnCancelFlag == 0) {  \/\/ if button is pressed, start timing for cancel\n                BtnCancelFlag = 1;\n                SetTime = millis();\n              }\n        \n              if (SwValue == 1 &amp;&amp; BtnCancelFlag == 1) {  \/\/ RH - if button released before BtnDelay, then reset flag\n                BtnCancelFlag = 0;\n              }\n        \n              if (SwValue == 0 &amp;&amp; BtnCancelFlag == 1 &amp;&amp; ((millis() - SetTime) &gt; BtnDelay)) {  \/\/ RH - button has been held for &gt; BtnDelay, so cancel operation\n                lcd.clear();\n                lcd.setCursor(0, 0);\n                lcd.print(\"Program cancel\");\n                delay(3000);\n                lcd.clear();\n                PhotoTaken = 0;\n                PhotoNr = 2;\n                SwMenu = 0;\n                MaxSwMenu = 0;\n                Steps = 0;\n                BtnCancelFlag = 0;\n              }\n            }   \n          break;\n          \n    case 1:  \/\/***********************************************Menu1***********************************************\/\/\n            if (SwMenu == 0){  \/\/Menu1 selected\n                lcd.setCursor(0,0);\n                lcd.print(\"&lt;-\");\n                lcd.setCursor(3, 0);\n                lcd.print(\"Cinematica\");\n                lcd.setCursor(14,0);\n                lcd.print(\"-&gt;\");\n                CinCancelFlag = 0;\n                Cntr = 0;\n              }\n          \n              if (SwMenu == 1){  \/\/Entered menu1 - sub menu1\n                lcd.setCursor(0, 0);\n                lcd.print(\"motor speed\");\n                lcd.setCursor(7, 1);\n                lcd.print(rolePerMinute);\n          \n                if (FastChng == 0) {  \/\/ RH - if not in fast change mode, update set time\n                  SetTime = millis();\n                }\n                \n                if (YValue &lt; 400 &amp;&amp; Flag3 == 0){ \/\/ joystick up -&gt; Add 1 RPM\n                  rolePerMinute = rolePerMinute + 1;\n                  Flag3 = 1;\n                  FastChng = 1;\n                  lcd.clear();\n                }\n                if (YValue &gt; 600 &amp;&amp; Flag3 == 0){ \/\/ joystick down -&gt; Subtract 1 RPM\n                  rolePerMinute = rolePerMinute - 1;\n                  Flag3 = 1;\n                  FastChng = 1;\n                  lcd.clear();\n                }\n                if (YValue &gt; 399 &amp;&amp; YValue &lt; 599 &amp;&amp; Flag3 == 1){  \/\/if the Y-axis is back at it's neutral possition -&gt; Flag3 = 0 -&gt; Prevents constant adding or subtracting of 1\n                  Flag3 = 0;\n                  FastChng = 0;\n                }\n          \n                if (YValue &lt; 400 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick up is held for &gt; the fast delay time, then enter fast change mode\n                  if ((millis() - SetTime) &gt; FastDelay) {\n                    FastChng = 2;\n                    SetTime = millis();  \/\/ update the set time\n                  }\n                }\n          \n                if (YValue &gt; 600 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick down is held for &gt; the fast delay time, then enter fast change mode\n                  if ((millis() - SetTime) &gt; FastDelay) {\n                    FastChng = 2;\n                    SetTime = millis();  \/\/ update the set time\n                  }\n                }\n          \n                if (YValue &lt; 400 &amp;&amp; FastChng == 2) {  \/\/ RH - we are in fast change mode, so we want to update the values at the LongInt interval\n                  if ((millis() - SetTime) &gt; LongInt) {  \/\/ (using fixed LongInt since not that many values to cycle through)\n                    rolePerMinute = rolePerMinute + 1;\n                    SetTime = millis();\n                    lcd.clear();\n                  }\n                }\n          \n                if (YValue &gt; 600 &amp;&amp; FastChng == 2) {  \/\/ RH - same for joystick down in fast change mode\n                  if ((millis() - SetTime) &gt; LongInt) {\n                    rolePerMinute = rolePerMinute - 1;\n                    SetTime = millis();\n                    lcd.clear();\n                  }\n                }\n                \n                if (rolePerMinute &lt; 1){  \/\/Min allowable RPM\n                  rolePerMinute = 1;\n                }\n                if (rolePerMinute &gt; 17){  \/\/Max allowable RPM\n                  rolePerMinute = 17;\n                }\n              }\n          \n              if (SwMenu == 2){  \/\/Entered menu1 - sub menu2\n                lcd.setCursor(0, 0);\n                lcd.print(\"Nr of turns\");\n                lcd.setCursor(7, 1);\n                lcd.print(TurnNr);\n          \n                if (FastChng == 0) {  \/\/ RH - if not in fast change mode, update set time\n                  SetTime = millis();\n                }\n                \n                if (YValue &lt; 400 &amp;&amp; Flag4 == 0){ \/\/ joystick up -&gt; Add 1 turn\n                  TurnNr = TurnNr + 1;\n                  Flag4 = 1;\n                  FastChng = 1;\n                  lcd.clear();\n                }\n                if (YValue &gt; 600 &amp;&amp; Flag4 == 0){ \/\/ joystick down -&gt; Subtract 1 turn\n                  TurnNr = TurnNr - 1;\n                  Flag4 = 1;\n                  FastChng = 1;\n                  lcd.clear();\n                }\n                if (YValue &gt; 399 &amp;&amp; YValue &lt; 599 &amp;&amp; Flag4 == 1){  \/\/if the Y-axis is back at it's neutral possition -&gt; Flag3 = 0 -&gt; Prevents constant adding or subtracting of 1\n                  Flag4 = 0;\n                  FastChng = 0;\n                }\n          \n                if (YValue &lt; 400 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick up is held for &gt; the fast delay time, then enter fast change mode\n                  if ((millis() - SetTime) &gt; FastDelay) {\n                    FastChng = 2;\n                    SetTime = millis();  \/\/ update the set time\n                  }\n                }\n          \n                if (YValue &gt; 600 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick down is held for &gt; the fast delay time, then enter fast change mode\n                  if ((millis() - SetTime) &gt; FastDelay) {\n                    FastChng = 2;\n                    SetTime = millis();  \/\/ update the set time\n                  }\n                }\n          \n                if (YValue &lt; 400 &amp;&amp; FastChng == 2) {  \/\/ RH - we are in fast change mode, so we want to update the values quickly, proportional between\n                  if ((millis() - SetTime) &gt; (LongInt - (400 - YValue) * (LongInt - ShortInt) \/ 400)) {  \/\/ ShortInt and LongInt based on joystick deflection\n                    TurnNr = TurnNr + 1;\n                    SetTime = millis();\n                    lcd.clear();\n                  }\n                }\n          \n                if (YValue &gt; 600 &amp;&amp; FastChng == 2) {  \/\/ RH - same for joystick down in fast change mode\n                  if ((millis() - SetTime) &gt; (LongInt - (YValue - 600) * (LongInt - ShortInt) \/ 400)) {\n                    TurnNr = TurnNr - 1;\n                    SetTime = millis();\n                    lcd.clear();\n                  }\n                }\n                \n                if (TurnNr &lt; 1){  \/\/Min allowable amount of turns\n                  TurnNr = 1;\n                }\n                if (TurnNr &gt; 200){  \/\/Max allowable amount of turns\n                  TurnNr = 200;\n                }\n              }\n          \n              if (SwMenu == 3){  \/\/Program started\n                MaxSwMenu = 1;\n                StepPoll = 32 * rolePerMinute;  \/\/ RH - set polling rate StepPoll = number of steps per second (roughly)\n                lcd.setCursor(0, 0);\n                lcd.print(\"Program started\");\n                lcd.setCursor(0, 1);\n                lcd.print(\"Turns done: \");\n                lcd.print(CurrentTurn);\n          \n                if (CurrentTurn &lt; TurnNr){ \n                  myStepper.setSpeed(rolePerMinute);\n                  Cntr = 0;  \/\/ RH - initialize step counter\n                  while ((Cntr &lt;= FullRev) &amp;&amp; (CinCancelFlag == 0)) { \n                    myStepper.step(StepPoll);  \/\/ RH - breaking up plate rotation into roughly 1 sec intervals to check for cancel\n                    Cntr = Cntr + StepPoll;\n                    SwValue = digitalRead(SW_pin);\n                    if (SwValue == 0 &amp;&amp; BtnCancelFlag == 0) {  \/\/ RH - check if button is pressed, if so start timing for cancel\n                      BtnCancelFlag = 1;\n                      SetTime = millis();\n                    }\n                    if (SwValue == 1 &amp;&amp; BtnCancelFlag == 1) {  \/\/ RH - if button released before BtnDelay, then reset button flag\n                      BtnCancelFlag = 0;\n                    }\n                    if (SwValue == 0 &amp;&amp; BtnCancelFlag == 1 &amp;&amp; ((millis() - SetTime) &gt; BtnDelay)) {  \/\/ RH - button has been held for &gt; BtnDelay, so cancel operation\n                      CinCancelFlag = 1;\n                      CurrentTurn = TurnNr;  \n                    }\n                  }\n                  if (CinCancelFlag == 0) {  \/\/ RH - operation not cancelled, so continue\n                    myStepper.step(FullRev + StepPoll - Cntr);  \/\/ RH - need to move remainder of steps for 1 full turn due to kickout from while loop\n                    CurrentTurn = CurrentTurn + 1;\n                    lcd.setCursor(0, 1);\n                    lcd.print(\"Turns done: \");\n                    lcd.print(CurrentTurn);\n                  }\n                }\n          \n                if (CurrentTurn == TurnNr){  \/\/If the current turn is equal to the amount of thurns that need to be turned -&gt; program finished (RH - or cancelled)\n                  lcd.setCursor(0, 0);\n                  if (CinCancelFlag == 0) {\n                    lcd.print(\"Program finished\");\n                  }\n                  else {\n                    lcd.clear();\n                    lcd.print(\"Program cancel\");\n                  }\n                  delay(3000);\n                  lcd.clear();  \/\/Reset\n                  CurrentTurn = 0;\n                  PhotoNr = 1;\n                  rolePerMinute = 15;\n                  SwMenu = 0;\n                  MaxSwMenu = 0;\n                  CinCancelFlag = 0;\n                  Steps = 0;\n                }\n              }\n              break;\n              \n    case 2: \/\/***********************************************Menu2***********************************************\/\/\n          if (SwMenu == 0){\n            lcd.setCursor(0,0);\n            lcd.print(\"&lt;-\");\n            lcd.setCursor(3, 0);\n            lcd.print(\"Manual\");\n            lcd.setCursor(3,1);\n            lcd.print(\"control\");\n          }\n      \n           if (SwMenu == 1){  \/\/Entered menu2\n            lcd.setCursor(0, 0);\n            lcd.print(\"motor speed\");\n            lcd.setCursor(7, 1);\n            lcd.print(rolePerMinute);\n      \n            if (FastChng == 0) {  \/\/ RH - if not in fast change mode, update set time\n              SetTime = millis();\n            }\n            \n            if (YValue &lt; 400 &amp;&amp; Flag5 == 0){ \/\/ joystick up -&gt; Add 1 RPM\n              rolePerMinute = rolePerMinute + 1;\n              Flag5 = 1;\n              FastChng = 1;\n              lcd.clear();\n            }\n            if (YValue &gt; 600 &amp;&amp; Flag5 == 0){ \/\/ joystick down -&gt; Subtract 1 RPM\n              rolePerMinute = rolePerMinute - 1;\n              Flag5 = 1;\n              FastChng = 1;\n              lcd.clear();\n            }\n            if (YValue &gt; 399 &amp;&amp; YValue &lt; 599 &amp;&amp; Flag5 == 1){  \/\/if the Y-axis is back at it's neutral possition -&gt; Flag3 = 0 -&gt; Prevents constant adding or subtracting of 1\n              Flag5 = 0;\n              FastChng = 0;\n            }\n      \n            if (YValue &lt; 400 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick up is held for &gt; the fast delay time, then enter fast change mode\n              if ((millis() - SetTime) &gt; FastDelay) {\n                FastChng = 2;\n                SetTime = millis();  \/\/ update the set time\n              }\n            }\n      \n            if (YValue &gt; 600 &amp;&amp; FastChng == 1) {  \/\/ RH - if joystick down is held for &gt; the fast delay time, then enter fast change mode\n              if ((millis() - SetTime) &gt; FastDelay) {\n                FastChng = 2;\n                SetTime = millis();  \/\/ update the set time\n              }\n            }\n      \n            if (YValue &lt; 400 &amp;&amp; FastChng == 2) {  \/\/ RH - we are in fast change mode, so we want to update the values at the LongInt interval\n              if ((millis() - SetTime) &gt; LongInt) {  \/\/ (using fixed LongInt since not that many values to cycle through)\n                rolePerMinute = rolePerMinute + 1;\n                SetTime = millis();\n                lcd.clear();\n              }\n            }\n      \n            if (YValue &gt; 600 &amp;&amp; FastChng == 2) {  \/\/ RH - same for joystick down in fast change mode\n              if ((millis() - SetTime) &gt; LongInt) {\n                rolePerMinute = rolePerMinute - 1;\n                SetTime = millis();\n                lcd.clear();\n              }\n            }\n            \n            if (rolePerMinute &lt; 1){  \/\/Min allowable RPM\n              rolePerMinute = 1;\n            }\n            if (rolePerMinute &gt; 17){  \/\/Max allowable RPM\n              rolePerMinute = 17;\n            }\n      \n            if (XValue &gt; 400 ){  \/\/if the joystick is pushed to the right side and the neutral flag is 0 then 1 will be added to the menu number (purpose of the flag -&gt; see comment Flag1 above)\n              Steps = Steps + 1;\n              myStepper.setSpeed(rolePerMinute);\n              myStepper.step(Steps);\n              lcd.setCursor(14, 1);\n              lcd.print(\"&lt;-\");\n              Flag6 = 1;\n            }\n      \n            if (XValue &lt; 600 ){  \/\/if the joystick is pushed to the left side and the neutral flag is 0 then 1 will be subtracted from the menu number (purpose of the flag -&gt; see comment Flag1 above)\n              Steps = Steps + 1;\n              myStepper.setSpeed(rolePerMinute);\n              myStepper.step(-Steps);\n              lcd.setCursor(0, 1);\n              lcd.print(\"-&gt;\");\n              Flag6 = 1;\n            }\n      \n            if (XValue &gt; 399 &amp;&amp; XValue &lt; 599){  \/\/if the Y-axis is back at it's neutral possition -&gt; Flag3 = 0 -&gt; Prevents constant adding or subtracting of 1\n              Steps = 0;\n              if (Flag6 == 1){\n                lcd.clear();\n                Flag6 = 0;  \/\/This flag is only active during 1 program cycle to clear the lcd\n              }\n            }\n           }\n      \n           if (SwMenu == 2){  \/\/Leave menu 2 when button is pressed\n             lcd.clear();\n             CurrentTurn = 0;\n             PhotoNr = 1;\n             rolePerMinute = 15;\n             SwMenu = 0;\n             Steps = 0;\n           }\n           break;\n           \n    default:\n           break;       \n  }\n  \n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Limitaciones<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>El modelo 3D final conlleva un nivel de comprensi\u00f3n de modelaje 3D elevado junto con acceso a aplicaciones externas de la calidad requerida para el proceso.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Podr\u00eda haber una futura implementaci\u00f3n en la cual automatiz\u00e1ramos la grabaci\u00f3n del v\u00eddeo.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>La \u00fanica compatibilidad es con dispositivos Android.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>El tama\u00f1o y peso de los objetos es limitado debido a que nuestro modelo es \u00abcasero\u00bb.<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Reparto de tareas<\/h2>\n\n\n\n<p>La implementaci\u00f3n hardware de todo el conjunto se encarg\u00f3 Erik Fern\u00e1ndez Orgaz, de la creaci\u00f3n del PowerPoint de presentaci\u00f3n Adri\u00e1n Leonis Garc\u00eda y de la creaci\u00f3n de esta Memoria Alejandro Herrera Gonz\u00e1lez.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Presupuesto<\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><strong>Componentes<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>Precio<\/strong><\/td><\/tr><tr><td>M\u00f3dulo LCD 16&#215;2 con m\u00f3dulo I2C<\/td><td class=\"has-text-align-center\" data-align=\"center\">6 \u20ac<\/td><\/tr><tr><td>Motor paso a paso<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>Driver<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td>M\u00f3dulo Bluetooth hc-06<\/td><td class=\"has-text-align-center\" data-align=\"center\">10 \u20ac<\/td><\/tr><tr><td>Regulador de voltaje<\/td><td class=\"has-text-align-center\" data-align=\"center\">5 \u20ac<\/td><\/tr><tr><td>M\u00f3dulo FTDI-USB<\/td><td class=\"has-text-align-center\" data-align=\"center\">5 \u20ac<\/td><\/tr><tr><td>Piezas impresas en 3D<\/td><td class=\"has-text-align-center\" data-align=\"center\">0 \u20ac<\/td><\/tr><tr><td><strong>TOTAL<\/strong><\/td><td class=\"has-text-align-center\" data-align=\"center\"><strong>26 \u20ac<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">V\u00eddeos de los Casos de Uso<\/h2>\n\n\n\n<div style=\"height:54px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Funcionalidad del Modo Esc\u00e1ner<\/h5>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Video Esc\u00e1ner\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/bn3tMtwQ8Cw?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<div style=\"height:54px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Funcionalidad del Modo Cinem\u00e1tica<\/h5>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"V\u00eddeo Cinem\u00e1tica\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/3RzymOEmsFE?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<div style=\"height:54px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Funcionalidad del Modo de Control Manual<\/h5>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"V\u00eddeo Control Manual\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/3vZkwOC3278?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">V\u00eddeo Explicativo \u00abScan-It\u00bb<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Explicaci\u00f3n &quot;Scan-It&quot;\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/UyZbZ9gc4vU?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Material Extra<\/h2>\n\n\n\n<h5 class=\"wp-block-heading\">V\u00eddeo de la presentaci\u00f3n PowerPoint de apoyo<\/h5>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"video-container\"><iframe loading=\"lazy\" title=\"Presentaci\u00f3n &quot;Scan-It&quot;\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Y7D90Ifl7C0?feature=oembed&#038;wmode=opaque\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Bibliograf\u00eda<\/h2>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=y8PcNbAA6AQ\">https:\/\/www.youtube.com\/watch?v=y8PcNbAA6AQ<\/a>&nbsp; (Flash Hc-06)<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/lorf\/csr-spi-ftdi\">https:\/\/github.com\/lorf\/csr-spi-ftdi<\/a>&nbsp; (Software para Flash)<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/witnessmenow\/BPLib\">https:\/\/github.com\/witnessmenow\/BPLib<\/a>&nbsp; (Comandos de configuraci\u00f3n RN-42)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Autores: Erik Fern\u00e1ndez Orgaz Alejandro Herrera Gonz\u00e1lez Adri\u00e1n Leonis Garc\u00eda Introducci\u00f3n del proyecto Nuestro proyecto se basa en un esc\u00e1ner 3d con varias funcionalidades las cuales son: esc\u00e1ner, cinem\u00e1tica y control manual. La implementaci\u00f3n&#46;&#46;&#46;<\/p>\n","protected":false},"author":31,"featured_media":5271,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5264","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-proyectos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>&quot;SCAN-IT&quot; - Proyectos con Arduino. %<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"&quot;SCAN-IT&quot; - Proyectos con Arduino. %\" \/>\n<meta property=\"og:description\" content=\"Autores: Erik Fern\u00e1ndez Orgaz Alejandro Herrera Gonz\u00e1lez Adri\u00e1n Leonis Garc\u00eda Introducci\u00f3n del proyecto Nuestro proyecto se basa en un esc\u00e1ner 3d con varias funcionalidades las cuales son: esc\u00e1ner, cinem\u00e1tica y control manual. La implementaci\u00f3n&#046;&#046;&#046;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/\" \/>\n<meta property=\"og:site_name\" content=\"Proyectos con Arduino.\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-12T22:11:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-06-03T08:48:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"2048\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"\u00abSCAN-IT\u00bb\",\"datePublished\":\"2022-05-12T22:11:01+00:00\",\"dateModified\":\"2022-06-03T08:48:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/\"},\"wordCount\":1186,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/EscanerFotoGeneral.jpg\",\"articleSection\":[\"Proyectos\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/\",\"name\":\"\\\"SCAN-IT\\\" - Proyectos con Arduino. %\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/EscanerFotoGeneral.jpg\",\"datePublished\":\"2022-05-12T22:11:01+00:00\",\"dateModified\":\"2022-06-03T08:48:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/EscanerFotoGeneral.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/EscanerFotoGeneral.jpg\",\"width\":1536,\"height\":2048,\"caption\":\"Esc\u00e1ner 3D\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/scan-it\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u00abSCAN-IT\u00bb\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#website\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"name\":\"Proyectos con Arduino.\",\"description\":\"Blog de proyectos de Arduino de alumnos de la URJC\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#organization\",\"name\":\"Universidad Rey Juan Carlos\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2022\\\/05\\\/logourjc-1.jpg\",\"width\":745,\"height\":288,\"caption\":\"Universidad Rey Juan Carlos\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\\\/\\\/blogs.etsii.urjc.es\\\/dseytr\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\"SCAN-IT\" - Proyectos con Arduino. %","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/","og_locale":"es_ES","og_type":"article","og_title":"\"SCAN-IT\" - Proyectos con Arduino. %","og_description":"Autores: Erik Fern\u00e1ndez Orgaz Alejandro Herrera Gonz\u00e1lez Adri\u00e1n Leonis Garc\u00eda Introducci\u00f3n del proyecto Nuestro proyecto se basa en un esc\u00e1ner 3d con varias funcionalidades las cuales son: esc\u00e1ner, cinem\u00e1tica y control manual. La implementaci\u00f3n&#46;&#46;&#46;","og_url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/","og_site_name":"Proyectos con Arduino.","article_published_time":"2022-05-12T22:11:01+00:00","article_modified_time":"2022-06-03T08:48:46+00:00","og_image":[{"width":1536,"height":2048,"url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"20 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#article","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/"},"author":{"name":"","@id":""},"headline":"\u00abSCAN-IT\u00bb","datePublished":"2022-05-12T22:11:01+00:00","dateModified":"2022-06-03T08:48:46+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/"},"wordCount":1186,"commentCount":0,"publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg","articleSection":["Proyectos"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/","name":"\"SCAN-IT\" - Proyectos con Arduino. %","isPartOf":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#primaryimage"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg","datePublished":"2022-05-12T22:11:01+00:00","dateModified":"2022-06-03T08:48:46+00:00","breadcrumb":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#primaryimage","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/EscanerFotoGeneral.jpg","width":1536,"height":2048,"caption":"Esc\u00e1ner 3D"},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/scan-it\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.etsii.urjc.es\/dseytr\/"},{"@type":"ListItem","position":2,"name":"\u00abSCAN-IT\u00bb"}]},{"@type":"WebSite","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#website","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","name":"Proyectos con Arduino.","description":"Blog de proyectos de Arduino de alumnos de la URJC","publisher":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.etsii.urjc.es\/dseytr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#organization","name":"Universidad Rey Juan Carlos","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","contentUrl":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-content\/uploads\/sites\/8\/2022\/05\/logourjc-1.jpg","width":745,"height":288,"caption":"Universidad Rey Juan Carlos"},"image":{"@id":"https:\/\/blogs.etsii.urjc.es\/dseytr\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"","url":"https:\/\/blogs.etsii.urjc.es\/dseytr\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/comments?post=5264"}],"version-history":[{"count":47,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5264\/revisions"}],"predecessor-version":[{"id":5815,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/posts\/5264\/revisions\/5815"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media\/5271"}],"wp:attachment":[{"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/media?parent=5264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/categories?post=5264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.etsii.urjc.es\/dseytr\/wp-json\/wp\/v2\/tags?post=5264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}