<<

#319 ; Ni trovu bonan konsolon en PWM

>>

Aŭtune oni ne plu vidas birdojn tre ofte en Finnlanda naturo, ĉar plej multaj el ili jam flugis al pli varmaj landoj. Tial estas la apude fotitaj iom timemaj novembraj akvaj birdoj tre refreŝiga vidaĵo. Kredeble estas multe da nutraĵo por birdoj en la lageto, ekzemple fiŝoj kiojn mi iam somere sukcesis por foti.

Nudaj estas jam la branĉoj de foliaj arboj en Nordo kaj oni atendas venontan vintron, malvarmon, malsekecon, glitecon. Aliaj aferoj nin tamen nun interesas. Ni volas esplori la bonajn eblecojn de GPIO-pintoj de Raspberry Pi (mallongigo RPi) mikrokomputila karto.

La hodiaŭa temo estas PWM aŭ "Pulse Width Modulation" kion mi jam antaŭe provis kun Arduino Uno ekzemple por malnovaj artikoloj #106 kaj #107.

La ideo de PWM estas por produkti elektran tension kies direkto restas la sama, sed la tensio aperas en pulsoj kies frekvencon kaj larĝecon oni povas reguligi per programo. La plej alta tensio de pulsoj restas la sama, sed la meza tensio estas iom pli malalta ĉar parton de tempo la tensio estas paseme nur nulo, 0 voltoj.

Se la kargo ne estas tre rapida kaj sentema por rapida variado de tensio, ĝi povas kvazaŭ imagi ke la meza tensio estas la vera. Ekzemple homoj tute ne rimarkas variadon de LED-lumo se la frekvenco de elektraj pulsoj estas ekzemple 100 Hz, kvankam la lampo fakte estas estingita 100 fojoj ĉiu sekundo. Rotacianta DC -motoro ne havas tempon por halti dum tioj kelkaj milisekundoj (1 ms = 1/1000 sekundo) kiam la tensio de ekzemple 500 Hz PWM-pulsoj estas nulo. Unu Herco signifas unu pulson per sekundo, 1 Hz = 1/s = s-1.

La plej alta tensio en pulsoj de PWM kredeble estas en RPi proksimume nur 3,3 voltoj (en Arduino iom pli alta 5 V). Se la tensio restas alta dum 50% da tempo kaj nur nulo la reston 50% da tempo, estas la meza tensio evidente proksimume duonon de 3,3 voltoj, aŭ 1,65 voltoj.

Mi ne scias kiel uzi SSH rekte en komanda fenestro de PC/Windows kaj tial mi uzas apude fotitan RPi4 por gvidi la "Lite" -muntitan RPi3 kion ni jam renkontis en antaŭaj artikoloj. Mi do skribos la programon en la loka RPi4 en SSH-konekto kun la distanca RPi3 kaj la programo estos efektivigita en la distanca komputilo.

Mi uzos la saman GPIO-pinton #11 en RPi3 kiel antaŭe. Nun ni tamen ne plu kontentiĝas en nura statika tensio, sed ni volas iom rapidaj pulsoj. Tial simpla tensia mezurilo ne plu taŭgas, sed ni uzu malgrandan osciloskopon por observi la DC-pulsojn. Temas ja pri "kontinua kurento" ĉar la direkto de tensio restos la sama, sed la nivelo de tensio ne restas tuttempe la sama. Pli akurate mi eble devus skribi pri pulsoj de kontinua kurento, DC-pulsoj.

Maldekstre vi vidas foton de nia distanca "Lite" -muntita RPi3 kaj la simpla osciloskopo kio mezuras tension inter GPIO-pintoj #09 (GND aŭ elektra tero) kaj #11 kie ni atendas ioman pozitivan tension.

La ruĝa parto je RJ45-konektilo kaŭzas ke la norma rekta Ethernet -kablo kiel tutaĵo estas kruce konektita. Tiel ni ja povas agi en konekto inter du komputiloj. Se nia loka komputila reto estus pli granda ol 2 komputiloj, ni devus uzi rektaj Ethernet -kabloj kaj apartan aparateton "Ethernet switch"

Do ni komecu. Nature ni devas iom atendi kaj doni por la distanca komputilo tempon por sin funkciigi al norma stato tiel ke ĝi povas komunikadi tra "Ethernet" -kablo. Ekzistas malgrandaj lumoj ĉe "Ethernet" -konektiloj tiel ke eblas vidi se estas jam trafiko en la kablo.

En komanda fenestro de RPi4 ni povas per ping -komando testi ĉu estas jam konekto preta kun la distanca RPi3. Fakte ĝi ja ne estas tre distanca, nur je la distanco de kelkaj metroj, sed principe povus esti ekzemple multaj dekoj da metroj distanca.

