Tässä opetusohjelmassa näemme, kuinka yleisimmät moottorityypit liitetään SBC. Näytämme sinulle myös, miten niitä käsitellään muutamilla esimerkeillä. Yleisimmät moottorityypit ovat:
- Tasavirtamoottorit ovat halpoja ja helppoja ohjata, tarvitaan vain yksi teholähtö ja se voidaan aktivoida PWM-signaalilla.
- Servomoottorit ovat samanlaisia kuin tasavirtamoottorit, mutta niissä on pieni elektroniikka ja sisäinen potentiometri, jotka muodostavat suljetun säätöpiirin, mikä mahdollistaa pyörimiskulman säätelyn. Ohjaus on myös PWM:llä, mutta tässä tapauksessa ohjaussignaali on pienitehoinen ja tehoaste on integroitu itse servomoottoriin.
- Askelmoottoreissa on useita käämejä ja ne vaativat sekvenssin ohjaamista, mutta vastineeksi ne tarjoavat suuren tarkkuuden, koska ne etenevät askel askeleelta aina, kun niiden käämien napaisuus käännetään.
1. DC-moottorit
Tasavirtamoottorin ohjaamiseksi yhdistämme sen SBC:hen seuraavan kaavion mukaisesti:
Meidän on tiedettävä joitain moottorimme parametreja, erityisesti käytettyjen volttien ja moottorin nopeuden tai Kv välinen suhde.
Dc_Motor-luokka edustaa DC-moottoria, jota ohjaa PWM 50 Hz:llä. Kuten voidaan nähdä, on annettava joitain parametreja, kuten syöttöjännite ja Kv-vakio sekä käytettävä nasta. Vastineeksi saamme kaksi funktiota: set_voltage ja set_speed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | luokka Dc_Motor: FREQ_Hz = 50 def __init__( itse, pin, vm, kv ): itse.vm = vm itse.kv = kv itse.mänty = mänty itse.dout = SBC.Dout() itse.dout.set_pwm( itse.mänty, itse.FREQ_Hz, 0 ) itse.set_voltage( 0 ) def set_voltage( itse, v ): pulse_percent_on = 100 *v/itse.vm itse.dout.set_pwm( itse.mänty, itse.FREQ_Hz, 100-pulse_percent_on ) def set_speed( itse, rpm): itse.set_voltage( rpm/itse.kv) |
Käyttöesimerkki olisi seuraava:
>>> tuontiaika
>>> tuonti sbc_mtr
>>> moottori = sbc_mtr.Dc_Motor( "DOUT3", vm=12, kv=0.5 )
>>> tulosta( "Jännitesäätö")
Jännitteen ohjaus
>>> motor.set_voltage( 6 )
>>> aika.uni( 1 )
>>> motor.set_voltage( 0 )
>>> tulosta ("Nopeussäätö")
Nopeuden säätö
>>> motor.set_speed( 100 )
>>> aika.uni( 1 )
>>> motor.set_speed( 0 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | luokka Servo moottori: FREQ_Hz = 50 DUTY_MIN_ms = 0.5 DUTY_MAX_ms = 2.5 def __init__( itse, pin): itse.mänty = mänty itse.dout = SBC.Dout() itse.dout.set_pwm( itse.mänty, itse.FREQ_Hz, 0 ) def set_angle( itse, kulman_aste ): duty_ms = itse.DUTY_MIN_ms + (itse.DUTY_MAX_ms-itse.DUTY_MIN_ms)*kulma_aste/ 180 pulse_percent_on = itse.FREQ_Hz*duty_ms/ 10 itse.dout.set_pwm( itse.mänty, itse.FREQ_Hz, 100-pulse_percent_on ) |
Ja yksi esimerkki käytöstä:
>>> tuontiaika
>>> tuonti sbc_mtr
>>> moottori = sbc_mtr.Servo_Motor( "DOUT3" )
>>> print("Aseta kulma 90 asteeseen")
Aseta kulma 90 asteeseen
>>> motor.set_angle( 90 )
>>> aika.uni( 1 )
>>> print("Aseta kulma 0 asteeseen")
Aseta kulma 0 asteeseen
>>> 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 | luokka Stepper_Motor: def __init__( itse, nastat ): itse.mänty = mänty itse.dout = SBC.Dout() itse.olivat = 0 itse.vaiheet = 0 itse.dir = 1 itse.ajastin = kone.Ajastin( -1 ) def vaihe( itse, suunta): if( itse.olivat == 0 ): itse.dout.kirjoittaa( itse.nastat[0], 1 ) itse.dout.kirjoittaa( itse.nastat[1], 1 ) itse.dout.kirjoittaa( itse.nastat[2], 0 ) itse.dout.kirjoittaa( itse.nastat[3], 0 ) elif( itse.olivat == 1 ): itse.dout.kirjoittaa( itse.nastat[0], 0 ) itse.dout.kirjoittaa( itse.nastat[1], 1 ) itse.dout.kirjoittaa( itse.nastat[2], 1 ) itse.dout.kirjoittaa( itse.nastat[3], 0 ) elif( itse.olivat == 2 ): itse.dout.kirjoittaa( itse.nastat[0], 0 ) itse.dout.kirjoittaa( itse.nastat[1], 0 ) itse.dout.kirjoittaa( itse.nastat[2], 1 ) itse.dout.kirjoittaa( itse.nastat[3], 1 ) elif( itse.olivat == 3 ): itse.dout.kirjoittaa( itse.nastat[0], 1 ) itse.dout.kirjoittaa( itse.nastat[1], 0 ) itse.dout.kirjoittaa( itse.nastat[2], 0 ) itse.dout.kirjoittaa( itse.nastat[3], 1 ) itse.vaiheet += suunta itse.olivat = (itse.olivat + suunta) & 0x03 def set_speed( itse, steps_s, direction ): if(vaiheet_s ja suunta): itse.ajastin.init( piste=int(1000 /step_s), tila=kone.Ajastin.PERIODIC, takaisinsoitto=lambda tmr: itse.askel (suunta) ) muu: itse.ajastin.deinit() |
Lopuksi esimerkki käytöstä:
>>> tuontiaika
>>> tuonti sbc_mtr
>>> moottori = sbc_mtr.Stepper_Motor( ["DOUT1", "DOUT2", "DOUT3", "DOUT4"] )
>>> tulosta ("Askel askeleelta")
Askel askeleelta
>>> i alueella (100):
... moottori.vaihe ( 1 )
... time.sleep_ms( 10 )
>>> tulosta ("Jatkuva")
Jatkuva
>>> motor.set_speed( 100, -1 )
>>> aika.uni( 1 )
>>> motor.set_speed( 0, 0 )