Teach ikasgaia
STM32 Mbed CodeIDE (2/8): LED sekuentziak eta denbora-kontrola
Programatu LED sekuentziak benetako STM32 plakan DigitalOut eta Mbed-en itxaronaldiak erabiliz; aldatu erritmoa eta azaldu behatutako ordena.
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
DigitalOuterabiliz hainbat pin kontrolatzea, planifikatutako sekuentzia bati jarraituz.Itxaronaldiak aldatzea irteera-patroia errazago behatzeko.
Kodearen ordenaren eta LEDetan ikusitako sekuentziaren arteko lotura azaltzea.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Planifikatu sekuentzia
8 min
STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 2.a. LEDa keinuka jartzeak plaka programatu daitekeela erakusten du; denboran antolatutako LED patroiak, berriz, informazioa eman dezake: abiarazte-sekuentzia bat, abisu bat edo egoera-kode bat. Kodearen ordenak eta itxaronaldiek hardwarean ikus daitekeen portaera sortzen dute. Hiru irteera kontrolatuko dituzu, beste pertsona batek patroia bereiz dezakeen egiaztatzeko.
Programa honetan, mikrokontrolagailuak instrukzioak idatzitako ordenan exekutatzen ditu. led_on(led1) bezalako funtzio laguntzaileak erabiliko dituzu, kodea irakurtzean egin nahi duzun ekintza fisikoa errazago ulertzeko.
Hau idazten baduzu:
led_on(led1);
ThisThread::sleep_for(500ms);
led_on(led2);
Lehen LEDa bigarrena baino lehen piztu beharko litzateke. Lehen LEDak piztuta jarraituko du bigarrena piztean, kodeak oraindik ez baitu led_off(led1) deitu.
Ikasgai honek STM32 WB55RG laborategiko Mbed irteera-pin hauek erabiltzen ditu:
PB_13PB_14PB_15
Entrenamendurako plakako hiru LED berdeei dagozkie. Maila baxuan aktibatzen dira: 0 idazteak LEDa pizten du, eta 1 idazteak itzali. Horregatik erabiltzen ditu hasierako kodeak funtzio laguntzaileak. led_on() pizteko da; led_off(), itzaltzeko. Lotura hori LED hauena da, ez LED guztientzako arau unibertsala.
Mbed-en, DigitalOut lerro bakoitzak STM32 pin batera lotutako irteera-objektua sortzen du. Irteerak azken balioa mantentzen du programak itxaroten duen bitartean: ThisThread::sleep_for(500ms) deitzeak ez du LEDari ezarritako egoera ezabatzen.
Erabili mapa hau kodea kamerarekin alderatzeko:
led1=PB_13= hiru LED berdeen taldeko ezkerrekoa.led2=PB_14= taldeko erdikoa.led3=PB_15= taldeko eskuinekoa.
Ikasgai honetako hiru LED berdeak
Egiaztatu talde horren ordena kameran. Bereiztea zaila bada, moteldu patroia 1000ms erabiliz eta baliatu aurreko mapa. Idatzi «kameran ezin da bereizi» moteldu ondoren ere ordena baieztatu ezin baduzu.
Funtzio laguntzaileen DigitalOut &led parametroan, & ikurrak adierazten du funtzioak pasatu diozun jatorrizko LED objektuarekin lan egiten duela, haren erreferentziaren bidez. 500ms adierazpenean, ms milisegundoren laburdura da.
Lehenik 1. LEDa, gero 2.a eta azkenik 3.a pizten badira, tartean led_off() deitu gabe, zer ikusiko da all_off() exekutatu aurretik?
Exekutatu sekuentzia gidatua
26 min
Aurreikusi bi konpilazio eta laborategiko 20 minutu aktibo inguru. 1. bertsioak ezkerretik eskuinera pizten ditu LEDak, urratsen arteko 500ms-ko tartearekin; 2. bertsioan step_delay soilik aldatuko duzu, 250ms edo 1000ms erabiliz. Ilaran zauden bitartean, erantzun LEDak bata bestearen ondoren piztuta mantentzeari buruzko galdera, aukeratu bigarren itxaronaldia eta idatzi espero duzun ordena.
Hasierako kodeak konpilatzea eragozten duten lau hutsune ditu. Ordeztu TODO 1–4 gorde edo konpilatu aurretik. Bilatu TODO: ez da hutsunerik geratu behar, ezta amaitutako TODO iruzkinik ere.
Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.
Ireki
main.cpp.Ordeztu fitxategia hurrengo kodearekin. 1. bertsioan, erabili
500msTODO 1ean, etaled1,led2,led3TODO 2–4an, ordena horretan.Bilatu
TODO. Bat ere geratzen ez denean, gorde, konpilatu 1. bertsioa eta kargatu.Behatu gutxienez hiru ziklo oso, eta jaso LEDen ordena eta erritmoa.
Aldatu
step_delaysoilik:500ms-ren ordez, jarri250msedo1000ms.Gorde
main.cpp, konpilatu 2. bertsioa, kargatu eta alderatu ea itxaronaldi berriak patroia errazago edo zailago egiaztatzeko aukera ematen duen.- urratsa amaitu ondoren bakarrik, sakatu Marcar práctica como completada (markatu praktika amaitutzat).
Klase-saio batean erabilgarri
#include "mbed.h"
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);
}
int main() {
// 1: lehen bertsiorako, ordeztu hutsunea 500ms balioarekin.
const auto step_delay = TODO_STEP_DELAY;
const auto reset_delay = 1000ms;
all_off();
while (true) {
// 2-4: erabili LED bakoitza behin, ezkerretik eskuinera.
led_on(TODO_FIRST_LED);
ThisThread::sleep_for(step_delay);
led_on(TODO_SECOND_LED);
ThisThread::sleep_for(step_delay);
led_on(TODO_THIRD_LED);
ThisThread::sleep_for(reset_delay);
all_off();
ThisThread::sleep_for(reset_delay);
}
}
Jaso probatutako bi bertsioen behaketak bereizita. Hasierako kodeak aurreko LEDak piztuta mantentzen ditu all_off() exekutatu arte. Beraz, espero den patroia hau da: 1.a piztuta → 1.a eta 2.a piztuta → hirurak piztuta → guztiak itzalita. step_delay lehen bi tarteetan soilik erabiltzen da; hirurak piztuta eta guztiak itzalita dauden egoerek 1000ms irauten dute bakoitzak, bi bertsioetan.
LEDik aldatzen ez bada, egiaztatu DigitalOut eta programa kargatu dela. Egoerak alderantzizkoak badira, egiaztatu led_on() funtzioak 0 idazten duela eta led_off() funtzioak 1. Ordena okerra bada, berrikusi deien ordena. step_delay aipatzen duen konpilazio-errorea agertzen bada, egiaztatu haren definizioa ez duzula ezabatu.
Jatorrizko 500ms bertsiorako, jaso:
- kameran baieztatu duzun pizte-ordena edo patroia;
- LEDen kokapenak
led1/led2/led3maparekin bat etorri diren; - zerk erraztu edo zaildu duen patroia egiaztatzea.
Itxaronaldia aldatutako bertsiorako, jaso:
- probatu duzun itxaronaldiaren balioa;
- pizte-ordena eta aurreko LEDak piztuta mantentzeko patroia berdin mantendu diren;
- erritmo berriak patroia errazago edo zailago egiaztatzea ekarri duen;
- «kameran ezin da bereizi», baina soilik patroia moteldu ondoren ere ordena baieztatu ezin baduzu.
Aukeratu LED baten egoera aldatzen duen funtzio-dei bat. Idatzi lerroa, adibidez led_on(led2);, eta azaldu zer aldaketa fisiko eragin duen eta sekuentziaren zein unetan gertatu den.
Azaldu azken itxaronaldia
13 min
Mantendu ezkerretik eskuinerako ordena azken fitxategian. Bigarren konpilazioan itxaronaldia bakarrik aldatuko duzu: 250ms erabiliz lehen bi urratsak azkarrago gertatuko dira; 1000ms erabiliz, motelago, eta kameran bereiztea errazagoa izan daiteke. Bi aukerak baliozkoak dira, jasotako ebidentziarekin bat badatoz. Ez dira zikloko tarte guztiak aldatzen: reset_delay bere horretan geratzen da.
Adierazi azken step_delay balioa milisegundotan. Azaldu zergatik aukeratu duzun 250ms edo 1000ms, eta kamerako behaketek zure hautua egokia dela erakutsi duten.
Bidali zure kodea
8 min
Erantsi gordetako azken main.cpp fitxategia
Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak). Ziurtatu main.cpp fitxategiak probatutako ezkerretik eskuinerako ordena eta azken itxaronaldia dituela, eta TODO markarik ez dela geratzen. 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