文章目录
- 一.舵机介绍
- 二.舵机工作原理
- 180度舵机
- 360度舵机
- 三.利用jetson nano GPIO控制舵机
- 1.jetson nano与舵机接
- 2.c++编写程序输出脉冲(Qt做界面)
一.舵机介绍
舵机,是指在自动驾驶仪中操纵飞机舵面(操纵面)转动的一种执行部件。分有:
- 电动舵机,由电动机、传动部件和离合器组成。接受自动驾驶仪的指令信号而工作,当人工驾驶飞机时,由于离合器保持脱开而传动部件不发生作用。
- 液压舵机,由液压作动器和旁通活门组成。当人工驾驶飞机时,旁通活门打开,由于作动器活塞两边的液压互相连通而不妨害人工操纵。此外,还有电动液压舵机,简称“电液舵机”。
二.舵机工作原理
180度舵机
舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。最重要的一点是,不同舵机的最大转动角度可能不相同,但是其中间位置的脉冲宽度是一定的,那就是1.5ms。
角度是由来自控制线的周期且持续的含有固定脉冲宽度的信号所产生。这种控制方法叫做脉冲调制。周期信号中的脉冲长短决定舵机转动多大角度。例如:发出的周期为20ms的信号,信号中的高位持续时间为1.5毫秒,1.5毫秒脉冲会使舵机转动到中间位置(对于180°舵机来说,就是90°位置)。当控制系统发出某个周期脉冲指令,舵机就会移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,否则舵机的角度不会一直不变。
当舵机接收到一个小于1.5ms宽度的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲宽度大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。如下图:
舵机的转动速度取决于起始角度和目标角度的差,差别越大转得越快,当接近时就放慢角度。所以没有专门的函数控制转速。但在大角度转动时,你可以用程序把它设成几个小角度递进,这样可以放慢速度。也通过delay进行慢速,但快速的话只有加高电压了 。
360度舵机
360度舵机与一般舵机的区别是:给一般舵机一个PWM信号,舵机会转到一个特定角度,而给360度舵机一个PWM信号,舵机会以一个特定的速度转动,类似与电机。但与电机不同的是,360舵机是闭环控制,速度控制稳定。
PWM 信号与360舵机转速的关系:
0.5ms----------------正向最大转速;
1.5ms----------------速度为0;
2.5ms----------------反向最大转速;
三.利用jetson nano GPIO控制舵机
利用jetson nano自带的GPIO口可以输出特定大小的脉冲信号,即可达到控制舵机的旋转角度。
1.jetson nano与舵机接
2.c++编写程序输出脉冲(Qt做界面)
这里用C++进行GPIO口的输出电平控制,Qt做软件界面,软件界面上的滑块每次改变位置时,舵机都会转到相应的位置,界面上的LCD会显示当前的舵机旋转角度
界面
cmakeList.txt文件
#cmakeList.txt文件
cmake_minimum_required(VERSION 3.5)
project(steeringEngineTest VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Gui)
find_package(JetsonGPIO)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
add_executable(${PROJECT_NAME} ${PROJECT_SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Gui)
target_link_libraries(${PROJECT_NAME} PRIVATE JetsonGPIO)
main.cpp
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.h
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_horizontalSlider_valueChanged(int value); //界面滑块所表示的值变化后的回调函数,在这里进行脉冲宽度的控制输出
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
//mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <JetsonGPIO.h>
#include <unistd.h>
#include <QDebug>
using namespace std;
using namespace GPIO;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//软件初始化时,设置GPIO的控制模式以及对信号引脚(11)进行设置输出模式
GPIO::setmode(GPIO::BOARD);
GPIO::setup(11, GPIO::OUT);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
//滑块变化回调函数,这里对引脚进行特定宽度的脉冲输出,输出脉冲宽度取决于回调函数的value值,这个值代表界面中滑块当前位置的值
//1.首先,把引脚电平拉高
GPIO::output(11, GPIO::HIGH);
//2.延时,固定脉冲宽度
usleep(value);
//3.然后拉低脉冲
GPIO::output(11, GPIO::LOW);
//4.拉低的时间加上高电平的时间要大于20ms,这样就输出了一个周期的脉冲,舵机就会根据这个周期中的脉冲宽度的大小转到相应的角度,
// 并自行保持住,直到接收到下一次周期信号
usleep(30000-value);
//将角度显示到界面上
ui->lcdNumber->display(180*(value-500)/2000);
qDebug() << value;
}