martes, 29 de noviembre de 2016

Prueba 8 aprovechamiento de la EEPROM


Código 8

Este código almacena cada una de las memorias dentro de la EEPROM y ya no usa el control análogo, se configura a partir del teclado de la PC o LAPTOP mediante la conexión USB y el puerto serial que Arduino tiene integrado en todas sus placas.


Para entender mejor su uso se desarrollo un vídeo tutorial.




La realización de este código tomo mucho esfuerzo... me base en muchos sistemas y realice muchísimos cálculos, te lo dejo aquí, solo respeta mis avances y reconoce mi trabajo, así como en su momento yo reconocí la idea y el sistema en en el que me inspire.
Ahora estoy aquí, con un código mejorado que nadie mas realizo y estoy orgulloso de mi trabajo, ayúdame compartiendo y suscribiendo te.
espero pronto poder ver tu proyecto mi amigo.


El "código 8" es la perfecta mezcla, optimizada entre el "código 6" y el "código 7"

QUE HERMOSO CODIGO!!!

/*
comando
'1' base       'd' +5   'm' memorias  'p' pause     'e' pinza  'i' borrar EEPROM
'2' motor 2  'f' +10  'a' autómata  'p' reanudar
'3' motor 3  'c' -5                 'g' guardar
'4' muñeca  'v' -10
'5' pinza
*/
#include <Servo.h>
#include <EEPROM.h>
Servo servo1;//base
Servo servo2;//codo
Servo servo3;//mano
Servo servo4;//muñeca
Servo servo5;//pinza
//arreglos solo pueden memorizar 20 posiciones con esta configuración
byte memoria[105];
//arreglo para movimiento fuera de autómata
byte paso[5];
//variables para entrada serial
byte s;
unsigned char comando=20;
//arreglos para cálculos
byte memor[5];
double registro[5], direccion[5], diferencia[5];
//contadores
byte figura,seccion=1,limite;
//contadores EEPROM
byte eprom,EE=0;
//tiempo
long tiempoc=0;
long tiempob=0;
unsigned long tiempotranscurrido=millis();
unsigned long tiempomicros=micros();
int time=1000;
//constantes
#define retardo 4000
//booleanos
boolean automata=false, primer_memoria=true, primer_paso=true, primer_seccion=true, ultima_memoria=true, pause=false, pinza=true ;

void setup()
{
  pinMode(13, OUTPUT);
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
  paso[0] = 90;
  paso[1] = 80;
  paso[2] =120;
  paso[3] = 80;
  paso[4] = 90;
  Serial.begin(115200);
  Serial.print("\t\tIniciando | ");
  for(s=0;s<31;s++){
    Serial.print("###");
    delay(25);
  }
  s=0;
  Serial.print(" | 100% 0.75s");
  Serial.print("\n\n\t\tBIENVENIDO USUARIO :)\n");
  delay(500);
  Serial.print("\t\t''CODIGO 8'' CONTROL SERIAL Y ALMACENAMIENTO EN EEPROM-JUALLEK 2016");
}

void loop()
{
  tiempotranscurrido=millis();
  tiempomicros=micros();
  serial();
  if(!automata)
  {
  mover();
  }
  else if(automata)
  {
    if(primer_paso==true)
    {
      if(ultima_memoria)ultimo_registro();
      figura=0;
      eprom=1;
      primer_paso=false;
    }
    else if(figura>EEPROM.read(250))
    {
      figura=0;
      eprom=1;
    }
    if(primer_seccion)matriz_de_traslacion();
    if(tiempomicros-tiempob>time)
    {
      tiempob=tiempomicros;
      ejecutar_automata();
    }
  }
}

void estado()
{
  if(comando=='m')
  {
    figura++;
    if(primer_memoria==true){
      figura=0;
      eprom=1;
    }
    memorisa();
  }
  else if(comando=='a')
  {
    automata=true;
    Serial.print("\n\t\t****************************************EJECUTAR_AUTOMATA****************************************");
  }
}

void mover()
{
  servo1.write(paso[0]);
  servo2.write(paso[1]);
  servo3.write(paso[2]);
  servo4.write(paso[3]);
  servo5.write(paso[4]);
}

void ejecutar_automata()
{
  if(seccion<=limite)
  {
    Serial.print("\n\t\t\t\t\t\t\t\tSECCION="); Serial.print(seccion);
    seccion++;
    if(seccion == 1)              time = retardo*4;      
    else if(seccion == 10)        time = retardo*3;  
    else if(seccion == 20)        time = retardo*2;
    else if(seccion == 30)        time = retardo*1;
    if(seccion == limite-40)      time = retardo*2;
    else if(seccion == limite-30) time = retardo*3;
    else if(seccion == limite-20) time = retardo*4;
    else if(seccion == limite-10) time = retardo*5;
    registro[0]+=direccion[0];
    registro[1]+=direccion[1];
    registro[2]+=direccion[2];
    registro[3]+=direccion[3];
    registro[4]+=direccion[4];
    servo1.write(registro[0]);
    servo2.write(registro[1]);
    servo3.write(registro[2]);
    servo4.write(registro[3]);
    servo5.write(registro[4]);
  }
  else
  {
    limite=0;
    seccion=1;
    figura++;
    primer_seccion=true;
  }
  while(pause==true)//Sección de pause
  {
    if(Serial.available())
    {
      comando=Serial.read();
      if (comando=='p')pause=false;
    }
    if(comando=='g')// En pausa el robot se puede colocar recto para guardarlo y poder mover lo de lugar
    {
      servo1.write(90);
      servo2.write(10);//rango inclinado para ganar distancia guardar a 10
      servo3.write(140);//rango inclinado para ganar distancia guardar a 140
      servo4.write(90);
      servo5.write(90);//rango de pinza 90-130
    }
    digitalWrite(13, HIGH); delay(500);
    digitalWrite(13, LOW); delay(500);
  }
}


void matriz_de_traslacion()
{
  Serial.print("\n\t\t\t\t\t\t\t\tCALCULO DE MATRIZ");Serial.print(figura);
  //convierte la EEPROM en matriz
  for(EE=0;EE<5;EE++)
  {
    memor[EE]=EEPROM.read(eprom);
    eprom++;
  }
  EE=0;
  //calcular diferencias
  diferencia[0] = abs (registro[0]-memor[0]);
  diferencia[1] = abs (registro[1]-memor[1]);
  diferencia[2] = abs (registro[2]-memor[2]);
  diferencia[3] = abs (registro[3]-memor[3]);
  diferencia[4] = abs (registro[4]-memor[4]);
  // se elimino la sección de filtrado (no hay vibraciones causadas por los potencio metros)
  //calcular limite de secciones (la mayor distancia)
  limite = max(diferencia[0],diferencia[1]);
  limite = max(limite,diferencia[2]);
  limite = max(limite,diferencia[3]);
  limite = max(limite,diferencia[4]);
  Serial.print("\n\t\t\t\t\t\t\t   LIMITE=");Serial.print(limite);
  //calcula dirección e incremento en grados de cada sección
  if(registro[0]>memor[0]) direccion[0]=(0-diferencia[0])/limite; else direccion[0]=diferencia[0]/limite;
  if(registro[1]>memor[1]) direccion[1]=(0-diferencia[1])/limite; else direccion[1]=diferencia[1]/limite;
  if(registro[2]>memor[2]) direccion[2]=(0-diferencia[2])/limite; else direccion[2]=diferencia[2]/limite;
  if(registro[3]>memor[3]) direccion[3]=(0-diferencia[3])/limite; else direccion[3]=diferencia[3]/limite;
  if(registro[4]>memor[4]) direccion[4]=(0-diferencia[4])/limite; else direccion[4]=diferencia[4]/limite;
  Serial.print("\n\t\t\t\t\t\t\t\tEJECUTANDO_MEMORIA ");Serial.print(figura);
  primer_seccion=false;
}


void ultimo_registro()
{
  registro[0] = paso[0];
  registro[1] = paso[1];
  registro[2] = paso[2];
  registro[3] = paso[3];
  registro[4] = paso[4];
  ultima_memoria=false;
}

void memorisa()
{
  //convierte la matriz posición en EEPROM 
  for(EE=0;EE<5;EE++)
  {
    EEPROM.write(eprom,paso[EE]);
    eprom++;
  }
  EE=0;
  Serial.print("\n\t\t\t\t\t\tMEMORIA\t\t"); Serial.print(figura);
  EEPROM.write(250,figura);
  primer_memoria=false;
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
}

void entrada_serial()
{
  comando=Serial.read();
  if(comando=='1')s=0;
  if(comando=='2')s=1;
  if(comando=='3')s=2;
  if(comando=='4')s=3;
  if(comando=='5')s=4;
}

void asignacion()
{
  if(s==4)
  {
    if(comando=='e'&&pinza==true)
    {
      paso[4]=130;
      pinza=false;
    }
    else if(comando=='e')
    {
      paso[4]=90;
      pinza=true;
    }
  }
  if(paso[s]<180){
    if(comando=='d')paso[s]+=5;
    if(comando=='f')paso[s]+=10;
  }
  if(paso[s]>0){
    if(comando=='c')paso[s]-=5;
    if(comando=='v')paso[s]-=10;
  }
  if(paso[s]>=180)paso[s]=180;
  else if(paso[s]<=0)paso[s]=0;
}

