0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Arduino制造一個(gè)自動(dòng)平衡機(jī)器人

科技觀察員 ? 來(lái)源:八色木 ? 作者:八色木 ? 2022-04-02 17:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文將介紹如何使用Arduino來(lái)制造一個(gè)自動(dòng)平衡機(jī)器人,并介紹其控制原理。

自平衡機(jī)器人的控制原理

poYBAGJIFzSAS9J1AAaQZ19FzRM458.png

自平衡機(jī)器人

自平衡機(jī)器人聽(tīng)名字比較高大上,但實(shí)際生活中其中已經(jīng)可以看到很多成品了,像比較早期高端的賽格威,滿(mǎn)大街跑的小米平衡車(chē)等,都屬于自平衡機(jī)器人的范疇。那他是如何工作的呢?首先我們要知道,自平衡機(jī)器人為了讓機(jī)器人保持平衡,電機(jī)的運(yùn)動(dòng)必須要能抵消機(jī)器人的自然重力導(dǎo)致的姿態(tài)變化,比如傾倒、后仰等。要實(shí)現(xiàn)這個(gè)抵消的動(dòng)作平衡機(jī)器人就需要能反饋并糾正這些變化的因素。在本項(xiàng)目中,反饋元件是MPU6050及其內(nèi)置的陀螺儀和加速度計(jì),它在三個(gè)軸上都提供加速度和旋轉(zhuǎn)反饋功能。

Arduino控制器通過(guò)它來(lái)知道機(jī)器人當(dāng)前的姿態(tài)信息,從而通過(guò)這些信息控制電機(jī)和車(chē)輪的運(yùn)動(dòng),使機(jī)器人能夠保持平衡。

poYBAGJIFzuACRU9AAHtK3wB4mw293.png

感知到機(jī)器人的傾斜,通過(guò)驅(qū)動(dòng)車(chē)輪來(lái)保持機(jī)器人直立。

自平衡機(jī)器人的電路原理

pYYBAGJIFz-AV4cVAAK9G8-2pQo425.png

自平衡機(jī)器人的電路原理圖

在電路連接方面, 首先我們要將MPU6050連接到Arduino,可查閱:Arduino如何使用MPU6050,然后參照上圖所示連接其余的組件。L298N模塊可以為Arduino提供所需的+5V(詳情見(jiàn): Arduino直流電機(jī)控制教程 中的相關(guān)內(nèi)容 )。本文中,我們選擇了單獨(dú)的電源為電機(jī)和電路供電。請(qǐng)注意,如果您計(jì)劃為L(zhǎng)298N模塊使用大于+12V的電源電壓,您需要移除剛好位于+12V輸入上方的跳線。

構(gòu)建機(jī)器人

pYYBAGJIF0aAUZJOAAV28BIL43Y475.png

機(jī)器人框架

機(jī)器人框架采用一些簡(jiǎn)單的材料黏貼完成,如果有3D打印機(jī)也可以嘗試設(shè)計(jì)一款適合自己風(fēng)格外殼框架。具體可參閱:設(shè)計(jì)自平衡機(jī)器人。

poYBAGJIF0yAcUJoAAev6fyVosI763.png

機(jī)器人主電路板

主電路板主要包括Arduino Nano和MPU6050和一塊L298N電機(jī)驅(qū)動(dòng)板。

自平衡機(jī)器人本質(zhì)上是一個(gè)倒立鐘擺。如果質(zhì)量中心相對(duì)于輪軸較高,則可以更好地平衡。較高的質(zhì)心意味著較高的質(zhì)量慣性矩,這對(duì)應(yīng)于較低的角加速度(下降較慢)。這就是為什么我把電池組放在上面。然而,機(jī)器人的高度是根據(jù)材料的可用性來(lái)選擇的。 制作時(shí)不必過(guò)分強(qiáng)求。

PID控制原理

