<< | #325 ; Direkte al pli bona programo por unipolar |
>> |
Nun mi provas skribi pli bonan Python programon por testi simplan unipolar-stepper -motoron 28BYJ48
. La komenco de laboro ja estis programo kion mi trovis en la Interreto dum la antaŭa artikolo. Mi aldonas du kupliloj per kioj eblas selekti la direkton de rotacio (+ aŭ -) kaj por fini la programon bele, sen aliigo de programo.
Kelkaj mankoj ankoraŭ restis en la malnova programo. Oni povis fini la programon nur malbele per "Ctrl-C" kaj tiam restis elektra kurento en la bobenoj de motoro post la programo. La programo raportis eraroj, ĉar GPIO estis komence en nenorma stato. Ili ne estas danĝeraj, sed estas pli afable por fini la programon bele per kuplilo.
Mi aldonis la novan belan kuplilon de 3 aliaj pozoj inter la elektra tero (GND) kaj GPIO-pintoj #12 (GPIO 18) kaj #13 (GPIO 27). En la centra pozo la kuplilo faras nenion, sed en la aliaj du pozoj ĝi kuplas unu el la GPIO-pintoj al tero. Temas pri direkto de rotacio kaj tial ambaŭ kontraŭaj alternativoj ne povas okazi samtempe. La motoro ja ne povas turni samtempe kaj horloĝdirekte kaj maldekstrume. Mi volas ke la motoro ne movu kiam la kuplilo de 3 pozoj estas en la centra pozo kaj nenio el siaj eniroj estas nulo.
Mi ankaŭ aldonis pli simplan kuplilon inter la tero kaj GPIO-pinto #22 (GPIO 25). Per tio mi povas estingi la programon bele sen "Ctrl-C". Kaj mi jam kredas ke ĉiuj libere selekteblaj GPIO-pintoj en la komenco de pintoj - tioj kioj ne havas alian taskon - jam estas en uzo. Nu, fakte la GPIO-pintoj de "Lite" -muntita RPi3 ankoraŭ tute ne havas aliaj taskoj ol la motoro kaj la kupliloj. Se vere estus ankaŭ aliaj taskoj por GPIO, mi eble ne volus fine en programo komandi GPIO.cleanup()
?
Ni uzas tioj novaj GPIO-pintoj kiel eniro por la programo kaj eblas en programo determini ke norme la eniraj pintoj havas altan tension. Se ili estas konektitaj al la elektra tero, la programo legos valuon nulo (0) el tioj eniroj. Alie la programo legos el ili valuon 1. Do oni ne bezonas apartan eksteran reostaton por tiri la enirojn al alta tensio se la kuplilo ilin ne alterigas. Nenia danĝero pri antena efekto.
Klare ke la apuda eksperimento aperas iom malbela. Nenia preta komerca produktaĵo. La tre granda interna beleco de ideo ankoraŭ ne estas evidenta.
Ĉi tio programo ankoraŭ estas por la malgranda iom stranga 28BYJ48
. La sekvantaj varioj de programo mi tamen skribos por normaj unipolar kaj "bipolar half-coil" -tipaj motoroj.
Ia gramatiko por la uzo de programo estu: sudo python unipolar.py [WaitTime [StepDir0]]
kie WaitTime
estas tempo kion unu paŝo daŭras en milisekundoj, entjero almenaŭ 2, supozita valuo 10 se la uzanto ne donas valuon. La dua valuo StepDir0
estas 1 aŭ 2, supozita valuo 1. Se estas StepDir0 = 2
, plenumas la motoro nur 4 paŝoj por unu ciklo kaj alie la tutaj 8 paŝoj por ciklo.
La valuoj en krampoj ne estas nepraj, sed se oni volas doni la duan valuon StepDir0
, oni ankaŭ unue donu la unuan valuon ... en alia kazo la dua valuo ja ne estus la dua ...
Oni povas starti la programon en SSH-konekto ekzemple per komando sudo python unipolar.py 2 1
tiel ke estos tempo por paŝoj de motoro 2 milisekundoj, do 500 paŝoj por unu sekundo. Tiam daŭris unu tuta turno de akso proksimume 8 sekundoj.
Se oni komencas la programon sudo python unipolar.py 3 2
, estos nur 4 paŝoj por ciklo kaj tempo por daŭro de unuopaj paŝoj 3 milisekundoj. Tiam daŭris unu tuta turno de akso proksimume 6 sekundoj. Per la bateria tensio 3 voltoj tioj estis la plej rapidaj rotacioj kiojn mi akiris. La akso tute ne turnas se la pulsoj venas tro rapide.
Nu, klare ke malrapidaj estas la turnoj de akso por la motoro 28BYJ48
, sed estas 4096 paŝoj por unu tuta turno de akso kun 8 paŝoj en ciklo kaj kredeble 2048 paŝoj por unu turno kun 4 paŝoj por ciklo. Eble por la pli norma tensio 5 voltoj estus pli granda rotacia rapido ebla? Normaj stepper -motoroj kun ekzemple 200 paŝoj por unu tuta rotacio de akso kredeble estas signife pli rapidaj.
Por la programo de Arduino -mikroregilo estis la plej kurta daŭro de paŝo 1150 mikrosekundoj ( μs ) kio estas 1,15 milisekundoj ( ms ), sed por ĉi tio programo la daŭro de paŝo estu entjero kaj nur 1 milisekundo estas tro malmulte por la motoro.
Mi kredas ke mi povus uzi esence la saman programon por normaj motoroj, se mi nur aliigas la tabulon Seq
tiel ke por alternativo StepDir0 = 2
estas la normaj nombroj en tabulo - laŭ stilo " A+, B+, A-, B-" - kaj la aliaj vicoj estas nur nuloj. Eble estus bona ideo ankaŭ provi nuloj inter la veraj laboraj vicoj. Nome principe povus kaŭzi problemojn se la ordo de aliigo de statoj ne estas bona. La statoj en dratoj ja ne aliiĝos tute tuje, sed postulas iom da tempo. Kelkaj el la malnovaj statoj - eble valuo "1" - ankoraŭ ĉeestas kiam oni donas novajn.
Miaopinie la programo ne bezonas la vicon "shebang" de origina programo #!/usr/bin/python
ĉar tute ne eblas starti sen sudo
ĉar uzas GPIO.
Do jen iom da programo:
# unipolar.py # ----------- # Eniro por kupliloj: # kuplilo kun 3 pozoj # - fizika #12 = GPIO 18 # - fizika #13 = GPIO 27 # - (tero, GND) # simpla kuplilo # - fizika #22 = GPIO 25 # - (tero, GND) # # Eliro por motoro: # - input 1 ; fizika #11, GPIO 17 # - input 2 ; fizika #15, GPIO 22 # - input 3 ; fizika #16, GPIO 23 # - input 4 ; fizika #18, GPIO 24 # - (tero kaj uza tensio) import sys from time import sleep import RPi.GPIO as GPIO
print "Testo por unipolar-motoro, kun konektiloj" print sys.argv # nur entjeroj 2 ... por la tempo en tutaj milisekundoj! WaitTime = 10 / float(1000) if len(sys.argv) > 1: if int(sys.argv[1]) > 0: WaitTime = int(sys.argv[1]) / float(1000) StepDir0 = 1 if len(sys.argv) > 2 and int(sys.argv[2]) == 2: StepDir0 = 2 GPIO.setmode(GPIO.BCM) button1 = 18 button2 = 27 button0 = 25 GPIO.setup(button1, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(button2, GPIO.IN, pull_up_down = GPIO.PUD_UP) GPIO.setup(button0, GPIO.IN, pull_up_down = GPIO.PUD_UP) StepPins = [17, 22, 23, 24] for pin in StepPins: GPIO.setup(pin, GPIO.OUT) GPIO.output(pin, False) Seq = [[1, 0, 0, 1], [1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1]] StepCount = len(Seq) StepCounter = 0 StepDir = 0 pelas = GPIO.input(button0)
while (pelas == 1): direkto = 0 if GPIO.input(button1) == 0: direkto = -1 StepDir = -StepDir0 if GPIO.input(button2) == 0: direkto = 1 StepDir = StepDir0 if (direkto == 0) and (StepDir != 0): print " - ne plu pelas, do estingu bobenojn " for pin in StepPins: GPIO.output(pin, False) StepDir = 0 if direkto != 0: print StepCounter, Seq[StepCounter], for pin in range(0, 4): xpin = StepPins[pin] if Seq[StepCounter][pin] != 0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) # Fino por "for" StepCounter += StepDir if (StepCounter >= StepCount): StepCounter = 0 print if (StepCounter < 0): StepCounter = StepCount + StepDir print # Finis la "if direkto != 0:" sleep(WaitTime) pelas = GPIO.input(button0) # Jam finis la "while (pelas == 1):" print print "Fino de programo" # Fine nuligu la situacion de GPIO-pintoj for pin in StepPins: GPIO.output(pin, False) GPIO.cleanup()
Nokte mi trovis "problemon" - aŭ nur ioman mankon - en la programo. Nome la programo permesas elektran kurenton flui en bobenoj kiam la 3-poza kuplilo estas en meza pozo. Miaopinie estus pli bone aparte estingi la kurenton en bobenoj kiam la motoro ne rotacias, kvankam la programo ankoraŭ estas aktiva. Tion mankon mi tamen jam poste korektigis. Nun la programo estingas bobenojn kioj ne plu bezonas kurenton por turni la motoron.
Fine mi desegnu novan elektran skemon por pli bone klarigi kiel la kupliloj estas konektitaj al la GPIO-pintoj.
Kvankam mi ne scias ĉu estus tre bona skemo precipe por la motoro 28BYJ48
. Mi pensis pri normaj motoroj kaj miaopinie normaj unipolar -motoroj estas iom aliaj.
Eble estus utila ankaŭ tia iom alia programo ke eblus peli la motoron akurate ekzemple la bibliaj 666 paŝoj horloĝdirekte aŭ maldekstrume?
Sekve mi sebdube devas batali por provi peli iom pli grandaj motoroj. Estos granda batalo, sed forte batali ja estas la esenco en homa vivo.
Kaj certe fine ..........
NI VENKOS!
La Ambasadoro en Finnlando de sendependa nacio Mueleja Insulo |