'''
///////////////////////////////////////////////////////////////////////////
// Programa desenvolvido por Cristiano Teixeira                          //
// Sob Licença Apache 2.0                                                //
// https://github.com/ProfessorCristiano                                 //
// Hexapod com MicroPython e ESP32                                       //
// Programa utiliza ESP32 e Servo motores SG90 para controlar um quadpod //
// MePed V2.0, com 8 servos, para 4 patas                                //
// Sendo 4 para movimentos de 'ombro' e 4 para movimentos de 'joelho'.   //
// https://meped.io/mepedv2                                              //
// programa exemplo em:                                                  //
// https://www.meped.io/sites/default/files/2017-06/mePed_IR_Starter_Program_0.ino //
//  e                                                                    //
// https://github.com/keaoli/SPARX/blob/master/CoreMovement.py           //
// As posições iniciais são definidas e os movimentos são sincronizados  //
// com base nessas posições.                                             //
// Veja os comentários para entender como o código funciona.             //
///////////////////////////////////////////////////////////////////////////
'''
from machine import Pin, PWM
import time
# Configuração dos pinos dos servos
servos = {
    "ombro_frente_direito": PWM(Pin(19), freq=50),
    "joelho_frente_direito": PWM(Pin(32), freq=50),
    "ombro_frente_esquerdo": PWM(Pin(21), freq=50),
    "joelho_frente_esquerdo": PWM(Pin(33), freq=50),
    "ombro_tras_direito": PWM(Pin(5), freq=50),
    "joelho_tras_direito": PWM(Pin(13), freq=50),
    "ombro_tras_esquerdo": PWM(Pin(4), freq=50),
    "joelho_tras_esquerdo": PWM(Pin(14), freq=50),
}
# Função para mover um servo para um ângulo específico
def mover_servo(servo, angulo):
    duty = int((angulo / 180) * 1023)  # Converte ângulo para duty cycle
    servos[servo].duty(duty)
# Posições neutras (iniciais)
posicoes_iniciais = {
    "ombro_frente_direito": 90,
    "joelho_frente_direito": 90,
    "ombro_frente_esquerdo": 90,
    "joelho_frente_esquerdo": 90,
    "ombro_tras_direito": 90,
    "joelho_tras_direito": 90,
    "ombro_tras_esquerdo": 90,
    "joelho_tras_esquerdo": 90,
}
# Função para definir as posições iniciais
def resetar_posicoes():
    for servo, angulo in posicoes_iniciais.items():
        mover_servo(servo, angulo)
    time.sleep(1)
# Função para andar para frente
def andar_para_frente():
    # Levanta a perna direita da frente
    mover_servo("joelho_frente_direito", 60)
    time.sleep(0.2)
    # Move o ombro para frente
    mover_servo("ombro_frente_direito", 120)
    time.sleep(0.2)
    # Abaixa a perna
    mover_servo("joelho_frente_direito", 90)
    time.sleep(0.2)
    # Repete para as outras pernas
    mover_servo("joelho_tras_esquerdo", 60)
    time.sleep(0.2)
    mover_servo("ombro_tras_esquerdo", 120)
    time.sleep(0.2)
    mover_servo("joelho_tras_esquerdo", 90)
    time.sleep(0.2)
# Função para virar à esquerda
def virar_esquerda():
    mover_servo("ombro_frente_direito", 120)
    mover_servo("ombro_tras_direito", 60)
    time.sleep(0.5)
    resetar_posicoes()
# Função para parar
def parar():
    resetar_posicoes()
# Programa principal
resetar_posicoes()
while True:
    andar_para_frente()
    time.sleep(1)
    virar_esquerda()
    time.sleep(1)
    parar()
    time.sleep(2)