在控制中,保持某個(gè)變量(機(jī)器人的位置)的穩(wěn)定需要一個(gè)稱(chēng)為PID(比例積分導(dǎo)數(shù))的特殊控制器。這些參數(shù)都存在“增益”的問(wèn)題,通常稱(chēng)為Kp、Ki和Kd。PID需要在期望值(輸入值)和實(shí)際值(輸出值)之間進(jìn)行校正。輸入和輸出之間的差異稱(chēng)為“誤差”。PID控制器通過(guò)不斷調(diào)整輸出將誤差減小到最小值。在本文的Arduino自平衡機(jī)器人中,這些值的設(shè)置遵循以下原則:

使Kp Ki Kd等于0。

Kp的調(diào)整:Kp值太低會(huì)使機(jī)器人摔倒,因?yàn)闆](méi)有足夠的校正值。太大的Kp會(huì)使機(jī)器人瘋狂地來(lái)回移動(dòng)。一個(gè)合適的Kp值會(huì)使機(jī)器人稍微來(lái)回移動(dòng)或者稍微擺動(dòng)即可。

設(shè)定好Kp值后,需要調(diào)整Kd值。適當(dāng)?shù)腒d值可以減小振動(dòng),直到機(jī)器人基本穩(wěn)定。同時(shí),即使它被推動(dòng),適當(dāng)?shù)腒d值也能讓機(jī)器人始終保持站立。

最后就是設(shè)置Ki值。因?yàn)槲覀兗词乖O(shè)定了Kp和Kd值,機(jī)器人在打開(kāi)電源時(shí)也會(huì)發(fā)生振動(dòng),但它會(huì)在一定的時(shí)間后穩(wěn)定下來(lái)。正確的Ki值可以縮短機(jī)器人穩(wěn)定的時(shí)間。

Arduino自平衡機(jī)器人代碼

要成功實(shí)現(xiàn)代碼安裝,需要四個(gè)外部庫(kù)文件來(lái)讓Arduino自平衡機(jī)器人正常工作。PID庫(kù)的引入使得計(jì)算P、I和D值變得相對(duì)容易。LMotorController庫(kù)文件用于L298N模塊驅(qū)動(dòng)兩個(gè)電機(jī),I2Cdev庫(kù)和MPU6050_6_Axis_MotionApps20庫(kù)用于從MPU6050讀取數(shù)據(jù)。你可以在這里下載包含這些庫(kù)文件的代碼。

#include

#include

#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE

#include "Wire.h"

#endif

#define MIN_ABS_SPEED 20

MPU6050 mpu;

// MPU control/status vars

bool dmpReady = false; // set true if DMP init was successful

uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU

uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)

uint16_t packetSize; // expected DMP packet size (default is 42 bytes)

uint16_t fifoCount; // count of all bytes currently in FIFO

uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars

Quaternion q; // [w, x, y, z] quaternion container

VectorFloat gravity; // [x, y, z] gravity vector

float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector

//PID

double originalSetpoint = 173;

double setpoint = originalSetpoint;

double movingAngleOffset = 0.1;

double input, output;

//adjust these values to fit your own design

double Kp = 50;

double Kd = 1.4;

double Ki = 60;

PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);

double motorSpeedFactorLeft = 0.6;

double motorSpeedFactorRight = 0.5;

//MOTOR CONTROLLER

int ENA = 5;

int IN1 = 6;

int IN2 = 7;

int IN3 = 8;

int IN4 = 9;

int ENB = 10;

LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight);

volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high

void dmpDataReady()

{

mpuInterrupt = true;

}

void setup()

{

// join I2C bus (I2Cdev library doesn't do this automatically)

#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE

Wire.begin();

TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)

#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE

Fastwire::setup(400, true);

#endif

mpu.initialize();

devStatus = mpu.dmpInitialize();

// supply your own gyro offsets here, scaled for min sensitivity

mpu.setXGyroOffset(220);

mpu.setYGyroOffset(76);

mpu.setZGyroOffset(-85);

mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

// make sure it worked (returns 0 if so)

if (devStatus == 0)