void serial()
{
  if(Serial.available())
  {
    entrada_serial();
    asignacion();
    estado();
    if(comando=='p')pause=true;
    //borrar EEPROM
    if(comando=='i'){
      Serial.println("\n\t\t\t\tBORRANDO EEPROM | ");
      for (int i = 0 ; i < EEPROM.length() ; i++) {
      EEPROM.write(i, 0);
      Serial.print("#");
      }
      digitalWrite(13,HIGH);
      delay(3000);
      digitalWrite(13,LOW);
      Serial.print("EEPROM BORRADA\n");
    }
  }
}



Trabajando!!!

Modificación del código 7 para usarlo con una banda transportadora que incluye un sensor infrarrojo y un servomotor de 360 grados a 5v y de 10kg de torque.

/*
comando
'1' base    'd' +5   'm' memorias  'p' pause     'e' pinza
'2' motor 2  'f' +10  'a' autómata  'p' reanudar
'3' motor 3  'c' -5                 'g' guardar
'4' muñeca  'v' -10
'5' pinza
*/
#include <Servo.h>
Servo servo1;//base
Servo servo2;//codo
Servo servo3;//mano
Servo servo4;//muñeca
Servo servo5;//pinza
Servo servo6;//motor 360 de la banda
//arreglos solo pueden memorizar 20 posiciones con esta configuración
byte memoria1[20];
byte memoria2[20];  
byte memoria3[20];  
byte memoria4[20];
byte memoria5[20];
//enteros banda
int rele=3;
//arreglo para movimiento fuera de autómata
byte paso[5];
//variables para entrada serial
byte s;
unsigned char comando=20;
//arreglos para cálculos
double registro[5], direccion[5], diferencia[5];
//contadores
byte figura,pasomax,seccion=1,limite;
//tiempo
long tiempoc=0;
long tiempob=0;
unsigned long tiempotranscurrido=millis();
unsigned long tiempomicros=micros();
int time=1000;
//constantes
#define retardo 4000
//booleanos
boolean automata=false, primer_memoria=true, primer_paso=true, primer_seccion=true, ultima_memoria=true, pause=false, pinza=true, unciclo=false ;

void setup() 
  pinMode(6,INPUT);
  pinMode(rele,OUTPUT);
  pinMode(13, OUTPUT);
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
  servo6.attach(7);
  paso[0] = 90;
  paso[1] = 80;
  paso[2] =120;
  paso[3] = 80;
  paso[4] = 90;
  Serial.begin(115200);
  Serial.print("\t\tIniciando | ");
  for(s=0;s<31;s++){
    Serial.print("###");
    delay(25);
  }
  s=0;
  Serial.print(" | 100% 0.75s");
  Serial.print("\n\n\t\tBIENVENIDO USUARIO :)\n");
  delay(500);
  Serial.print("\t\t''CODIGO 7'' CONTROL SERIAL-JUALLEK 2016");
  digitalWrite(rele,HIGH);
}

void loop() 
{
  tiempotranscurrido=millis();
  tiempomicros=micros();
  serial();
  if(!automata)
  {
  mover();
  }
  else if(automata)
  {
    if(unciclo==true)
    {
      if(primer_paso==true)
    {
      if(ultima_memoria)ultimo_registro();
      figura=0;
      primer_paso=false;
    }
    else if(figura>pasomax)
    {
      figura=0;
      unciclo=false;
    }
    if(primer_seccion)matriz_de_traslacion();
    if(tiempomicros-tiempob>time)
    {
      tiempob=tiempomicros;
      ejecutar_automata();
    }
    }
    infrarojo();
    pausa1();
  }
}

void estado()
{  
  if(comando=='m')
  {
    figura++;
    if(primer_memoria==true)figura=0;
    memorisa();
  }
  else if(comando=='a')
  {
    automata=true;
    Serial.print("\n\t\t****************************************EJECUTAR_AUTOMATA****************************************");
  }
}

void mover()
{
  servo1.write(paso[0]);
  servo2.write(paso[1]);
  servo3.write(paso[2]);
  servo4.write(paso[3]);
  servo5.write(paso[4]);
}

