Teach Urruneko laborategidun ikasgaiak

Teach ikasgaia

STM32 Mbed CodeIDE (8/8): kontrolagailu integratuaren azken proiektua

Osatu STM32 kontrolagailu bat sarrera analogikoa, alarma ikusi dela baieztatzeko botoia, RGB eta egoera-LEDa erabiliz; egiaztatu portaera kameran eta serie-kontsolan.

  • STM32 Nucleo (Mbed)
  • 65 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. pot2 PC_1 sarrera eta B1 PC_5 botoia kontrolagailura doaz; programak PA_8–PA_10 RGB PWM kanalak, PB_13 egoera-LEDa eta serieko mezuak kontrolatzen ditu.
STM32 Nucleo (Mbed)

Ikaskuntza-emaitzak

  • Kontrolagailu batean sarrera analogikoa, botoia, RGB PWM irteera, egoera-LEDa eta serieko ebidentzia uztartzea.

  • Proba-taula erabiltzea kontrolagailuaren portaera egoeraz egoera egiaztatzeko.

  • Kodeak, serieko irteerak eta kamerako behaketek kontrolagailuari buruzko ondorio bat nola justifikatzen duten azaltzea.

Ikaslearen jardueraren aurrebista

Jardueraren edukia

Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.

1

Kontrolagailuaren eskakizunak

12 min

STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 8.a. Sistema txertatu batean hainbat zeregin uztartzen dira: balio bat irakurtzea, dagokion egoera erabakitzea, abisu ikusgaia ematea eta emaitza egiaztatzeko informazioa inprimatzea. Hemen aire konprimituko depositu baten presio-alarma simulatuko duzu.

Potentziometroa presio simulatuaren sarrera da, eta botoiak alarma ikusi dela baieztatzeko balio du. Benetako instalazioak transmisore kalibratua eta babes egokiak behar lituzke; jarduera honek adierazpenaren eta baieztapenaren logika lantzen du. Ez du benetako presiorik kontrolatzen.

Aurreikusi laborategiko 45 minutu inguru eta bi konpilazio/karga: hasierako kontrolagailua eta hobekuntza. Ilaran, prestatu TODOak, aurreikuspena eta lau espero diren erantzunak. Irakurri hobekuntzaren atala lehen proba egin aurretik: aukeratu gero ere errepikatu ahal izango duzun sarrera, aurreko eta ondorengo ebidentzia alderatzeko.

Hasierako kontrolagailuaren hardware-mapa:

  • PC_1: presio simulatuaren sarrera, Pot. pot2 graduatzailearekin.
  • PC_5: alarma ikusi dela baieztatzeko sarrera, B1 botoiarekin.
  • PA_8, PA_9 eta PA_10: RGB PWM kanalak, hurrenez hurren gorria, berdea eta urdina.
  • PB_13: egoera-LED berdea, maila baxuan aktibatzen dena.

Sarrerak, kontrolagailua eta irteerak

Pot. pot2 PC_1 sarrera eta B1 PC_5 botoia kontrolagailura doaz; programak PA_8–PA_10 RGB PWM kanalak, PB_13 egoera-LEDa eta serieko mezuak kontrolatzen ditu.

Sarrerak irakurri, egoera erabaki eta irteerak eguneratzen dira. Serieko mezuak Console atalean ikusiko dituzu (kontsola).

Mbed objektuak elkarrekin erabiltzen dira: AnalogIn sarrera analogikorako, DigitalIn botoirako, PwmOut RGB kanaletarako eta DigitalOut egoera-LEDerako. percent sarreraren ehunekoa da; level, egoera; SAFE, maila segurua simulazioan; WARNING, abisua; CRITICAL, egoera kritikoa; eta ack, alarma ikusi dela gordetako baieztapena. ack=0: baieztatu gabe; ack=1: baieztatuta. Kopiatu serie-lerroak agertu bezala eta azaldu euskaraz.

Eskatutako portaera:

  • %40tik behera: RGB berdea, egoera-LEDa itzalita. Adibidea: percent=25 level=SAFE ack=0.
  • %40–69: RGB horia, egoera-LEDa itzalita. Adibidea: percent=55 level=WARNING ack=0.
  • %70 edo gehiago, baieztapena gorde gabe eta botoia askatuta: RGB gorria eta egoera-LEDa keinuka. Adibidea: percent=80 level=CRITICAL ack=0. Behatu gutxienez bi segundo; idatzi «keinuka» LEDa behin eta berriz piztu eta itzaltzen ikusi baduzu.
  • %70 edo gehiago, botoia sakatu eta programak baieztapena jaso ondoren: RGB urdina eta egoera-LEDa itzalita. Adibidea: percent=80 level=CRITICAL ack=1. Botoia askatzeak ez du baieztapena ezabatzen, sarrerak kritiko jarraitzen badu.

