資料介紹
描述
系列介紹
本系列文章的重點是基于可在所有機器人中重復使用的服務創(chuàng)建可擴展的面向對象的模塊化軟件架構,而無需在每次創(chuàng)建新機器人時都從頭開始。
也許開始使用機器人技術的最具成本效益的方法是使用您可以在任何電子商務(全球速賣通、banggood 等)上購買的智能機器人汽車。但當然,購買它是最簡單的部分……您不需要專門購買它,即使有了Smart Robot Car Yo的描述,您也會發(fā)現許多不同的變體。我將為您使用此套件獲得的所有最常見模塊創(chuàng)建“服務”,因此您可以選擇您需要的服務,并將它們一起使用來創(chuàng)建您自己的智能機器人,而無需從頭開始對每個機器人進行操作你做。
指數
這是我將要創(chuàng)建的泰博機器人服務系列或文章的索引。
關于 L298N 電機驅動器
這種雙路雙向電機驅動器可讓您輕松獨立地控制兩個雙向最高 2A 的電機。
它是機器人應用的理想選擇,非常適合連接到每個電機只需要幾條控制線的任何 Arduino。
還集成了一個板載用戶可訪問的 5V 穩(wěn)壓器,可用于為需要高達約 1A 的穩(wěn)壓 5V 直流電源的任何其他電路供電。
特征:
- 電機電源:6 至 35 VDC
- 控制邏輯:標準TTL邏輯電平
- 輸出功率:每個高達 2 A
- 啟用和方向控制引腳
- IC散熱片
- 開機 LED 指示燈
- 4方向LED指示燈
創(chuàng)建服務
我們將使用在上一篇文章中創(chuàng)建的基服務類。如果您沒有閱讀它,請閱讀它,以便您了解我們將在這里創(chuàng)建的內容。
MotorService 基類
我們將創(chuàng)建另一個抽象層,它將定義任何 Motor Service 應具有的行為。這樣做,允許我們?yōu)槲覀冑徺I的任何硬件創(chuàng)建不同的電機服務,并以相同的方式使用我們擁有的任何電機服務(因此代碼幾乎沒有變化)。
MotorService 類應該允許我們:
- 設置電機的速度
- 獲取電機的速度
- 當然,從基服務類繼承的功能
MotorService 類頭文件 (MotorService.h) 如下所示:
#pragma once
#include "Arduino.h"
#include "Service.h"
namespace Taibot
{
class MotorService : public Service
{
public:
MotorService(bool isEnabled, bool isVerbose);
// Sets the speed of the motor
// speed = 0 then motor stops
// speed between -255 and -1 then motor runs backwards
// speed between 1 and 255 then motor runs forward
// Method that must be implemented in every MotorService specific implementation inheriting from the MotorService class
virtual void SetSpeed(int speed) = 0;
// Returns the current speed of the motor
// Method that must be implemented in every MotorService specific implementation inheriting from the MotorService class
virtual int GetSpeed() const = 0;
};
};
及其實現(MotorService.h):
#include "MotorService.h"
using namespace Taibot;
MotorService::MotorService(bool isEnabled, bool isVerbose) : Service(isEnabled, isVerbose)
{
}
如您所見,MotorService類除了為 MotorServices 實現定義契約外沒有做任何其他事情(現在我們將處理L298N 電機驅動模塊的實現)。
L298NMotorService類
最后我們得到了真正做某事的代碼!
此類是MotorService的實現,它控制L298N 電機驅動模塊。它遵循我們在前兩個基類中指定的布局。
像往常一樣,首先是頭文件(L298NMotorService.h):
#pragma once
#include "MotorService.h"
namespace Taibot
{
class L298NMotorService : public MotorService
{
public:
L298NMotorService(bool isEnabled, bool isVerbose, unsigned int pinEnable, unsigned int pinIn1, unsigned int pinIn2);
// Implements the method inherited from the base MotorService class
void SetSpeed(int speed);
// Implements the method inherited from the base MotorService class
int GetSpeed() const;
void Setup();
void Update();
private:
unsigned int _pinEnable;
unsigned int _pinIn1;
unsigned int _pinIn2;
// Keeps track of the current speed of the Motor driver
unsigned int _currentSpeed = 0;
};
};
及其實現(L298NMotorService.cpp):
#include "L298NMotorService.h"
using namespace Taibot;
L298NMotorService::L298NMotorService(bool isEnabled, bool isVerbose, unsigned int pinEnable, unsigned int pinIn1, unsigned int pinIn2)
: MotorService(isEnabled, isVerbose)
{
_pinEnable = pinEnable;
_pinIn1 = pinIn1;
_pinIn2 = pinIn2;
_currentSpeed = 0;
}
void L298NMotorService::SetSpeed(int speed)
{
// Save the current speed...
_currentSpeed = speed;
if (IsVerbose())
{
//If we are logging, print the speed we are giving to the motor
Serial.print("L298NMotor: speed=");
Serial.println(speed);
}
// Only activate the motors if the driver is enabled
if (IsEnabled())
{
if (speed >= 0)
{
// if the speed is positive or 0 then move forward
analogWrite(_pinEnable, speed);
digitalWrite(_pinIn1, HIGH);
digitalWrite(_pinIn2, LOW);
}
else
{
// if the speed is negative then move backwards
analogWrite(_pinEnable, -speed);
digitalWrite(_pinIn1, LOW);
digitalWrite(_pinIn2, HIGH);
}
}
}
int L298NMotorService::GetSpeed() const
{
return _currentSpeed;
}
void L298NMotorService::Setup()
{
// We have nothing to set up
}
void L298NMotorService::Update()
{
// This service doesn't do anythin in background so this method is empty
}
真正的魔法發(fā)生在 SetSpeed 方法中。如您所見,在移動電機之前,我們正在檢查服務是否已啟用。此外,在打印調試信息之前,我們正在檢查它是否為 Verbose。
此方法接收 -255 到 255 范圍內的 int 值。
- 當值為負(-255 到 -1)時,電機向后移動。
- 當值為正(1 到 255)時,電機向前移動。
- 當然,當速度為 0 時,電機停止
由于 L298N 模塊的工作方式,我們應該向 _pinEnable 發(fā)送一個 PWM 脈沖,以設置旋轉速度。這個脈沖可以在 0 到 255 之間。我們正在使用analogWrite調用來設置 Arduino 上數字引腳的 PWM 輸出。(這里有更多詳細信息)。
我們還將_pinIn1和_pinIn2設置為 HIGH 或 LOW,具體取決于旋轉方向,如 L298N 模塊的文檔所述。
測試服務
我們現在需要將代碼添加到草圖以測試此服務。我認為您可能會理解為什么我們一直在處理所有這些代碼混亂。
這是 Arduino Sketch 的外觀:
/*
Name: Taibot.ino
Created: 12/13/2016 10:27:53 AM
Author: Nahuel Taibo savagemakers.com
*/
#include "L298NMotorService.h"
using namespace Taibot;
// Pin definitions for the L298N Motor driver (Change this defines according to your hardware configuration)
#define PIN_L298N_ENA PIN2
#define PIN_L298N_IN1 PIN3
#define PIN_L298N_IN2 PIN4
#define PIN_L298N_IN3 PIN5
#define PIN_L298N_IN4 PIN6
#define PIN_L298N_ENB PIN7
L298NMotorService rightMotor(true, true, PIN_L298N_ENA, PIN_L298N_IN1, PIN_L298N_IN2);
L298NMotorService leftMotor(true, true, PIN_L298N_ENB, PIN_L298N_IN3, PIN_L298N_IN4);
//We will use this variables to change the robot speed on after some seconds (without using delays)
unsigned long previousTime = millis();
unsigned int updateFreq = 5000;
// the setup function runs once when you press reset or power the board
void setup()
{
Serial.begin(115200);
// Call the Setup method of all the services we are using
rightMotor.Setup();
leftMotor.Setup();
Serial.println("Taibot Started.");
}
// the loop function runs over and over again until power down or reset
void loop()
{
// Call the Update method of all the service we are using...
rightMotor.Update();
leftMotor.Update();
// Do anything else we want to do...
if ((previousTime + updateFreq) < millis())
{
previousTime = millis();
if (rightMotor.GetSpeed() > 0)
{
rightMotor.SetSpeed(0);
leftMotor.SetSpeed(0);
}
else
{
rightMotor.SetSpeed(150);
leftMotor.SetSpeed(150);
}
}
}
如果一切正常,構建此代碼并將其上傳到您的機器人后,您應該會看到它前進 5 秒,停止 5 秒,并重復該行為,直到您將其關閉。
結論
是的,它有很多代碼只是為了推動機器人前進,但是一旦我們開始添加越來越多的服務,您就會注意到這些代碼比無休止的意大利面條代碼更有意義。我希望您能關注本系列,因為我們會在每一篇新文章中不斷為您的機器人提供越來越多的智能。
您將找到本文附帶的代碼存儲庫。我創(chuàng)建了一個僅包含此服務實現的分支,因此如果您有意的話,您只能獲得此服務。
如果您不理解本文的任何部分、無法使此代碼工作、發(fā)現錯誤或有任何建議,請告訴我,我愿意改進它并使其成為任何人的干凈代碼庫想要重用它。
- L298N 電機驅動模塊--配套程序
- L298N電機驅動模塊的使用
- Arduino實驗17 L298N電機驅動模塊
- arduino的L298N電機驅動模塊 10次下載
- L298N電機驅動模塊
- L298N電機驅動
- L298N電機驅動的使用
- 繼電器模塊和L298N電機驅動模塊的使用
- L298N的電機驅動模塊的方法程序免費下載 27次下載
- L298N驅動模塊應用原理圖免費下載 227次下載
- L298N電機驅動器的詳細資料合集免費下載 249次下載
- L298N電機驅動模塊程序 83次下載
- L298N電機驅動模塊.(4).PrjPcb 0次下載
- L298N電機驅動模塊指導書 56次下載
- L298N電機驅動模塊參考程序 16次下載
- L298N引腳定義及功能 2.5w次閱讀
- L298N模塊介紹 6602次閱讀
- 如何制作一個智能尋路+避障的小車? 3765次閱讀
- 基于51單片機的全自動洗衣機設計 3546次閱讀
- 如何使用L298N和Arduino板控制直流電機 1w次閱讀
- 基于L298N芯片對離子滲氮中壓強的控制設計方案 2306次閱讀
- dfrobotL298N直流電機驅動模塊DF-MD介紹 3741次閱讀
- 12v直流電機驅動電路圖 4.1w次閱讀
- l298n驅動電機的工作原理_L298N驅動步進電機程序 6.9w次閱讀
- TMS320F28027與L298N的懸掛運動控制系統設計 3879次閱讀
- 基于L298N芯片對離子滲氮中壓強的控制 2915次閱讀
- 基于80C196KC和L298N的直流電機PWM控制技術 6102次閱讀
- 基于Intel8253與L298N的電機PWM調速方法 6762次閱讀
- L298N中文資料匯總_L298N引腳圖及功能_工作原理_特性參數及典型驅動電路 57.5w次閱讀
- 新手入門超聲自平衡小車最佳方案 1.3w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多