Teach Pelajaran dengan makmal jarak jauh

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.

  • STM32 Nucleo (Mbed)
  • 60 min
  • Elektronik vokasional menengah atas / pengenalan
  • ms-MY
  • Embedded systems
STM32 Nucleo (Mbed)
STM32 Nucleo (Mbed)

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.

1

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

Laluan daripada butang B1 pada PC5 kepada bacaan pertama, menunggu 50 ms, kemudian bacaan kedua sebelum menerima tekanan butang.

Nilai manakah yang kemudiannya akan menjadi pressed_value dalam atur cara jujukan anda?

2

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.

  1. Buka makmal STM32 Mbed CodeIDE.

  2. Buka main.cpp.

  3. Gantikan fail dengan program siasatan di bawah.

  4. Simpan, jalankan kompilasi 1 dan muat naik.

  5. Tonton panel konsol berhampiran bahagian bawah paparan makmal. Makmal menguruskan sambungan bersiri; gunakan baris bercetak, bukan terminal berasingan.

  6. Biarkan butang dilepaskan dan salin satu baris button_raw.

  7. Tahan B1 sehingga sekurang-kurangnya satu atau dua baris konsol baharu muncul, kemudian salin baris button_raw yang diubah.

  8. Catat bacaan ketika butang dilepaskan dan ditekan sebelum menukar kod.

  9. 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.

3

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.

  1. Gantikan main.cpp dengan program di bawah dan lengkapkan TODO 1-2 daripada bukti siasatan anda.

  2. Cari TODO. Apabila tiada lagi, simpan, jalankan kompilasi 2 dan muat naik.

  3. Tekan dan lepaskan B1, dan tonton urutan penuh.

  4. 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.

  5. Tukar satu sela masa yang kelihatan dalam run_sequence() daripada 500ms kepada 1000ms. Jangan ubah sela nyahpantul 50ms atau sela semakan selepas dilepaskan 20ms. Simpan, lakukan kompilasi 3, muat naik dan bandingkan.

  6. 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?

4

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.