Điều khiển động cơ Servo bằng STM32F103C8
Trong điện tử, động cơ Servo chủ yếu được sử dụng trong các dự án Robotics vì độ chính xác và xử lý dễ dàng. Động cơ servo có kích thước nhỏ hơn và chúng rất hiệu quả và tiết kiệm năng lượng. Chúng cung cấp mô-men quay cao và có thể được sử dụng để nâng hoặc đẩy trọng lượng theo đặc điểm kỹ thuật của động cơ. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về Động cơ Servo và Cách giao tiếp Servo với board STM32F103C8. Biến trở cũng được sử dụng để thay đổi vị trí trục của động cơ servo và màn hình LCD để hiển thị giá trị góc.
Linh kiện cần thiết
- Board STM32F103C8
- Động cơ Servo (SG90)
- LCD (16×2)
- Biến trở
- Breadboard
- Dây dẫn
Sơ đồ mạch và kết nối
Chi tiết chân SMT32F103C8
Trong STM32F103C8, có 10 chân ADC (PA0-PB1) và ở đây chúng tôi chỉ sử dụng một chân (PA3) cho analogread () để đặt vị trí trục của động cơ bằng biến trở. Ngoài ra trong số 15 chân PWM của STM32 (PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9), một chân sẽ được sử dụng để cung cấp xung cho động cơ (thường là màu cam).
Nối dây giữa STM32F103C8 và LCD
STM32F103C8 | LCD |
GND | VSS |
+5V | VDD |
Chân giữa của biến trở | V0 |
PB0 | RS |
GND | RW |
PB1 | E |
PB10 | D4 |
PB11 | D5 |
PC13 | D6 |
PC14 | D7 |
+5V | A |
GND | K |
Nối dây giữa động cơ Servo và STM32F103C8
STM32F103C8 |
SERVO |
+5V |
Đỏ (+5V) |
PA0 |
Cam (chân PWM ) |
GND |
Nâu (GND) |
Nối dây cho biến trở
Chúng tôi đã sử dụng hai biến trở
- Biến trở bên phải được sử dụng để thay đổi độ tương phản LCD. Nó có ba chân, chân trái là + 5V và phải là GND và chân giữa được nối với V0 của LCD.
- Biến trở bên trái được sử dụng để thay đổi vị trí trục của động cơ servo bằng cách điều khiển điện áp đầu vào tương tự, chân trái có đầu vào 3,3V và bên phải nối GND và đầu ra ở giữa được nối với (PA3) của STM32
Lập trình STM32 cho động cơ Servo
Giống như hướng dẫn trước đây của chúng tôi, chúng tôi đã lập trình STM32F103C8 với Arduino IDE thông qua cổng USB mà không cần sử dụng FTDI. Chúng ta có thể tiến hành lập trình nó như một Arduino. Code hoàn chỉnh được đưa ra ở cuối dự án.
Đầu tiên tải các tệp thư viện cho các chức năng của servo và LCD:
#include <Servo.h> #include <LiquidCstall.h>
Sau đó khai báo chân cho màn hình LCD và khởi tạo nó. Cũng khai báo một vài biến khác cho PWM và biến trở:
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;
Ở đây chúng tôi đã tạo ra servo biến đổi với kiểu dữ liệu Servo và gắn nó vào chân PWM được khai báo trước đó.
Servo servo; servo.attach (servoPin );
Sau đó đọc giá trị Analog từ chân PA3 vì đây là chân ADC, nó chuyển đổi điện áp tương tự (0-3.3) thành dạng số (0-4095)
analogRead (potPin);
Vì đầu ra analog có độ phân giải 12 bit, chúng ta cần lấy các giá trị trong phạm vi độ (0-170), nó chia giá trị ADC (0-4096) theo góc tối đa 170 độ để chúng ta chia cho 24.
angle = (reading/24);
Câu lệnh dưới đây giúp động cơ servo quay trục theo góc đã cho.
servo.write (angle);
Code hoàn chỉnh được đưa ra dưới đây.
//INTERFACE SERVO WITH STM32 //CIRCUIT DIGEST #include<Servo.h> //including servo library #include<LiquidCrystal.h> //including LCD display library const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; //declaring pin names and pin numbers of lcd LiquidCrystal lcd(rs,en,d4,d5,d6,d7); //setting lcd and its paramaters int servoPin = PA0; //declare and initialize pin for servo output PWM int potPin = PA3; //potentiometer ADC input Servo servo; // creating variable servo with datatype Servo void setup() { lcd.begin(16,2); //setting lcd as 16x2 lcd.setCursor(0,0); //setting cursor at first row and first column lcd.print("CIRCUIT DIGEST"); //puts CIRCUIT DIGEST in LCD lcd.setCursor(0,1); //setting cursor at second row and first column lcd.print("SERVO WITH STM32"); //puts SERVO WITH STM32 in LCD delay(3000); // delays for 3 seconds lcd.clear(); //clears lcd display servo.attach(servoPin); //it connects pin PA0 with motor as control feedback by providing pulses } void loop() { lcd.clear(); //clears lcd int angle; //declare varible angle as int int reading; //declare varible reading as int reading = analogRead(potPin); //read analog value from pin PA3 angle = (reading/24); //it divides ADC the value according to max angle 170 deg servo.write(angle); //it puts angle value at servo lcd.setCursor(0,0); //setting cursor at first row and first column lcd.print("ANGLE:"); //puts ANGLE in LCD lcd.print(angle); //puts value at angle delay(100); //delay in time }
Video