(บล็อกที่ 20 )มอเตอร์เซอร์โวที่เชื่อมต่อกับ STM32F103C8
มอเตอร์ที่เชื่อมต่อด้วย STM32F103C8 (Blue Pill)
ในอิเล็คทรอนิคส์เซอร์โวมอเตอร์ส่วนใหญ่จะใช้ในโครงการหุ่นยนต์เนื่องจากความแม่นยำและการจัดการที่ง่าย มอเตอร์เซอร์โวมีขนาดเล็กและมีประสิทธิภาพและประหยัดพลังงาน มีแรงบิดสูงและสามารถใช้ยกหรือดันน้ำหนักตามข้อกำหนดของมอเตอร์ได้ ในบทแนะนำนี้เราจะเรียนรู้เกี่ยวกับ Servo Motor และ วิธีเชื่อมต่อเซอร์โวกับบอร์ด STM32F103C8 โพเทนชิมิเตอร์ยังเชื่อมต่อเพื่อเปลี่ยนตำแหน่งของเพลาของเซอร์โวมอเตอร์และจอ LCD เพื่อแสดงค่ามุม
องค์ประกอบที่จำเป็น
- คณะกรรมการ STM32F103C8 (Blue Pill)
- เซอร์โวมอเตอร์ (SG90)
- จอแอลซีดี (16x2)
- โอมิเตอร์
- เขียงหั่นขนม
- สายจัมเปอร์
แผนผังและการเชื่อมต่อ
รายละเอียด Pin SMT32F103C8
ในSTM32F103C8เรามีหมุด ADC 10 ตัว (PA0-PB1) และที่นี่เราใช้ขาเดียว (PA3) สำหรับแอดวานซ์อะนาล็อก ()สำหรับการกำหนดตำแหน่งของเพลาของมอเตอร์ด้วยโพเทนชิออมิเตอร์ นอกจากนี้ในระหว่าง 15 หมุด PWMของ STM32 (PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9) ขาเดียวจะถูกใช้เพื่อให้พัลส์ไปยัง Servo มอเตอร์ของ PWM พิน (มักเป็นสีส้ม)
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ PWM และ ADC ได้จากด้านล่างเพื่อดูบทความโดยละเอียด:
การเชื่อมต่อระหว่าง STM32F103C8 และ LCD
STM32F103C8 | จอแอลซีดี |
GND | VSS |
+ 5V | VDD |
ไปที่ศูนย์ PIN Potentiometer Center | V0 |
PB0 | อาร์เอส |
GND | RW |
Pb1 | E |
PB10 | D4 |
PB11 | D5 |
PC13 | D6 |
PC14 | D7 |
+ 5V | A |
GND | K |
การเชื่อมต่อระหว่างมอเตอร์เซอร์โวและ STM32F103C8
STM32F103C8
|
SERVO
|
+ 5V
|
RED (+ 5V)
|
PA0
|
ORANGE (ขา PWM)
|
GND
|
BROWN (GND)
|
การเชื่อมต่อโพเทนชิออมิเตอร์
เราใช้โพเทนชิออลสองตัวที่นี่
1. โพเทนทีมิเตอร์ด้านขวาใช้เพื่อปรับคอนทราสต์ LCD มีพินสามขาขาซ้ายสำหรับ + 5V และด้านขวาสำหรับ GND และขากลางจะเชื่อมต่อกับ V0 ของ LCD
2. โพเทนชิออมิเตอร์ด้านซ้ายใช้เพื่อปรับตำแหน่งของเพลาของเซอร์โวมอเตอร์โดยการควบคุมแรงดันไฟฟ้าอินพุตขาเข้าขาด้านซ้ายมีอินพุต 3.3V และด้านขวาจะมี GND และเอาท์พุทกลางไปที่ (PA3) ของ STM32
การเขียนโปรแกรม STM32 สำหรับ Servo Motor
เช่นเดียวกับการกวดวิชาก่อนหน้านี้เราได้ตั้งโปรแกรม STM32F103C8 พร้อม Arduino IDE ผ่านพอร์ต USBโดยไม่ใช้โปรแกรมเมอร์ FTDI เราสามารถดำเนินการเขียนโปรแกรมได้เหมือน Arduino รหัสสมบูรณ์จะได้รับด้านล่างเมื่อสิ้นสุดโครงการ
ขั้นแรกเราได้รวมไฟล์ไลบรารีไว้สำหรับฟังก์ชั่นเซอร์โวและแอลซีดี:
#include <Servo.h> #include <LiquidCrystal.h>
จากนั้นจึงประกาศหมุดสำหรับจอ LCD และเริ่มใช้งาน ยังประกาศตัวแปรอื่น ๆ ไม่กี่สำหรับ PWM และ Potentiometer:
const int rs = PB0, en = PB1, d4 = PB10, d5 = PB11, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7); int servoPin = PA0; int potPin = PA3;
ต่อไปนี้เราได้สร้างเซอร์โวเซอร์โวชนิดที่มีServoประเภทข้อมูลและแนบ PIN PWM ที่ประกาศไว้ก่อนหน้านี้
Servo servo; servo.attach (servoPin );
จากนั้นอ่านค่าอะนาล็อกจากขา PA3 เนื่องจากเป็นขา ADC จะแปลงแรงดันไฟฟ้าอนาล็อก (0-3.3) เป็นรูปแบบดิจิทัล (0-4095)
analogRead (potPin);
เนื่องจากดิจิตอลเอาต์พุตเป็นความละเอียด 12 บิตเราจำเป็นต้องได้รับค่าในช่วงองศา (0-170) จึงหารค่า ADC (0-4096) ตามมุมสูงสุด 170 องศาดังนั้นเราจึงหารด้วย24
มุม = (อ่าน / 24 );
คำสั่งด้านล่างทำให้เซอร์โวมอเตอร์หมุนเพลาตามมุมที่กำหนด
servo.write (มุม);
รหัสสมบูรณ์จะได้รับด้านล่างและอธิบายได้ดีโดยความเห็น
รหัส
// อินเทอร์เฟซ SERVO พร้อม STM32
// CIRCUIT DIGEST
// CIRCUIT DIGEST
#include <Servo.h> // รวมถึงไลบรารีเซอร์โว
# ประกอบด้วย <LiquidCrystal.h> // รวมทั้งไลบรารีการแสดงผล LCD
const int rs = PB0, en = PB1, d4 = PB10, d5 = PB11, d6 = PC13, d7 = PC14 ; // ประกาศชื่อ pin และหมายเลขพินของ LCD
LiquidCrystal lcd (rs, en, d4, d5, d6, d7); / / การตั้งค่า lcd และ paramaters ของ
# ประกอบด้วย <LiquidCrystal.h> // รวมทั้งไลบรารีการแสดงผล LCD
const int rs = PB0, en = PB1, d4 = PB10, d5 = PB11, d6 = PC13, d7 = PC14 ; // ประกาศชื่อ pin และหมายเลขพินของ LCD
LiquidCrystal lcd (rs, en, d4, d5, d6, d7); / / การตั้งค่า lcd และ paramaters ของ
int servoPin = PA0; / / ประกาศและเริ่มต้นขาสำหรับ servo output PWM
potPin int = PA3; อินพุต ADC Potentiometer
potPin int = PA3; อินพุต ADC Potentiometer
Servo servo; // สร้าง servo ตัวแปรกับ servo ประเภทข้อมูล
การตั้งค่าเป็นโมฆะ ()
{
lcd.begin (16,2); / / การตั้งค่า LCD เป็น 16x2
lcd.setCursor (0,0); // การตั้งค่าเคอร์เซอร์ที่แถวแรกและคอลัมน์แรก
lcd.print ("CIRCUIT DIGEST"); // ใส่ CIRCUIT DIGEST ใน LCD
lcd.setCursor (0.1); / / การตั้งค่าเคอร์เซอร์ที่แถวที่สองและคอลัมน์แรก
lcd.print ("SERVO WITH STM32"); / / ทำให้ servo กับ STM32 ใน
ความล่าช้าLCD (3000); / / ล่าช้าเป็นเวลา 3 วินาที
lcd.clear (); / / ล้าง
servo.attach จอแสดงผล(servoPin); / / มันเชื่อมต่อขา PA0 กับมอเตอร์เป็นข้อเสนอแนะการควบคุมโดยการให้พั
}
lcd.begin (16,2); / / การตั้งค่า LCD เป็น 16x2
lcd.setCursor (0,0); // การตั้งค่าเคอร์เซอร์ที่แถวแรกและคอลัมน์แรก
lcd.print ("CIRCUIT DIGEST"); // ใส่ CIRCUIT DIGEST ใน LCD
lcd.setCursor (0.1); / / การตั้งค่าเคอร์เซอร์ที่แถวที่สองและคอลัมน์แรก
lcd.print ("SERVO WITH STM32"); / / ทำให้ servo กับ STM32 ใน
ความล่าช้าLCD (3000); / / ล่าช้าเป็นเวลา 3 วินาที
lcd.clear (); / / ล้าง
servo.attach จอแสดงผล(servoPin); / / มันเชื่อมต่อขา PA0 กับมอเตอร์เป็นข้อเสนอแนะการควบคุมโดยการให้พั
}
void loop ()
{
lcd.clear (); / / ล้าง
มุม int lcd ; / / ประกาศ varible มุม
int อ่าน int; / / ประกาศอ่าน varible เป็น
อ่านint = analogRead (potPin); // อ่านค่าอะนาล็อกจากขา PA3
มุม = (อ่าน / 24); / / มันแบ่ง ADC ค่าตามมุมสูงสุด 170 deg
servo.write (มุม); / / มันทำให้ค่ามุมที่ servo
lcd.setCursor (0,0); // การตั้งค่าเคอร์เซอร์ที่แถวแรกและคอลัมน์แรก
lcd.print ("ANGLE:"); // ใส่ ANGLE ใน LCD
lcd.print (มุม); / / ทำให้ค่าที่
ล่าช้ามุม(100); // delay in time
}
{
lcd.clear (); / / ล้าง
มุม int lcd ; / / ประกาศ varible มุม
int อ่าน int; / / ประกาศอ่าน varible เป็น
อ่านint = analogRead (potPin); // อ่านค่าอะนาล็อกจากขา PA3
มุม = (อ่าน / 24); / / มันแบ่ง ADC ค่าตามมุมสูงสุด 170 deg
servo.write (มุม); / / มันทำให้ค่ามุมที่ servo
lcd.setCursor (0,0); // การตั้งค่าเคอร์เซอร์ที่แถวแรกและคอลัมน์แรก
lcd.print ("ANGLE:"); // ใส่ ANGLE ใน LCD
lcd.print (มุม); / / ทำให้ค่าที่
ล่าช้ามุม(100); // delay in time
}
วีดีโอ
ความคิดเห็น
แสดงความคิดเห็น