domingo, 2 de noviembre de 2014

Garra Trasnportador - Robotica

Garra Trasnportador - Robotica
Autor : René Curín
Competencia : Creatividad e innovación (nivel 1)
Asignatura: Prigramacion de Robots
Palabras clave: Programación, NQC, Lego
 Descripción de la actividad
 Adecuar un robot NQC con una garra que fuera lo suficiente mete resistente como para poder ir a tomar una carga y luego volver al mismo lugar con la carga entre la garra.

Enunciado de la actividad:
EL robot debe ir a buscar la carga(una lata)y llevarla hasta el punto de partida.
Herramientas utilizadas
- Editor de lenguaje NQC
- Robot Lego   
Implementaciones que debe tener el robot:
- 3 motores
- 1 sensor de tacto
- tener un contador
Solución de la actividad :
 Estrategia de solución

      Comenzamos por el análisis del problema que debía hacer el robot, el cual consistía en que debía salir a buscar un objeto en línea recta por un tiempo desconocido y traerlo de vuelta al punto de origen, entonces nos dimos cuenta de que debíamos crear algún mecanismo para poder agarrar dicho objeto, y el mecanismo que creamos fue una garra accionada por un tercer motor en la parte delantera de nuestro robot y también ubicar un sensor de tacto por el interior de las garras para poder sujetar el objeto, y traerlo de vuelta.


Modelo de solución

  El desarrollo de nuestro problema comenzó por analizar los tipo de movimientos que debía realizar el robot, verificar si estaba adecuadamente estructurado para soportar la tarea, por lo que tuvimos que implementar un nuevo equipamiento, esta vez fue una garra. el código empleado consiste en un WHILE con dos IF el primer if era que si el sensor de choque 1 era igual a cero sumara al contador TIEMPO, el segundo if consistía en que si el sensor 1 era igual a uno, que retroceda el motor B el cual cerraba la garra para poder sujetar el objeto, luego que giraran los motores A y C por un tiempo de 2 segundos, para que después avancen con una potencia de 5 por un tiempo igual a la variable tiempo, se apagan ambos motores y comienza a avanzar el motor B por un tiempo de 10 milisegundos para abrir la garra y dejar suelto el objeto, nuevamente se ejecutan ambos motores pero esta vez retrocediendo por 1 segundo y finaliza apagando todos los motores.
Código del programa

int tiempo ;
task main()
{
 SetSensor(SENSOR_1, SENSOR_TOUCH);
 SetPower(OUT_A+OUT_C,5);
 OnFwd(OUT_A+OUT_C);
     tiempo = 200;
     while (true)
     {
           if(SENSOR_1== 0)
           {
              tiempo ++;
 OnFwd(10);
           }
           if(SENSOR_1== 1)
           {
 OnRev(OUT_B);
 Wait(5);
 Off(OUT_A+OUT_C);
  Wait(30);
 SetPower(OUT_A+OUT_C,4);
 OnRev(OUT_A);
  OnFwd(OUT_C);
  Wait(200);
 SetPower(OUT_A+OUT_C,5);
 OnFwd(OUT_A+OUT_C);
 Wait(tiempo);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_B);
 Wait(10);
 OnRev(OUT_A+OUT_C);
 Wait(100);
 Off(OUT_A+OUT_C);
           }
         }
}


Pseudocódigo
int tiempo ;
task main()
{
 Pocision_Sensor(Pocision 1, Sensor de tacto);
 Enciende_motores(A+C,potencia de 5);
 Avanza_motor(A+C);
     tiempo= 200 ;
     mientras (verdadero)
     {
           Si(Sensor_pocision 1 es igual a 0)
           {
              tiempo + 1;
  Avanza(por 10 milesimas);
           }
           Si(Sensor_pocision 1 es igua a 1)
           {
             Retrocede_motor(b);
             por un tiempo(de 5 milesimas);
             Apaga_motores(A+C);
             Por un tiempo (de 30 miesimas);
             Enciemde motores(A+C,con potencia de 4);
             Retrocede_motor(A);
             Avanza_motor(C);
             Por un tiempo de (2 segundos);
             Enciende motores(A+C,con potencia5);
             Avanza_motores(A+C);
             Por un tiempo de (tiempo);
             Apaga_motores(A+C);
             Avanza_motores(B);
             Por un tiempo(de 10 milisegundos);
             Retrocede motores(A+C);
             Por un tiempo de(1 segundos);
             Apaga Motores(A+C);
           }
         }

}
   
