Pelajaran Teach
STM32 Mbed CodeIDE (2/8): jujukan LED dan pemasaan
Pelajar memprogram pemasaan jujukan LED pada papan STM32 sebenar dengan Mbed DigitalOut dan tempoh menunggu, kemudian mengubah pemasaan dan menerangkan urutan yang diperhatikan.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Kawal beberapa pin Mbed
DigitalOutdalam urutan yang dirancang.Gunakan perubahan masa untuk menjadikan corak output lebih mudah diperhatikan.
Terangkan hubungan antara susunan kod dan susunan LED fizikal.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Rancang jujukan
8 min
Sekelip mata membuktikan papan boleh diprogramkan; corak LED bermasa boleh membawa maklumat, seperti sapuan permulaan, urutan amaran atau kod status. Idea penting dalam pelajaran ini bukan sekadar "menghidupkan LED"; ia ialah perintah kod ditambah kelewatan pemasa menjadi tingkah laku yang boleh dilihat pada perkakasan.
Mikropengawal mengikut susunan kod anda dengan tepat. Program di bawah akan menggunakan panggilan pembantu seperti led_on(led1) supaya kod itu dapat dibaca seperti tindakan fizikal yang anda mahu lihat.
Jika anda menulis:
led_on(led1);
ThisThread::sleep_for(500ms);
led_on(led2);
kemudian LED 1 harus dihidupkan sebelum LED 2.
LED 1 akan kekal dihidupkan semasa LED 2 dihidupkan, kerana kod itu belum memanggil led_off(led1) lagi.
Pelajaran ini menggunakan tiga pin keluaran Mbed yang tersedia dalam makmal STM32 WB55RG:
- PB_13
- PB_14
- PB_15
Ini ialah keluaran LED hijau tersuai pada papan latihan. Dalam contoh CodeIDE Mbed tempatan, ia aktif-rendah: menulis 0 menghidupkan LED dan menulis 1 mematikannya. Itulah sebabnya kod pemula menggunakan fungsi pembantu dan bukannya meminta anda mengingati polariti 0/1 mentah.
Dalam Mbed, setiap baris DigitalOut mencipta satu objek keluaran yang disambungkan kepada satu pin STM32. Objek mengekalkan nilai terakhirnya semasa program menunggu, jadi ThisThread::sleep_for(500ms) menjeda kod tanpa mengubah keadaan LED yang baru anda tetapkan.
Gunakan pemetaan ini apabila anda membandingkan kod anda dengan kamera:
- led1 = PB_13 = LED hijau paling kiri dalam kumpulan tiga-LED.
- led2 = PB_14 = LED hijau tengah dalam kumpulan itu.
- led3 = PB_15 = LED hijau paling kanan dalam kumpulan itu.
Tiga keluaran LED hijau yang digunakan dalam pelajaran ini
Gunakan paparan kamera untuk menyemak susunan kumpulan LED ini. Jika LED sukar dibezakan, perlahankan corak kepada 1000ms, gunakan pemetaan di atas dan catat tidak dapat dibezakan melalui kamera hanya jika paparan kamera masih tidak dapat mengesahkan susunannya.
Dalam takrif fungsi pembantu DigitalOut &led, tanda & bermakna pembantu berfungsi pada objek LED sebenar yang anda masukkan, bukan pada salinan. Dalam 500ms, ms bermaksud milisaat.
Jika LED 1 dihidupkan, kemudian LED 2, kemudian LED 3, tanpa panggilan led_off() antara mereka, apakah yang muncul sebelum all_off()?
Jalankan urutan berpandu
26 min
Peruntukkan dua proses kompilasi/muat naik dan kira-kira 20 minit masa makmal aktif. Versi 1 menggunakan urutan kiri ke kanan dan 500ms; versi 2 hanya menukar sela masa langkah kepada sama ada 250ms atau 1000ms. Semasa menunggu giliran, jawab soalan tentang corak kumulatif, pilih sela masa kedua dan tulis urutan yang dijangkakan.
Kod permulaan mempunyai empat ruang letak yang menghalang kompilasi. Gantikan TODO 1-4 sebelum menyimpan atau mengkompil. Cari TODO; fail yang sedia untuk dikompil sepatutnya tidak mengandungi sebarang padanan.
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan kod di bawah. Untuk kompilasi 1, tetapkan TODO 1 kepada
500ms, kemudian tetapkan TODO 2-4 kepadaled1,led2danled3dalam susunan itu.Cari
TODO. Apabila tiada lagi, simpan, jalankan kompilasi 1 dan muat naik.Perhatikan sekurang-kurangnya tiga kitaran lengkap dan perhatikan susunan dan pemasaan LED.
Tukar hanya
step_delaydaripada500mskepada sama ada250msatau1000ms.Simpan
main.cpp, jalankan kompilasi 2, muat naik dan bandingkan sama ada pemasaan baharu lebih mudah atau lebih sukar untuk disahkan.Hanya selepas langkah 7 selesai, klik Tandai amalan sebagai selesai.
#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: gantikan ruang letak masa dengan 500ms untuk kompilasi 1.
const auto step_delay = TODO_STEP_DELAY;
const auto reset_delay = 1000ms;
all_off();
while (true) {
// TODO 2-4: pilih setiap LED sekali untuk membentuk susunan kiri ke kanan.
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);
}
}
Rakam dua versi yang diuji secara berasingan. Oleh kerana kod pemula membiarkan LED sebelumnya dihidupkan sehingga all_off() berjalan, jujukan yang dijangka kelihatan adalah terkumpul: LED 1 on -> LEDs 1+2 on -> LEDs 1+2+3 on -> all off.
Untuk versi 500ms asal, catat:
- tertib kelihatan atau corak terkumpul yang anda sahkan dalam kamera;
- sama ada kedudukan LED sepadan dengan pemetaan led1/led2/led3;
- perkara yang menjadikan corak mudah atau sukar untuk disahkan.
Untuk versi pemasaan yang diubah, catat:
- nilai sela masa yang anda uji;
- sama ada susunan yang boleh dilihat atau corak terkumpul kekal sama;
- sama ada pemasaan baharu menjadikan corak lebih mudah atau sukar untuk disahkan;
- tidak dapat dibezakan melalui kamera hanya jika anda memperlahankan corak dan masih tidak dapat mengesahkan susunannya.
Pilih satu panggilan pembantu yang mengubah LED. Namakan baris tersebut, seperti led_on(led2);, dan terangkan perubahan fizikal yang disebabkan oleh baris itu dan bila ia berlaku dalam jujukan.
Terangkan pilihan pemasaan terakhir anda
13 min
Kekalkan urutan TODO dari kiri ke kanan dalam fail akhir. Satu-satunya perubahan untuk kompilasi kedua ialah pilihan masa: 250ms memberikan perbandingan yang lebih pantas; 1000ms memberikan perbandingan yang lebih perlahan dan mesra kamera. Kedua-duanya sah jika bukti sepadan.
Nyatakan step_delay akhir anda dalam milisaat. Terangkan mengapa anda memilih 250ms atau 1000ms dan sama ada bukti kamera menyokong pilihan itu.
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi susunan kiri-ke-kanan yang diuji, pilihan masa akhir anda dan tiada teks TODO. Kemudian klik Lampirkan kod yang disimpan dan Serahkan penyerahan.