Il CityHub diventa un semplice battery box Power Function

Una delle prime critiche che fu sollevata dall’ambiente AFOL, quando fu presentato il nuovo sistema Powered Up, era l’impossibilità di utilizzare alla stregua del battery box Power Function ovvero poter attivare un motore semplicemente premendo sul pulsante di accensione. Infatti, gli Hub Powered Up (con il firmware originale LEGO) necessitano di essere attivati o dall’apposito remote control (con i limite dell’attivazione bang-bang, per i motori che non siano quelli del treno) o tramite uno smartphone tablet.

Questa lacuna verrà in parte colmata nelle prossime settimane, quando (ad agosto) verrà rilasciato il ‘battery box’ Powered Up con le generose dimensioni del Technic Hub (vedi questo mio altro articolo)

Però, grazie a Pybrick e alla sua caratteristica di poter precaricare un programma all’interno della memoria flash del dispositivo, possiamo ovviare a questa mancanza 😉

Ecco cosa mi sono “inventato” con qualche riga di codice:

Il funzionamento del “CityHub as PF Battery Box” è molto semplice:
1) Accendi l’Hub con un click sul pulsante verde (LED Blu=Stand by);
2) Ad ogni nuova pressione del pulsante verde il motore inizia a girare (LED Verde=Running Program) aumentando la velocità in 9 step, fino ad arrivare al 100% di velocità (LED Rosso=Max speed);
3) Una volta raggiunta la velocità massima, continuando a premere il pulsante verde il motore decrementerà la sua velocità, fino a fermarsi… ;
4) Per bloccare immediatamente la rotazione del motor, sarà sufficiente un veloce ‘doppio click’ sul pulsante verde;
5) Per spegnere definitivamente l’Hub è sufficiente tener premuto il pulsante per alcuni secondi;

Riepilogando:
– Led Blu: stand-by
– Led Verde: motore in rotazione nel range 20-90%
– Led Rosso: motore in rotazione al 100%

Questo il codice utilizzato:

import uos
from pybricks.hubs import CityHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.parameters import Color
from pybricks.tools import wait, StopWatch
import uerrno

print(uos.uname())

hub=CityHub()
crono=StopWatch()
lastClick=crono.time()
ramp=0
        
def isDoubleClick():
    global lastClick, crono
    y=crono.time() - lastClick
    if (y < 300):
        #print(str((tmr.time() - previousClickTime))) #debug double click time
        return True
    else:
        lastClick=crono.time()
        return False

def get_motor(port):
    #Returns a Motor object if a motor is connected to port or None if no motor is connected.
    try:
        return Motor(port)
    except OSError as ex:
        if ex.args[0] != uerrno.ENODEV:
            raise
        return None

#Show a red blinking if not motor present
def warning_LED(speed):
    iCount=0
    while iCount < 4:
        hub.light.on(Color.RED)
        wait(speed)
        hub.light.off()
        wait(speed)
        iCount +=1
        
# don't care which port motor is connected to
mot = get_motor(Port.A) or get_motor(Port.B)

if not mot:
    warning_LED(100)
    raise RuntimeError("No motor connected on Port A or Port B")

speedMultipler=2 #with less of 20% of Duty Cycle the motor don't turn
mot.dc(10 * speedMultipler) #start the motor at 20%

while True:
    try:
        if (speedMultipler==10):
            hub.light.on(Color.RED) #with max speed, turn on RED light
        else:
            hub.light.on(Color.GREEN) #otherwise, GREEN light
        wait(500)
    except KeyboardInterrupt as e:
        if isDoubleClick()==True:
            raise SystemExit("Stop by user..")

        if (ramp==0):    
            speedMultipler +=1
            mot.dc(10 * speedMultipler)
            if (speedMultipler==10):
                ramp=1
        else:
            speedMultipler -=1
            if (speedMultipler>1):
                mot.dc(10 * speedMultipler)
            else:
                raise SystemExit("End of speed ramp cycle...")

(Nota: il codice è stato aggiornato rispetto la prima pubblicazione, migliorandone il funzionamento)

Lascia una risposta

L'indirizzo email non verrà pubblicato.I campi obbligatori sono contrassegnati *