239 lines
6.4 KiB
Python
239 lines
6.4 KiB
Python
"""
|
|
test_motion.py — Tests individuals del mòdul motion.py.
|
|
Executa des del directori Rasp/: python tests/test_motion.py
|
|
|
|
Descomenta la funció que vols provar al final del fitxer.
|
|
Assegura't que el venv està activat i pigpiod en marxa (sudo pigpiod -s 1).
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
import time
|
|
import pigpio
|
|
import motion
|
|
from motion import (
|
|
motion_setup, motion_setup_steppers, motion_setup_sensors, motion_cleanup,
|
|
enable_wheels, enable_arms, enable_syringe,
|
|
arms_home, syringe_home,
|
|
distance_to_object,
|
|
ON, OFF, CW, CCW,
|
|
)
|
|
|
|
def _pi_connect():
|
|
pi = pigpio.pi()
|
|
if not pi.connected:
|
|
print("ERROR: pigpiod no està en marxa. Executa: sudo pigpiod -s 1")
|
|
sys.exit(1)
|
|
return pi
|
|
|
|
def _setup_motors():
|
|
"""Setup mínim per a tests de motors (sense sensors I2C)."""
|
|
pi = _pi_connect()
|
|
motion_setup_steppers(pi)
|
|
return pi
|
|
|
|
def _setup_sensors():
|
|
"""Setup mínim per a tests de sensors I2C (sense steppers)."""
|
|
pi = _pi_connect()
|
|
motion_setup_sensors(pi)
|
|
return pi
|
|
|
|
def _teardown_motors(pi):
|
|
motion_cleanup()
|
|
pi.stop()
|
|
|
|
def _teardown_sensors(pi):
|
|
pi.stop()
|
|
|
|
|
|
# ==================
|
|
# TEST 1 — Motors pas a pas (rodes)
|
|
# ==================
|
|
|
|
def test_motor_unic():
|
|
"""
|
|
Prova únicament la roda DRETA: 200 passos endavant i enrere.
|
|
Primer test a fer — verifica que un sol motor funciona correctament.
|
|
Hauries de veure la roda girar ~1/5 de volta (reducció 1:5).
|
|
"""
|
|
print("=== TEST MOTOR ÚNIC (RODA DRETA) ===")
|
|
pi = _setup_motors()
|
|
|
|
PASSOS = 200
|
|
|
|
print(f"Movent roda DRETA {PASSOS} passos endavant...")
|
|
enable_wheels(ON)
|
|
motion.wheel_R.move_to(PASSOS)
|
|
while motion.wheel_R.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda dreta endavant: OK")
|
|
|
|
time.sleep(0.5)
|
|
|
|
print(f"Movent roda DRETA {PASSOS} passos enrere...")
|
|
motion.wheel_R.move_to(0)
|
|
while motion.wheel_R.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda dreta enrere: OK")
|
|
|
|
enable_wheels(OFF)
|
|
_teardown_motors(pi)
|
|
print("Test motor únic completat.\n")
|
|
|
|
|
|
def test_motors():
|
|
"""
|
|
Prova les dues rodes: avança 200 passos i torna enrere.
|
|
Executa test_motor_unic() primer per verificar que un motor funciona.
|
|
Hauries de veure cada roda girar ~1/5 de volta (reducció 1:5).
|
|
"""
|
|
print("=== TEST MOTORS (RODES) ===")
|
|
pi = _setup_motors()
|
|
|
|
PASSOS = 200
|
|
|
|
print(f"Movent roda DRETA {PASSOS} passos endavant...")
|
|
enable_wheels(ON)
|
|
motion.wheel_R.move_to(PASSOS)
|
|
while motion.wheel_R.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda dreta: OK")
|
|
|
|
time.sleep(0.5)
|
|
|
|
print(f"Movent roda DRETA {PASSOS} passos enrere...")
|
|
motion.wheel_R.move_to(0)
|
|
while motion.wheel_R.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda dreta enrere: OK")
|
|
|
|
time.sleep(0.5)
|
|
|
|
print(f"Movent roda ESQUERRA {PASSOS} passos endavant...")
|
|
motion.wheel_L.move_to(PASSOS)
|
|
while motion.wheel_L.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda esquerra: OK")
|
|
|
|
time.sleep(0.5)
|
|
|
|
print(f"Movent roda ESQUERRA {PASSOS} passos enrere...")
|
|
motion.wheel_L.move_to(0)
|
|
while motion.wheel_L.is_running():
|
|
time.sleep(0.05)
|
|
print("Roda esquerra enrere: OK")
|
|
|
|
enable_wheels(OFF)
|
|
_teardown_motors(pi)
|
|
print("Test motors completat.\n")
|
|
|
|
|
|
# ==================
|
|
# TEST 2 — Homing (finals de carrera)
|
|
# ==================
|
|
|
|
def test_homing_brac():
|
|
"""
|
|
Executa el homing únicament dels BRAÇOS.
|
|
Primer test de homing — verifica que un sol conjunt de finals de carrera funciona.
|
|
ATENCIÓ: assegura't que els braços tinguin espai per moure's.
|
|
"""
|
|
print("=== TEST HOMING BRAÇOS ===")
|
|
pi = _setup_motors()
|
|
|
|
print("Iniciant homing dels BRAÇOS...")
|
|
arms_home()
|
|
print("Homing braços: OK")
|
|
|
|
_teardown_motors(pi)
|
|
print("Test homing braços completat.\n")
|
|
|
|
|
|
def test_homing():
|
|
"""
|
|
Executa el homing complet: braços i xeringa.
|
|
Executa test_homing_brac() primer per verificar els finals de carrera dels braços.
|
|
ATENCIÓ: assegura't que els braços i la xeringa tinguin espai per moure's.
|
|
"""
|
|
print("=== TEST HOMING COMPLET ===")
|
|
pi = _setup_motors()
|
|
|
|
print("Iniciant homing dels BRAÇOS...")
|
|
arms_home()
|
|
print("Homing braços: OK")
|
|
|
|
time.sleep(1.0)
|
|
|
|
print("Iniciant homing de la XERINGA...")
|
|
syringe_home()
|
|
print("Homing xeringa: OK")
|
|
|
|
_teardown_motors(pi)
|
|
print("Test homing completat.\n")
|
|
|
|
|
|
# ==================
|
|
# TEST 3 — Sensor de distància VL53L0X
|
|
# ==================
|
|
|
|
def test_distance_sensor():
|
|
"""
|
|
Llegeix la distància 10 vegades cada 500ms.
|
|
Posa la mà davant del sensor per verificar que canvia el valor.
|
|
"""
|
|
print("=== TEST SENSOR DISTÀNCIA VL53L0X ===")
|
|
pi = _setup_sensors()
|
|
|
|
print("Llegint distància durant 5 segons (posa la mà davant del sensor)...")
|
|
for i in range(10):
|
|
dist = distance_to_object()
|
|
if dist == 65535:
|
|
print(f" Lectura {i+1:2d}: fora de rang")
|
|
else:
|
|
print(f" Lectura {i+1:2d}: {dist} mm")
|
|
time.sleep(0.5)
|
|
|
|
_teardown_sensors(pi)
|
|
print("Test sensor distància completat.\n")
|
|
|
|
|
|
# ==================
|
|
# TEST 4 — Sensors de línia ADS1115
|
|
# ==================
|
|
|
|
def test_line_sensors():
|
|
"""
|
|
Llegeix els dos sensors de línia 10 vegades cada 500ms.
|
|
Posa el sensor sobre superfícies de diferent color per veure la variació.
|
|
Valor alt (~9700+) = negre. Valor baix = blanc/clar.
|
|
"""
|
|
print("=== TEST SENSORS DE LÍNIA ADS1115 ===")
|
|
pi = _setup_sensors()
|
|
|
|
print("Llegint sensors de línia durant 5 segons...")
|
|
print(" (posa els sensors sobre blanc i negre per veure la diferència)")
|
|
for i in range(10):
|
|
r = motion._chan_r.value
|
|
l = motion._chan_l.value
|
|
print(f" Lectura {i+1:2d}: DRETA={r:5d} ESQUERRA={l:5d} error={r-l:+6d}")
|
|
time.sleep(0.5)
|
|
|
|
_teardown_sensors(pi)
|
|
print("Test sensors de línia completat.\n")
|
|
|
|
|
|
# ==================
|
|
# Execució
|
|
# ==================
|
|
|
|
if __name__ == "__main__":
|
|
# Descomenta el test que vols executar:
|
|
test_motor_unic() # Primer: prova un sol motor
|
|
# test_motors() # Segon: prova les dues rodes
|
|
# test_homing_brac() # Primer homing: només els braços
|
|
# test_homing() # Homing complet: braços i xeringa
|
|
# test_distance_sensor()
|
|
# test_line_sensors()
|