miércoles, 12 de marzo de 2014

DMX con micrófono hecho con Atmega 328P (Psicodélico)

Este es un proyecto que trata de la creación de un DMX que funciona con un micrófono mediante el microcontrolador Atmega 328P.


INTRODUCCIÓN

La idea del proyecto surgió de este esquema de psicodélico ya hecho:
(Click en la imagen para agrandar)

Este es un esquema de un psicodélico al cual le llega la señal de audio y esa misma señal la divide en graves, medios y agudos de forma analógica, para lo cual se necesitan 3 filtros diferentes. La siguiente etapa del psicodélico es la amplificación, para lo que se necesitan otros 3 amplificadores, uno para cada filtro. 
Finalmente, tras la etapa de amplificación está la etapa de salida, que consiste en 3 optotriacs, nuevamente 1 para cada señal.

La idea de este proyecto es, a través del Atmega 328P, librarnos en parte de algunas etapas analógicas y hacerlas digitalmente y hacerlo también más independiente. Para ello utilizaremos un módulo de micrófono para arduino junto con un amplificador u741, para meterle la señal analógica del audio ya amplificada al Atmega. Los filtros los hará digitalmente con un programa que le meteremos al Atmega, basándonos en la FFT (Transformada Rápida de Fourier). A la salida usaremos los optotriacs para alimentar luces de 60V por ejemplo.

Aquí la placa prototipo funcionando con el programa:

Video:





PRIMERA SEMANA 
(Lunes 13 - Viernes 17 de Enero)

Lo primero que hice fue encargar los componentes que considero que me van a hacer falta:
-Módulo de micrófono para arduino.
-Fuente reguladora DC-DC.
-Módulo de bluetooth para arduino.
Durante la primera semana de trabajo he ido diseñando el esquemático de una placa de pruebas en ISIS. 

(Click en la imagen para agrandar)

Para hacer el esquemático diseñé el encapsulado del módulo de micrófono con 4 pines para que fuera conectar y listo. La patilla DO (digital output) del micrófono la dejamos sin conectar, ya que no la vamos a utilizar.

Como es una placa prototipo sólo tiene lo básico: el micrófono, un amplificador a la salida del micrófono (ya que la señal que sale es muy débil), el Atmega 328P con su cristal oscilador de 16MHz, 3 leds de diferente color a las salidas y RX/TX para probar la comunicación por bluetooth.

Tras diseñar el esquemático en ISIS, lo siguiente era hacer el PCB de la placa, tratando de hacer su tamaño lo más reducido posible.

(Click en la imagen para agrandar)

Una vez impreso el diseño en la placa, comenzamos a soldar, quedando así la placa:

 

A la par que he ido haciendo esto, he ido buscando información en casa y en clase sobre la Transformada Rápida de Fourier (FFT) y algunos programas ya hechos que me puedan servir de ayuda, para poder empezar a programar en la semana que entra.



SEGUNDA SEMANA 
(Lunes 20 - Viernes 24 de Enero)

El primer paso para empezar a programar ha sido descargar la librería FFT, que se puede descargar desde aquí, haciendo click en Archivo/Descargar. Ahí se incluyen los ficheros de la librería necesarios para poder incorporarlo a nuestro programa de arduino, junto con un ejemplo ya hecho.

Una vez descargada la librería, comencé a recopilar información de diversas páginas web y de programas ya hechos.

Con el micrófono de un compañero he podido ir haciendo pruebas y editando el programa.

 

Desde aquí podemos descargar el programa.

El programa lo que hace es coger el valor analógico que le llega desde el micrófono (tras amplificarlo) y a través de la fórmula de la FFT separamos esos valores en 3 variables, una contiene los tonos agudos, otra los tonos medios y otra los tonos graves. A cada variable le aplicamos una fórmula para que no sature la salida cuando hay demasiado volumen. Tras esto, sale cada valor por las patillas que habíamos preparado en la placa prototipo.

Este sería un programa prototipo, para el programa final quiero que haya comunicación serie por bluetooth para que se pueda controlar el valor de la salida desde otro dispositivo (como si fuera un potenciómetro digital).

Por otro lado he de hacer una placa nueva para los optotriacs que cogerían el valor de la salida para, en un principio, alimentar luces de 60V.