Kiam la distanca komputilo estas preta, mi startas SSH-konekton en komanda fenestro de RPi4 per komando ssh pi@169.254.26.126 kaj post inter alie iomaj avertaj tekstoj mi donas la sekretan vorton de distanca RPi3 por la norma uzanto "pi" kiu jam havas la rajtojn de "superuzanto" en la sistemo de distanca RPi3.

Sekve mi volas skribi kelkaj linioj da Python -programo kiojn la RPi3 tuj efektivigu kaj tial mi komandas la distancan komputilon sudo python por starti la Python -programon en distanca RPi3 laŭ simpla interagada stilo.

La unuaj linioj de programo estas por ni jam bone konataj, la samaj kiel antaŭe por selekti pinton #11 por eliro de elektra tensio. Tioj linioj ankoraŭ ne kaŭzas ian aliigon por la osciloskopo de distanca komputileto.

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)

Nun ni tamen volas provi, ne nur statikan tension, sed PWM-pulsoj kaj tial estas la daŭrigo nun alia. Ni uzos objekton pwm kies nomon mi povis libere mem selekti:

pwm = GPIO.PWM(11, 500)     # pinto #11, frekvenco 500 Hz
pwm.start(50)               # alta tensio por 50% da tempo
pwm.ChangeDutyCycle(20)     # nun alia valuo, nur 20%
pwm.ChangeFrequency(1000)   # nun alia frekvenco, 1000 Hz

Mi skribis unu linion pofoje kaj sekve fotis la ekranon de osciloskopo. La Python -programo rapide interpretis la skribitan linion kaj tuj ĝin efektivigis. Sekve mi skribis alian linion da teksto, paŭzis por foti, kaj tiel plu. Mi do mem kontrolis mane la progreson de programo. Se mi volus ke la programo donu por mi sufiĉan tempon por foti inter la gravaj linioj de programo, estus la programo multe pli kompleksa. Ni tamen volas nun koncentiĝi en la principoj de PWM.

Fine mi skribos por nuligi la situacion:

pwm.stop()
GPIO.cleanup()

Jam la GPIO do ne plu funkcias, sed dum agado estis 3 aliaj situacioj de pulsoj, kiel la sekvantaj fotoj de osciloskopa ekrano atestas:

La osciloskopo tutan tempon montras horizontale 1 milisekundon da tempo per kvadrato kaj vertikale 1 volton da elektra tensio per kvadrato. La tuta sur ekraneto videbla tempo do estas 12 milisekundoj, aŭ nur 0,012 sekundoj, kaj la alta tensio de pulsoj evidente estas iom pli ol 3 voltoj. Osciloskopo estas bona aparato por perobjektigi la naturon de ripetaj elektraj pulsoj.

Frekvenco de pulsoj f kaj tempo por unu ciklo t havas la inversan rilaton t = 1/f kaj do nature ankaŭ estas f = 1/t. Unue la frekvenco de DC-pulsoj estis f = 500 Hz = 500/s kaj tial unu tuta ciklo daŭris proksimume tempon t = 1/(500/s) = 2*10-3s = 2 ms. La meza tensio dum la 50% pulsoj kredeble estis proksimume 1,6 V kaj dum la 20% pulsoj nur proksimume 3,3V/5 = 0,66 V kvankam la alta tensio restis la sama tutan tempon.

Kiam la frekvenco estis f = 1000 Hz = 1000/s, daŭris unu ciklo proksimume tempon t = 1/(1000/s) = 1*10-3s = 1 ms aŭ unu milisekundon. Tio tamen ne aliigas la mezan tension ĉar la porcio de alta tensio restis la sama. La valuoj klare ne estas tre akurataj ... aŭ la RPi3 ne estas tre preciza por produkti pulsoj aŭ la simpla osciloskopeto ne estas tre preciza por ilin mezuri ... tamen principe utilaj bildoj.

Norme la malforta komputileto ne kapablas sole peli grandan kargon per PWM, sed ĝi bezonas fortigilon por produkti pli grandan elektran kurenton. La komputilo produktas la pulsojn kaj io fortigilo ilin fortigu tiel ke eblas sekure peli la kargon. La osciloskopo kiel la sola elektra kargo tamen estas sensignife malgranda kaj bezonas nenian apartan fortigilon.

Sekve mi volas testi kiel uzi servo -motoron per GPIO-pintoj de RPi. Certe estas iom alia afero ol ĝenerala PWM, sed por RPi oni uzas programon de simila tipo, kvankam la frekvenco estas ĉiam f = 50 Hercoj kaj la daŭro de alta tensio estu inter la limoj 1 ... 2 ms. Tia motoro do bezonas pulsoj 1 ... 2 milisekundoj longaj en frekvenco f = 50 Hz.

