# Adventronics de Fablab BCN [ToC] ## Intro Yo he seguido el proyecto de Barduino desde el 2.0 que tenían en 2020 que hice el [fabacademy](http://fabacademy.org/2020/labs/barcelona/students/david-prieto/) así que cuando han publicado lo del Adventronics con el nuevo pues me apunté de cabeza https://fablabbcn.github.io/adventronics/ ![imagen](https://hackmd.io/_uploads/B13nUJuB6.png) Aquí está la documentación algo más detallada del microcontrolador que voy a explorar este mes https://fablabbcn-projects.gitlab.io/electronics/barduino-docs/ Se puede seguir también por Mastodon por acá: https://peoplemaking.games/@d_prieto/111507610213653911 ## Dia 1 - Blinko blonko https://fablabbcn.github.io/adventronics/solutions/01/01/ La versión básica es bueno, esto: ```C++ void setup() { pinMode(48, OUTPUT); } void loop() { digitalWrite(48, HIGH); delay(400); digitalWrite(48, LOW); delay(400); } ``` Video: https://s3.wasabisys.com/pmg-media/media_attachments/files/111/507/621/675/663/049/original/b19884887f2e5878.mp4 Para añadirle un poco de salsa he averiguado cómo van los números aleatorios en random que parece ser que en expressif han sobreescrito la función de random. También he visto que el Serial va diferente porque no me consigo conectar, pero ya veré cómo funciona. Este es el código que he usado: :::spoiler ```C++ // constants won't change. Used here to set a pin number: const int led = 48; // the LED of the Barduino is connected to pin 48 // Variables will change: int ledState = LOW; // ledState used to set the LED // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store unsigned long previousMillis = 0; // will store last time LED was updated long interval = 1000; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // the interval at which you want to blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(led, ledState); interval= 10*random(1,100); Serial.println(interval); } } ``` ::: Este es el video de cómo queda https://s3.wasabisys.com/pmg-media/media_attachments/files/111/507/795/096/867/244/original/1a7a6f23a64dd1ad.mp4 ### Enlaces de temas de generador de números aleatorios RGN https://www.luisllamas.es/esp32-random-numbers/ (¡Luis Llamas, tú lo has escrito tó antes!) https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/random.html ## Día 2 Selfi con Moncho https://fablabbcn.github.io/adventronics/solutions/02/02/ Hoy tocaba una selfi con el Barduino, y me la tomé con mi perrito Moncho. En el grupo de telegram hubo muchas cosas divertidas (que no reproduzco porque protección de datos). ![imagen](https://hackmd.io/_uploads/H1q748cS6.png) ## Día 3 Sticker Stocker Hoy toca hacer un sticker en una imagen así que voy a repasar una cosa que tenía curiosidad de ver cómo funcionaba en inkscape. El equidist de autoCAD o desvio según cómo lo dice en el inkscape. La gracia de esa herramienta es que me permitirá genera la parte de recorte de mi ilustración. De momento la idea es hacer algo como "my barduino sense is tingling" ![imagen](https://hackmd.io/_uploads/rkBhIUqrp.png) No sé si podré tener este juego tan chulo de colores y efectos pero TIEMPO AL TIEMPO. Para trabajar hay unos svgs que nos han dejado para usar https://fablabbcn.github.io/adventronics/solutions/03/03/ ![imagen](https://hackmd.io/_uploads/B1VkI85Hp.png) De momento veo que tengo un inkscape viejito instalado en este ordenador y que la representación queda un poco regulinchi ![imagen](https://hackmd.io/_uploads/H1Iwr8qHa.png) Aunque no hay que negar que tiene cierto flow como arte de glitch. Buscando información reviso los tutoriales de la propia página de inkscape https://inkscape.org/doc/tutorials/shapes/tutorial-shapes.html Que aunque son muy intereantes (el otro día estaba buscando cómo hacer segmentos de un círculo y ahora lo he encontrado) ### Dinamic Offset en inkscape o desvío dinámico Encontré una versión de la documentación oficial pero no entendí la explicación https://inkscape.org/doc/tutorials/advanced/tutorial-advanced.html Encontré aquí la versión en video pero lo voy a explicar porque es un poco invisible la weá https://inkscape.org/es/~JurgenG/%E2%98%85using-dynamic-offset-in-inkscape Tenemos una forma que en nuestro caso es la forma del microcontrolador ![imagen](https://hackmd.io/_uploads/B1G4kP5HT.png) Vamos a trayecto desvío dinámico (Ctrl+J) teniendo seleccionada la forma que vamos a modificar. ![imagen](https://hackmd.io/_uploads/SJx21P9ra.png) Ahora, si nos fijamos con mucho detalle y cariño hay algo que ha cambiado. Arriba ahora hay un pequeño diamante que nos servirá para modificar el equidist. Recordar que esto va a ser esta misma forma así que no estamos duplicando nada por ahora. ![imagen](https://hackmd.io/_uploads/SJbMgw9S6.png) _arriba está la weá a la izquierda_ En la parte de abajo además nos pone esto: ![imagen](https://hackmd.io/_uploads/H1j4eP9HT.png) Si pinchamos en el rombito y arrastramos podremos modificar el trazado. y bueno, pueden pasar cosas como esta ![imagen](https://hackmd.io/_uploads/ryEWbv5Hp.png) ![imagen](https://hackmd.io/_uploads/S1zHWP5H6.png) Y esto ha pasado porqu me he pasado un poco pero también porque al hacer esto también se han heho grandes los agujeros (cosa extraña, pero supongo que funciona así) Por lo que veo el rombito hay que colocalo en el punto que quieras que pase el trazado. En este caso es solo ampliarlo un poco ![imagen](https://hackmd.io/_uploads/SJhRZDqHT.png) Original vs modificado Que con un par de rectángulos y la fusión queda todo listo ![imagen](https://hackmd.io/_uploads/HJecfP5Ba.png) Poniéndolo por detrás de la figura inicial tenemos esto ![imagen](https://hackmd.io/_uploads/H1217vqrT.png) Con varias superposiiones tenemos esto por acá ![imagen](https://hackmd.io/_uploads/H1pxHw9Ha.png) La imagen al final ha sido esta: ![imagen](https://hackmd.io/_uploads/rJmSqPcSp.png) ### Ronda extra ![imagen](https://hackmd.io/_uploads/SJ6xqPcHT.png) Bendiciones (no me pude loguear en blingee https://blingee.com/) ## Día 4 el código morse https://fablabbcn.github.io/adventronics/solutions/04/04/ Hoy ha sido fácil porque, bueno, enseño a mis alumnos el código morse nada más comenzar el curso así que este lo tengo trillado. De momento para ello suelo partir de la definición de morse de la [wikipedia](https://es.wikipedia.org/wiki/C%C3%B3digo_morse) ![International_Morse_code](https://hackmd.io/_uploads/Sk73LSsHT.png) Para empezar también tengo un código de una alumna que me dio para poder usarlo y que puede ser un punto de partida :::spoiler ```C++ void setup() { // put your setup code here, to run once: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: String word = Serial.readString(); // String(Serial.read()) word.toUpperCase(); for (int i = 0; i < word.length(); i++){ switch(word[i]) { case 'A': Serial.print(".-"); break; case 'B': Serial.print("-..."); break; case 'C': Serial.print("-.-."); break; case 'D': Serial.print("-.."); break; case 'E': Serial.print("."); break; case 'F': Serial.print("..-."); break; case 'G': Serial.print("--."); break; case 'H': Serial.print("...."); break; case 'I': Serial.print(".."); break; case 'J': Serial.print(".---"); break; case 'K': Serial.print("-.-"); break; case 'L': Serial.print(".-.."); break; case 'M': Serial.print("--"); break; case 'N': Serial.print("-."); break; case 'O': Serial.print("---"); break; case 'P': Serial.print(".--."); break; case 'Q': Serial.print("--.-"); break; case 'R': Serial.print(".-."); break; case 'S': Serial.print("..."); break; case 'T': Serial.print("-"); break; case 'U': Serial.print("..-"); break; case 'V': Serial.print("...-"); break; case 'W': Serial.print(".--"); break; case 'X': Serial.print("-..-"); break; case 'Y': Serial.print("-.--"); break; case 'Z': Serial.print("--.."); break; default: delay(2000); break; } Serial.print("/"); } Serial.println(""); delay(1000); } ``` ::: Como este es el primero que hago ahora con el Barduino 4.0, voy a remezclarlo con la propuesta que hay en la página. Para empezar voy a refactorizar para que el código morse lo haga en una función que sea el pasar a morse. De momento llevo esto: :::spoiler ```C++ const int led = 48; const int buzzer = 14; const int freq = 800; const int dotDuration = 200; String message = "Feliz Navidad"; void setup() { Serial.begin(115200); pinMode(led, OUTPUT); // ledcAttach(buzzer, 1); delay(2000); //wait 2 seconds to start transmitting } void loop() { // put your main code here, to run repeatedly: String message = Serial.readString(); fromCharactersToMorse(message ); } void dot() { digitalWrite(led, HIGH); ledcWriteTone(1, freq); delay(dotDuration); digitalWrite(led, LOW); ledcWriteTone(1, 0); delay(dotDuration); //space between parts of a letter } void dash() { digitalWrite(led, HIGH); ledcWriteTone(1, freq); delay(dotDuration * 3); // A dash are 3 dots digitalWrite(led, LOW); ledcWriteTone(1, 0); delay(dotDuration); //space between parts of a letter } void fromCharactersToMorse( String message) { message.toUpperCase(); for (int i = 0; i < message.length(); i++){ switch(message[i]) { case 'A': Serial.print(".-"); dot(); dash(); break; case 'B': Serial.print("-..."); dash(); dot(); dot(); dot(); break; case 'C': Serial.print("-.-."); dash(); dot(); dash(); dot(); break; case 'D': Serial.print("-.."); dash(); dot(); dot(); break; case 'E': Serial.print("."); dot(); break; case 'F': Serial.print("..-."); dot(); dot(); dash(); dot(); break; case 'G': Serial.print("--."); dash(); dash(); dot(); break; case 'H': Serial.print("...."); dot(); dot(); dot(); dot(); break; case 'I': Serial.print(".."); dot(); dot(); break; case 'J': Serial.print(".---"); dot(); dash(); dash(); dash(); break; case 'K': Serial.print("-.-"); dash(); dot(); dash(); break; case 'L': Serial.print(".-.."); dot(); dash(); dot(); dot(); break; case 'M': Serial.print("--"); dash(); dash(); break; case 'N': Serial.print("-."); dash(); dot(); break; case 'O': Serial.print("---"); dash(); dash(); dash(); break; case 'P': Serial.print(".--."); dot(); dash(); dash(); dot(); break; case 'Q': Serial.print("--.-"); dash(); dash(); dot(); dash(); break; case 'R': Serial.print(".-."); dot(); dash(); dot(); break; case 'S': Serial.print("..."); dot(); dot(); dot(); break; case 'T': Serial.print("-"); dash(); break; case 'U': Serial.print("..-"); dot(); dot(); dash(); break; case 'V': Serial.print("...-"); dot(); dot(); dot(); dash(); break; case 'W': Serial.print(".--"); dot(); dash(); dash(); break; case 'X': Serial.print("-..-"); dash(); dot(); dot(); dash(); break; case 'Y': Serial.print("-.--"); dash(); dot(); dash(); dash(); break; case 'Z': Serial.print("--.."); dash(); dash(); dot(); dot(); break; case ' ': Serial.print("/"); //no delay here because it's going to get an extra 2 + 3 because of the end of the letter. break; default: delay(1000); break; } Serial.print("/"); delay(dotDuration*2); //delay between letters 1 (in the last dot/dash) +2 = 3 } Serial.println(); delay(1000); } ``` ::: De momento compila pero me da error el establecer el buzzer. Primero lo probaré sin sonido a ver si funciona. ### El error de "no me funciona el Serial" Mientras hacía test veía que no me funcionaba bien el objeto Serial y no me imprimía. Fui a ver si en un ejemplo de Blink añadiendo un Serial.begin y un mensaje de "owo" y no salía. Al final era por algo que se puede ver aquí: https://fablabbcn-projects.gitlab.io/electronics/barduino-docs/GettingStarted/arduinoIDE/ Básicamente que hay que decirle que el USB CDC On Boot que enabled y de ahí funciona ![imagen](https://hackmd.io/_uploads/ryepTMPPa.png) Se ve en Herramientas -> USB CDC On Boot: -> Enabled ### Código que sólo tiene la luz Con esto ya tengo un código que sí le funciona con la luz y que es este: :::spoiler ```cpp const int led = 48; const int buzzer = 14; const int freq = 800; const int dotDuration = 200; String message = "Feliz Navidad"; void setup() { Serial.begin(115200); pinMode(led, OUTPUT); //ledcAttachPin(buzzer, 1); delay(2000); //wait 2 seconds to start transmitting fromCharactersToMorse(message); } void loop() { // put your main code here, to run repeatedly: String message = Serial.readString(); Serial.println(message); fromCharactersToMorse(message); } void dot() { digitalWrite(led, HIGH); // ledcWriteTone(1, freq); delay(dotDuration); digitalWrite(led, LOW); //ledcWriteTone(1, 0); delay(dotDuration); //space between parts of a letter } void dash() { digitalWrite(led, HIGH); // ledcWriteTone(1, freq); delay(dotDuration * 3); // A dash are 3 dots digitalWrite(led, LOW); //ledcWriteTone(1, 0); delay(dotDuration); //space between parts of a letter } void fromCharactersToMorse( String message) { message.toUpperCase(); for (int i = 0; i < message.length(); i++){ switch(message[i]) { case 'A': Serial.print(".-"); dot(); dash(); break; case 'B': Serial.print("-..."); dash(); dot(); dot(); dot(); break; case 'C': Serial.print("-.-."); dash(); dot(); dash(); dot(); break; case 'D': Serial.print("-.."); dash(); dot(); dot(); break; case 'E': Serial.print("."); dot(); break; case 'F': Serial.print("..-."); dot(); dot(); dash(); dot(); break; case 'G': Serial.print("--."); dash(); dash(); dot(); break; case 'H': Serial.print("...."); dot(); dot(); dot(); dot(); break; case 'I': Serial.print(".."); dot(); dot(); break; case 'J': Serial.print(".---"); dot(); dash(); dash(); dash(); break; case 'K': Serial.print("-.-"); dash(); dot(); dash(); break; case 'L': Serial.print(".-.."); dot(); dash(); dot(); dot(); break; case 'M': Serial.print("--"); dash(); dash(); break; case 'N': Serial.print("-."); dash(); dot(); break; case 'O': Serial.print("---"); dash(); dash(); dash(); break; case 'P': Serial.print(".--."); dot(); dash(); dash(); dot(); break; case 'Q': Serial.print("--.-"); dash(); dash(); dot(); dash(); break; case 'R': Serial.print(".-."); dot(); dash(); dot(); break; case 'S': Serial.print("..."); dot(); dot(); dot(); break; case 'T': Serial.print("-"); dash(); break; case 'U': Serial.print("..-"); dot(); dot(); dash(); break; case 'V': Serial.print("...-"); dot(); dot(); dot(); dash(); break; case 'W': Serial.print(".--"); dot(); dash(); dash(); break; case 'X': Serial.print("-..-"); dash(); dot(); dot(); dash(); break; case 'Y': Serial.print("-.--"); dash(); dot(); dash(); dash(); break; case 'Z': Serial.print("--.."); dash(); dash(); dot(); dot(); break; case ' ': Serial.print("/"); //no delay here because it's going to get an extra 2 + 3 because of the end of the letter. break; default: delay(1000); break; } Serial.print("/"); delay(dotDuration*2); //delay between letters 1 (in the last dot/dash) +2 = 3 } Serial.println(); delay(1000); } ``` ::: #### Hero shot 1 ![imagen](https://hackmd.io/_uploads/BJZ0gmPP6.png) ### Ahora el buzzer Por alguna razón me da error ```ledcAttachPin(buzzer, 1);``` diciendo que no está definido y que si es ledcAttach a secas. Pero que claro, ledcAttach requiere 3 parámetros. Así que toca ir a buscar documentación. Tras revisar diversa documentación y gente que le da error parece ser que están usando otra librería que no es la que yo tengo disponible así que tocó ir al readTheDocs de expressif https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html En este caso en el setup hay que poner esto: ``` bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution); ``` [Aquí la descripción](https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html#ledcattach) Cosa que he usado primero para ver si funciona o no (y sí funcionaba) con esta sencilla estructura: ```cpp if(ledcAttach(buzzer, 5000, 8)) { Serial.println("Buzzer configured"); } else { Serial.println("Buzzer not configured"); } ``` La resolución y la frecuencia puse esa pero no estaba muy seguro, puse una frecuencia mayor a la que usé y le puse esa resolución. Luego en el dot y en el dash le ponemos estas funciones que en este caso piden el pin y la frecuencia: ```cpp! ledcWriteTone(buzzer, freq); ledcWriteTone(buzzer, 0); ``` Quedando una cosa así (el dash es igual pero con otro delay entre el HIGH y el LOW) ```cpp! void dot() { digitalWrite(led, HIGH); ledcWriteTone(buzzer, freq); delay(dotDuration); digitalWrite(led, LOW); ledcWriteTone(buzzer, 0); delay(dotDuration); //space between parts of a letter } ``` Este es el código completo: :::spoiler ```Cpp= const int led = 48; const int buzzer = 14; const int freq = 800; const int dotDuration = 200; String message = "Feliz Navidad"; void setup() { Serial.begin(115200); pinMode(led, OUTPUT); if(ledcAttach(buzzer, 5000, 8)) { Serial.println("Buzzer configured"); } else { Serial.println("Buzzer not configured"); } delay(2000); //wait 2 seconds to start transmitting fromCharactersToMorse(message); } void loop() { // put your main code here, to run repeatedly: String message = Serial.readString(); Serial.println(message); fromCharactersToMorse(message); } void dot() { digitalWrite(led, HIGH); ledcWriteTone(buzzer, freq); delay(dotDuration); digitalWrite(led, LOW); ledcWriteTone(buzzer, 0); delay(dotDuration); //space between parts of a letter } void dash() { digitalWrite(led, HIGH); ledcWriteTone(buzzer, freq); delay(dotDuration * 3); // A dash are 3 dots digitalWrite(led, LOW); ledcWriteTone(buzzer, 0); delay(dotDuration); //space between parts of a letter } void fromCharactersToMorse( String message) { message.toUpperCase(); for (int i = 0; i < message.length(); i++){ switch(message[i]) { case 'A': Serial.print(".-"); dot(); dash(); break; case 'B': Serial.print("-..."); dash(); dot(); dot(); dot(); break; case 'C': Serial.print("-.-."); dash(); dot(); dash(); dot(); break; case 'D': Serial.print("-.."); dash(); dot(); dot(); break; case 'E': Serial.print("."); dot(); break; case 'F': Serial.print("..-."); dot(); dot(); dash(); dot(); break; case 'G': Serial.print("--."); dash(); dash(); dot(); break; case 'H': Serial.print("...."); dot(); dot(); dot(); dot(); break; case 'I': Serial.print(".."); dot(); dot(); break; case 'J': Serial.print(".---"); dot(); dash(); dash(); dash(); break; case 'K': Serial.print("-.-"); dash(); dot(); dash(); break; case 'L': Serial.print(".-.."); dot(); dash(); dot(); dot(); break; case 'M': Serial.print("--"); dash(); dash(); break; case 'N': Serial.print("-."); dash(); dot(); break; case 'O': Serial.print("---"); dash(); dash(); dash(); break; case 'P': Serial.print(".--."); dot(); dash(); dash(); dot(); break; case 'Q': Serial.print("--.-"); dash(); dash(); dot(); dash(); break; case 'R': Serial.print(".-."); dot(); dash(); dot(); break; case 'S': Serial.print("..."); dot(); dot(); dot(); break; case 'T': Serial.print("-"); dash(); break; case 'U': Serial.print("..-"); dot(); dot(); dash(); break; case 'V': Serial.print("...-"); dot(); dot(); dot(); dash(); break; case 'W': Serial.print(".--"); dot(); dash(); dash(); break; case 'X': Serial.print("-..-"); dash(); dot(); dot(); dash(); break; case 'Y': Serial.print("-.--"); dash(); dot(); dash(); dash(); break; case 'Z': Serial.print("--.."); dash(); dash(); dot(); dot(); break; case ' ': Serial.print("/"); //no delay here because it's going to get an extra 2 + 3 because of the end of the letter. break; default: delay(1000); break; } Serial.print("/"); delay(dotDuration*2); //delay between letters 1 (in the last dot/dash) +2 = 3 } Serial.println(); delay(1000); } ``` ::: #### Hero Shot 2 Aquí enlazo al hilo de mastodon ## Extra: pánico Vale, pues no sé qué me pasa pero ahora no puedo configurar el barduino. Me da error como si no existiera ningún puerto ![imagen](https://hackmd.io/_uploads/SJgQyz6Bp.png) Es en windows 10. He tratado de instalar los drivers del USB por acá pero no hay forma. https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads La plaa ahora si la dejo conectada se calienta así que la voy desconectando. He probado varios cables. Yo no sé qué hacer u.u ![imagen](https://hackmd.io/_uploads/H1A9Jf6Hp.png) ### Revisión con Josep Tras unos días (me pilló en Burgos) revisamos si estaban bien las soldaduras y parecío que estaba correcto salvo por la parte de... bueno, de no funcionar. ## Barduino 4.0 ![imagen](https://hackmd.io/_uploads/By93emvDT.png) Por todo esto ahora tengo para seguir con el reto un Barduino 4.0 que tiene algunas leves diferencias. Por un lado hubo que cambiar un par de resistencias que eran muy bajitas (22 ohmnios) que estaban conectadas a los LED, había que cambiarlas por unas de 1000 ohm para que no brillase demasiado. También ha un par de pins que están intercambiados. En este caso el pin 3 está conectada al botón capacitivo y además al sensor de temperatura. Lo importante es que funciona así que VOLVEMOS AL RUEDO.