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");
    }
  }
}



No hay comentarios.:

Publicar un comentario