Teach ikasgaia
STM32 Mbed CodeIDE (3/8): botoiak, pull-up erresistentziak eta erreboteen iragazketa
Irakurri maila baxuan aktibatzen diren botoiak Mbed-en DigitalIn eta PullUp erabiliz, probatu erreboteen iragazketa eta lotu botoiaren irakurketak benetako LEDen portaerarekin.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Sakagailu bat irakurtzea Mbed-en
DigitalInerabiliz.Uneko laborategian botoia maila baxuan aktibatzen den egiaztatzea.
Erreboteak iragazteko egiaztapen erraz bat erabiltzea: itxaronaldi baten ondoren berriz irakurri, sakatzea onartu aurretik.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Irakurri, erantzun aurretik
10 min
STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 3.a. Sarrerei esker, argi-patroi finko bat pertsona, etengailu edo sentsore bati erantzuten dion kontrolagailu bihur daiteke. Lehenik, botoia askatuta eta sakatuta dagoenean zer irakurtzen den egiaztatuko duzu; gero, erreboteak iragazteko egiaztapen erraz bat gehituko duzu, sakatze batek sekuentzia bakarra abiarazten duen probatzeko.
CodeIDEren gidak PC_5, PC_6 eta PC_10 aipatzen ditu STM32 WB55RG laborategiko botoi/sentsoreen pinen artean. Ikasgai honetan PC_5 erabiliko duzu. Botoia sakatzean irakurtzen den balioa egiaztatuko duzu lehenik, gero programaren erabakietan erabiltzeko.
Pull-up erresistentzia duten botoi-zirkuitu asko maila baxuan aktibatzen dira: sakatuta daudenean maila elektrikoa txikiagoa da askatuta daudenean baino. Hala ere, irakurri laborategiko botoia bi egoeretan, balio horiek programan erabili aurretik.
DigitalIn button(PC_5, PullUp);
int raw = button.read();
DigitalIn pin bat irakurtzeko Mbed objektua da. PullUp aukerak mikrokontrolagailuaren barneko pull-up erresistentzia gaitzen du: sarrera maila alturantz eramaten du botoia askatuta dagoenean. button.read() deitzean, une horretan irakurritako 0 edo 1 balioa lortzen da.
Urruneko laborategiaren interfazean botoi-kontrol biribilak daude. Ikasgai honetan, erabili B1 PC_5 pinari eragiteko. Kontsolako button_raw etiketa botoiaren zuzeneko irakurketa da. press detected mezuak sakatzea detektatu dela adierazten du; sequence complete, sekuentzia amaitu dela; eta ready for next press, hurrengo sakatzerako prest dagoela. Kopiatu ebidentziarako serie-lerroak agertu bezala, eta azaldu esanahia euskaraz.
Erreboteak iragazteko bi irakurketa
Lehen laginak sakatuta dagoela adierazten badu, programak 50 ms itxaroten du eta berriz irakurtzen du. Bigarren lagina ere sakatze-balioaren berdina bada, sekuentzia onartzen du.
Zein balio erabili behar duzu gero sekuentzia-programako pressed_value aldagaian?
Irakurri botoiaren balioa
20 min
Aurreikusi hiru konpilazio eta laborategiko 25 minutu aktibo inguru: botoiaren proba, sekuentzia eta sekuentziaren itxaronaldi baten aldaketa. Ilararik badago, prestatu bi behaketa-eremuak eta irakurri TODO 1–2 saioa hasi aurretik.
Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.
Ireki
main.cpp.Ordeztu fitxategia hurrengo proba-programarekin.
Gorde, konpilatu 1. bertsioa eta kargatu.
Begiratu laborategiaren behealdeko kontsola. Laborategiak kudeatzen du serie-konexioa; erabili bertako lerroak, ez aparteko terminal bat.
Utzi botoia askatuta, eta kopiatu
button_rawlerro bat.Mantendu
B1sakatuta kontsolan lerro berri bat edo bi agertu arte, eta kopiatu une horretakobutton_rawlerroa. Balioa aldatu ez bada, jaso hori ere.Kodea aldatu aurretik, jaso botoiaren irakurketak bi egoeretan: askatuta eta sakatuta.
- urratsa amaitu ondoren bakarrik, sakatu Marcar práctica como completada (markatu praktika amaitutzat).
Klase-saio batean erabilgarri
#include "mbed.h"
DigitalIn button(PC_5, PullUp);
int main() {
printf("Button probe start\n");
while (true) {
int raw = button.read();
printf("button_raw=%d\n", raw);
ThisThread::sleep_for(500ms);
}
}
Jaso bereizita botoiaren irakurketak, askatuta eta sakatuta. Kopiatu kontsolako button_raw zenbaki zehatza. Button probe start mezuak botoiaren proba hasi dela adierazten du.
Erabili behatutako balioak, ez aurresuposatutakoak:
button_raw=<askatuta behatutako balioa>
button_raw=<sakatuta behatutako balioa>Botoia askatuta dagoela, idatzi lerro bat formatu honekin: Probatutako kontrola: B1 | button_raw=...
Ordeztu puntuak kontsolatik kopiatutako balio zehatzarekin.
B1 sakatuta dagoela, idatzi lerro bat formatu honekin: Kontrola: B1 | button_raw=... | sakatuta mantendutako denbora: ... s | aldatu da?: bai/ez
Erabili kontsolako balio zehatza. Adierazi zenbat denboraz mantendu duzun sakatuta, irakurketa aldatu den erabaki aurretik.
Idatzi emaitza honela: askatuta=<behatutako balioa>, sakatuta=<behatutako balioa>. Ondoren, adierazi sakatuta irakurritako balioa askatutakoa baino txikiagoa den eta, hortaz, saio honetan sarrera maila baxuan aktibatzen den.
Abiarazi sekuentzia botoia sakatuz
22 min
Orain, erabili B1 hiru LEDen sekuentzia abiarazteko. Jarri programan zure proban botoia sakatuta irakurritako balioa. Bi egoeretan balio bera lortu baduzu, egiaztatu B1 eta PC_5 arteko lotura irakaslearekin jarraitu aurretik.
Botoi mekanikoen kontaktuek erreboteak izan ditzakete: sakatzean seinale elektrikoa 0 eta 1 artean azkar alda daiteke milisegundo batzuetan. Hemen erabiliko duzun iragazketa erraza itxaronaldi labur baten ondoren berriz irakurtzea da. Bi laginak berdinak izateak ez du frogatzen tarte osoan seinalea etenik gabe egon denik.
Hiru neurri hauek eginkizun desberdinak dituzte:
- Erreboteen iragazketa: itxaron 50 ms, irakurri berriz eta onartu bigarren lagina ere behatutako sakatze-balioaren berdina bada.
- Sekuentzian zehar ez irakurtzea:
run_sequence()funtzioa amaitu arte, programak ez du sarrera berriz irakurtzen. Horrek sekuentzia barruan beste abiarazte bat eragozten du; ez du kontaktuaren errebotea iragazten. - Askatu ondoren berriz prestatzea: sekuentzia amaitzean, sarrerak sakatze-balioa izateari utzi arte itxaroten du. Horrela, botoia sakatuta mantentzeak ez du berehala beste sekuentziarik abiarazten. Askatze hori ez da bi laginen bidez egiaztatzen.
Kodeak konpilatzea eragozten duten bi hutsune ditu. TODO 1ean, erabili behatutako sakatze-balioa. TODO 2an, idatzi bigarren lagina sakatze-balioarekin bat ez datorrenean baztertzeko baldintza. Bete biak eta bilatu TODO konpilatu aurretik; amaitutako TODO iruzkinak ere kendu edo berridatzi.
Ordeztu
main.cpphurrengo programarekin, eta bete TODO 1–2 zure probako ebidentzia erabiliz.Bilatu
TODO. Bat ere geratzen ez denean, gorde, konpilatu 2. bertsioa eta kargatu.Sakatu eta askatu
B1, eta behatu sekuentzia osoa.Sakatu botoia hainbat aldiz sekuentzia martxan dagoen bitartean. Programak ez ditu tarte horretako sakatzeak irakurtzen. Beste sekuentzia bat hasteko, itxaron amaitu arte, askatu botoia eta sakatu berriz.
Aldatu
run_sequence()funtzioko itxaronaldi ikusgai bat500ms-tik1000ms-ra. Ez aldatu erreboteak iragazteko50ms-ko itxaronaldia, ezta askatzea/sarrera irakurtzeko20ms-koa ere. Gorde, konpilatu 3. bertsioa, kargatu eta alderatu.- urratsa amaitu ondoren bakarrik, sakatu Marcar práctica como completada (markatu praktika amaitutzat).
Klase-saio batean erabilgarri
#include "mbed.h"
DigitalIn button(PC_5, PullUp);
DigitalOut led1(PB_13, 1);
DigitalOut led2(PB_14, 1);
DigitalOut led3(PB_15, 1);
void led_on(DigitalOut &led) {
led = 0;
}
void led_off(DigitalOut &led) {
led = 1;
}
void all_off() {
led_off(led1);
led_off(led2);
led_off(led3);
}
void run_sequence() {
led_on(led1);
ThisThread::sleep_for(500ms);
led_on(led2);
ThisThread::sleep_for(500ms);
led_on(led3);
ThisThread::sleep_for(2000ms);
all_off();
}
int main() {
// 1: jarri proban botoia sakatuta behatutako balio zehatza.
const int pressed_value = TODO_PRESSED_VALUE;
all_off();
printf("Button sequence start\n");
while (true) {
bool pressed = (button.read() == pressed_value);
if (pressed) {
ThisThread::sleep_for(50ms);
// 2: baztertu bigarren laginak botoia sakatuta ez dagoela adierazten badu.
if (TODO_CONFIRM_CONDITION) {
continue;
}
printf("press detected: running sequence\n");
run_sequence();
printf("sequence complete; release button\n");
while (button.read() == pressed_value) {
ThisThread::sleep_for(20ms);
}
printf("ready for next press\n");
}
ThisThread::sleep_for(20ms);
}
}
Jaso hiru egiaztapen labur, aurreikuspena eta ebidentzia bereizita. Button sequence start mezuak programa hasi dela dio; press detected: running sequence mezuak sakatzea onartu eta sekuentzia hasi dela; sequence complete; release button mezuak sekuentzia amaitu eta botoia askatzeko eskatzen du. ready for next press agertzean, hurrengo sakatzerako prest dago.
Sakatzeak ez badu sekuentzia abiarazten, egiaztatu PC_5 eta zuzeneko serie-irakurketa. Hainbat aldiz abiarazten bada, berrikusi bigarren laginaren baldintza eta askatu arteko begizta, 50 ms aldatu aurretik. LEDen egoerak alderantzizkoak badira, berrikusi funtzio laguntzaileen 0/1 balioak.
Sakatze arruntaren proba:
- aurreikusitako abiarazte kopurua: bat;
- LEDen behatutako ordena;
- hasiera eta amaiera erakusten dituzten serie-lerroak.
Hainbat sakatze, sekuentzia martxan dagoen bitartean:
ready for next pressaurretik aurreikusitako abiarazte kopurua;ready for next pressaurretik behatutakopress detectedlerro kopurua.
Itxaronaldia aldatutako bertsioa:
- aldatutako sekuentzia-itxaronaldia, milisegundotan;
- aurreikusitako aldaketa ikusgaia;
- 3. bertsioa kargatu ondoren behatutako aldaketa ikusgaia.
Zein esaldik bereizten ditu zuzen erreboteen iragazketa eta sekuentzian zehar sarrera ez irakurtzea?
Bidali zure kodea
8 min
Erantsi gordetako azken main.cpp fitxategia
Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak), eta ziurtatu main.cpp fitxategiak behatutako sakatze-balioa, bigarren laginaren baldintza eta probatutako 1000ms aldaketa dituela, TODO markarik gabe. Ondoren, sakatu Adjuntar código guardado (erantsi gordetako kodea) eta Enviar entrega (bidali lana).
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