Pelajaran Teach
STM32 Mbed CodeIDE (3/8): butang, perintang tarik naik dan nyahpantul
Pelajar membaca butang aktif-rendah dengan DigitalIn dan PullUp dalam Mbed, menguji nyahpantul dan mengaitkan bukti butang dengan keluaran LED pada papan STM32 sebenar.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Baca input butang tekan dengan Mbed
DigitalIn.Sahkan sama ada butang berkelakuan sebagai aktif-rendah dalam paparan makmal semasa.
Menggunakan semakan nyahpantul tunggu-kemudian-sahkan sebelum menerima satu tekanan butang.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Baca sebelum bertindak balas
10 min
Input menukar corak cahaya tetap menjadi pengawal yang bertindak balas kepada seseorang, suis atau penderia. Anda akan terlebih dahulu membuktikan nilai yang dibaca apabila butang dilepaskan dan ditekan, kemudian menambah semakan nyahpantul mudah supaya atur cara bertindak balas kepada satu tekanan sebenar dan bukannya sentuhan yang melantun.
Panduan CodeIDE menyenaraikan PC_5, PC_6 dan PC_10 antara pin butang/sensor yang tersedia dalam makmal STM32 WB55RG. Pelajaran ini menggunakan PC_5 dahulu dan mengajar anda untuk mengesahkan nilai yang ditekan sebelum membina logik di sekelilingnya.
Banyak litar butang tarik naik adalah aktif-rendah, bermakna aras elektrik yang ditekan adalah lebih rendah daripada aras yang dilepaskan. Pendawaian makmal masih mesti diukur sebelum anda meletakkan mana-mana nilai ke dalam logik kawalan.
DigitalIn button(PC_5, PullUp);
int raw = button.read();
DigitalIn ialah objek input Mbed untuk membaca pin. PullUp meminta Mbed menggunakan perintang tarik naik dalaman mikropengawal, jadi pin mempunyai nilai yang ditentukan apabila butang dilepaskan. button.read() mengembalikan nilai 0/1 semasa pada masa kod anda memanggilnya.
UI makmal jauh mempunyai kawalan butang bulat. Dalam pelajaran ini, gunakan B1 untuk PC_5.
Semakan nyahpantul mudah menggunakan dua bacaan
Nilai manakah yang kemudiannya akan menjadi pressed_value dalam atur cara jujukan anda?
Ukur nilai butang
20 min
Peruntukkan tiga proses kompilasi/muat naik dan kira-kira 25 minit masa makmal aktif: program siasatan, jujukan, kemudian jujukan dengan satu sela masa yang diubah. Jika perlu menunggu giliran, sediakan dua ruang pemerhatian dan baca TODO 1-2 sebelum sesi bermula.
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan program siasatan di bawah.
Simpan, jalankan kompilasi 1 dan muat naik.
Tonton panel konsol berhampiran bahagian bawah paparan makmal. Makmal menguruskan sambungan bersiri; gunakan baris bercetak, bukan terminal berasingan.
Biarkan butang dilepaskan dan salin satu baris
button_raw.Tahan
B1sehingga sekurang-kurangnya satu atau dua baris konsol baharu muncul, kemudian salin barisbutton_rawyang diubah.Catat bacaan ketika butang dilepaskan dan ditekan sebelum menukar kod.
Hanya selepas langkah 8 selesai, klik Tandai amalan sebagai selesai.
#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);
}
}
Catat bacaan ketika butang dilepaskan dan ditekan secara berasingan. Salin nombor button_raw yang tepat daripada konsol.
Garis bersiri anda yang disalin hendaklah menggunakan nilai yang diperhatikan, bukan nilai yang dibekalkan oleh pelajaran:
button_raw=<nilai diperhatikan ketika butang dilepaskan>
button_raw=<nilai diperhatikan ketika butang ditekan>Dengan butang dilepaskan, tulis satu baris dalam format ini:
Kawalan diuji: B1 | button_raw=...
Gantikan titik dengan nilai tepat yang disalin daripada konsol.
Dengan B1 ditekan, tulis satu baris dalam format ini:
Kawalan: B1 | button_raw=... | ditahan selama: ... s | berubah?: ya/tidak
Gunakan nilai konsol yang tepat dan masa anda memegang butang sebelum membuat keputusan
sama ada bacaan telah berubah.
Tulis keputusan anda sebagai: dilepaskan=<nilai diperhatikan>, ditekan=<nilai diperhatikan>. Kemudian nyatakan sama ada nilai ketika ditekan lebih rendah daripada nilai ketika dilepaskan, lalu menunjukkan input aktif-rendah dalam sesi ini.
Mulakan jujukan dengan satu tekanan
22 min
Sekarang gunakan B1 untuk memulakan jujukan tiga LED. Masukkan nilai ketika butang ditekan yang anda ukur melalui siasatan sendiri dan bukannya menyalin nilai andaian.
Sentuhan mekanikal di dalam butang boleh bertukar-tukar antara 0 dan 1 selama beberapa milisaat walaupun butang hanya ditekan sekali. Nyahpantul bermaksud menunggu sebentar dan membaca semula supaya satu tekanan fizikal tidak dianggap sebagai beberapa tekanan.
Tiga perlindungan mempunyai tugas yang berbeza:
- Pengesahan nyahpantun: tunggu 50 ms, ambil sampel sekali lagi dan terima hanya jika sampel kedua masih sama dengan nilai ditekan yang diperhatikan.
- Sekatan semasa jujukan: run_sequence() menyekat, jadi input tidak dibaca semasa jujukan LED berjalan. Ini menghalang permulaan kedua semasa jujukan; ini bukan nyahpantul.
- Sedia semula selepas butang dilepaskan: selepas jujukan, tunggu sehingga input berbeza daripada nilai ditekan sebelum menerima tekanan seterusnya. Ini menghalang butang yang terus ditahan daripada memulakan semula jujukan dengan serta-merta; ini juga bukan nyahpantul.
Kod permulaan mempunyai dua ruang letak yang menghalang kompilasi. TODO 1 menggunakan nilai tekan yang anda perhatikan. TODO 2 mestilah syarat sebenar untuk menolak sampel kedua. Gantikan kedua-duanya dan cari TODO sebelum mengkompil.
Gantikan
main.cppdengan program di bawah dan lengkapkan TODO 1-2 daripada bukti siasatan anda.Cari
TODO. Apabila tiada lagi, simpan, jalankan kompilasi 2 dan muat naik.Tekan dan lepaskan
B1, dan tonton urutan penuh.Tekan butang berulang kali semasa urutan berjalan. Tekanan tambahan semasa urutan diabaikan. Untuk memulakan urutan lain, tunggu sehingga urutan selesai, lepaskan butang, kemudian tekan sekali lagi.
Tukar satu sela masa yang kelihatan dalam
run_sequence()daripada500mskepada1000ms. Jangan ubah sela nyahpantul50msatau sela semakan selepas dilepaskan20ms. Simpan, lakukan kompilasi 3, muat naik dan bandingkan.Hanya selepas langkah 5 selesai, klik Tandai amalan sebagai selesai.
#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: gantikan dengan nilai tepat ketika butang ditekan yang diperhatikan dalam siasatan.
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);
// TODO 2: tolak tekanan jika sampel kedua tidak lagi ditekan.
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);
}
}
Catat tiga semakan jujukan pendek. Simpan ramalan dan bukti berasingan.
Ujian tekanan biasa:
- meramalkan bilangan jujukan bermula: satu;
- tertib LED diperhatikan;
- baris bersiri yang membuktikan permulaan dan penyiapan.
Tekan berulang semasa urutan sedang berjalan:
- ramalan bilangan permulaan sebelum ready for next press;
- memerhati bilangan garisan press detected sebelum ready for next press.
Versi dengan sela masa diubah:
- sela masa yang diubah, dalam milisaat;
- meramalkan perbezaan yang boleh dilihat;
- perbezaan yang boleh dilihat selepas kompilasi 3.
Pernyataan manakah yang betul-betul memisahkan nyahlantun daripada kunci keluar jujukan?
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi nilai tekan anda yang diperhatikan, keadaan sampel kedua, perubahan jujukan 1000ms yang diuji dan tiada TODO. Kemudian lampirkan dan serahkan.