TERCERA SEMANA 
(Lunes 27 - Viernes 31 de Enero)

Al finalizar la semana pasada, tuve un accidente con la placa cuando medía con el osciloscopio, pero tras intensivas mediciones con el polímetro y alguna soldadura que otra, ya vuelve a estar sana y operativa de nuevo para poder seguir haciendo prácticas con ella.

Se han pedido ya los optotriacs MOC3041 y los triacs para empezar a hacer la etapa de salida.

Mientras llegan los componentes, comenzaré con el diseño de la placa de salida y con el programa de comunicación serie. De momento así está quedando el diseño de la etapa de salida, aún incompleta:

Diseño ISIS de la etapa de salida sin terminar.


CUARTA SEMANA 
(Lunes 03 - Viernes 07 de Febrero)

Se me ha ocurrido poner la opción de que al programa le entre el audio a través de un jack y no sólo por el micrófono, para dar al aparato más opciones. Lo mejor para ello es con un conmutador. Por ello, he empezado a prepararme los materiales necesarios para la placa final, como el interruptor de encendido/apagado, el conmutador, etc:

Fuente de alimentación, que consiste en un adaptador 
AC-DC de 8V que irá a un conector el cual alimentará la placa.

Conector de jack para poder meterle el audio directamente a través de un cable jack.

Este será el interruptor On/Off, que irá junto con un led rojo indicador.

Conmutador de 3 patillas y 2 posiciones, para dar al usuario la opción de 
cambiar la entrada de audio por micrófono o por cable jack.

Mi intención es dejarlos ya soldados a unos cables para cuando tenga la placa hecha sea sólo cuestión de pinchar y soldar. Por el momento los tendré guardados hasta que me hagan falta.


Para la etapa de salida usaremos 3 optotriacs que atacarán a 3 triacs. Este sería el diseño de una placa prototipo ya terminada, continuando con el diseño que quedó incompleto la semana pasada:

Diseño etapa de salida en ISIS (Click para agrandar)


Y su versión en PCB:

Diseño etapa de salida PCB (Click para agrandar)

En el diseño de la PCB hay que tener en cuenta algo muy importante: el grosor de las pistas, ya que hay que tener en cuenta que debe pasar hasta 1 Amperio por el circuito y hasta 3 Amperios en la entrada de la corriente. Aquí hay una pequeña tabla informativa sobre el grosor de las pistas en función de su corriente para que nos hagamos una idea:

Tamaño en (pulgadas)Tamaño (en mm)Corriente (amperios)
0.010 inch0.254 mm0.3A
0.015 inch 0.381 mm0.4A
0.020 inch0.508 mm0.7A
0.025 inch 0.635 mm1A
0.050 inch1.27 mm2A
0.100 inch2.54 mm4A

La ferrita la he hecho manualmente haciendo que todas midieran de 13uH a 15uH:
Estas son unas ferritas sacadas de otras placas viejas.

Les sacamos el hilo:

Y una vez limpias, empezamos a liarlas con hilo de cobre esmaltado hasta que midan todas más o menos lo mismo (una media de 15 vueltas).

Así quedan:
Como bien he dicho antes, miden entre 13 y 15 micro Henrios aproximadamente, 
no es muy crítico, pero cuanto más se asemejen los valores, mejor.

Tanto el ARES como el ISIS no tenían un diseño para la ferrita y los fusibles, por ello los he diseñado a mano, midiendo su tamaño en pulgadas. La ferrita tiene un tamaño aproximado de 1x0,5 pulgadas, mientras que los fusibles tienen un tamaño un tamaño aproximado de 0,87x0.3 pulgadas. Teniendo esto en cuenta, hemos diseñado su dibujo en ARES para poder incluirlo en el PCB.

Esta placa la voy a hacer con la fotoinsoladora para practicar con ella, ya que es un prototipo.


QUINTA SEMANA 
(Lunes 10 - Viernes 14 de Febrero)

El DMX estará alimentado con un adator AC-DC a 8V, por ello será necesario hacer un regulador para bajar a 5V, que son los que entrarán en el Atmega. Los 8V también los aprovecharemos para alimentar el amplificador que va después del micrófono.

