<< | #110 ; La sanga batalo kun paŝa motoro kontinuu |
>> |
Elektraj motoroj estas la destino, sorto kaj fatalo de nia malgranda, sed fervore tenaca nacio. Ĉiu sendisciplina elektrono, malvirta magneto kaj fadenmontra kupra drato sciu tion bone. Ni estas la nacio Mueleja Insulo kaj ni montros la propran lokon de ŝranko por ĉiu nedifinita cirkvito kaj por ĉiu senskrupula elektro-magneta kampo. Ne saltu al niaj okuloj, vi frustraciaj komponantoj!
Ni kontinuos nian esploran vojaĝon en la mirinda lando de paŝaj motoroj. Jen la plej akutaj problemoj:
( Tiuj estis aktualaj demandoj en januaro. Poste la akcento estis iom alia. )
Ni volas solvi la problemon de rotaciaj direktoj.
Ni esploru pli detale la ULN2003 karton kaj la konektilon por la motoro. La fortigila karto ULN2003 ja fakte uzas nur 4 el la entute 7 fortigiloj en la cirkvito. Kvar fortigiloj tamen estas sufiĉe por ĉi tiu intenco.
Ni jam antaŭe konstatis ke kun normaj bibliotekaj funkcioj de Arduino (Stepper.h) eblas turnigi la motoron 28BYJ48 nur al unu direkto.
Ekzistas ja jam preta solvo en la komputila reto. Oni ne uzu Stepper.h, sed uzu anstataŭ la pordegojn de Arduino Uno rekte.
La antaŭa ekzemplo uzis stiftojn numero 8 ... 11 de Arduino Uno por peli la motoron. Ni povas uzi tiuj samaj stiftoj sed nomi ilin kune PORTB.
Fakte PORTB signifas ankaŭ stiftojn 12 kaj 13, sed ilin ni ne nun bezonas. Ni bezonas gvidi nur 4 linioj por unu motoro.
Eblas skribi valuon al ĉiuj stiftoj de PORTB per unu komando. Ni supozu ke sufiĉas peli nur unu motoron per 4 linioj. Se estus du motoroj, ĉi tiu metodo estus problemhava. Estas tamen pli bona ideo skribi valuojn por la fortigilo en nur unu komando. Alie la linioj de motoro povus ricevi la interligitajn tensiojn en iom aliaj momentoj kaj tio eble povus iam kaŭzi problemon.
Nu PORTB do estas stiftoj 8 ... 13 kaj ni uzas nur la plej malaltajn 4 numerojn. Ni bezonas 8 paŝoj por unu ciklo.
|
En la apuda tabelo ni vidas la signifon de apartaj linioj kiel nombroj.
MSB (Most Signifigant Bit) estas la plej signifa kaj LSB (Least Signifigant Bit) estas la plej malpli signifa linio.
En la fotoj ni vidas kiel la fortigila karto aperas en ambaŭ flankoj. Ni bezonas esplori ĝin pli detale.
Kiel ni vidas, estas ordo de linioj In1 ... In4 la sama kiel la ordo de linioj en la eliro de karto.
Por 28BYJ48 kaj la ULN2003 -karto validas ke la ruĝa drato estas la komuna drato por pozitiva uza tensio kaj ĝi estas #5 en la konektilo de fortiganto.
Vi notu en la sekvanta tabulo ke por ĉiu linio de motoro estas en la ciklo de 8 paŝoj 3 sinsekvaj unuoj (1) kaj 5 sinsekvaj nuloj (0) por sinsekvaj paŝoj. Vi ankaŭ notu ke por sinsekvaj paŝoj de ciklo estas alterne 1 aŭ 2 unuoj (1) en la linioj de motoro.
Aliaj 4 dratoj havas la sekvantajn kvalitojn:
PORTB Uno# | In# | paŝo #1 | paŝo #2 | paŝo #3 | paŝo #4 | paŝo #5 | paŝo #6 | paŝo #7 | paŝo #8 | Koloro de drato por la motoro | M# | |
(La komuna pozitiva tensio) | Ruĝa | M5 | ||||||||||
11 | In1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | Oranĝa | M4 | |
10 | In2 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | Flava | M3 | |
9 | In3 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | Hele ruĝa | M2 | |
8 | In4 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | Blua | M1 | |
Valuo por paŝo | 8 | 12 | 4 | 6 | 2 | 3 | 1 | 9 | ||||
Hex | 8 | C | 4 | 6 | 2 | 3 | 1 | 9 |
Kiam ni skribas la valuojn 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09 sinsekve al PORTB, turnas la motoro al unu direkto kaj kiam ni skribas la samajn valuojn en kontaŭa ordo, turnas la motoro al alia direkto.
Ni notu ke en ĉiuj paŝoj la ULN2003-karto havas la valuon unu aŭ 1 almenaŭ en unu el la kvar linioj. Nenia paŝo de norma ciklo havas nur nuloj aŭ 0 en ĉiuj linioj samtempe. Oni tamen devas skribi nulon por la ULN2003 (por ĉiuj linioj) por estingi elektron de motoro tute.
... La artikolo estos poste daŭrigota ...
Kaj jes, mi fine returnis por plibonigi la artikolon! La sekretoj de paŝa motoro nun jam bone malkovriĝis.
En ĉi tiuj fotoj vi vidas la malgrandan paŝan motoron 28BYJ48 kun fortigila karto ULN2003 en simpla testo kun mikroregilo Arduino Uno kaj la talenta karta komputilo Raspberry Pi (RPi). Arduino IDE, la komputila programo kiun ni bezonas por skribi kaj efektivigi la C++ programojn por Arduino mikroregilo, do estas en RPi. En ĉi tiu testo Arduino Uno ricevas ankaŭ sian elektron el RPi tra la USB-konektilo.
La mikroregilo estas ja tro malforta por peli la elektran motoron sole. Jam 0,02 da amperoj estus granda kurento en la eliroj de mikroregilo kaj motoroj bezonas almenaŭ dekoble pli multe da elektra kurento. Ni uzas la karton ULN2003 por fortigi la signalojn de mikroregilo.
Estas ja vero ke tiu malgranda elektra motoro eblas turnigi nur al unu direkto kun la pretaj bibliotekaj funkcioj de Arduino. Tial ni ne uzu bibliotekaj funkcioj de Stepper.h, sed ni uzu nian propran programon kaj pelu la motoron rekte, sen la biblioteka funkcio.
Eble oni povus peli la motoron per nur 2 dratoj, sed mi kredas ke tiam ne eblus tute estingi la elektron de motoro el programo. La uzata fortigilo tamen havas 4 linioj kaj mi ne vidas la plian utilon kion 2 dratoj donus.
La malgranda motoro estas surprize forta. Apenaŭ eblas turni la akson mane. Mi ne estas certa kiom da paŝoj tiu malgranda - sed forta - motoro bezonas por unu tuta turno de ekstera akso.
Ie mi vidis la nombron 4096 kiu estas 64 * 64 kaj la ideo estas ke la interna akso de motoro bezonas 64 elektraj paŝoj por unu turno kaj la ekstera akso bezonas 64 turnoj de interna akso por unu turno. Do la vehikla rilato inter la ekstera kaj interna akso estus 1:64, sed mi ne scias tion certe.
En la testo la pintoj 8 ... 11 de Arduino Uno pelas la motoron. Oni povas ankaŭ nomi tiuj 4 pintoj PORTB kaj tiun eblecon mi uzas en la programo. Mi testis la aparaton kun la sekvanta simpla programo, kiu estas ia vario de konata programo en la komputila reto.
byte CCW[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; byte CW[8] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; int basicDelay = 1150; // mikrosekundoj int addDelay = 10; // 0 ... ekzemple 100 milisekundoj int suunta = 1; // direkto de rotacio, valuo 1 aŭ 2 int laskuri = 0; // kiom da cikloj de 8 paŝoj void Motor_CCW() // CounterClockWise, ciklo de 8 paŝoj { for ( int j = 0; j < 8; j++) { PORTB = CCW[j]; delayMicroseconds(basicDelay); delay(addDelay); } } void Motor_CW() // ClockWise, ciklo de 8 paŝoj { for ( int j = 0; j < 8; j++) { PORTB = CW[j]; delayMicroseconds(basicDelay); delay(addDelay); } } void stoppi() { PORTB = 0xf0; } void setup() { Serial.begin(9600); // nur por nombri la turnoj de motoro DDRB = 0xff; stoppi(); } void loop() { laskuri++; if (suunta == 1) { Serial.print(" CCW "); Serial.print(laskuri); Serial.print(" \n"); Motor_CCW(); } else if (suunta == 2) { Serial.print(" CW "); Serial.print(laskuri); Serial.print(" \n"); Motor_CW(); } else stoppi(); }
La programo turnas motoron horloĝdirekte (CW) aŭ maldekstrume (CCW) depende de valuo de suunta
. Oni devas skribi la valuon PORTB = 0xf0;
por ekstingi elektron de motoro. La lasta paŝo de norma ciklo ne ekstingas la elektron. La valuo HEX F0
ja estas 16, sed la 4 malpli signifaj linioj estas nuloj ĉar 16 = 24 akurate kaj ni ja uzas ĉi tie nur la 4 malpli signifaj linioj kies valuoj estas en intervalo 20 ... 23 aŭ 1, 2, 4 kaj 8.
La malgranda tukpinĉilo montras la pozon de ekstera akso de motoro. Laŭ mia takso la motoro bezonis proksimume 500 tiaj cikloj de 8 elektraj paŝoj por unu tuta turno de ekstera akso. Estas 500 * 8 = 4000 kaj do la valuo 4096 elektraj paŝoj por unu tuta turno ŝajnas kredebla.
Mi kredas ke ĉi tiu malgranda motoro estus tute sufiĉa por turni ekzemple la horangulan akson de amatora astronomia teleskopo. Oni apenaŭ bezonus pli grandan motoron. La teleskopo ja estas normale en mekanika ekvilibro kaj tre granda forto ne estas bezonata. La akso de hora angulo bezonas turni nur 15°/horo por kompensi la rotacion de planedo. La motoro kaŭzas ioman tremon kiam ĝi laboras en malgrandaj paŝoj, sed tio apenaŭ estus granda problemo.
La motoro ne estas tre rapida, sed eblas turni akurate. La rotacio estas praktike sendependa de kargo kaj uzata elektra tensio, inter prudentaj limoj, tute alie ol por ordinara DC-motoro. Se unu ciklo daŭras ekzemple proksimume 9,2 milisekundoj (8 * 1150 mikrosekundoj), do la tuta turno de ekstera akso estus proksimume 512 * 0,0092 sekundoj aŭ proksimume 5 sekundoj sen superfluaj prokrastoj.
La valuo de addDelay
estus nulo en vera uzo. Mi uzis la valuon 10 milisekundoj por povi pli facile sekvi la nombron de cikloj por unu turno de akso. Kun pli granda valuo 100 eblas eĉ sekvi la malgrandaj LEDoj de fortiga karto ULN2003 kaj konstati ke ili funkcias laŭ planoj. Alie ili lumigas tro rapide por observi aparte. Tamen la alia valuo en la programo int basicDelay = 1150;
estas tute nepra por la motoro, ĝi estas la nombro de mikrosekundoj kiun oni nepre devas atendi post ĉiu paŝo. La motoro ne povas fidinde rotacii pli rapide.
La frekvenco de kristalo de Arduino Uno estas 16 MHz aŭ 16 milionoj da Hercoj. Ĝi do kredeble havas sufiĉan tempon por fari ion dum unu mikrosekundo, aŭ milionono de sekundo.
Ni ja ne povas scii kio estas la fazo de motoro en komenco. Povas ja esti ke la unuaj paŝoj de ciklo kaŭzas nenian efekton. Tamen mi kredas ke la fazo de motoro estas konata tiam kiam oni plenumis unu tutan ciklon de 8 paŝoj.
Dekstre vi vidas la aranĝon de testo. Ĉio elektra kurento de fortigilo kaj motoro pasas tra reostato R kiu estas 1 Ω. La elektra kurento tra la reostato kaŭzas tension kion ni povas mezuri. Tio aranĝo kauzas ioman perdon de elektra efekto, sed ĝi ebligas por ni mezuri la formon de elektra kurento tra la aparato per osciloskopo.
Jen sekve kelkaj osciloskopaj bildoj. La motoro rotacias kiel eble plej rapide, sen superfluaj prokrastoj ; addDelay = 0.
La unua foto prezentas tension en unu el la eniroj de fortigilo. La bluaj kvadratoj estas 2 milisekundoj larĝaj kaj 1 volton altaj.
Do la pulsoj estas preskaŭ 5V en plej alta tensio, daŭras proksimume 6 ms kaj ripetas en intervalo de 12 ms. Oni povus diri ke la frekvenco de tiuj pulsoj estas 80 Hz. Estas ja la sama tensio en la enira linio de fortigilo dum 3 kaj 5 sinsekvaj paŝoj de motoro.
La bobenilo ja ricevas kurenton nur tiam kiam la tensio en la eniro de fortigila linio estas alta. La eliro de fortigilo estas tiam malalta kaj kurento fluas tra la responda bobenilo. La fortigilo (transistoro tipo "open collector") ja renversas fazon de elektro.
Hmmmm ... la rilato de daŭro de pulsoj devus esti 3:5 ĉar dum 3 sinsekvaj paŝoj la tensio en linio estu alta kaj dum 5 sinsekvaj paŝoj la tensio estu praktike nulo. Eble mi mezuris en erara direkto?
Estas nur unu kanalo en mia simpla osciloskopo kaj estus pli malfacile mezuri la tension kaj kurenton en la eliro de fortigilo.
La alia foto prezentas tensio trans la reostato de 1 omo tra kiu la tuta kurento de motoro pasas. La bluaj kvadratoj estas nun 1 milisekundon larĝaj kaj nur 0,1 voltoj altaj.
La tensio trans la 1Ω reostato ŝajnas surprize varia. La plej alta tensio estas 0,22 V kaj oni povas kalkuli ke la plej granda kurento tra la reostato do estas I = U/R = 0,22V / 1Ω = 0,22 A
. La tensio de elektra fonto de motoro estis proksimume 4,9 voltoj kaj la reostato kaŭzas ioman plian perdon de tensio, do la motoro ne ricevas tre multe da tensio.
La plej malgranda tensio tra la reostato estis proksimume 0,1 voltoj kaj la responda kurento tra la motoro proksimume 0,1 A aŭ 100 miliamperoj (sed iom varias).
Mi ne komprenas la variadon de tensio tute, sed mi kredas ke unu bobenilo de motoro konsumas 0,1 A da kurento. Alterne la fortigilo lasas tra la motoro 0,1A kaj 0,2A da elektra kurento ĉar alterne 1 aŭ 2 bobeniloj laboras samtempe.
La frekvenco de plej signifaj pulsoj ŝajnas esti proksimume f = 1/T = 1 / 2,3 ms = 434 Hz
sed la bizaran finon en la dekstra foto mi ne komprenas.
Laŭ mia kompreno la sinsekvaj pulsoj devus esti nur 1,15 milisekundoj aparte ĉar tiom la programo atendas post nova pulso. La frekvenco estus proksimume 870 Hz. Nu bone, la pulsoj de plej granda kurento ŝajnas daŭri proksimume tiom. Ĉu la oka paŝo de ciklo tamen malsukcesas en la fortigilo aŭ en la motoro? Ĝi aperas nenormala en la osciloskopo.
Hmmmm ... eble mi devus poste plue klarigi la problemon de ĉiu oka sinsekva pulso de tiu fajna elektra aparato?
Kaj ĉu iu ankoraŭ dubas ke ..........
NI VENKOS!
La Ambasadoro en Pori de sendependa nacio Mueleja Insulo |