IRONMAN
IRONMAN
IRONMAN
PROYECTO MAKER
ETAPAS DEL PROYECTO
A) Construcción de la máscara
B) Prueba de circuitos Arduino
C) Prototipados finales
PROTOTIPADO FINAL
1. Botón de apertura
2. Comando de voz
3. Reproductor musical
CONSTRUCCIÓN DE LA MÁSCARA
1. Diseño del prototipo en papercraft con Pepakura designer
2. Impresión 2D de las bases
3. Cortado de las bases en cartón
4. Pegado con silicona caliente
5. Masillado y lijado
6. Aplicación de la resina epoxi
7. Aplicación de base primer
8. Pintura
PEPAKURA DESIGNER
PEGADO
Pistola de silicona
RESINADO
Resina epoxi + endurecedor
Pincel y guantes
Reposo 24 Hs.
MASILLADO-SECADO-LIJADO
Con espátula
Reposo 24 Hs
Lija de madera
Volver a masillar errores
IMPRIMAR-PINTAR
Imprimar
Reposo 24 Hs
Pintar
Reposo 4 Hs
Pintar con fibrón metalizado los errores
APERTURA CON PULSADOR
Prueba de circuitos
Circioto final
ARDUINO NANO
Microcontrolador de hardware libre que permite la interacción entre sensores y actuadores, para ejecutar acciones de robótica, domótica y automatización
PROTOBOARD
IDE ARDUINO
MICROSERVOS
Un servomotor es un motor eléctrico, con regulación en voltaje y reductores de engranajes, tanto plásticos como mecánicos. Tiene la particularidad de ser controlado, tanto en velocidad como en posición.
MICROSERVO SG-90
Es un servo con caja reductora de engranajes de nylon y posee un giro programable de hasta 180 grados, con un torque de 1.4 kg
MICROSERVO MG-60
Es un servo con caja reductora de engranajes de metal y posee un giro programable de hasta 180 grados. Aumenta su torque de 1.8 a 2.2 Kg
MICROSERVO MG-996r
Es un servo con caja reductora de engranajes de metal y posee un giro programable de hasta 360 grados (con código especial), con un torque de 11 kg
CABLEADO MICROSERVOS MG-60/MG-90s
Señal PWM
VCC +
GND -
0. PRUEBA DE MICROSERVOS Arduino Uno
Utilizar baterías externas 9v
/* Funcionamiento básico de un microservo
**Desafío 1:
¿Cómo girar el servo 45 grados?
**Desafío 2:
¿Cómo girar el servo 120 grados?
**Desafío 3:
Generar un programa que cambie el nombre del servo
y que gire de 45 grados a 120 grados
en otro pin ¿Cuál podrías elegir?
Prof. Daniel Tedesco */
#include <Servo.h>
Servo servo;
void setup() {
servo.attach(9);
}
void loop() {
servo.write(0);
delay(2000);
servo.write(90);
delay(2000);
}
1.PRUEBA DE MICROSERVOS
/*Probar los dos microoservos MG-60
Asegurarse en lo posible de utilizar
una batería esxterna de 9v o
dupla de 3.7 V (18650)
o tripla AA 1.5 V con portapila
Prof. Daniel Tedesco*/
#include <Servo.h>
Servo servoMotor;
void setup() {
servoMotor.attach(2);
}
void loop() {
servoMotor.write (0);
delay(2000);
servoMotor.write(90);
delay(2000);
}
Utilizar baterías externas 9v
2. PRUEBA DE MICROSERVO Y PULSADOR
int boton =6;
void setup() {
Serial.begin(9600);
pinMode (boton, INPUT_PULLUP);
}
void loop() {
int estado = digitalRead (boton);
if( estado == LOW ){
Serial.println ("BOTON PULSADO");
}
}
3. PRUEBA DE 2 MICROSERVOS Y PULSADOR
int boton = 6;
#include <Servo.h>
Servo servo1;
Servo servo2;
void setup() {
Serial.begin(9600);
pinMode (boton, INPUT_PULLUP);
servo1.attach(2);
servo1.write(0);
servo2.attach(3);
servo2.write(90);
}
void loop() {
int estado = digitalRead (boton);
if (estado == LOW){
servo1.write(90);
} else {
servo1.write(0);
}
if (estado == LOW){
servo2.write(0);
} else {
servo2.write(90);
}
}
4. CIRCUITO FINAL
int boton = 6;
#include <Servo.h>
Servo servo1;
Servo servo2;
void setup() {
Serial.begin(9600);
pinMode (boton, INPUT_PULLUP);
servo1.attach(2);
servo1.write(0);
servo2.attach(3);
servo2.write(90);
}
void loop() {
int estado = digitalRead (boton);
if (estado == LOW){
servo1.write(90);
} else {
servo1.write(0);
}
if (estado == LOW){
servo2.write(0);
} else {
servo2.write(90);
}
}
5. MONTAJE
REPRODUCTOR DE MÚSICA
Prueba de circuitos
Circuito final
0. CARACTERISTICAS DEL DF PLAYER
Tensión 3.3 V a 5V
Pines DAC Paraltes comerciales
Pines SPK parante de desarrollo hasta 3W
Pines RX TX control con Arduino
Pines USB -+ conexión ficha hembra USB
ADKEY_1 inicia reproducción
IO_1 baja el volumen (Presión constante)
IO_1 Siguiente pista (Presión rápida)
IO_2 sube el volumen (Presión constante)
Reproduce *.mp3 escalonados 0001 en adelante
Tarjetas micro SD hasta 32 Gb
0. CARACTERISTICAS DEL DF PLAYER
0. CARACTERISTICAS DEL DF PLAYER
1. REPRODUCIMOS NUESTRO 1ER. AUDIO
1. REPRODUCIMOS NUESTRO 1ER. AUDIO
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(5, 6);
DFRobotDFPlayerMini myDFPlayer;
void setup() {
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) {
while(true);
}
myDFPlayer.volume(100);
myDFPlayer.play(1);
}
void loop() {
}
2. REPRODUCIMOS AUDIO CON BOTON
2. REPRODUCIMOS AUDIO CON BOTON
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int boton = 2;
SoftwareSerial mySoftwareSerial(5, 6);
DFRobotDFPlayerMini myDFPlayer;
void setup() {
pinMode (boton, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) {
while(true);
}
myDFPlayer.volume(100);
myDFPlayer.play(1);
}
void loop() {
int estado = digitalRead (boton);
if( estado == LOW ){
myDFPlayer.play(2);
}
}
3. AUDIOS RANDOM
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
int boton = 2;
long aleatorio;
SoftwareSerial mySoftwareSerial(5, 6);
DFRobotDFPlayerMini myDFPlayer;
void setup() {
pinMode (boton, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) {
while(true);
}
myDFPlayer.volume(100);
myDFPlayer.play(1);
}
void loop() {
int estado = digitalRead (boton);
aleatorio = random(3,5);
if( estado == LOW ){
myDFPlayer.play(aleatorio);
}
}
2. REPRODUCIMOS AUDIO CON DF PLAYER Y BOTON
2. REPRODUCIMOS AUDIO CON DF PLAYER Y BOTON
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Servo.h>
Servo servo1;
Servo servo2;
int boton = 4;
long aleatorio;
int anterior;
SoftwareSerial mySoftwareSerial(5, 6);
DFRobotDFPlayerMini myDFPlayer;
void setup() {
servo1.attach (2);
servo1.write (0);
servo2.attach (3);
servo2.write (180);
pinMode (boton, INPUT_PULLUP);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) {
while(true);
}
myDFPlayer.volume(100);
myDFPlayer.play(1);
}
void loop() {
int estado = digitalRead (boton);
if( estado == LOW ){
servo1.write (180);
} else {
servo1.write (0);
}
if( estado == LOW ){
servo2.write (0);
} else {
servo2.write (180);
}
if (anterior == HIGH && estado ==LOW){
myDFPlayer.play(2);
}
anterior = estado;
}
COMANDO DE VOZ
Prueba de circuitos
Circuito final
0. PROBAMOS EL MÓDULO ELECHOUSE
La luz del módulo debe prenderse e indica la llegada de corriente
Módulo de reconocimiento de voz
0.1 PROBAMOS EL MÓDULO ELECHOUSE
1. Instalar librería Elechouse
2. Cargar el ejemplo "vr sample train" del menú ejemplos
3. Abrimos monitor serie y configuramos en 115200 baudios
4. En la caja de búsqueda, cargamos el comando "sigtrain 0 abrir" y comprobamos el reconocimiento de voz
5. Una vez chequeado el comando, lo cargamos al módulo con la instrucción "Load 0" y comprobamos la carga
VER CAPTURAS EN EL SLIDE INFERIOR SIGUIENTE
Grabamos el primer comando
CAPTURAS
Otros comandos
-"sigtrain 1 música"
-load 1 Carga comando 1
-load 0 1 carga ambos comandos
-"sigtrain 2 cerrar"
-load 2
1. CONEXION DF PLAYER- ELECHOUSE
CÓDIGO
#include "SoftwareSerial.h"
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include "DFRobotDFPlayerMini.h"
VR portTwo(2,3);
SoftwareSerial portOne(5, 6);
DFRobotDFPlayerMini myDFPlayer;
uint8_t records[2];
uint8_t buf[64];
#define abrir (0)
#define musica (1)
void printSignature(uint8_t *buf, int len)
{
int i;
for(i=0; i<len; i++){
if(buf[i]>0x19 && buf[i]<0x7F){
Serial.write(buf[i]);
}
else{
Serial.print("[");
Serial.print(buf[i], HEX);
Serial.print("]");
}
}
}
void printVR(uint8_t *buf)
{
Serial.println("VR Index\tGroup\tRecordNum\tSignature");
Serial.print(buf[2], DEC);
Serial.print("\t\t");
if(buf[0] == 0xFF){
Serial.print("NONE");
}
else if(buf[0]&0x80){
Serial.print("UG ");
Serial.print(buf[0]&(~0x80), DEC);
}
else{
Serial.print("SG ");
Serial.print(buf[0], DEC);
}
Serial.print("\t");
Serial.print(buf[1], DEC);
Serial.print("\t\t");
if(buf[3]>0){
printSignature(buf+4, buf[3]);
}
else{
Serial.print("NONE");
}
Serial.println("\r\n");
}
void setup() {
delay(500);
Serial.begin(115200);
portOne.begin(9600);
portTwo.begin(9600);
if (portTwo.load((uint8_t)abrir) >= 0) {
Serial.println("Comando 0 (Abrir) cargado");
}
if (portTwo.load((uint8_t)musica) >= 0) {
Serial.println("Comando 1 (Musica) cargado");
}
myDFPlayer.begin(portOne);
myDFPlayer.volume(100);
delay (1000);
myDFPlayer.play(1);
}
void loop() {
portOne.listen();
Serial.println("Data from port one:");
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
Serial.println();
portTwo.listen();
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
Serial.println();
int ret;
ret = portTwo.recognize(buf, 50);
if(ret>0){
switch(buf[1]){
case abrir:
myDFPlayer.play(2);
break;
default:
Serial.println("Record function undefined");
break;
}
/** voice recognized */
printVR(buf);
}
}
001 intro
002 máscara abierta
003 máscara cerrada
004 shot to thrill
005 Damnation
006 Back in black
CÓDIGO
+ MUSICA
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Servo.h>
VR portTwo(2,3 );
SoftwareSerial portOne(5, 6);
long aleatorio;
DFRobotDFPlayerMini myDFPlayer;
uint8_t records[3];
uint8_t buf[64];
#define abrir (0)
#define musica (1)
#define cerrar (2)
void printSignature(uint8_t *buf, int len)
{
int i;
for(i=0; i<len; i++){
if(buf[i]>0x19 && buf[i]<0x7F){
Serial.write(buf[i]);
}
else{
Serial.print("[");
Serial.print(buf[i], HEX);
Serial.print("]");
}
}
}
void printVR(uint8_t *buf)
{
Serial.println("VR Index\tGroup\tRecordNum\tSignature");
Serial.print(buf[2], DEC);
Serial.print("\t\t");
if(buf[0] == 0xFF){
Serial.print("NONE");
}
else if(buf[0]&0x80){
Serial.print("UG ");
Serial.print(buf[0]&(~0x80), DEC);
}
else{
Serial.print("SG ");
Serial.print(buf[0], DEC);
}
Serial.print("\t");
Serial.print(buf[1], DEC);
Serial.print("\t\t");
if(buf[3]>0){
printSignature(buf+4, buf[3]);
}
else{
Serial.print("NONE");
}
Serial.println("\r\n");
}
void setup() {
portOne.begin(9600);
portTwo.begin(9600);
Serial.begin(115200);
Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");
if(portTwo.load((uint8_t)abrir) >= 0){
Serial.println("abrir loaded");
}
if(portTwo.load((uint8_t)musica) >= 0){
Serial.println("musica loaded");
}
if(portTwo.load((uint8_t)cerrar) >= 0){
Serial.println("cerrar loaded");
}
myDFPlayer.begin (portOne);
myDFPlayer.volume(100);
delay (1000);
myDFPlayer.play(1);
}
void loop() {
aleatorio = random(4,6);
portOne.listen();
Serial.println("Data from port one:");
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
Serial.println();
portTwo.listen();
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
Serial.println();
int ret;
ret = portTwo.recognize(buf, 50);
if(ret>0){
switch(buf[1]){
case abrir:
myDFPlayer.play(2);
break;
case cerrar:
myDFPlayer.play(3);
break;
case musica:
myDFPlayer.play(aleatorio);
break;
default:
Serial.println("Record function undefined");
break;
}
/** voice recognized */
printVR(buf);
}
}
001 intro
002 máscara abierta
003 máscara cerrada
004 shot to thrill
005 Damnation
006 Back in black
2. ESQUEMA
FINAL
CÓDIGO
FINAL
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Servo.h>
Servo servo1;
Servo servo2;
VR portTwo(7,8 );
SoftwareSerial portOne(5, 6);
long aleatorio;
DFRobotDFPlayerMini myDFPlayer;
uint8_t records[3];
uint8_t buf[64];
#define abrir (0)
#define musica (1)
#define cerrar (2)
void printSignature(uint8_t *buf, int len)
{
int i;
for(i=0; i<len; i++){
if(buf[i]>0x19 && buf[i]<0x7F){
Serial.write(buf[i]);
}
else{
Serial.print("[");
Serial.print(buf[i], HEX);
Serial.print("]");
}
}
}
void printVR(uint8_t *buf)
{
Serial.println("VR Index\tGroup\tRecordNum\tSignature");
Serial.print(buf[2], DEC);
Serial.print("\t\t");
if(buf[0] == 0xFF){
Serial.print("NONE");
}
else if(buf[0]&0x80){
Serial.print("UG ");
Serial.print(buf[0]&(~0x80), DEC);
}
else{
Serial.print("SG ");
Serial.print(buf[0], DEC);
}
Serial.print("\t");
Serial.print(buf[1], DEC);
Serial.print("\t\t");
if(buf[3]>0){
printSignature(buf+4, buf[3]);
}
else{
Serial.print("NONE");
}
Serial.println("\r\n");
}
void setup() {
portOne.begin(9600);
portTwo.begin(9600);
servo1.attach (2);
servo1.write (0);
servo2.attach (3);
servo2.write (180);
Serial.begin(115200);
Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");
if(portTwo.load((uint8_t)abrir) >= 0){
Serial.println("abrir loaded");
}
if(portTwo.load((uint8_t)musica) >= 0){
Serial.println("cerrar loaded");
}
if(portTwo.load((uint8_t)cerrar) >= 0){
Serial.println("cerrar loaded");
}
myDFPlayer.begin (portOne);
myDFPlayer.volume(100);
delay (1000);
myDFPlayer.play(1);
}
void loop() {
aleatorio = random(4,6);
portOne.listen();
Serial.println("Data from port one:");
while (portOne.available() > 0) {
char inByte = portOne.read();
Serial.write(inByte);
}
Serial.println();
portTwo.listen();
Serial.println("Data from port two:");
while (portTwo.available() > 0) {
char inByte = portTwo.read();
Serial.write(inByte);
}
Serial.println();
int ret;
ret = portTwo.recognize(buf, 50);
if(ret>0){
switch(buf[1]){
case abrir:
servo1.write (180);
servo2.write (0);
myDFPlayer.play(2);
break;
case cerrar:
servo2.write (180);
servo1.write (0);
myDFPlayer.play(3);
break;
case musica:
myDFPlayer.play(aleatorio);
break;
default:
Serial.println("Record function undefined");
break;
}
/** voice recognized */
printVR(buf);
}
}
Proyecto Maker: Casco Iron Man
By profdanieltedesco
Proyecto Maker: Casco Iron Man
Now you can add blur and drop-shadow filters to your content blocks.
- 68