La fuente reguladora estará hecha con un TL2575-05 el cual regula cualquier voltaje de continua desde 7V hasta 40V, y saca 5V. Desde su mismo datasheet podemos ver un diseño de como utilizarlo. Este sería el diseño resultante en ISIS:

Diseño de regulador a 5V en ISIS (Click para agrandar)

Y así queda su diseño en ARES:

Diseño de regulador a 5V en ARES (Click para agrandar)


Ya tengo el programa de comunicación, será una aplicación móvil para android desde la cual controlaremos los umbrales graves-medios y medios-agudos, mientras que muestra en pantalla cuál es ese umbral en Herzios.

Visualmente, el programa se verá así:

El programa lo podemos descargar desde aquí para pasarlo a nuestro móvil e instalarlo manualmente.

A su vez, hemos tenido que modificar el programa de arduino ya hecho añadiéndole estas lineas:
"
Dentro del setup:
    Serial.begin(9600);

Dentro del loop:
    if (Serial.available() > 0)
    {
      int var = Serial.read();
      if (var <= 18){
        BAJOS_MEDIOS = var;
      }
      if (var >= 19){
        MEDIOS_AGUDOS = var;
      }
    }
"
Con esto le decimos al Atmega que inicie la comunicación serie y lo preparamos para que, si esta comunicación está establecida, reciba datos, que son para modificar los umbrales, y que si no hay comunicación, mantenga un valor fijo para los umbrales.

SEXTA SEMANA 
(Lunes 17 - Viernes 21 de Febrero)

Este es el resultado de la etapa de salida en el papel fotosensible tras el proceso de la fotoinsoladora, pero debido a un error de medición queda inservible, ya que los fusibles ocupan un tamaño considerable que no tuve en cuenta.


Además incorporé componentes en SMD, lo que supone un riesgo añadido por la proximidad en las pistas, ya que debe estar preparada para que aguante hasta 1 Amperio y puede dar problemas.

Por ello, ya que es una placa prototipo la he hecho de nuevo en el ácido, con su nuevo diseño para que haya hueco suficiente para los fusibles y con componentes de tamaño normal.


A su vez, he ido haciendo el regulador a 5V, el cual está ya montado a falta de un diodo 1N5819, el cual llegará el jueves y podré ponerla a prueba.


Una vez ha llegado el diodo, terminamos de soldar los componentes

La bobina no está soldada, ya que no es la placa definitiva, pero 
hemos comprobado con un polímetro que realmente regula el voltaje a 5V.

A estas alturas ya tengo el diseño final en ISIS y ARES. Saldría una placa de 10cm de ancho por 11,6cm de largo, aproximadamente.

Aquí está el diseño del ARES en formato pdf.

Y el esquemático:

Diseño de ISIS en tamaño original.


Tras tener el diseño de la PCB, exportamos los ficheros necesarios para la PhotoPlotter. En el mismo papel hemos puesto las 2 caras de nuestra placa para ahorrar papel.
Así queda nuestro papel fotosensible tras el proceso:

La parte superior es el cobre de la cara de arriba,
 y la parte inferior es el cobre de la cara de abajo.

Sabiendo el tamaño que va a ocupar nuestro DMX, es hora de hacerle un encapsulado. Para ello hemos cogido de un ordenador viejo todo aquello que ya no servía pero que sí podemos aprovechar. El encapsulado estará hecho de chapa metálica de lectores de CD, disqueteras, discos duros, etc... modificados según la necesidad de nuestra placa.

Aquí unas fotos de como quedaría más o menos la parte delantera para hacernos una idea, pero está incompleto aún:



En las imágenes podemos ver ya el jack de entrada, el conmutador de entrada jack/micrófono, interruptor y led de ON/OFF y los 3 leds delanteros, que indicarán graves, medios y agudos. Como podemos ver también, en los laterales hay unos agujeros para atornillar la chapa al resto del conjunto.

SÉPTIMA SEMANA 
(Lunes 24 - Viernes 28 de Febrero)

Tras preparar la placa y aplicarle la máscara de soldadura, empezamos a soldar. Estas son algunas imágenes de la placa ya soldada:





Esta es una prueba en vídeo de que la primera fase de la placa funciona correctamente, es decir, que obtiene el sonido desde 2 fuentes distintas de audio y lo separa en 3 tonos diferentes.