Funcionamiento de la actividad



De que me sirvió esta actividad 



El principal aporte que me genero esta actividad fue la de poder generar un soporte (garra) que fuera lo suficientemente fuerte como para sostenerlo y moverlo de un lugar a otro, el código del programa fue algo sencillo, por lo cual no ayudo mucho al aprendizaje sobre la programación.


Agradecimiento a Carla Moya  .

Abastecimiento para damnificados por terremotos - Programación


Abastecimiento para damnificados por terremotos - Programación
Autor : René Curín
Competencia : Aplicacion ciencias de la ingenieria (nivel 1)
Asignatura: Programación 2
Palabras clave: Programación, Funciones, Python
Descripción de la actividad:

Este proyecto consistió en la elaboración de un programa que fuera capaz de extraer datos desde un archivo que contiene datos de personas damnificadas por lo terremotos y luego trabajar con sus datos para poder separar y ordenar las personas según su provincia en la región, además de entregar recursos o beneficios según sea pertinente para cada persona y finalmente generar reportes gráficos respecto a la totalidad de beneficios y afectados en la región.

Enunciado de la actividad: 
 Para poder dar una solución a una problemática como esta se solicita realizar los siguientes reportes respecto al potencial envío y entrega de alimentos:

1. Genere la carpeta llamada “Tarapacá”, la que a vez contienen un conjunto de subcarpetas llamadas según el nombre de sus provincias tal como se muestra en la Figura 2. Note que esto será generado en la misma ruta donde ejecutará su script de Python (nombre alumno.py (más detalles en la sección 3: normas de entrega)).

2. Por cada provincia (en su respectiva carpeta), genere el archivo llamado “nombre provincia.csv”, los cuales contienen los nombres (solo los nombres) de todos sus damnificados ordenados en orden creciente según apellido paterno.

3. Genere la carpeta “reportes” dentro de “Tarapacá”. Elabore un reporte (dentro de Tarapacá/reportes/) llamado “requerimientos.csv”, el cual muestra la cantidad de personas por provincia y las necesidades alimentarias requeridas, es decir, la cantidad de productos requeridos de acuerdo a la canasta básica. De acuerdo a lo anterior, el archivo contiene:
provincia:numero personas;agua,azúcar,arroz,té,pan,pasta.

4. Considerando la realización del punto anterior, cree la carpeta “graficos” dentro de Tarapacá/reportes/ y genere dentro de esta usando matplotlib lo siguiente:
    - a. Gráfico de torta que contenga la información referente a la distribución porcentual de damnificados por provincia respecto del total. Este gráfico debe ser guardado (no desplegado) con el nombre “damnificados.png”.
    - b. Gráfico de torta que contenga la información referente a los distribución porcentual de la cantidad de agua por provincia respecto del total. Este gráfico debe ser guardado (no desplegado) con el nombre “consumo_agua.png”.
    - c. Gráfico de barras que contenga la información referente al consumo de pan por provincia. Este gráfico debe ser guardado (no desplegado) con el nombre “consumo_pan.png”.

5. Suponga que azúcar es escasa y que solo un 20% de lo requerido es posible distribuir en las provincias. Construya el reporte (dentro de /Tarapacá/reportes/) llamado “provincia azucar.csv”, el cual contiene un listado de todas las personas (nombres:azúcar) las cuales están ordenadas en orden decreciente respecto de los kilos de azúcar solicitado. Recuerde que solo el 20% de la cantidad de azúcar está disponible para todas las provincia, por tanto, considere una distribución de azúcar ≤ 20%.