Botoiak ez du presioa jaisten, ezta egoera kritikoa seguru bihurtzen ere. Alarma ikusi dela memorian gordetzen du. Horri baieztapena atxikitzea esango diogu. Serieko mezuak level=CRITICAL mantentzen du; baieztapena automatikoki ezabatzen da sarrera atalase kritikotik behera jaisten denean. Programak botoiaren maila irakurtzen du gutxi gorabehera 500 ms-an behin. Egoera kritikoan, mantendu sakatuta kontsolan ack=1 ikusi arte, eta gero askatu. Sakatze oso laburra gal daiteke.

Bi kasuetan, hasi gordetako baieztapena ezabatuta dagoela, eta sakatu botoia programak irakur dezan. Erantzun formatu honekin:

  1. 69% | level=... | ack=...
  2. 70% | level=... | ack=...
  3. Azalpena: ...

Azaldu zergatik den desberdina adarra %70eko berdintasunean, eta zergatik gorde daitekeen baieztapena kasu horretan.

2

Exekutatu hasierako kontrolagailua

30 min

  1. Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.

  2. Ireki main.cpp.

  3. Ordeztu fitxategia hurrengo kontrolagailuarekin.

  4. Bete TODO 1 botoiaren maila baxuko aktibazio-adierazpenarekin, eta TODO 2 WARNING tartearen atalase-baldintzarekin.

  5. Konpilatu edo plaka behatu aurretik, bete taulako lau Espero den erantzuna gelaxkak aurreko eskakizunen arabera.

  6. Gorde, konpilatu eta kargatu. Aurreikusitako lehen konpilazioa da.

  7. Erabili Pot. pot2 maila segurua, abisua eta kritikoa simulatzeko.

  8. Egoera kritikoan, utzi lehenik botoia askatuta bi segundoz. Gero sakatu ack=1 ikusi arte eta askatu; egiaztatu ondorengo gutxienez bi serie-lerrotan ack=1 mantentzen dela.

  9. Jaso egoera bakoitzeko errenkada bat, serie-lerro osoarekin.

  10. Jaitsi sarrera %70etik behera, eta egiaztatu baieztapena ezabatzen dela (ack=0), amaitu aurretik.

Klase-saio batean erabilgarri

#include "mbed.h"

AnalogIn level_control(PC_1);
DigitalIn acknowledge_button(PC_5, PullUp);

PwmOut rgb_red(PA_8);
PwmOut rgb_green(PA_9);
PwmOut rgb_blue(PA_10);

DigitalOut status_led(PB_13, 1);

constexpr int warning_threshold_percent = 40;
constexpr int critical_threshold_percent = 70;

void status_on() {
    status_led = 0;
}

void status_off() {
    status_led = 1;
}

void set_rgb(float red, float green, float blue) {
    rgb_red.write(red);
    rgb_green.write(green);
    rgb_blue.write(blue);
}

void show_safe() {
    set_rgb(0.0f, 0.7f, 0.0f);
    status_off();
}

void show_warning() {
    set_rgb(0.7f, 0.5f, 0.0f);
    status_off();
}

void show_critical(bool acknowledged) {
    if (acknowledged) {
        set_rgb(0.0f, 0.0f, 0.8f);
        status_off();
    } else {
        set_rgb(0.9f, 0.0f, 0.0f);
        status_led = !status_led.read();
    }
}

int main() {
    rgb_red.period_ms(2);
    rgb_green.period_ms(2);
    rgb_blue.period_ms(2);

    printf("Integrated controller start\n");

    bool acknowledged = false;

    while (true) {
        float reading = level_control.read();
        int percent = (int)(reading * 100.0f);
        // TODO 1: ordeztu false botoiaren maila baxuko aktibazio-adierazpenarekin.
        bool button_pressed = false;

        if (percent < critical_threshold_percent) {
            acknowledged = false;
        } else if (button_pressed) {
            acknowledged = true;
        }

        if (percent < warning_threshold_percent) {
            show_safe();
            printf("percent=%d level=SAFE ack=%d\n",
                   percent,
                   acknowledged);
        // TODO 2: ordeztu false WARNING atalase-baldintzarekin.
        } else if (false) {
            show_warning();
            printf("percent=%d level=WARNING ack=%d\n",
                   percent,
                   acknowledged);
        } else {
            show_critical(acknowledged);
            printf("percent=%d level=CRITICAL ack=%d\n",
                   percent,
                   acknowledged);
        }

        ThisThread::sleep_for(500ms);
    }
}

Osatu taula bi urratsetan. Konpilatu aurretik, hautatu Proba-kasua eta botoiaren ekintza, eta idatzi Espero den erantzuna, RGB kolorea eta egoera-LEDaren portaera adieraziz. Proban, jaso benetan irakurritako ehuneko osoa, ikusitako erantzuna eta serie-lerro osoa. Ehunekoak transmisorea simulatzen du; ez da bar-etan neurtutako presioa. Baieztatu gabeko kritikoan, behatu bi segundo gutxienez, LEDa keinuka ari dela baieztatzeko. Baieztatutako kritikoan, jaso botoia askatu ondoko lerro bat, ack=1 mantentzen dela erakusteko. Utzi hutsik errenkada gehigarriak. Integrated controller start mezuak programa hasi dela adierazten du. (int) bihurketak ehunekoaren zati hamartarra kentzen du.