void ejecutar_automata()
{
  if(seccion<=limite)
  {
    Serial.print("\n\t\t\t\t\t\t\t\tSECCION="); Serial.print(seccion);
    seccion++;
    if(seccion == 1)              time = retardo*4;         
    else if(seccion == 10)        time = retardo*3;    
    else if(seccion == 20)        time = retardo*2;   
    else if(seccion == 30)        time = retardo*1;
    if(seccion == limite-40)      time = retardo*2;
    else if(seccion == limite-30) time = retardo*3;
    else if(seccion == limite-20) time= retardo*4;
    else if(seccion == limite-10) time = retardo*5;  
    registro[0]+=direccion[0];
    registro[1]+=direccion[1];
    registro[2]+=direccion[2];
    registro[3]+=direccion[3];
    registro[4]+=direccion[4];
    servo1.write(registro[0]);
    servo2.write(registro[1]);
    servo3.write(registro[2]);
    servo4.write(registro[3]);
    servo5.write(registro[4]); 
  }
  else
  {
    limite=0;
    seccion=1;
    figura++;//                                                             figura al pasar a la siguiente memoria >>
    primer_seccion=true;
  }
}


void matriz_de_traslacion()
{
  Serial.print("\n\t\t\t\t\t\t\t   CALCULO DE MATRIZ ");Serial.print(figura);
  //calcular diferencias
  diferencia[0] = abs (registro[0]-memoria1[figura]);
  diferencia[1] = abs (registro[1]-memoria2[figura]);
  diferencia[2] = abs (registro[2]-memoria3[figura]);
  diferencia[3] = abs (registro[3]-memoria4[figura]);
  diferencia[4] = abs (registro[4]-memoria5[figura]);
  // se elimino la sección de filtrado (no hay vibraciones causadas por los potencio metros)
  //calcular limite de secciones (la mayor distancia)
  limite = max(diferencia[0],diferencia[1]);
  limite = max(limite,diferencia[2]);
  limite = max(limite,diferencia[3]);
  limite = max(limite,diferencia[4]);
  Serial.print("\n\t\t\t\t\t\t\t   LIMITE=");Serial.print(limite);
  //calcula dirección e incremento en grados de cada sección
  if(registro[0]>memoria1[figura]) direccion[0]=(0-diferencia[0])/limite; else
 direccion[0]=diferencia[0]/limite;
  if(registro[1]>memoria2[figura]) direccion[1]=(0-diferencia[1])/limite; else
 direccion[1]=diferencia[1]/limite;
  if(registro[2]>memoria3[figura]) direccion[2]=(0-diferencia[2])/limite; else
 direccion[2]=diferencia[2]/limite;
  if(registro[3]>memoria4[figura]) direccion[3]=(0-diferencia[3])/limite; else
 direccion[3]=diferencia[3]/limite;
  if(registro[4]>memoria5[figura]) direccion[4]=(0-diferencia[4])/limite; else direccion[4]=diferencia[4]/limite;
  Serial.print("\n\t\t\t\t\t\t\t\tEJECUTANDO_MEMORIA ");Serial.print(figura);
  primer_seccion=false;
}


void ultimo_registro()
{
  registro[0] = paso[0];
  registro[1] = paso[1];
  registro[2] = paso[2];
  registro[3] = paso[3];
  registro[4] = paso[4];
  ultima_memoria=false;
}

void memorisa()
{
  Serial.print("\n\t\t\t\t\t\tMEMORIA\t\t"); Serial.print(figura);
  memoria1[figura] = paso[0];
  memoria2[figura] = paso[1];  
  memoria3[figura] = paso[2]; 
  memoria4[figura] = paso[3];
  memoria5[figura] = paso[4];
  pasomax=figura;
  primer_memoria=false;
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
}

void entrada_serial()
{
  comando=Serial.read();
  if(comando=='1')s=0;
  if(comando=='2')s=1;
  if(comando=='3')s=2;
  if(comando=='4')s=3;
  if(comando=='5')s=4;
}

void asignacion()
{
  if(s==4)
  {
    if(comando=='e'&&pinza==true)
    {
      paso[4]=130;
      pinza=false;
    }
    else if(comando=='e')
    {
      paso[4]=90;
      pinza=true;
    }
  }
  if(paso[s]<180){
    if(comando=='d')paso[s]+=5;
    if(comando=='f')paso[s]+=10;
  }
  if(paso[s]>0){
    if(comando=='c')paso[s]-=5;
    if(comando=='v')paso[s]-=10;
  }
  if(paso[s]>=180)paso[s]=180;
  else if(paso[s]<=0)paso[s]=0;
}
void serial()
{
  if(Serial.available())
  { 
    entrada_serial();
    asignacion();
    estado();
    if(comando=='p')pause=true;
  }
}