6. Suponga que solo es posible distribuir un 70% de todas las necesidades y que la provincia de Iquique fue la más afectada, por tanto, elabore el reporte (dentro de /Tarapacá/reportes/) llamado “beneficiados.csv”, el cual contiene todas las personas (toda la información disponible de necesidades.csv) que serán beneficiadas considerando que debe satisfacerse todas las necesidades de la provincia de Iquique. Por otra parte, elabore el reporte (dentro de /Tarapacá/reportes/) llamado “espera provincia.csv”, el que debe contener el nombre de todas las personas (ordenadas en orden decreciente según apellido paterno) que no hayan sido beneficiadas. Se considera una persona como beneficiada cuando todos sus requerimientos fueron cumplidos y si no es así, no sería beneficiada (no se toman casos parciales).

Se espera que en el informe se realice un análisis detallado sobre cómo es que usted decidió hacer esta distribución de ayuda, tomando en cuenta el código que usted utilice en su programa y lo revisado en la parte 5 y 6 de esta tarea.

Solución de la activida:
 Codigo del prohgrama:

# -*- encoding: utf-8 -*-
import os
import numpy as np
from pylab import*
import matplotlib.pyplot as plt

def obtener_provincias(x):
    archi = open(str(x),"r")
    prov = []
    cont = 0
    for k in archi:
        k = k.split(";")
        for i in range(len(prov)):
            if k[1] == prov[i]:
                cont = 1
        if cont == 0:
            prov.append(k[1])
        cont = 0
    archi.close()
    return prov

def ordenar(a):
    nombres = []
    for k in a:
        k = k.split(";")
        nom = k[0]
        nom = nom.split(" ")
        nombre = str(nom[2])+" "+str(nom[3])+" "+str(nom[0])+" "+str(nom[1])
        nombres.append(nombre)
    nombres = sorted(nombres)
    final = []
    for k in nombres:
        k = k.split(" ")
        nombre = str(k[2])+" "+str(k[3])+" "+str(k[0])+" "+str(k[1])
        final.append(nombre)
    return final

def crear(x):
    if (os.path.exists(x) == False):
        os.mkdir(x)

def sub_carpetas(x, provincias):
    crear(x)
    for C in provincias:
        crear(x + "/"+ str(C))

def graf_torta(valores,etiquetas,direccion):
    aficion = valores
    etiquetas = etiquetas
    ax = axes([0, 0, 0.8, 1])
    plt.pie(aficion, labels = etiquetas)
    legend()
    ylabel("Numero Personas")
    xlabel("Provincias")
    grid(True)
    plt.savefig(direccion)
    show()

def graf_bar(valores,etiquetas,direccion):
    name =etiquetas
    values=valores
    pos = arange(len(name)) + .5
    plt.bar(pos, values, align='center', color='#b8ff5c')
    xticks(pos,name,rotation=30,size="small")
    plt.savefig(direccion)
    show()

def productos(alimentos):
    agua = []
    pan = []
    azucar=0
    total = 0
    for f in range(len(alimentos)):
        x = alimentos[f]
        total += x[0]+x[1]+x[2]+x[3]+x[4]+x[5]
        agua.append(x[0])
        pan.append(x[4])
        azucar+=int(x[1])
    return agua,pan,azucar,total

def graficos(direccion,personas,provincias,agua,pan):
    crear(direccion)  #"Tarapaca/Reportes/Graficos"
    graf_torta(personas,provincias,str(direccion)+"/damnificados.png")
    graf_torta(agua,provincias,str(direccion)+"/consumo_agua.png")
    graf_bar(pan,provincias,str(direccion)+"/consumo_pan.png")