En este vídeo le metemos la señal de audio por cable jack desde el ordenador, por eso no escuchamos el sonido, pero sí vemos a las luces actuar.



En este otro vídeo se obtiene el audio desde el micrófono, con lo que podemos escuchar la música a la vez que el micro controlador actúa sobre los leds.


Estos no son los leds definitivos, sólo una prueba para comprobar que la placa funciona.


OCTAVA SEMANA 
(Martes 04 - Viernes 07 de Marzo)

Ya tengo la caja donde irá la placa. Para hacerla he aprovechado las chapas de ordenadores viejos y lectores de CD, las he recortado a mi gusto y les he ido haciendo los agujeros. Una vez comprobado que todo encajaba, la he pintado de color negro mate. La tapa será corredera.

Parte delantera:






Parte trasera:





Especificaciones sobre la obtención de audio del DMX: 
Debido a la FFT, el valor mínimo que podríamos obtener es 117 Hz, y el valor máximo rondaría los 7500 Hz debido al ADC del Atmega, con lo que, para hacernos una idea, estaríamos perdiendo 3 de los valores que aparecen en los ecualizadores.


Como podemos ver en esta imagen de un ecualizador promedio, los supergraves de 30 Hz y 60 Hz los perdemos, lo mismo pasa con los superagudos de 16000 Hz. Como ya he dicho, esto es para hacerse una idea de lo que realmente está "escuchando" el DMX cuando obtiene el audio.


Memorias de una placa:



En este vídeo se puede ver el proceso de realización y el tratamiento que ha recibido la placa del DMX desde que era simplemente una placa de cobre de doble cara hasta ser lo que es hoy en día.

En este enlace se puede ver la memoria escrita en un documento, donde se puede ver el proceso explicado paso a paso.


Prueba de funcionamiento del bluetooth:



Primera prueba del programa de bluetooth, aún sin terminar del todo.


Prueba de Bombillas:


Con un programa básico hemos ido haciendo la prueba de que funciona la etapa de salida, antes de usarlo con el programa del psicodélico.

Este vídeo sería con el programa que debe llevar el psicodélico:



Diagrama de estados:

En este enlace podemos ver un diagrama de estados del DMX en funcionamiento.

Programa de arduino final:
"
#include <fix_fft.h>

#define MUESTRAFFT 128      

char data[MUESTRAFFT];        
char im[MUESTRAFFT];          

unsigned char salida[MUESTRAFFT/2];
unsigned char valorBajos,valorMedios,valorAgudos;

byte  comp,                          
      compBajos,compMedios,compAgudos,
      limiteBajos,limiteMedios,limiteAgudos;    

void setup() {
    Serial.begin(9600);  
    bitWrite(ADCSRA,ADPS2,1);
    bitWrite(ADCSRA,ADPS1,0);
    bitWrite(ADCSRA,ADPS0,1);
    analogReference(INTERNAL*2);
 
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
 
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);                
    digitalWrite(11, LOW);
    delay(500);
    digitalWrite(9, HIGH);
    delay(150);
    digitalWrite(9, LOW);
    digitalWrite(10, HIGH);
    delay(150);
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    delay(150);  
    digitalWrite(11, LOW);
    delay(300);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);                
    digitalWrite(11, HIGH);
    delay(300);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);                
    digitalWrite(11, LOW);
    delay(300);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);                
    digitalWrite(11, HIGH);
    delay(300);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);                
    digitalWrite(11, LOW);
    delay(100);    
 
    comp = 0;
    compBajos = 0;
    compMedios = 0;
    compAgudos = 0;
    limiteBajos = 50;
    limiteMedios = 50;
    limiteAgudos = 50;
}

void loop() {
    for( int i=0; i < MUESTRAFFT; i++) {
       data[i] = analogRead(0)/4 -128;                              
       im[i] = 0;                                              
    }
 
    calculosHann (data);
    fix_fft(data,im,7,0);
 
    for (int i=0; i < MUESTRAFFT/2; i++){
       salida[i] = data[i] * data[i] + im[i] * im[i];
    }

    if (Serial.available() > 0)
    {
      var = Serial.read();
      if (var >= 2 && var <= 18){
        BAJOS_MEDIOS = var;
      }
      if (var >= 19 && var <= 63){
        MEDIOS_AGUDOS = var;
      }
      if(var == 70){
        analogReference(INTERNAL*4);
      }
      if(var == 71){
        analogReference(INTERNAL*3);
      }
      if(var == 72){
        analogReference(INTERNAL*2.5);
      }
      if(var == 73){
        analogReference(INTERNAL*2);
      }
      if(var == 74){
        analogReference(INTERNAL*1);
      }
      if(var == 75){
        analogReference(INTERNAL/2);
      }    
    }


    valorBajos = 0;
    for (int i=2; i < 7; i++){
      valorBajos += salida[i];
    }
    valorBajos = valorBajos/2;
 
    valorMedios = 0;
    for (int i=7 ; i < 35; i++){
      valorMedios += salida[i];
    }
    valorMedios = valorMedios/2;
 
    valorAgudos = 0;
    for (int i=35; i < MUESTRAFFT/2; i++){
      valorAgudos += salida[i];
    }
    valorAgudos = valorAgudos/2;

   int siBajos  =  valorBajos  > limiteBajos;
   int siMedios =  valorMedios > limiteMedios;
   int siAgudos =  valorAgudos > limiteAgudos;
 
   digitalWrite(9,siBajos ? HIGH : LOW);
   digitalWrite(10,siMedios? HIGH : LOW);
   digitalWrite(11,siAgudos? HIGH : LOW);
 
   compBajos  += siBajos;
   compMedios += siMedios;
   compAgudos += siAgudos;
 
   if ( ++comp > 10 ) {
      comp = 0;
      limiteBajos  = 20 + compBajos*5;
      limiteMedios = 20 + compMedios*5;
      limiteAgudos = 20 + compAgudos*5;
      compBajos  = 0;
      compMedios = 0;
      compAgudos = 0;
   }
 }

void calculosHann (char *datos) {
    double muestra = (double(MUESTRAFFT) - 1.0);
    for (uint8_t i = 0; i < MUESTRAFFT/2 ; i++) {
        double indice = double(i);
        double ratio = (indice / muestra);
        double factor = 0.5 * (1.0 - cos(6.28 * ratio));
datos[i] *= factor;
datos[MUESTRAFFT - (i + 1)] *= factor;
    }
}

"

En este Gantt he estimado el tiempo que me puede llevar realizar todo el proyecto. He puesto tiempo de sobra en cada tarea para poder ir con tiempo o por si fallo en alguna de las tareas y tengo que volver a hacerla, comprobar errores, etc.

Manual de instrucciones:
Este es un documento con instrucciones de uso y precauciones del mismo.


(Click en la imagen para agrandar)





miércoles, 5 de marzo de 2014

AutomatCar: coche controlado con arduino

Mi proyecto sera un coche que tenga la posibilidad de ser controlado tanto de manera manual como automática, controlado con un micro-controlador arduino, que tenga la posibilidad de esquivar obstáculos y avanzar de manera automática y que también se pueda controlar desde una aplicación en android.



OBJETIVOS
Un objetivo a realizar es conseguir que de manera automática se mueva y evite obstáculos.
Para ello usare dos sensores de ultrasonidos que midan la distancia para evitar que choque y un puente en H para que pueda ir hacia adelante y hacia atrás y también servirá para poder girar.
Otro objetivo es poder controlarlo de manera manual, pudiendo regularle la velocidad e indicarle la dirección, esto lo llevare a cabo mediante una aplicación en android usando el app inventor y un modulo de bluetooth (HC-06), que le pasara la información del dispositivo android a la arduino.
Usando también el puente en H para cambiar el sentido y la dirección.
ESQUEMA Y PCB DEL PUENTE EN H
Lo primero ha sido realizar el esquema y la simulacion del puente en H en ISSIS en el que he usado los componentes:
-2 Transistores BD135 .
-2 Transistores BD136.
-2 Transistores 2N2222.
-4 Diodos 1N4007.
- 4Resistencias de 0,6W (2 de 22 Ohmios y 2 de 470 Ohmios).
-3 Conectores de 2 pines. 

Tras comprobar en la simulación su correcto funcionamiento se puede pasar a la construcción de la pcb, sacar la placa y montarla.



Puente en H finalizado