{

// turn on the DMP, now that it's ready

mpu.setDMPEnabled(true);

// enable Arduino interrupt detection

attachInterrupt(0, dmpDataReady, RISING);

mpuIntStatus = mpu.getIntStatus();

// set our DMP Ready flag so the main loop() function knows it's okay to use it

dmpReady = true;

// get expected DMP packet size for later comparison

packetSize = mpu.dmpGetFIFOPacketSize();

//setup PID

pid.SetMode(AUTOMATIC);

pid.SetSampleTime(10);

pid.SetOutputLimits(-255, 255);

}

else

{

// ERROR!

// 1 = initial memory load failed

// 2 = DMP configuration updates failed

// (if it's going to break, usually the code will be 1)

Serial.print(F("DMP Initialization failed (code "));

Serial.print(devStatus);

Serial.println(F(")"));

}

}

void loop()

{

// if programming failed, don't try to do anything

if (!dmpReady) return;

// wait for MPU interrupt or extra packet(s) available

while (!mpuInterrupt && fifoCount < packetSize)

{

//no mpu data - performing PID calculations and output to motors

pid.Compute();

motorController.move(output, MIN_ABS_SPEED);

}

// reset interrupt flag and get INT_STATUS byte

mpuInterrupt = false;

mpuIntStatus = mpu.getIntStatus();

// get current FIFO count

fifoCount = mpu.getFIFOCount();

// check for overflow (this should never happen unless our code is too inefficient)

if ((mpuIntStatus & 0x10) || fifoCount == 1024)

{

// reset so we can continue cleanly

mpu.resetFIFO();

Serial.println(F("FIFO overflow!"));

// otherwise, check for DMP data ready interrupt (this should happen frequently)

}

else if (mpuIntStatus & 0x02)

{

// wait for correct available data length, should be a VERY short wait

while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

// read a packet from FIFO

mpu.getFIFOBytes(fifoBuffer, packetSize);

// track FIFO count here in case there is > 1 packet available

// (this lets us immediately read more without waiting for an interrupt)

fifoCount -= packetSize;

mpu.dmpGetQuaternion(&q, fifoBuffer);

mpu.dmpGetGravity(&gravity, &q);

mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

input = ypr[1] * 180/M_PI + 180;

}

}

