Neste tutorial veremos como conectar os tipos de motores mais comuns ao SBC. Também mostraremos como lidar com eles com alguns exemplos. Os tipos mais comuns de motores são:
- Os motores DC são baratos e fáceis de controlar, apenas uma saída de energia é necessária e pode ser ativada com um sinal PWM.
- Os servomotores são semelhantes aos motores DC, mas incluem pequenos componentes eletrônicos e um potenciômetro interno para formar um circuito de controle fechado, que permite controlar o ângulo de rotação. O controle é por PWM também, mas neste caso o sinal de controle é de baixa potência e o estágio de potência é integrado no próprio servomotor.
- Os motores de passo possuem vários enrolamentos e necessitam de uma sequência para serem controlados, mas em troca oferecem grande precisão, pois avançam passo a passo cada vez que a polaridade de seus enrolamentos é invertida.
1. Motores DC
Para controlar um motor DC, vamos conectá-lo ao SBC conforme indicado no diagrama a seguir:


Precisamos conhecer alguns parâmetros do nosso motor, especificamente a relação entre os volts aplicados e a velocidade do motor ou Kv.

A classe Dc_Motor representa o motor DC, controlado por um PWM em 50Hz. Como pode ser observado, alguns parâmetros devem ser fornecidos, como a tensão de alimentação e a constante Kv, bem como o pino a ser utilizado. Em troca, obtemos duas funções: set_voltage e set_speed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | classe Motor DC: FREQ_Hz = 50 def __init__( eu, pino, vm, kv ): eu.vm = vm eu.kv = kv eu.pino = pino eu.idiota = SBC.Dout() eu.idiota.set_pwm( eu.alfinete, eu.FREQ_Hz, 0 ) eu.set_tensão( 0 ) def tensão_definida( eu, v ): pulse_percent_on = 100 *v/eu.vm eu.idiota.set_pwm( eu.alfinete, eu.FREQ_Hz, 100-pulso_percent_on ) def definir_velocidade( eu, rotações): eu.set_voltage(rpm/eu.kv) |
Um exemplo de uso seria o seguinte:
>>> tempo de importação
>>> importar sbc_mtr
>>> motor = sbc_mtr.Dc_Motor( "DOUT3", vm=12, kv=0.5 )
>>> print("Controle de tensão")
Controle de tensão
>>> motor.set_voltage( 6 )
>>> time.sleep( 1 )
>>> motor.set_voltage( 0 )
>>> print("Controle de velocidade")
Controle de velocidade
>>> motor.set_speed( 100 )
>>> time.sleep( 1 )
>>> motor.set_speed( 0 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | classe Servo-motor: FREQ_Hz = 50 DUTY_MIN_ms = 0.5 DUTY_MAX_ms = 2.5 def __init__( eu, PIN ): eu.pino = pino eu.idiota = SBC.Dout() eu.idiota.set_pwm( eu.alfinete, eu.FREQ_Hz, 0 ) def ângulo definido( eu, angle_deg ): duty_ms = eu.DUTY_MIN_ms + (eu.DUTY_MAX_ms-eu.DUTY_MIN_ms)*ângulo_deg/ 180 pulse_percent_on = eu.FREQ_Hz*dever_ms/ 10 eu.idiota.set_pwm( eu.alfinete, eu.FREQ_Hz, 100-pulso_percent_on ) |
E um exemplo de uso:
>>> tempo de importação
>>> importar sbc_mtr
>>> motor = sbc_mtr.Servo_Motor( "DOUT3" )
>>> print("Ajuste o ângulo para 90 graus" )
Defina o ângulo para 90 graus
>>> motor.set_angle( 90 )
>>> time.sleep( 1 )
>>> print("Ajuste o ângulo para 0 graus" )
Defina o ângulo para 0 graus
>>> motor.set_angle( 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 Motor_de passo: def __init__( eu, pinos ): eu.pins = pins eu.idiota = SBC.Dout() eu.estado = 0 eu.passos = 0 eu.dir = 1 eu.cronômetro = máquina.Cronômetro( -1 ) def passo( eu, direção ): if( eu.estado == 0 ): eu.idiota.escrever( eu.alfinetes[0], 1 ) eu.idiota.escrever( eu.alfinetes[1], 1 ) eu.idiota.escrever( eu.alfinetes[2], 0 ) eu.idiota.escrever( eu.alfinetes[3], 0 ) elif( eu.estado == 1 ): eu.idiota.escrever( eu.alfinetes[0], 0 ) eu.idiota.escrever( eu.alfinetes[1], 1 ) eu.idiota.escrever( eu.alfinetes[2], 1 ) eu.idiota.escrever( eu.alfinetes[3], 0 ) elif( eu.estado == 2 ): eu.idiota.escrever( eu.alfinetes[0], 0 ) eu.idiota.escrever( eu.alfinetes[1], 0 ) eu.idiota.escrever( eu.alfinetes[2], 1 ) eu.idiota.escrever( eu.alfinetes[3], 1 ) elif( eu.estado == 3 ): eu.idiota.escrever( eu.alfinetes[0], 1 ) eu.idiota.escrever( eu.alfinetes[1], 0 ) eu.idiota.escrever( eu.alfinetes[2], 0 ) eu.idiota.escrever( eu.alfinetes[3], 1 ) eu.passos += direção eu.estado = (eu.estado + direção) & 0x03 def definir_velocidade( eu, passos_s, direção ): if( passos_s e direção): eu.cronômetro.inicial(período=int(1000 /passos_s), modo=máquina.Cronômetro.PERIÓDICO, retorno de chamada=lambda tmr: eu.passo(direção) ) outro: eu.cronômetro.deinit() |
Por fim, um exemplo de uso:
>>> tempo de importação
>>> importar sbc_mtr
>>> motor = sbc_mtr.Stepper_Motor( ["DOUT1", "DOUT2", "DOUT3", "DOUT4"] )
>>> print("Passo a passo" )
Passo a passo
>>> para i no intervalo (100):
... motor.passo( 1 )
... tempo.sleep_ms(10)
>>> print("Contínuo" )
Melhoria
>>> motor.set_speed( 100, -1 )
>>> time.sleep( 1 )
>>> motor.set_speed( 0, 0 )