Tras realizar el montaje completo de los puentes en H he comprobado su funcionamiento, con buen resultado. Desde arduino se le da la señal al puente para que vaya el motor en una dirección o en otra. El motor se alimenta con 12V que pasan a través del driver y con una señal de PWM al driver se controla su velocidad.

Aplicacion en Android
Con una aplicacion en android se va a poder controlar el movimiento del coche y decirle que se comporte tanto de manera automática como manual, y poder controlar la velocidad y direccion cuando se encuentre en modo manual.

La aplicacion la he realizado a traves del MIT App Inventor 2 y se comunicara con arduino a traves de un modulo de bluetooth HC-06. La comunicacion se hara a traves de cadenas con el app Inventor, al pulsar un boton se le enviara una cadena por el puerto serie al Arduino Mega y este actuará en consecuencia.

Por ejemplo, si se quiere que el coche avance mas rapido se le pulsara al boton mas, este le enviara al arduino por serie la palabra "mas" y hara que la velocidad se incremente 40.

Así quedara la pantalla de la aplicación:

Para que la aplicación funcione la programación se hace a través de bloques. Así es como quedan los bloques tras programar toda la aplicación:




Comunicación de Arduino Mega con Arduino Uno
En el arduino Uno irán conectados los dos ultrasonidos y llevará el programa que hace que cuando un ultrasonido detecte un obstáculo a menos de 30 centímetros activa una salida y cuando sea el otro ultrasonido pondrá otra diferente. El arduino Mega estará conectado a esas dos patillas leyendo en que estado se encuentran, los datos los guarda en dos variables y actúa en consecuencia con ellas.

Programa Arduino Uno

#define PIN_TRIGD 9
#define PIN_ECHOD 5
#define PIN_TRIGT 6 
#define PIN_ECHOT 3


void setup() {
  Serial.begin(9600); 
  pinMode(PIN_TRIGD, OUTPUT);
  pinMode(PIN_ECHOD, INPUT);
  pinMode(PIN_TRIGT, OUTPUT);
  pinMode(PIN_ECHOT, INPUT);
  pinMode(13,OUTPUT); 
  pinMode(12,OUTPUT); 
}
void loop()
{
  long distanciaD,distanciaT;
    distanciaD = medir(PIN_TRIGD,PIN_ECHOD);
    Serial.print("Delantero :");
    Serial.println(distanciaD); 
    distanciaT = medir(PIN_TRIGT,PIN_ECHOT);
    Serial.print("Trasero :");
    Serial.println(distanciaT);
    delay(100);
    
  if(distanciaD<=30){
    digitalWrite(13,HIGH);
  }
  else{
    digitalWrite(13,LOW);
  }
  if(distanciaT<=30){
    digitalWrite(12,HIGH);
  }
  else{
    digitalWrite(12,LOW);
  }
}

  long medir(int PIN_TRIG,int PIN_ECHO)
   { 
  long tiempo, distancia;
  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(PIN_TRIG, HIGH);
  digitalWrite(PIN_TRIG, LOW);  
  tiempo = pulseIn(PIN_ECHO, HIGH);
  distancia = (tiempo/2) / 29;
  
  return distancia;
  }

Programa Arduino Mega
#define adelante1 30
#define atras1 32
#define motor1 5
#define adelante2 31
#define atras2 33
#define motor2 6
#define inter 40

String readString;

int der,izq;
int velocidad1=0,velocidad2=0,acel1=51,acel2=acel1/4;
int valadelante1,valatras1;
int valadelante2,valatras2;
int valinter;
int i=0,j=0,a=0,m=0;

