In questo tutorial vedremo come collegare le più comuni tipologie di motori al SBC. Ti mostreremo anche come gestirli con alcuni esempi. I tipi più comuni di motori sono:
- I motori DC sono economici e facili da controllare, è necessaria una sola uscita di potenza e questa può essere attivata con un segnale PWM.
- I servomotori sono simili ai motori CC, ma includono una piccola elettronica e un potenziometro interno per formare un circuito di controllo chiuso, che consente di controllare l'angolo di rotazione. Anche il controllo è PWM, ma in questo caso il segnale di controllo è di bassa potenza e lo stadio di potenza è integrato nel servomotore stesso.
- I motori passo-passo hanno diversi avvolgimenti e richiedono una sequenza da controllare, ma in cambio forniscono una grande precisione poiché avanzano passo dopo passo ogni volta che la polarità dei loro avvolgimenti viene invertita.
1. Motori a corrente continua
Per controllare un motore a corrente continua, lo collegheremo all'SBC come indicato nello schema seguente:


Avremo bisogno di conoscere alcuni parametri del nostro motore, in particolare il rapporto tra i volt applicati e la velocità del motore o Kv.

La classe Dc_Motor rappresenta il motore DC, controllato da un PWM a 50Hz. Come si vede occorre fornire alcuni parametri, come la tensione di alimentazione e la costante Kv, oltre al pin da utilizzare. In cambio otteniamo due funzioni: set_voltage e set_speed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | classe Motore a corrente continua: FREQ_Hz = 50 def __init__( auto, perno, vm, kv ): auto.vm = vm auto.kv = kv auto.perno = perno auto.fuori = sbc.Dout() auto.fuori.set_pwm( auto.perno, auto.FREQ_Hz, 0 ) auto.set_voltaggio( 0 ) def set_voltaggio( auto, v ): impulso_percentuale_on = 100v/auto.vm auto.fuori.set_pwm( auto.perno, auto.FREQ_Hz, 100-impulso_percent_on ) def imposta_velocità( auto, giri/min): auto.set_voltaggio( rpm/auto.kv) |
Un esempio di utilizzo potrebbe essere il seguente:
>>> ora di importazione
>>> importa sbc_mtr
>>> motore = sbc_mtr.Dc_Motor( "DOUT3", vm=12, kv=0.5 )
>>> print( "Controllo di tensione" )
Controllo della tensione
>>> motor.set_voltage( 6 )
>>> tempo.sonno( 1 )
>>> motor.set_voltage( 0 )
>>> print( "Controllo velocità")
Controllo della velocità
>>> motore.set_speed( 100 )
>>> tempo.sonno( 1 )
>>> motore.set_speed( 0 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | classe Servomotore: FREQ_Hz = 50 DUTY_MIN_ms = 0.5 DUTY_MAX_ms = 2.5 def __init__( auto, spillo ): auto.perno = perno auto.fuori = sbc.Dout() auto.fuori.set_pwm( auto.perno, auto.FREQ_Hz, 0 ) def set_angolo( auto, angle_deg ): duty_ms = auto.DUTY_MIN_ms + (auto.DUTY_MAX_ms-auto.DUTY_MIN_ms)*angolo_gradi/ 180 pulsazioni_percentuali = auto.FREQ_Hz*dovere_ms/ 10 auto.fuori.set_pwm( auto.perno, auto.FREQ_Hz, 100-impulso_percent_on ) |
E un esempio di utilizzo:
>>> ora di importazione
>>> importa sbc_mtr
>>> motore = sbc_mtr.Servo_Motor( "DOUT3" )
>>> print("Imposta l'angolo a 90 gradi" )
Impostare l'angolo a 90 gradi
>>> angolo_set_motore( 90 )
>>> tempo.sonno( 1 )
>>> print("Imposta l'angolo a 0 gradi" )
Impostare l'angolo a 0 gradi
>>> angolo_set_motore( 0 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | classe Stepper_Motore: def __init__( auto, spille ): auto.pino = pino auto.fuori = sbc.Dout() auto.stato = 0 auto.passi = 0 auto.dir = 1 auto.timer = macchina.Timer( -1 ) def passo( auto, direzione ): if( auto.stato == 0 ): auto.fuori.scrivere( auto.spille[0], 1 ) auto.fuori.scrivere( auto.spille[1], 1 ) auto.fuori.scrivere( auto.spille[2], 0 ) auto.fuori.scrivere( auto.spille[3], 0 ) Elif( auto.stato == 1 ): auto.fuori.scrivere( auto.spille[0], 0 ) auto.fuori.scrivere( auto.spille[1], 1 ) auto.fuori.scrivere( auto.spille[2], 1 ) auto.fuori.scrivere( auto.spille[3], 0 ) Elif( auto.stato == 2 ): auto.fuori.scrivere( auto.spille[0], 0 ) auto.fuori.scrivere( auto.spille[1], 0 ) auto.fuori.scrivere( auto.spille[2], 1 ) auto.fuori.scrivere( auto.spille[3], 1 ) Elif( auto.stato == 3 ): auto.fuori.scrivere( auto.spille[0], 1 ) auto.fuori.scrivere( auto.spille[1], 0 ) auto.fuori.scrivere( auto.spille[2], 0 ) auto.fuori.scrivere( auto.spille[3], 1 ) auto.passi += direzione auto.stato = (auto.stato + direzione) & 0x03 def imposta_velocità( auto, passi_s, direzione ): if( passi_s e direzione): auto.timer.init( punto=int(1000 /passi_s), modalità=macchina.Timer.PERIODICO, richiamata=lambda signor: auto.passo(direzione)) altro: auto.timer.deinit() |
Infine un esempio di utilizzo:
>>> ora di importazione
>>> importa sbc_mtr
>>> motore = sbc_mtr.Stepper_Motor( ["DOUT1", "DOUT2", "DOUT3", "DOUT4"] )
>>> print( "Passo dopo passo" )
Passo dopo passo
>>> per i nell'intervallo( 100 ):
... passo.motore( 1 )
... tempo.sleep_ms( 10 )
>>> print( "Continuo")
Educazione
>>> motore.set_speed( 100, -1 )
>>> tempo.sonno( 1 )
>>> motore.set_speed( 0, 0 )