Kontrolagailuaren lau egoeren proba-taula

Probatu aurretik, bete lau egoeren espero diren erantzunak. Proban, gehitu benetako irakurketak, ikusitako erantzuna eta serie-lerro osoa. Utzi hutsik errenkada gehigarriak.

Proba-kasua Presio simulatuaren irakurketa % Botoiaren ekintza Espero den erantzuna Behatutako erantzun ikusgaia Serieko ebidentzia

Egoera kritikoan alarma ikusi dela baieztatu ondoren, kopiatu B1 askatu osteko lerro oso bat, oraindik level=CRITICAL ack=1 erakusten duena. Gero, jaitsi sarrera %70etik behera eta kopiatu ack=0 erakusten duen lehen lerro osoa. Azaldu nola erakusten duten bi lerroek baieztapena mantentzea eta hura ezabatzeko baldintza.

Aukeratu zure ebidentziarik argiena duen proba-errenkada. Aipatu sarrera-egoera eta serie-lerroa, eta azaldu RGB irteera eta egoera-LEDa eskakizunarekin bat etorri diren.

3

Hobetu kontrolagailua

15 min

Aurreko kontrolagailua abiapuntua da. Aukeratu aldaketa bat, inplementatu main.cpp fitxategian, gorde, konpilatu, kargatu eta probatu alarma-simulazioan. Plana egitea ez da nahikoa: kode berria exekutatu eta egiaztatu behar duzu.

Aukeratu bi bide hauetako bat:

  • Atalasea aldatzea: aldatu critical_threshold_percent soilik, %72–80 tarteko balio batera. Aukeratu sarrera finko bat: gutxienez %70ekoa eta atalase berria baino txikiagoa. Horrela, sarrera berak beste adar bat hautatuko du aldaketaren ondoren.
  • Maila oso altua gehitzea: gehitu VERY_HIGH adarra (oso altua), %90 edo gehiagorako, ohiko adar kritikoaren aurretik. Ezarri RGB magenta, egoera-LEDa etengabe piztuta eta level=VERY_HIGH serie-etiketa. Konparazioan erabili %95eko sarrera eta botoia askatuta; ondoren probatu %80, ohiko portaera kritikoak funtzionatzen jarraitzen duela egiaztatzeko. Hasi gordetako baieztapena ezabatuta: jaitsi lehenik atalase kritikotik behera, eta gero igo probako baliora botoia sakatu gabe.

Editatu aurretik, erantzun lerro hauekin:

  1. Hautatutako bidea: atalasea / maila oso altua
  2. Aldatuko dudan kodeko leku zehatza: ...
  3. Aurretik eta ondoren errepikatuko ditudan sarrera eta botoiaren ekintza: ...
  4. Maila oso altuaren biderako soilik: Aurreko portaera mantentzen den egiaztatzeko %80ko proba: ...

Erabili hasierako kontrolagailuaren dagokion errenkada aldaketaren aurreko ebidentzia gisa. Oraindik behar duzun sarreran ez baduzu probatu, jaso aurreko ebidentzia bertsio berria kargatu aurretik. Egin aldaketa, gorde, konpilatu eta kargatu: aurreikusitako bigarren konpilazioa da. Errepikatu sarrera, botoiaren ekintza eta hasierako baieztapen-egoera berak, ondorengo ebidentziarako. Jaso serie-lerro osoa eta RGB/LED portaera. Maila oso altua gehitu baduzu, egin %80ko egiaztapena ere eta azaldu azken erantzunean. Erabili benetako kontsolako ehunekoa; helburuko baliora iritsi ezin bazara, jaso lortutakoa eta konparazioaren muga.

Probatu eskakizun bat aldi bakoitzean; ez mugitu kontrolak erantzuna jaso aurretik. Ehunekoa aldatzen bada baina RGB ez, egiaztatu PwmOut pinak eta set_rgb() deiak. Botoiak ez badu espero bezala jokatzen, begiratu ack eta egiaztatu PC_5, PullUp eta sakatze-balioa. Mantendu PB_13ren laguntzaileak: 0 pizteko eta 1 itzaltzeko.

Aldaketaren aurreko eta ondorengo ebidentzia

Erabili sarrera eta hasierako baieztapen-egoera berak aurretik eta ondoren. Utzi hutsik erabiltzen ez dituzun errenkada gehigarriak.

Bertsioa Presio simulatuaren sarrera kontrolatua % Botoiaren egoera kontrolatua Konpilazioaren/kargaren egoera Serie-lerro osoa RGB eta egoera-LEDaren emaitza ikusgaia

Adierazi aldaketa zehatza eta alderatu aurreko/ondorengo serie-lerroak eta emaitza ikusgaiak. Ondorioztatu ebidentziak espero zen aldaketa baieztatu duen. Maila oso altuaren bidean, azaldu %80ko proban ohiko portaera kritikoa mantendu den.

4

Bidali zure kodea

8 min

Erantsi gordetako azken main.cpp fitxategia

Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak), ziurtatu main.cpp fitxategiak probatu duzun azken kontrolagailua 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.