void pausa1()
{
  while(pause==true)
  {
    if(Serial.available())
    {
      comando=Serial.read();
      if (comando=='p')pause=false;
    }
    if(comando=='g')// En pausa el robot se puede colocar recto para guardarlo y poder mover lo de lugar
    {
      servo1.write(90);
      servo2.write(10);//rango inclinado para ganar distancia guardar a 10
      servo3.write(140);//rango inclinado para ganar distancia guardar a 150
      servo4.write(90);
      servo5.write(90);//rango de pinza 90-130
    }
    digitalWrite(13, HIGH); delay(500);   
    digitalWrite(13, LOW); delay(500);
    digitalWrite(rele,HIGH);
    servo6.write(90);
  }
}

void infrarojo()
{
  if(digitalRead(6)==HIGH){
    digitalWrite(rele,HIGH);
    digitalWrite(buz,HIGH);
    delay(25);
    digitalWrite(buz,LOW);
    servo6.write(90);
    unciclo=true;
  }
  if(digitalRead(6)==LOW){
    digitalWrite(rele,LOW);
    servo6.write(140);
  }
}



DIAGRAMA
El NPN 2n222 necesita una resistencia de 1k en base.
R1 se debe calcular pero yo use una de 1000k
este diagrama es para el código 7 y código 8











Prueba 6

Código 6
Básicamente utiliza el mismo diagrama que la prueba 5, solo que almacena las variables en la EEPROM. hace uso del control aun.

#include <Servo.h>
#include <EEPROM.h>
Servo servo1;//base
Servo servo2;//codo
Servo servo3;//mano
Servo servo4;//muñeca
Servo servo5;//pinza
/*arreglos solo pueden memorizar 20 posiciones con esta configuración (en el arduino UNO),
 el uso de la EEPROM limita la capacidad del brazo de aprender
 20 posiciones * 5 servos =memorias*/
byte memoria[105];
//arreglos para cálculos
byte memor[5];
double direccion[5], registro[5], diferencia[5];
//arreglo para movimiento sin memoria
byte paso[5];
//contadores
byte pasoN=0,i=0,seccion=1,limite=0;
//contadores EEPROM
byte eprom,EE=0;
//tiempo
long tiempoc=0;
long tiempob=0;
unsigned long tiempotranscurrido=millis();
unsigned long tiempomicros=micros();
byte time=1000;
//constantes
#define retardo 4000
//booleanos
boolean automata=false, primer_memoria=true, primer_paso=true, pinzaabierta=true, primer_seccion=true, ultima_memoria=true;

void setup()
{
  for(i=5;i<8;i++){
    pinMode(i,INPUT);
  }
  i=0;
  pinMode(13, OUTPUT);
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
  Serial.begin(115200);
  Serial.print("\t\tIniciando | ");
  for(i=0;i<31;i++){
    Serial.print("###");
    delay(25);
  }
  i=0;
  Serial.print(" | 100% 0.75s");
  Serial.print("\n\n\t\tBIENVENIDO USUARIO :)\n");
  delay(500);
  Serial.print("\t\t''CODIGO 6'' ALMACENAMIENTO EN EEPROM-JUALLEK 2016");
}

void loop()
{
  tiempotranscurrido=millis();
  tiempomicros=micros();
  boton();
  if(!automata)
  {
  mover();
  }
  else if(automata)
  {
    if(primer_paso)
    {
      lectura();
      if(ultima_memoria)ultimo_registro();
      pasoN=0;
      eprom=1;//                                                       eprom (inicio de secuencias)
      primer_paso=false;
    }
    else if(pasoN>EEPROM.read(250))
    {
      pasoN=0;
      eprom=1;//                                                       eprom (reinicio al llegar a limite de memoria)
    }
    if(primer_seccion)matriz_de_traslacion();
    if(tiempomicros-tiempob>time)
    {
      tiempob=tiempomicros;
      ejecutar_automata();
    }
  }
}

void boton()
{
  if((digitalRead(6))==LOW)
  {
    delay(20);
    if((digitalRead(6))==HIGH)
    {
      if(i==0)
      {
        i=1;
        tiempoc=tiempotranscurrido;
      }
      else if((i==1)&&((tiempotranscurrido-tiempoc)<500))
      {
        i=2;
      }
    }
  }  
  if((i==1)&&((tiempotranscurrido-tiempoc)>1000))
  {
    pasoN++;
    if(primer_memoria)
    {
      pasoN=0;
      eprom=1;//                                                       eprom (inicio de memorias)
    }
    memoriza();
    EEPROM.write(250,pasoN);
    primer_memoria=false;
    i=0;
  }
  else if(i==2)
  {
    automata=true;
    Serial.print("\n\t\t\t\t****************************************EJECUTAR_AUTOMATA****************************************");
    i=0;
  }
}

void mover()
{
  lectura();
  servo1.write(paso[0]);
  servo2.write(paso[1]);
  servo3.write(paso[2]);
  servo4.write(paso[3]);
  servo5.write(paso[4]);
}

