Teach Urruneko laborategidun ikasgaiak

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.

  • STM32 Nucleo (Mbed)
  • 60 min
  • Batxilergoa / Elektronikako Lanbide Heziketako hasierako maila
  • eu
  • Embedded systems

Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.

Pot. pot1 kontrola PC_0 sarreran: AnalogIn irakurketa eta PwmOut write(duty) bidezko irteera, PA_8, PA_9 eta PA_10 RGB pinetarako.
STM32 Nucleo (Mbed)

Ikaskuntza-emaitzak

  • Mbed-en PwmOut erabiltzea 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.

1

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

Pot. pot1 kontrola PC_0 sarreran: AnalogIn irakurketa eta PwmOut write(duty) bidezko irteera, PA_8, PA_9 eta PA_10 RGB pinetarako.

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.

2

Probatu RGB balio finkoak

22 min

  1. Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.

  2. Ireki main.cpp.

  3. Ordeztu fitxategia hurrengo programarekin.

  4. Gorde, konpilatu eta kargatu.

  5. Behatu kontsola eta kamera batera.

  6. Behatu distira/kolorearen hiru egoerak.

  7. 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?
3

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.

  1. Ordeztu main.cpp hurrengo programarekin.

  2. Bete TODO 1: bihurtu 0,0–1,0 tarteko irakurketa analogikoa PWMren 0,0–1,0 tarte berera, zuzenean.

  3. Bete TODO 2: ezarri kalkulatutako balioa kanal gorrian.

  4. Gorde, konpilatu eta kargatu. Aurreikusitako bigarren konpilazioa da.

  5. Mugitu poliki Pot. pot1 graduatzailea.

  6. 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.

4

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.