本文中的Kp、Ki、Kd的值可能適用也可能不適用你的機(jī)器人。如果不適用,那么按照上面PID控制原理中提到的方法來(lái)設(shè)當(dāng)調(diào)整。注意,代碼中的傾斜值設(shè)置為173度。如果有必要,你可以更改這個(gè)值,這是機(jī)器人必須保持的傾斜角度。此外,如果你的電機(jī)速度太快,你可以適當(dāng)調(diào)整motorSpeedFactorLeft和motorSpeedFactorRight值,一個(gè)成功的DIY是需要不斷調(diào)整的,重點(diǎn)是要有耐心,最后希望大家都能完成自己的自平衡機(jī)器人。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    213

    文章

    29666

    瀏覽量

    212500
  • Arduino
    +關(guān)注

    關(guān)注

    189

    文章

    6497

    瀏覽量

    190646
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)于兩輪自平衡機(jī)器人載重問(wèn)題

    現(xiàn)在流行的自平衡兩輪機(jī)器人,有人接觸過(guò)嗎,小弟最近想DIY個(gè)玩玩,現(xiàn)在碰到了個(gè)難點(diǎn),至今沒(méi)想
    發(fā)表于 11-24 11:20

    怎樣去制作種球上自平衡機(jī)器人

    畢業(yè)設(shè)計(jì)——球上平衡機(jī)器人前言本次畢業(yè)設(shè)計(jì)過(guò)程中,受到過(guò)許多人的幫助,收獲良多,在此將機(jī)器人整體開(kāi)源,同時(shí)總結(jié)一下機(jī)器人搭建過(guò)程中遇到的坑和未來(lái)的改進(jìn)方向。、
    發(fā)表于 08-17 08:44

    如何設(shè)計(jì)款球上自平衡機(jī)器人?

    如何設(shè)計(jì)款球上自平衡機(jī)器人?
    發(fā)表于 02-22 07:39

    制作個(gè)迷你平衡機(jī)器人

    描述迷你平衡機(jī)器人大家好。我知道互聯(lián)網(wǎng)上已經(jīng)有很多平衡機(jī)器人項(xiàng)目,但我也想做一個(gè)。實(shí)際上,我想制作些特別的東西并制作
    發(fā)表于 07-07 07:17

    平衡機(jī)器人護(hù)盾的資料分享

    描述平衡機(jī)器人護(hù)盾
    發(fā)表于 09-05 06:11

    DIY:簡(jiǎn)簡(jiǎn)單單自制平衡機(jī)器人

    DIY:簡(jiǎn)簡(jiǎn)單單自制平衡機(jī)器人
    發(fā)表于 01-18 20:40 ?25次下載

    機(jī)器人掌握自動(dòng)平衡術(shù) 未來(lái)可用于救災(zāi)

    來(lái)自中國(guó)廣東工業(yè)大學(xué)自動(dòng)化學(xué)院的研究人員開(kāi)發(fā)出了種新型自動(dòng)平衡機(jī)器人,開(kāi)發(fā)代號(hào)為Jet-HR1,該機(jī)器人可用噴氣動(dòng)力引擎調(diào)整重心,未來(lái)雙足機(jī)器人
    發(fā)表于 06-27 09:29 ?1033次閱讀

    如何利用超聲波傳感器制作個(gè)輪式自平衡機(jī)器人

    這是個(gè)輪式自平衡機(jī)器人。由 Arduino UNO 供電并由超聲波傳感器平衡,同時(shí)它能夠自我保持垂直
    的頭像 發(fā)表于 05-25 17:16 ?3677次閱讀
    如何利用超聲波傳感器制作<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>輪式自<b class='flag-5'>平衡機(jī)器人</b>

    迷你平衡機(jī)器人

    電子發(fā)燒友網(wǎng)站提供《迷你平衡機(jī)器人.zip》資料免費(fèi)下載
    發(fā)表于 07-08 09:34 ?16次下載
    迷你<b class='flag-5'>平衡機(jī)器人</b>

    Arduino平衡機(jī)器人盾牌代碼

    電子發(fā)燒友網(wǎng)站提供《Arduino平衡機(jī)器人盾牌代碼.zip》資料免費(fèi)下載
    發(fā)表于 08-15 14:36 ?3次下載
    <b class='flag-5'>Arduino</b><b class='flag-5'>平衡機(jī)器人</b>盾牌代碼

    Magicbit的自平衡機(jī)器人

    電子發(fā)燒友網(wǎng)站提供《Magicbit的自平衡機(jī)器人.zip》資料免費(fèi)下載
    發(fā)表于 11-24 11:15 ?0次下載
    Magicbit的自<b class='flag-5'>平衡機(jī)器人</b>

    帶有BT Web控制的Arduino平衡機(jī)器人

    電子發(fā)燒友網(wǎng)站提供《帶有BT Web控制的Arduino平衡機(jī)器人.zip》資料免費(fèi)下載
    發(fā)表于 11-29 10:27 ?0次下載
    帶有BT Web控制的<b class='flag-5'>Arduino</b>自<b class='flag-5'>平衡機(jī)器人</b>

    基于Arduino UNO的自平衡機(jī)器人

    平衡機(jī)器人,使用帶有 BluBug 和 Android 的車(chē)輪和 imu 6 軸傳感器平衡機(jī)器人。
    發(fā)表于 12-08 10:24 ?0次下載

    使用Arduino的自平衡機(jī)器人

    在這個(gè)項(xiàng)目中,我們將使用Arduino制造個(gè)DIY自平衡機(jī)器人。在此,我們可以學(xué)習(xí)平衡概念以及
    發(fā)表于 01-05 16:40 ?0次下載

    平衡機(jī)器人的構(gòu)建

    電子發(fā)燒友網(wǎng)站提供《自平衡機(jī)器人的構(gòu)建.zip》資料免費(fèi)下載
    發(fā)表于 02-09 11:54 ?0次下載
    自<b class='flag-5'>平衡機(jī)器人</b>的構(gòu)建

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品