Teach ikasgaia
STM32 Mbed CodeIDE (6/8): distiraren eta RGB kolorearen kontrola PWM bidez
Erabili Mbed-en PwmOut LEDen distira eta RGB kanalak kontrolatzeko, eta jaso lan-zikloa aldatzeak benetako plakan duen eragina.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Mbed-en
PwmOuterabiltzea LEDaren distira kontrolatzeko.Lan-zikloa ikusitako distirarekin edo kolore-nahasketarekin lotzea.
Sarrera analogikoa erabiltzea PWM irteera kontrolatzeko.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Lan-zikloa
8 min
STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 6.a. Gailu askotan ez da nahikoa irteera piztea edo itzaltzea: argiaren distira edo kolore-nahasketa doitu behar da. Ikasgai honetan, PWM erabiliko duzu distira eta kolore-nahasketa kontrolatzeko, eta gero potentziometroaren arabera aldatzeko. PWM pultsu-zabaleraren modulazioa da: irteera azkar piztu eta itzaltzen da. Lan-zikloa periodo bakoitzean aktibo emandako denboraren zatia da.
Aurreikusi laborategiko 44 minutu inguru eta bi konpilazio/karga: RGB balio finkoak eta potentziometro bidezko programa osatua. Ilaran, prestatu aurreikuspena eta bi TODO adierazpenak. Beste konpilazio bat egin diagnostikatutako errore bat zuzentzeko soilik.
Mbed-ek PwmOut erabiltzen du PWM pinetarako:
PwmOut red(PA_8);
red.period_ms(2);
red.write(0.25f);
PwmOut red(PA_8) adierazpenak PWM irteera-objektua sortzen du. period_ms(2) deitzean, pultsuen periodoa 2 ms da —500 errepikapen segundoko—, eta write(0.25f) deitzean, periodoaren laurdenean dago aktibo irteera. RGB kanal hauetan hori piztuta emandako zatia da: adibide honetan 0,5 ms piztuta eta 1,5 ms itzalita. Hiru kanaletan periodo bera erabiliko duzu, bakoitzaren lan-zikloa bereizita doituz.
write() funtzioari 0,0–1,0 tarteko lan-zikloa ematen zaio. RGB kanal hauetan:
0.0f: etengabe itzalita.0.25f: periodo bakoitzaren %25ean piztuta.1.0f: etengabe piztuta.
RGB pinak PA_8 (gorria), PA_9 (berdea) eta PA_10 (urdina) dira. Lan-zikloa ez da kameran neurtutako distira: begiaren eta kameraren erantzunak ez du zertan lineala izan.
Bigarren zatian, sarrera analogikorako PC_0 erabiliko duzu: laborategiko Pot. pot1 graduatzailea. Aurreko ikasgaiko PC_1 / Pot. pot2 sarreratik desberdina da. Kontsolako state egoera da; low_red, gorriaren lan-ziklo txikia; mixed, kolore-nahasketa; high_blue, urdinaren lan-ziklo handia; r/g/b, gorri/berde/urdinaren ehunekoak; eta red_percent, gorriaren lan-zikloaren ehunekoa. Kopiatu etiketak agertu bezala eta azaldu haien esanahia euskaraz.
Pot. pot1 kontroletik RGB PWM kanaletara
Diagramak sarrera eta hiru RGB irteerak erakusten ditu. Potentziometroaren programan kanal gorria bakarrik aldatuko da; berdea eta urdina zeroan egongo dira. Bete TODOak irakurketa lan-ziklo bihurtu eta irteeran ezartzeko.
LED kanal berean, zein lan-ziklorekin espero duzu distira handiagoa: 0,20rekin ala 0,80rekin? Azaldu esaldi batean.
Probatu RGB balio finkoak
22 min
Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.
Ireki
main.cpp.Ordeztu fitxategia hurrengo programarekin.
Gorde, konpilatu eta kargatu.
Behatu kontsola eta kamera batera.
Behatu distira/kolorearen hiru egoerak.
Jaso zer aldatu den gorriaren lan-ziklo txikiaren, kolore-nahasketaren eta urdinaren lan-ziklo handiaren artean.
Klase-saio batean erabilgarri
#include "mbed.h"
PwmOut red(PA_8);
PwmOut green(PA_9);
PwmOut blue(PA_10);
void set_rgb(float r, float g, float b) {
red.write(r);
green.write(g);
blue.write(b);
}
int main() {
red.period_ms(2);
green.period_ms(2);
blue.period_ms(2);
printf("PWM RGB fixed levels start\n");
while (true) {
set_rgb(0.20f, 0.00f, 0.00f);
printf("state=low_red r=20 g=0 b=0\n");
ThisThread::sleep_for(2000ms);
set_rgb(0.20f, 0.50f, 0.10f);
printf("state=mixed r=20 g=50 b=10\n");
ThisThread::sleep_for(2000ms);
set_rgb(0.00f, 0.00f, 0.80f);
printf("state=high_blue r=0 g=0 b=80\n");
ThisThread::sleep_for(2000ms);
}
}
Bete hiru errenkada, inprimatutako RGB egoera bakoitzeko bat. r=, g= eta b= ondoko zenbakiek hiru kanalen lan-zikloak adierazten dituzte ehunekotan; Behatutako irteera kameran ikusitako kolorea eta distira dira. Utzi erabat hutsik erabiltzen ez dituzun errenkada gehigarriak. Kolorea ondo bereizten ez baduzu, hautatu neurri batean edo ez, asmatu gabe. PWM RGB fixed levels start mezuak balio finkoen programa hasi dela adierazten du.
RGB balio finkoen ebidentzien taula
Bete inprimatutako hiru egoeren errenkadak. Utzi hutsik erabiltzen ez dituzun errenkada gehigarriak.
| Inprimatutako egoera | Gorriaren ehuneko inprimatua % | Berdearen ehuneko inprimatua % | Urdinaren ehuneko inprimatua % | Behatutako irteera | Bat etorri da espero zenarekin? |
|---|---|---|---|---|---|
Kontrolatu distira potentziometroarekin
22 min
Orain, lotu sarrera analogikoa eta PWM irteera. Potentziometroak kanal gorriaren lan-zikloa kontrolatuko du. Serieko ehunekoak programak agindutako balioaren berri ematen du; kamerak, benetako LEDaren portaera erakusten du. Kameraren esposizioak distira-aldaketa lausotzen badu, jaso muga hori. Ehunekoa ez da argi-distiraren neurketa fisikoa.
Ordeztu
main.cpphurrengo programarekin.Bete TODO 1: bihurtu 0,0–1,0 tarteko irakurketa analogikoa PWMren 0,0–1,0 tarte berera, zuzenean.
Bete TODO 2: ezarri kalkulatutako balioa kanal gorrian.
Gorde, konpilatu eta kargatu. Aurreikusitako bigarren konpilazioa da.
Mugitu poliki Pot. pot1 graduatzailea.
Jaso posizio baxu, ertain eta altuko irakurketak eta ikusitako irteera.
Klase-saio batean erabilgarri
#include "mbed.h"
AnalogIn pot(PC_0);
PwmOut red(PA_8);
PwmOut green(PA_9);
PwmOut blue(PA_10);
int main() {
red.period_ms(2);
green.period_ms(2);
blue.period_ms(2);
green.write(0.0f);
blue.write(0.0f);
printf("Potentiometer controlled PWM start\n");
while (true) {
float reading = pot.read();
// TODO 1: ordeztu 0.0f irakurketa lan-ziklo bihurtzen duen adierazpenarekin.
float duty = 0.0f;
int percent = (int)(duty * 100.0f);
// TODO 2: ordeztu 0.0f kalkulatutako duty aldagaiarekin.
red.write(0.0f);
printf("red_percent=%d\n", percent);
ThisThread::sleep_for(500ms);
}
}
Bete hiru kasuak: posizio baxua, ertaina eta altua. Serieko ehunekoa red_percent= ondoko zenbaki osoa da, % unitatearekin; Behatutako distira, kamerako balorazio orokorra, ez zenbakizko neurketa; eta Kamerako ikusgarritasuna, behaketaren argitasuna. Utzi hutsik errenkada gehigarriak. Potentiometer controlled PWM start mezuak potentziometro bidezko programa hasi dela adierazten du. (int) bihurketak ehunekoaren zati hamartarra kentzen du.
Distira aldatzen ez bada, egiaztatu PWM pina eta red.write(duty) lerroa. Serieko ehunekoa aldatzen bada, baina kameran ez bada aldaketarik bereizten, aztertu irteera-pina, PWM konfigurazioa eta kameraren esposizioa. Ezarri periodoa write() deitu aurretik. Konparatu distira baxua, ertaina eta altua; ez eskatu kamerari alde txikiak zenbakiz neurtzeko.
Potentziometro bidezko PWMren ebidentzien taula
Bete posizio baxu, ertain eta altuko errenkadak, TODOak osatutako programa exekutatu ondoren. Utzi hutsik errenkada gehigarriak.
| Potentziometroaren posizioa | Serieko ehunekoa % | Behatutako distira | Kamerako ikusgarritasuna |
|---|---|---|---|
Alderatu posizio baxu, ertain eta altuko errenkadak. Adierazi inprimatutako hiru ehunekoak ordenan, eta azaldu gorriaren distira ikusgaiak ere txikitik handirako joera izan duen.
Bidali zure kodea
8 min
Erantsi gordetako azken main.cpp fitxategia
Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak), ziurtatu main.cpp fitxategiak potentziometroz kontrolatutako PWM bertsioa duela eta sakatu Adjuntar código guardado (erantsi gordetako kodea). Ondoren, sakatu Enviar entrega (bidali lana), jardueraren amaieran.
Bihurtu aurrebista hau klase-saio batean
Jarraitu LabsLand Teach-era ikasgai hau ikasleekin erabiltzeko eta kontuaren sarbidea berrikusteko.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua