Pelajaran Teach
STM32 Mbed CodeIDE (7/8): kawalan kedudukan servo
Pelajar mengawal servo dengan lebar nadi Mbed PWM, menguji kedudukan dengan selamat dan merekodkan bukti pergerakan anggaran daripada persediaan STM32 jauh.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Kawal keluaran servo dengan Mbed
PwmOut.Petakan bacaan potensiometer kepada sudut anggaran.
Gunakan bukti bersiri untuk menyokong pemerhatian yang mungkin sukar dinilai secara visual.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Asas lebar nadi servo
10 min
Sesetengah keluaran perlu bergerak, bukan sekadar menyala. Servo digunakan apabila pengawal perlu menunjuk, membuka, mengemudi, mengunci atau meletakkan sesuatu pada kedudukan yang boleh diulang. Dalam pelajaran ini, anda akan menghubungkan arahan kedudukan servo dengan bacaan potensiometer.
PWM untuk LED mengubah kecerahan purata. Servo juga menggunakan denyutan berulang, tetapi nilai penting ialah lebar denyut:
- kira-kira 700 mikrosaat: satu hujung anggaran pergerakan
- kira-kira 1500 mikrosaat: tengah
- kira-kira 2300 mikrosaat: hujung anggaran pergerakan yang satu lagi
Dalam Mbed, isyarat servo dihasilkan dengan PwmOut. servo.period_ms(20) menetapkan tempoh ulangan 20 ms biasa, dan servo.pulsewidth_us(...) menukar lebar denyutan tinggi yang ditafsirkan oleh servo sebagai kedudukan.
Sudut mekanikal sebenar boleh berbeza. Pelajaran ini sengaja menggunakan julat latihan konservatif 700-2300 us, yang berada dalam julat lebih luas yang pernah diuji pada persediaan jauh ini. Jangan arahkan nilai di luar 700-2300 us. Jika lengan bergetar berterusan, kelihatan menekan hentian mekanikal atau tidak stabil selepas bergerak, hentikan ujian dan beritahu pengajar; jangan luaskan julat.
Tugas anda ialah untuk menunjukkan hubungan terkawal: nilai potensiometer rendah menghasilkan satu kedudukan, manakala nilai tinggi menghasilkan kedudukan lain yang jelas berbeza dan keluaran bersiri sepadan dengan pemetaan anda.
Kamera mungkin menunjukkan servo hanya sebagai lengan kecil pada papan latihan. Anggap angle sebagai anggaran yang dikira oleh kod anda. Bukti terkuat ialah gabungan pulse_us bersiri, anggaran sudut bersiri, dan perubahan ketara dalam kedudukan servo luas.
Senarai semak pin dan bukti untuk pelajaran ini:
- Output isyarat servo: PA_15
- Potensiometer yang digunakan kemudian: Pot. pot2 -> PC_1
- Bukti bersiri yang diperlukan: pulse_us
- Bukti kamera: perubahan kedudukan servo luas, bukan sudut yang diukur dengan tepat
Daripada potensiometer kepada nadi servo
Gunakan kamera untuk bukti kedudukan umum dan konsol untuk
bukti pulse_us. Rajah menunjukkan laluan arahan, bukan sudut yang tepat.
Jika kod anda memetakan nilai potensiometer rendah kepada 700 mikrosaat dan nilai tinggi kepada 2300 mikrosaat, apakah yang sepatutnya berlaku apabila anda mengubah potensiometer daripada rendah kepada tinggi?
Jalankan ujian tiga kedudukan
20 min
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan program di bawah.
Simpan, kompil dan muat naik.
Tonton kamera dan konsol bersama-sama.
Perhatikan tiga kedudukan servo luas.
Catat lebar nadi bersiri dan apa yang anda perhatikan.
#include "mbed.h"
PwmOut servo(PA_15);
void set_servo_us(int pulse_us) {
servo.pulsewidth_us(pulse_us);
}
int main() {
servo.period_ms(20);
printf("Servo three-position test start\n");
while (true) {
set_servo_us(700);
printf("pulse_us=700 position=low\n");
ThisThread::sleep_for(2000ms);
set_servo_us(1500);
printf("pulse_us=1500 position=middle\n");
ThisThread::sleep_for(2000ms);
set_servo_us(2300);
printf("pulse_us=2300 position=high\n");
ThisThread::sleep_for(2000ms);
}
}
Isi tiga baris, satu bagi setiap lebar nadi tetap: 700 us, 1500 us dan 2300 us. Lebar nadi ialah nombor dalam mikrosaat (us); Kedudukan bercetak ialah label tepat pada konsol; dan Pergerakan atau kedudukan yang diperhatikan ialah penerangan umum daripada kamera. Jika gerakan tidak jelas, pilih tidak jelas dan huraikan perkara yang dapat dilihat tanpa mereka-reka sudut tepat. Biarkan baris tambahan yang tidak digunakan kosong sepenuhnya.
Jadual lebar nadi tetap servo
Lengkapkan baris 700 us, 1500 us dan 2300 us. Biarkan baris tambahan yang tidak digunakan kosong.
| Lebar nadi us | Kedudukan bercetak | Pergerakan atau kedudukan diperhatikan | Keyakinan |
|---|---|---|---|
Petakan potensiometer kepada sudut servo
22 min
Sekarang petakan bacaan AnalogIn pada PC_1 kepada sudut anggaran dan lebar nadi. Gunakan peluncur Pot. pot2 yang dipetakan kepada PC_1.
Gantikan
main.cppdengan program di bawah.Lengkapkan TODO 1 untuk memetakan bacaan 0.0-1.0 kepada 700-2300 mikrosaat.
Lengkapkan TODO 2 supaya lebar nadi yang dipetakan ditulis pada servo.
Simpan, kompil dan muat naik. Ini ialah kitaran 2 daripada 2 yang dirancang.
Gerakkan peluncur
Pot. pot2ke kedudukan rendah, tengah dan tinggi.Catatkan peratus cetakan, anggaran sudut, lebar nadi dan pergerakan yang diperhatikan.
#include "mbed.h"
AnalogIn pot(PC_1);
PwmOut servo(PA_15);
int main() {
servo.period_ms(20);
printf("Potentiometer servo control start\n");
while (true) {
float reading = pot.read();
int percent = (int)(reading * 100.0f);
int angle = (int)(reading * 180.0f);
// TODO 1: gantikan 700 dengan pemetaan penuh 700-2300 us.
int pulse_us = 700;
// TODO 2: gantikan 700 dengan pembolehubah pulse_us yang dipetakan.
servo.pulsewidth_us(700);
printf("percent=%d angle=%d pulse_us=%d\n",
percent,
angle,
pulse_us);
ThisThread::sleep_for(500ms);
}
}
Isi tiga kes yang diperlukan: kedudukan potensiometer rendah, tengah dan tinggi. Peratus bersiri mempunyai unit %; Anggaran sudut bersiri ialah nilai yang dikira dalam darjah, bukan ukuran kamera; Lebar nadi bersiri berada dalam mikrosaat (us); dan medan kamera hanya merekodkan kedudukan umum. Biarkan mana-mana baris tambahan yang tidak digunakan kosong sepenuhnya.
Jadual bukti potensiometer kepada servo
Lengkapkan baris rendah, tengah dan tinggi dengan nilai konsol dan bukti kamera yang luas. Biarkan baris tambahan yang tidak digunakan kosong.
| Kedudukan potensiometer | Peratus bersiri % | Anggaran sudut bersiri darjah | Lebar nadi bersiri us | Kedudukan servo diperhatikan |
|---|---|---|---|---|
Gunakan baris rendah, tengah dan tinggi anda untuk menerangkan sama ada potensiometer mengawal servo seperti yang diharapkan. Sertakan aliran pulse_us bersiri dan pemerhatian kamera yang luas.
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi versi servo terkawal potensiometer, kemudian klik Lampirkan kod yang disimpan. Selepas kod dilampirkan, klik Serah serahan di bahagian bawah aktiviti.