void ejecutar_automata()
{
  if(seccion<=limite)
  {
    Serial.print("\n\t\t\t\t\t\t\t\tEJECUTANDO_MEMORIA ");Serial.print(pasoN);
    Serial.print("\n\t\t\t\t\t\t\t\tSECCION="); Serial.print(seccion);
    seccion++;
    if(seccion == 1) time = retardo*4;      
    else if(seccion == 10) time = retardo*3;  
    else if(seccion == 20) time = retardo*2;
    else if(seccion == 30) time = retardo*1;
    if(seccion == limite-40) time = retardo*2;
    else if(seccion == limite-30) time = retardo*3;
    else if(seccion == limite-20) time = retardo*4;
    else if(seccion == limite-10) time = retardo*5;
    registro[0]+=direccion[0];
    registro[1]+=direccion[1];
    registro[2]+=direccion[2];
    registro[3]+=direccion[3];
    registro[4]+=direccion[4];
    servo1.write(registro[0]);
    servo2.write(registro[1]);
    servo3.write(registro[2]);
    servo4.write(registro[3]);
    servo5.write(registro[4]);
    primer_seccion=false;
  }
  else
  {
    limite=0;
    seccion=0;
    pasoN++;
    primer_seccion=true;
  }
  while (digitalRead(7)==true)
  {
    servo1.write(90);
    servo2.write(10);//rango inclinado para ganar distancia guardar a 10
    servo3.write(140);//rango inclinado para ganar distancia guardar a 150
    servo4.write(90);
    servo5.write(90);//rango de pinza 90-130
    digitalWrite(13, HIGH); delay(500);
    digitalWrite(13, LOW); delay(500);
  }
}


void matriz_de_traslacion()
{
  Serial.print("\n\t\t\t\t\t\t\t\tCALCULO DE MATRIZ");
  //convierte la EEPROM en matriz
  for(EE=0;EE<5;EE++)
  {
    memor[EE]=EEPROM.read(eprom);
    eprom++;
  }
  EE=0;
  //calcular diferencias
  diferencia[0] = abs (registro[0]-memor[0]);
  diferencia[1] = abs (registro[1]-memor[1]);
  diferencia[2] = abs (registro[2]-memor[2]);
  diferencia[3] = abs (registro[3]-memor[3]);
  diferencia[4] = abs (registro[4]-memor[4]);
   //filtrar vibraciones
  if(diferencia[0]<=5)diferencia[0]=0;
  if(diferencia[1]<=5)diferencia[1]=0;
  if(diferencia[2]<=5)diferencia[2]=0;
  if(diferencia[3]<=5)diferencia[3]=0;
  if(diferencia[4]<=5)diferencia[4]=0;
  //calcular limite de secciones
  limite = max(diferencia[0],diferencia[1]);
  limite = max(limite,diferencia[2]);
  limite = max(limite,diferencia[3]);
  limite = max(limite,diferencia[4]);
  Serial.print("\n\t\t\t\t\t\t\t\tLIMITE=");Serial.print(limite);
  //calcula dirección e incremento en grados de cada sección
  if(registro[0]>memor[0]) direccion[0]=(0-diferencia[0])/limite; else
 direccion[0]=diferencia[0]/limite;
  if(registro[1]>memor[1]) direccion[1]=(0-diferencia[1])/limite; else
 direccion[1]=diferencia[1]/limite;
  if(registro[2]>memor[2]) direccion[2]=(0-diferencia[2])/limite; else
 direccion[2]=diferencia[2]/limite;
  if(registro[3]>memor[3]) direccion[3]=(0-diferencia[3])/limite; else
 direccion[3]=diferencia[3]/limite;
  if(registro[4]>memor[4]) direccion[4]=(0-diferencia[4])/limite; else direccion[4]=diferencia[4]/limite;
}


void ultimo_registro()
{
  registro[0] = paso[0];
  registro[1] = paso[1];
  registro[2] = paso[2];
  registro[3] = paso[3];
  registro[4] = paso[4];
  ultima_memoria=false;
}

void memoriza()
{
  lectura();
  //convierte la matriz posición en EEPROM
  for(EE=0;EE<5;EE++)
  {
    EEPROM.write(eprom,paso[EE]);
    eprom++;
  }
  EE=0;
  Serial.print("\n\t\t\t\t\t\tMEMORIA\t\t"); Serial.print(pasoN);
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
}
void lectura()
{
  paso[0]=map(analogRead(A0),157,873,0,180);
  paso[1]=map(analogRead(A1),157,873,0,180);
  paso[2]=map(analogRead(A2),157,873,0,180);
  paso[3]=map(analogRead(A3),157,873,0,180);
  if((digitalRead(5))==HIGH)paso[4]=90;else paso[4]=130;
  //sección que delimita la lectura de los potencio metros
  paso[0]=constrain(paso[0],0,180);
  paso[1]=constrain(paso[1],0,180);
  paso[2]=constrain(paso[2],0,180);
  paso[3]=constrain(paso[3],0,180);
  paso[4]=constrain(paso[4],0,180);
}