Por PWM ĝenerale estas grava la meza tensio kion la pulsoj produktas. La frekvencon oni povas selekti relative libere. Por servo tamen gravas la tempa daŭro de f = 50 Hercaj pulso de alta tensio inter la limoj 1 ms kaj 2 ms.

La sekvanta komanda fenestro rakontas pri eksperimenta programo por servo:

Do unue mi uzis 5% pulsoj. Unu ciklo de frekvenco f = 50 Hz = 50/s estas t = 1/(50/s) = 20*10-3s = 20 milisekundoj kaj 5% da tio estas 1 ms, la plej kurta pulso por servo. La plej longa pulso por servo estas 10% da 20 ms, do 2 ms.

La en programo meze provita pwm.ChangeDutyCycle(7.5) aŭ porcio 7,5% (ne fotita sube) signifas la valuon meze de 1ms kaj 2 ms, do proksimume 1,5 milisekundoj. Depende de tipo de servo tio kredeble signifas aŭ angulon inter la ekstremaj valuoj aŭ rapidecon de rotacio kio estas teorie (sed eble ne praktike) nulo. Por rotacianta tipo de servo -motoro signifas la plej mallonga pulso 1 ms kiel eble plej rapidan rotacion al unu direkto kaj la plej longa pulso 2 ms kiel eble plej rapidan rotacion al la kontraŭa direkto. La lokon de akurata nulo oni tamen devas reguligi aparte. Povas eĉ okazi ke la preciza loko de nulo iom varias ekzemple laŭ temperaturo.

La lasta pli granda frekvenco f = 2000 Hz tamen havas nenion por fari kun servo -motoroj, estis nur testo. Fine mi volis por vidi per komando free kiom da RAM-memoro la distanca RPi3 uzas. La loka RPi4 havas kvaroble pli da RAM. Ni ja ankoraŭ estis en SSH-konekto kun la distanca RPi3.

Sed jen la osciloskopaj fotoj por norma frekvenco de servo, f = 50 Hz:

La skalo por osciloskopo estas la sama kiel antaŭe kaj klare unu ciklo t = 20 ms de frekvenco f = 50 Hz estas tro longa por la ekrano kio montras nur 12 ms. Tamen la plej grava parto de pulso por servo ja estas videbla.

Norma malgranda RC-servo kredeble eblas sekure peli rekte per kurento el RPi, sen aparta fortigilo. La malgranda servo nome jam havas ian propran fortigilon ene.

Mi jam antaŭe skribis iom pri malgrandaj servo -motoroj kun Arduino -mikroregilo en malnovaj artikoloj #139 kaj #144. Dum ĉi tio eksperimento kun osciloskopo ni ja tute ne uzis ion realan servo, nur esploris la pulsojn.

Tia estis nia hodiaŭa aventuro en la vasta mondo de GPIO-pintoj, aŭ almenaŭ kun la pinto #11. Dura estas la mondo, sed GPIO nin multe konsolas.

Mia avino "Tyyne" havis kiel bildo sur la muro de ĉambro bildon de Jesuo. Mi tamen povus uzi la apudan bildon pri GPIO kiel mia tabulo sur la muro de ĉambro.

La titolo de apuda bildo ja estas por "Pi2", kio signifas la malnovan varion 2 de RPi (kion mi tute ne iam uzis), sed la GPIO -pintoj kredeble estas la samaj ĉar oni nature volas ke novaj aldonaj kartoj estu kunigeblaj ankaŭ kun malnovaj RPi -komputiloj.

Eble mi ion belan tagon trovos ion pli por skribi pri ĉi tio interesa temo? Mi ja ankoraŭ skribis nenion ekzemple pri tio kiel eblus por komputilo por legi la staton de io konektilo tra GPIO-pintoj.

Kaj certe mi volas iam provi ion stepper -motoron kun RPi kaj forta fortigilo. La elektraj pulsoj ja bezonas esti fortaj por stepper. En teknika universitato de Tampere oni kredis ke servo estus ia tipo de stepper -motoro, sed tio ja ne pravas. Ili estas du tute aliaj animaloj.

Batalo de vivo kontinuos per granda frekvenco, tion la apuda foto atestas!

Nu, 2000 Hz = 2 kHz fakte ne estas tre alta frekvenco, tion eĉ maljunulo povas facile aŭdi.

Ni ja devas ĉiuokaze multe batali.

Kaj certe fine .......... NI VENKOS!

La Ambasadoro en Finnlando
de sendependa nacio
Mueleja Insulo


Menuo
Ĉefa paĝo (finna lingvo)