def repor_requerimiento(direccion,provincias,personas,alimentos):
    crear(direccion)
    requisitos = open(str(direccion)+"/Requerimientos.csv", "a")
    for i in range(len(provincias)):
        requisitos.write(str(provincias[i]) + ";" + str(personas[i]) + ";")
        for n in range(6):
            requisitos.write(str(alimentos[i][n]) + ",")
        requisitos.write(";\n")
    requisitos.close()

def repor_azucar(direc,azucar,doc):
    archi = open(doc,"r")
    text = open(str(direc) + "/provincia_azucar.csv","a")
    disponible = (azucar / 100) * 20
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        line = str(i[0])+";"+str(ali[1])
        if disponible >=0:
            if int(ali[1]) == 3:
                num = int(ali[1]) - 3
                disponible = disponible - 3
                line = str(i[0])+";"+str(num)
        text.write(line+"\n")
        line = ""
    archi.close()

def repor_beneficiados(direc,doc,total,afectado):
    archi = open(doc,"r")
    text = open(str(direc) + "/beneficiados.csv","a")
    disponible = (total / 100) * 70
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        if i[1] == afectado.upper():
            text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
            while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0 and disponible > 0:
                for k in range(6):
                    if disponible > 6:
                        if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        break
            #text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5])+"\n")
    archi.close()
    archi = open(doc,"r")
    true = True
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        cont = 2
        if i[1] != afectado.upper() and true == True:
            if int(ali[0]) >= cont and int(ali[1]) >= cont and int(ali[2]) >= cont and int(ali[3]) >= cont and int(ali[4]) >= cont and int(ali[5]) >= cont:
                text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
                while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0:
                    if disponible > 6:
                        for k in range(6):
                            if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        true = False
        if i[1] != afectado.upper():
            text1 = open(str(direc) + "/espera_provincia.csv","a")
            text1.write(str(i[0]) +";"+str(i[1])+";"+str(i[2]))
            text1.close()

def terremoto(documento):
    provincias = obtener_provincias(documento)    # Variable para almacenar las provincias
    personas = [0] * len(provincias)    # Variable para almacenar la cantidad de personas
    alimentos = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]    # variable para almacenar la cantidad de alimentos
    archi = open(documento, "r")
    sub_carpetas("Tarapaca", provincias)    # Se crean las subcaprteas
    for linea in archi:
  linea = linea.split(";")#Separolacadena por ; y su resultado seria['Nombre','provincia','1,5,9,78,45,7']
        prod = linea[2].split(",")    # La pocision 2 de linea son los alimentos y los separo por una coma
        for i in range(len(provincias)):
            if provincias[i] == linea[1]:    # si provicnias(Mayusculas es igual a provincias de la pocicion1
                personas[i] += 1     # Sumo 1 a la cantidad de personas segun provincia
                text = open("Tarapaca/" + str(provincias[i])+ "/" +str(provincias[i]) + ".csv", "a")
                text.write(str(linea[0]) + ";\n")
                text.close()
                for ali in range(6):
                    alimentos[i][ali] += int(prod[ali])
    archi.close()

    agua,pan,azucar,total = productos(alimentos)   #Obtengo los alimentos
    repor_requerimiento("Tarapaca/Reportes",provincias,personas,alimentos)
    repor_azucar("Tarapaca/Reportes",azucar,documento)
    repor_beneficiados("Tarapaca/Reportes",documento,total,"Iquique")
    graficos("Tarapaca/Reportes/Graficos",personas,provincias,agua,pan)    # Se generan los graficos

#--------Main---------
terremoto("necesidades1.csv")
El codigo no es muy legible al momento de postearlo, por eso les dejo el link del codigo -> LINK

De que me sirvió esta activida:

La actividad me ayudo a la formulación de ideas para poder seperar las personas y además poder crear algunos cálculos para poder entregar los beneficios para cada persona, como fue una tarea un poco enredada tuve que imaginar completamente la estructura del programa para poder empezar a programar.