Prueba 7

Código 7
El código 7 utiliza el teclado de la PC para mover y memorizar posiciones así como pausar y guardar el robot, se usa de forma similar al código 8.
Solo utiliza los servos y una fuente de alimentación de 5v 4 2000mA.

/*
comando
'1' base    'd' +5   'm' memorias  'p' pause     'e' pinza
'2' motor 2  'f' +10  'a' autómata  'p' reanudar
'3' motor 3  'c' -5                 'g' guardar
'4' muñeca  'v' -10
'5' pinza
*/
#include <Servo.h>
#define Juallekcreator
Servo servo1;//base
Servo servo2;//codo
Servo servo3;//mano
Servo servo4;//muñeca
Servo servo5;//pinza
//arreglos solo pueden memorizar 20 posiciones con esta configuración
byte memoria1[20];
byte memoria2[20];
byte memoria3[20];
byte memoria4[20];
byte memoria5[20];
//arreglo para movimiento fuera de autómata
byte paso[5];
//variables para entrada serial
byte s;
unsigned char comando=20;
//arreglos para cálculos
double registro[5], direccion[5], diferencia[5];
//contadores
byte figura,pasomax,seccion=1,limite;
//tiempo
long tiempoc=0;
long tiempob=0;
unsigned long tiempotranscurrido=millis();
unsigned long tiempomicros=micros();
int time=1000;
//constantes
#define retardo 4000
//booleanos
boolean automata=false, primer_memoria=true, primer_paso=true, primer_seccion=true, ultima_memoria=true, pause=false, pinza=true ;

void setup()
{
  pinMode(13, OUTPUT);
  servo1.attach(8);
  servo2.attach(9);
  servo3.attach(10);
  servo4.attach(11);
  servo5.attach(12);
  paso[0] = 90;
  paso[1] = 80;
  paso[2] =120;
  paso[3] = 80;
  paso[4] = 90;
  Serial.begin(115200);
  Serial.print("\t\tIniciando | ");
  for(s=0;s<31;s++){
    Serial.print("###");
    delay(25);
  }
  s=0;
  Serial.print(" | 100% 0.75s");
  Serial.print("\n\n\t\tBIENVENIDO USUARIO :)\n");
  delay(500);
  Serial.print("\t\t''CÓDIGO 7'' CONTROL SERIAL-JUALLEK 2016");
}

void loop()
{
  tiempotranscurrido=millis();
  tiempomicros=micros();
  serial();
  if(!automata)
  {
  mover();
  }
  else if(automata)
  {
    if(primer_paso==true)
    {
      if(ultima_memoria)ultimo_registro();
      figura=0;
      primer_paso=false;
    }
    else if(figura>pasomax)
    {
      figura=0;
    }
    if(primer_seccion)matriz_de_traslacion();
    if(tiempomicros-tiempob>time)
    {
      tiempob=tiempomicros;
      ejecutar_automata();
    }
  }
}

void estado()
{
  if(comando=='m')
  {
    figura++;
    if(primer_memoria==true)figura=0;
    memorisa();
  }
  else if(comando=='a')
  {
    automata=true;
    Serial.print("\n\t\t****************************************EJECUTAR_AUTOMATA****************************************");
  }
}

void mover()
{
  servo1.write(paso[0]);
  servo2.write(paso[1]);
  servo3.write(paso[2]);
  servo4.write(paso[3]);
  servo5.write(paso[4]);
}