void setup(){
 Serial.begin(9600);
 Serial.println("todo va bien ... de momento");
 pinMode(22,INPUT);
 pinMode(24,INPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(inter,INPUT);
 pinMode(atras1,OUTPUT);
 pinMode(motor1,OUTPUT);
 pinMode(adelante1,OUTPUT);
 pinMode(atras2,OUTPUT);
 pinMode(motor2,OUTPUT);
 pinMode(adelante2,OUTPUT);
 digitalWrite(adelante1,HIGH);
 digitalWrite(adelante2,HIGH);
 digitalWrite(12,LOW);
 digitalWrite(11,LOW);
}

void loop(){
  valadelante1 = digitalRead(adelante1);
  valatras1 = digitalRead(atras1);
  valadelante2 = digitalRead(adelante2);
  valatras2 = digitalRead(atras2);
  valinter = digitalRead(inter);
  der = digitalRead(22); //sensor derecho
  izq = digitalRead(24); //sensor izquierdo
  analogWrite(motor1,velocidad1);
  analogWrite(motor2,velocidad2);
  while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     if(readString == "3on"){ //adelante
       Serial.println("adelante");
       digitalWrite(atras1,LOW);
       digitalWrite(atras2,LOW);
       digitalWrite(adelante1,HIGH);
       digitalWrite(adelante2,HIGH);
       digitalWrite(8,LOW);
       digitalWrite(9,LOW);
       velocidad1=velocidad2;
       delay(400);
     }
     if(readString == "2on"){ //atras
       Serial.println("atras");
       digitalWrite(adelante1,LOW);
       digitalWrite(adelante2,LOW);
       digitalWrite(atras1,HIGH);
       digitalWrite(atras2,HIGH);
       digitalWrite(8,HIGH);
       digitalWrite(9,HIGH);
       velocidad1=velocidad2;
       delay(400);
     }
     if(readString == "mas"){ //+velocidad
       Serial.println("+");
       velocidad1=velocidad1+acel1;
       velocidad2=velocidad2+acel1;
       if(velocidad1>=255){
         velocidad1=255;
       }
       if(velocidad2>=255){
         velocidad2=255;
       }
     }
     if(readString == "menos"){
       Serial.println("-");
       velocidad1=velocidad1-acel1;
       velocidad2=velocidad2-acel1;
       if(velocidad1<=0){
         velocidad1=0;
       }
       if(velocidad2<=0){
         velocidad2=0;
       }
     }
     if(readString == "izq"){
       Serial.println("izquierda");
       velocidad2=velocidad1/4;
     }
     if(readString == "der"){
       Serial.println("derecha");
       velocidad1=velocidad2/4;
     }
     readString="";
   }
  //*************************//
  if(valinter==HIGH){
    //Modo interruptor en on
  if(a==1){
    valadelante1 = digitalRead(adelante1);
    valatras1 = digitalRead(atras1);
    valadelante2 = digitalRead(adelante2);
    valatras2 = digitalRead(atras2);
    valinter = digitalRead(inter);
    der = digitalRead(22); //sensor derecho
    izq = digitalRead(24); //sensor izquierdo
    analogWrite(motor1,velocidad1);
    analogWrite(motor2,velocidad2);
    //Entra en modo automatico
    Serial.println("Automatico");
      while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     readString="";
   }
  //Sensor delantero choca o izquierdo
  if((((der==HIGH)&&(izq==HIGH))||((der==LOW)&&(izq==HIGH)))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){                
    Serial.println("obstaculo grande, o izquierdo");
    velocidad1 = velocidad1 - acel1;
    velocidad2 = velocidad2 - acel1;
    if((velocidad1<=0)&&(velocidad2<=0)){
      velocidad1=0,velocidad2=0;
      digitalWrite(adelante1,LOW);
      digitalWrite(adelante2,LOW);
      delay(700);
      digitalWrite(atras1,HIGH);
      digitalWrite(atras2,HIGH);
      i =  1;
    }
  }
  //atras y giro
  if(((i>=1)&&(i<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
    Serial.println("vamos patras");
    velocidad1 = velocidad1 + acel2;
    velocidad2 = velocidad2 + acel1;
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    if(velocidad2>=255){
      velocidad2=255;
    }
    if(velocidad1>=51){
      velocidad1=51;
    }
    i++;
  }
  //parada y marcha alante
  if(i>8){
    Serial.println("fin de la marcha atras");
    velocidad1=0;
    velocidad2=0;
    digitalWrite(atras1,LOW);
    digitalWrite(atras2,LOW);
    delay(700);
    digitalWrite(adelante1,HIGH);
    digitalWrite(adelante2,HIGH);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    i=0;
  }
  //Sin obstaculos
  if(((der==LOW)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
    Serial.println("No obstaculos");  
    velocidad1 = velocidad1 + acel1;
    velocidad2 = velocidad2 + acel1;
    if(velocidad1>=255){
      velocidad1=255;
    }
    if(velocidad2>=255){
      velocidad2=255;
    }
  }
  //sensor derecho
  if(((der==HIGH)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
    Serial.println("obstaculo a la derecha");
    velocidad1 = velocidad1 - acel1;
    velocidad2 = velocidad2 - acel1;
    if((velocidad1<=0)&&(velocidad2<=0)){
      velocidad1=0,velocidad2=0;
      digitalWrite(adelante1,LOW);
      digitalWrite(adelante2,LOW);
      delay(700);
      digitalWrite(atras1,HIGH);
      digitalWrite(atras2,HIGH);
      j = 1;
    }
  }
  //atras y giro a derecha
  if(((j>=1)&&(j<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
    Serial.println("vamos patras otra vez");
    velocidad1 = velocidad1 + acel1;
    velocidad2 = velocidad2 + acel2;
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    if(velocidad2>=51){
      velocidad2=51;
    }
    if(velocidad1>=255){
      velocidad1=255;
    }
    j++;
  }
  //parada y marcha alante
  if(j>8){
    Serial.println("y paramos");
    velocidad1=0;
    velocidad2=0;
    digitalWrite(atras1,LOW);
    digitalWrite(atras2,LOW);
    delay(700);
    digitalWrite(adelante1,HIGH);
    digitalWrite(adelante2,HIGH);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    j=0;
  }
  delay(500);
  }
  if(m==1){
    valadelante1 = digitalRead(adelante1);
    valatras1 = digitalRead(atras1);
    valadelante2 = digitalRead(adelante2);
    valatras2 = digitalRead(atras2);
    valinter = digitalRead(inter);
    der = digitalRead(22); //sensor derecho
    izq = digitalRead(24); //sensor izquierdo
    analogWrite(motor1,velocidad1);
    analogWrite(motor2,velocidad2);
    Serial.println(velocidad1);
    Serial.println("*******");
    Serial.println(velocidad2);
    //Entra en modo manual para control en app
    Serial.println("MANUAL");
    while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     if(readString == "3on"){ //adelante
       Serial.println("adelante");
       digitalWrite(atras1,LOW);
       digitalWrite(atras2,LOW);
       digitalWrite(adelante1,HIGH);
       digitalWrite(adelante2,HIGH);
       delay(400);
     }
     if(readString == "2on"){ //atras
       Serial.println("atras");
       digitalWrite(adelante1,LOW);
       digitalWrite(adelante2,LOW);
       digitalWrite(atras1,HIGH);
       digitalWrite(atras2,HIGH);
       delay(400);
     }
     if(readString == "mas"){ //+velocidad
       Serial.println("+");
       velocidad1=velocidad1+acel1;
       velocidad2=velocidad2+acel1;
       if(velocidad1>=255){
         velocidad1=255;
       }
       if(velocidad2>=255){
         velocidad2=255;
       }
     }
     if(readString == "menos"){
       Serial.println("-");
       velocidad1=velocidad1-acel1;
       velocidad2=velocidad2-acel1;
       if(velocidad1<=0){
         velocidad1=0;
       }
       if(velocidad2<=0){
         velocidad2=0;
       }
     }
   
     readString="";
   }
   delay(500);
  }
  }
  if(valinter==LOW){
    //Modo off ni caso
    Serial.println("OFF");
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    velocidad1=0;
    velocidad2=velocidad1;
      while (Serial.available()) {
    delay(10);
    if (Serial.available() >0) {
      char c = Serial.read();
      readString += c;
     }
   }
 
   if(readString.length() >0){
     if(readString == "aon"){
       Serial.println("auto");
       m=0;
       a=1;
     }
     if(readString == "mon"){
       Serial.println("manual");
       a=0;
       m=1;
     }
     readString="";
   }
  }

}

Eficiencia energética
El apartado de eficiencia energética lo he tenido en cuenta en mi proyecto en:
         -El uso de fuentes conmutadas en vez de fuentes lineales, con alta eficiencia del 88%.
         -El uso de diodos leds, que tienen mínimo consumo.
         -La incorparación de un interruptor con el que poder apagar el coche cuando no se este usando.

Diagrama de bloques
Este es el diagrama de bloques donde se muestran todos los pasos por los que puede pasar el proyecto y su funcionamiento


Gantt Proyect
Este es el Gantt proyect con la planificacion de todas las semanas de proyecto y el contenido a realizar en esas semanas.