<< | #107 ; La sekreta vivo de eta DC-motoro malkovrita |
>> |
Mi iom eksperimentu kun la malgranda DC-motoro kaj PWM-signalo (signalo kies pulsojn oni povas reguligi je relativa larĝo aŭ daŭro de alta kaj nula tensia nivelo) de Arduino Uno kiujn mi iom priskribis en la antaŭa artikolo. DC-motoroj eble ne estas tre interesaj, sed la sorto de PWM-signalo en bobenoj certe estas.
Apude ni vidas bildon de PWM-signalo de Arduino Uno fotita el la monstrilo de simpla osciloskopo. La foto estas iom malbona kaj malklara, mi fotis per nur unu libera mano en limigita lumo. Alian manon mi bezonis por presi butonon de testa platformo.
La bildo tamen donas informon. Unu kvadrato en horisonta direkto respondas tempon 1 ms aŭ 0,001 sekundoj. Unu ciklo de PWM estas longa je 2 kvadratoj, do ĝi daŭras je 2 * 1 ms
, aŭ tempo de ciklo estas proksimume T = 0,002 s
. La frekvenco f
de PWM-signalo do estas proksimume f = 1 / T = 1 / 0,002s = 500 Hz
.
Unu kvadrato en vertikala direkto respondas tension 2 voltoj. La nula nivelo de tensio estas laŭ la suba rando de dua kvadrato. Ni do vidas ke la tensio de PWM-signalo varias inter tensioj 0 V (nulo) kaj proksimume 5 V. La pli alta tensio 5 voltoj estas la norma tensio por Arduino Uno.
La origina PWM-signalo estas fakte tre regula, bona kaj bela. Sed kio okazas kiam oni uzas tiujn tre bonajn kaj belajn pulsojn, fortigas ilin, kreskigas la plej altan tension ĝis 9 voltoj kaj servas ilin por malgranda DC-motoro?
La dua (iom mankhava en kvalito) osciloskopa foto prezentas la tension inter la linioj de DC-motoro kiu rotacias. Ĝi rotacias libere, sen ekstera kargo. La kvadratoj havas la saman signifon kiel antaŭe. La fazoj de signaloj tamen ne estas la samaj en ĉi tiuj fotoj.
La osciloskopo indikas kiel elektra tensio ŝanĝiĝas en la cirkvito dum tempo pasas. Estas ja sume 12 kvadratoj en la horizonta direkto kaj tial la osciloskopo prezentas sume 12 ms aŭ 0,012 sekundoj da tempo, do relative mallonga tempo.
La baza frekvenco estas la sama kiel la frekvenco de origina PWM-signalo, ĉirkaŭ 500 Hz. La formo de pulsoj tamen estas tre alia, ne tiel regula. Ekzistas ankaŭ signaloj de iom pli alta frekvenco.
La baza principo de osciloskopo estas ke la pulsoj estas kontinue la samaj kaj tial sufiĉas prezenti nur parton de pulsoj, sed tio ne pravas ĉiam. En ĉi tiu kazo la sinsekvaj pulsoj en linioj de DC-motoro estas iom aliaj.
Plej alta tensio por la motoro estas preskaŭ 9 V kiu estas la nominala tensio de baterio. Okazas tamen ankaŭ iom negativaj tensioj. Ni vidas ke la tensio estas iam sub la dua kvadrato. La tensio estas tiam sub nulo, do negativa.
Fakte la negativaj tensioj povus esti multe pli fortaj kaj eĉ danĝeraj por delikataj elektronikaj partoj, se oni ilin ne decideme limigus. La negativa tensio probable estas proksimume -0,7 V ĉar tiu estas la lima tensio de protekta diodo.
Estas interese kiel la tensio de DC-motoro kondutas. Fakte la PWM-signalo estas super nulo malpli ol 50% da tempo. Tamen la tensio en linioj de motoro estas preskaŭ tutan tempon super nulon. Por la motoro okazas forta negativa pulso kiam la pulso de PWM-signalo rompiĝas, sed sekve la tensio kreskas denove iom malregule proksimume ĝis nivelo +4 V ... +6 V antaŭ la sekvanta nova pulso alvenas. Ĉu ĝi vibras?
Ĉi tiuj fotoj ja montras nur la tension en linioj. Ili ne malkovras kiom da elektra kurento fluas kaj kia estas ĝia fazo. Kurento ne bezonas konduti same kiel tensio. Estas ja bobeno en la DC-motoro. Sed por esplori la aferon pli profunde, mi bezonus osciloskopon kiu havas multaj "kanaloj". Kun tia pli multekosta aparato eblas mezuri multaj linioj samtempe tiel ke oni vidas ankaŭ la relativajn fazojn de signaloj. Kun tia fajna aparato eblus mezuri samtempe kelkaj tensioj kaj (nerekte) ankaŭ kurentoj.
Rotacianta DC-motoro kaj PWM-signalo estas iom komplika sistemo. Estas ja magneto ene en la motoro kaj la bobeno de motoro movas relative al la magneto kiam la motoro rotacias. Do la motoro agas samtempe ankaŭ kiel generatoro kaj tion ni vidas en osciloskopo kiam la PWM-pulso estas nulo? Kia komplika mondo.
Negativa kurento el motoro povas pasi tra la protekta diodo. Mi tamen ne kredas ke kurento fluus en la motoro kiam la PWM-pulso estas nulo, malgraŭ la relative alta pozitiva tensio. Tiam la motoron uzanta transistoro nome ne lasas kurenton pasi.
Ni iom traktu la konektojn en la testo. La apuda skemo montras kiel la malgranda komputilo Arduino Uno gvidas la DC-motoron. La komputilo ricevas sian uzan efikon kaj la tension +5V el ekstero, el pli granda komputilo. La motoro havas sian propran eksteran baterion 9V. Teroj (GND) de ambaŭ tensioj estas kune.
La eksperimento uzas MOSFET-transistoron (IFR520) por fortigi la kurenton de malgranda komputilo por turni la DC-motoron. Flanke de motoro estas diodo 1N4007 por preventi la difektojn kiuj la negativa tensia pulso el bobenilo de motoro povus kaŭzi por elektronikaj partoj.
Arduino-karto havas 6 eliroj por PWM-signalo, markitaj ~. Ni uzas la stifton numero 9 por turni la DC-motoron.
La stiftojn numeroj 0 kaj 1 Arduino uzas por komunikadi kun la granda komputilo. La linio TX sendas kaj RX ricevas informon. Tial ni ne uzas tiuj stiftoj samtempe por aliaj intencoj.
La porcion de PWM-signalo ni selektas kun stifto A0 kie estas AD-transformilo. Ni selektas analogan tension 0 ... 5V el regulebla reostato kaj la komputila karto produktas korelativan digitalan valoron 0 ... 1023. Tiun valoron ni uzas por gvidi PWM-signalon en stifto 9, porcio de alta tensio en la signalo 0 ... 100%.
Ni havas maldekstre ankaŭ konektilon markita PUSH. Tiu konektilon gvidas tensian nivelon por stifto numero 2 dekstre en la karto. Kiam ni ne presas la konektilon, ricevas stifto 2 malaltan tension el GND kaj la ideo estas ke la motoro ne turnu tiam. Kiam ni presas la butonon, ricevas la stifto altan tension +5V kaj la ideo estas ke la motoro turnu tiam.
Vi eble miras kial estas reostato inter konektilo PUSH kaj la tero, GND. Ĉu tiu reostato ne estas tute vana? Ni tamen ne volas ke uzata eniro de komputilo estu en nepermesita aŭ nedifinita tensia nivelo, ĉar tiu estas stato simila al anteno de radioaparato. La reostato "tiras" la tension de stifto 2 "suben", aŭ ĝis nulo (tero) tiam kiam oni ne presas la butonon. Tiam ĝenaj tensioj de malamika ekstera mondo ne povas ĝeni la funkcion. Aperta anteno-simila stifto povus ricevi ĝenaj tensioj el ĉirkaŭaĵo kaj kaŭzi eraran funkcion. La eniroj de komputilo estas tre sentemaj por ĝenaj tensioj se ili estas sen drata kontakto. Oni klare vidas iom da tiuj ĝenaj tensioj kiam oni uzas osciloskopon sen kontakto kun la cirkvito. La elektra efekto de tiuj ĝenaj tensioj estas malgranda, sed ili tamen kapablas ĝeni delikataj instrumentoj kiuj havas grandan reziston en eniro.
Ni ja devas gvidi la funkciojn per komputila programo. La elektraj konektoj sole ne povas fari la laboron. Ni iom traktu la simplan programon de Arduino IDE.
const int switchPin = 2; const int motorPin = 9; int switchState = 0; void setup() { pinMode(motorPin, OUTPUT); pinMode(switchPin, INPUT); pinMode(A0, INPUT); Serial.begin(9600); } void loop() { switchState = digitalRead(switchPin); int a0 = analogRead(A0); if (switchState == HIGH) { // digitalWrite(motorPin, HIGH); // ... sen PWM analogWrite(motorPin, a0); Serial.print("A0: "); // nur por komunikado ... Serial.println(a0); } else { digitalWrite(motorPin, LOW); } }
Unue ni decidas ke ni uzu stifton 2 por la konektilo kaj la stifton 9 por la motoro. Ni uzas nomoj switchPin
kaj motorPin
por tiuj stiftoj de Arduino -karto.
setup()
estas parto de programo kiun la malgranda komputilo plenumas unue kaj nur unu fojon. Tie ni ordonas ke stifto 9 estu eliro kaj stifto 2 estu eniro por la komputilo. Krome ni ordonas ke ankaŭ stifto A0 estu eniro por la komputilo. Ni povas starti komunikadon kun la granda komputilo per Serial.begin(9600);
sed la motoro ja funkcias ankaŭ sen tio.
loop()
estas parto de programo kiun la malgranda komputilo plenumas kontinue ĝis ĝi estas elŝaltita. Tie ni unue legas la staton de stifto 2 kaj konservas la valuon (0/1) en switchState
. Ni legas ankaŭ la valuon de stifto A0 kaj konservas la valuon (0...1023) en varianto a0
.
Se switchState
estas en nivelo HIGH, ni scias ke oni presis la butonon kaj ni volas turni la motoron. En alia okazo ni ne volas turni la motoron kaj ni skribas LOW por stifto 9. Tiu elŝaltas la motoron.
La programa linio analogWrite(motorPin, a0);
kaŭzas ke ni skribas al stifto 9 la valuon kiun ni legis el stifto A0 (kun AD-transformo). Tiel la tensio en la regulebla reostato 0 ... +5V transformiĝas al PWM-signalo 0...100% en la stifto 9. La brava MOSFET afable fortigas la PWM-signalon tiel ke Arduino ne pereas, fumo ne leviĝas kaj la motoro tamen ricevas sufiĉan kurenton por turni.
Krome, MOSFET estas multe pli bona konektilo ol ordinara transistoro. Ĝi toleras grandan kurenton, kaŭzas nur malgrandan perdon de tensio, perdas kiel eble plej malmulte da elektra efekto. La eniro (nomita G aŭ angle "Grid", krado esperante) de MOSFET havas altan reziston kaj tial ĝi ne bezonas plian reostaton por limigi la kargon de komputilo kiu gvidas la transistoron. MOSFET, tre fajna elektronika komponanto.
Mi esperas ke dum ĉi tiu vintro kaj dum la venonta printempo mi kapablos eksperimenti ankaŭ kun multaj aliaj malgrandaj elektraj motoroj de diversaj tipoj. Por tiu intenco mi volas konstrui la eksperimentan "platformon" kiun mi menciis en la antaŭa artikolo. Pli multflanka osciloskopo kun 4 kanaloj estus tre bona mezurilo.
Kaj fine ............................
NI VENKOS!
La Ambasadoro en Pori de sendependa nacio Mueleja Insulo |