void ejecutar_automata()
{
  if(seccion<=limite)
  {
    Serial.print("\n\t\t\t\t\t\t\t\tSECCION="); Serial.print(seccion);
    seccion++;
    if(seccion == 1)              time = retardo*4;      
    else if(seccion == 10)        time = retardo*3;  
    else if(seccion == 20)       time = retardo*2;
    else if(seccion == 30)        time = retardo*1;
    if(seccion == limite-40)      time = retardo*2;
    else if(seccion == limite-30) time = retardo*3;
    else if(seccion == limite-20) time = retardo*4;
    else if(seccion == limite-10) time = retardo*5;
    registro[0]+=direccion[0];
    registro[1]+=direccion[1];
    registro[2]+=direccion[2];
    registro[3]+=direccion[3];
    registro[4]+=direccion[4];
    servo1.write(registro[0]);
    servo2.write(registro[1]);
    servo3.write(registro[2]);
    servo4.write(registro[3]);
    servo5.write(registro[4]);
  }
  else
  {
    limite=0;
    seccion=1;
    figura++;//                                                             figura al pasar a la siguiente memoria >>
    primer_seccion=true;
  }
  while(pause==true)
  {
    if(Serial.available())
    {
      comando=Serial.read();
      if (comando=='p')pause=false;
    }
    if(comando=='g')// En pausa el robot se puede colocar recto para guardarlo y poder mover lo de lugar
    {
      servo1.write(90);
      servo2.write(10);//rango inclinado para ganar distancia guardar a 10
      servo3.write(140);//rango inclinado para ganar distancia guardar a 150
      servo4.write(90);
      servo5.write(90);//rango de pinza 90-130
    }
    digitalWrite(13, HIGH); delay(500);
    digitalWrite(13, LOW); delay(500);
  }
}


void matriz_de_traslacion()
{
  Serial.print("\n\t\t\t\t\t\t\t   CALCULO DE MATRIZ ");Serial.print(figura);
  //calcular diferencias
  diferencia[0] = abs (registro[0]-memoria1[figura]);
  diferencia[1] = abs (registro[1]-memoria2[figura]);
  diferencia[2] = abs (registro[2]-memoria3[figura]);
  diferencia[3] = abs (registro[3]-memoria4[figura]);
  diferencia[4] = abs (registro[4]-memoria5[figura]);
  // se elimino la sección de filtrado (no hay vibraciones causadas por los potencio metros)
  //calcular limite de secciones (la mayor distancia)
  limite = max(diferencia[0],diferencia[1]);
  limite = max(limite,diferencia[2]);
  limite = max(limite,diferencia[3]);
  limite = max(limite,diferencia[4]);
  Serial.print("\n\t\t\t\t\t\t\t   LIMITE=");Serial.print(limite);
  //calcula dirección e incremento en grados de cada sección
  if(registro[0]>memoria1[figura]) direccion[0]=(0-diferencia[0])/limite; else
 direccion[0]=diferencia[0]/limite;
  if(registro[1]>memoria2[figura]) direccion[1]=(0-diferencia[1])/limite; else
 direccion[1]=diferencia[1]/limite;
  if(registro[2]>memoria3[figura]) direccion[2]=(0-diferencia[2])/limite; else
 direccion[2]=diferencia[2]/limite;
  if(registro[3]>memoria4[figura]) direccion[3]=(0-diferencia[3])/limite; else
 direccion[3]=diferencia[3]/limite;
  if(registro[4]>memoria5[figura]) direccion[4]=(0-diferencia[4])/limite; else direccion[4]=diferencia[4]/limite;
  Serial.print("\n\t\t\t\t\t\t\t\tEJECUTANDO_MEMORIA ");Serial.print(figura);
  primer_seccion=false;
}


void ultimo_registro()
{
  registro[0] = paso[0];
  registro[1] = paso[1];
  registro[2] = paso[2];
  registro[3] = paso[3];
  registro[4] = paso[4];
  ultima_memoria=false;
}

void memorisa()
{
  Serial.print("\n\t\t\t\t\t\tMEMORIA\t\t"); Serial.print(figura);
  memoria1[figura] = paso[0];
  memoria2[figura] = paso[1];
  memoria3[figura] = paso[2];
  memoria4[figura] = paso[3];
  memoria5[figura] = paso[4];
  pasomax=figura;
  primer_memoria=false;
  digitalWrite(13,HIGH);
  delay(100);
  digitalWrite(13,LOW);
}

void entrada_serial()
{
  comando=Serial.read();
  if(comando=='1')s=0;
  if(comando=='2')s=1;
  if(comando=='3')s=2;
  if(comando=='4')s=3;
  if(comando=='5')s=4;
}

void asignacion()
{
  if(s==4)
  {
    if(comando=='e'&&pinza==true)
    {
      paso[4]=130;
      pinza=false;
    }
    else if(comando=='e')
    {
      paso[4]=90;
      pinza=true;
    }
  }
  if(paso[s]<180){
    if(comando=='d')paso[s]+=5;
    if(comando=='f')paso[s]+=10;
  }
  if(paso[s]>0){
    if(comando=='c')paso[s]-=5;
    if(comando=='v')paso[s]-=10;
  }
  if(paso[s]>=180)paso[s]=180;
  else if(paso[s]<=0)paso[s]=0;
}

void serial()
{
  if(Serial.available())
  {
    entrada_serial();
    asignacion();
    estado();
    if(comando=='p')pause=true;
  }
}