哪位大神能帮我写一个arduino 控制两个直流电机正反转,加减速和拐弯的程序啊?arduino程序,非常感谢。

作者&投稿:狄萍 (若有异议请与网页底部的电邮联系)
怎样用Arduino去控制直流电机正反转?~

19、Arduino入门视频教程 PWM控制2个电机正转

一、硬件连接
采用两路继电器模块控制直流电动机。

硬件连接
二、控制程序

控制程序
从数字输出管脚7、8两脚输出控制信号,控制两路继电器交替导通。换向中间有一停止过程,避免电机冲击过大。

       假设您使用无线串口控制小车,那么你需要设计一个串口指令协议,一般来说,通信协议的数据帧包括3部分,一是指令头,又叫做帧同步字;二是指令内容,也叫帧内容;三是校验码。

       同步字是为了便于程序分析连续传输的数据中,帧与帧之间的间隔,帧内容包含了所有经过16进制编码的各种控制指令和数据,校验码通常采用累加和与异或算法,为了计算本数据帧是否正确。(工业环境中,所有数据传输系统都存在一定的误码干扰,校验字能有效判别数据传输是否正确,进而通过错误处理机制,有效避免错误动作)。

       刚好前段时间写了个小车的控制程序,使用的是双路H桥来驱动电机的,不过不是控制履带式的,稍微改动了下。

    (注意,本程序仅适用于履带式小车,即左右电机正反转实现前后及转向,程序支持前后左右混控)


//********************************

// 遥控帧协议和结构

// FB|80|51|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR

// 00|01|02|03|04|05|06|07|08|09|10|11|12|13

// 14 byte

//FB 80 51 遥控帧同步字                 00-02

//AA 前后控制量 128为中立位             03

//FF 恒定为0xFF                         04

//BB 左右控制量 128为中立位             05

//FF 恒定为0xFF                         06

//BY 备用控制指令 本程序为空            07-12

//CR 校验码,从00至12字节逐字节位异或   13

//********************************

// 遥测帧协议结构

// FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR

// 00|01|02|03|04|05|06|07|08|09|10|11|12|13

// 14 byte

// 重复遥控指令,除帧头外,其定义与遥控指令相同


#define BR 9600       //定义串口波特率

//遥控指令接收处理相关定义

#define TCDL 14       //定义遥控数据帧长度字节数

#define BUFF_LONG 30  //定义串口接收缓存的长度

byte BUFF[BUFF_LONG]; //定义串口数据接收存储缓存

int BUFF_IDX = 0;     //定义串口数据接收存储缓存的指针


//遥测指令发送处理相关定义

#define TMFQ 80         //定义遥测数据帧发送间隔为80ms

#define TMDL 14         //定义遥测数据帧长度字节数

byte TM_Data[TMDL];     //定义遥测数据缓存

int TM_Index = 0;       //定义遥测数据指针

unsigned long Time = 0; //定义遥测发送计时器为0


//定义左、右电机与Arduino的驱动信号接口

//注意,这里用了4个PWM输出,部分Arduino板可能不支持,请查看手册

int Moto_Right_A = 3;

int Moto_Right_B = 5;

int Moto_Left_A = 6;

int Moto_Left_B = 9;


//数据接收指示灯相关定义

boolean IS_Blink = false;     //定义是否闪烁LED灯的变量

int LED = 13;         //定义LED灯接口为13


//指令变量定义

byte RunPWM = 128;   //定义前进、后退控制PWM指令变量

byte TurnPWM = 128;  //定义左转、右转控制PWM指令变量


void setup()

{

  pinMode(Moto_Right_A, OUTPUT); //定义输出

  pinMode(Moto_Right_B, OUTPUT); //定义输出

  pinMode(Moto_Left_A, OUTPUT); //定义输出

  pinMode(Moto_Left_B, OUTPUT); //定义输出

  pinMode(LED, OUTPUT); //定义LED管脚为数字输出


  Port_Init();  //初始化串口

  Blink_LED(false); //关闭指示灯

}

void loop()

{

  byte c;

  if (Serial.available() > 0)  //如果接收到串口数据

  {

    c = Serial.read();   //读一个字节

    Buff_AddChar(c);     //塞进缓存进行存储、校验和解码

  }

  TM_Freq();             //尝试按要求逐字节发送遥测数据

  Driver_CAR(RunPWM, TurnPWM); //驱动左右电机正反转,实现运动控制

}


//驱动左右电机调速运行,实现左右正反转组合,实现控制

//前后、左右混控

void Driver_CAR(byte Run, byte Turn)

{

  byte Run_L, Run_R;  //定义左右前进混合值

  byte PWM_R_A, PWM_R_B, PWM_L_A, PWM_L_B; // 定义4个信号的独立PWM


  Run_L = Run - (128 - Turn);  //将转向PWM混合到左路

  Run_R = Run - (Turn - 128);  //将转向PWM混合到右路


  PWM_L_A = (255 / 128) * Run_L - 255;         //左路混合值结算为左路A信号PWM

  PWM_L_B = (-1 * 255 / 128) * Run_L + 255;    //左路混合值结算为左路B信号PWM

  PWM_R_A = (255 / 128) * Run_R - 255;         //右路混合值结算为右路A信号PWM

  PWM_R_B = (-1 * 255 / 128) * Run_R + 255;    //右路混合值结算为右路B信号PWM


  analogWrite(Moto_Right_A, PWM_R_A);    //输出右路A信号

  analogWrite(Moto_Right_B, PWM_R_B);    //输出右路B信号

  analogWrite(Moto_Left_A, PWM_L_A);     //输出左路A信号

  analogWrite(Moto_Left_B, PWM_L_B);     //输出左路B信号

}


//********************************

//子程序 Port_Init()

//功能:初始化串口通信

void Port_Init()

{

  BUFF_IDX = 0;  //初始化串口缓存指针为0

  TM_Data[0] = 0xFB;  //初始化遥测数据帧头

  TM_Data[1] = 0x80;  //初始化遥测数据帧头

  TM_Data[2] = 0x61;  //初始化遥测数据帧头

  Serial.begin(BR);  //定义波特率并启动串口

}


//********************************

// 子程序 Buff_AddChar(byte b)

// 功能:串口接收字节加入缓存

// 1、加入字节到缓存;

// 2、检测到帧头则尝试检测遥控帧;

// 3、管理缓存指针

void Buff_AddChar(byte b)

{

  BUFF[BUFF_IDX] = b;  //  缓存[缓存指针] = 接收字节

  if (BUFF_IDX >= 2)

  {

    if (BUFF[BUFF_IDX] == 0x51 && BUFF[BUFF_IDX - 1] == 0x80 && BUFF[BUFF_IDX - 2] == 0xFB) //  检测遥控帧头

    {

      if (BUFF_IDX == (TCDL - 1))

      {

        Buff_DCHK();  //  检测校验码

      }

      BUFF_IDX = 0;  //  缓存指针归零

      return;

    }

  }

  BUFF_IDX++;

  if (BUFF_IDX > (BUFF_LONG - 1)) //  缓存指针越界

  {

    BUFF_IDX = 0;  //  缓存指针归零

  }

}


//********************************

//子程序 Buff_DCHK()

//功能:校验遥控帧校验字是否正确

void Buff_DCHK()

{

  byte DCHK = 0x00;

  // 0xFB XOR 0x80 XOR 0x51

  DCHK = BUFF[0];

  DCHK = DCHK ^ BUFF[1];

  DCHK = DCHK ^ BUFF[2];

  int i;

  for (i = 0; i < (TCDL - 4); i++)

  {

    DCHK = DCHK ^ BUFF[i];

  }

  if (DCHK == BUFF[TCDL - 4])

  {

    //校验字正确

    Blink_LED(true); //闪烁LED

    Get_CMD();       //解码指令

  }

}

//********************************

// 子程序 Get_CMD()

// 功能:解码遥控指令

void Get_CMD()

{

  RunPWM = BUFF[0];

  TurnPWM = BUFF[2];


  //后面可以自己添加关于BY指令的解码处理

}


//********************************

//子程序 TM_Freq()

//功能:遥测数据发送帧率控制

void TM_Freq()

{

  unsigned long t;

  if (TM_Index < TMDL) //如果一帧数据还没有发完

  {

    Serial.write(TM_Data[TM_Index]); //继续发数据

    TM_Index++;  //指针累加

  }

  else  //如果发完

  {

    if (Time == 0)  //检测计时器是否为0

    {

      Time = millis(); //是则赋予计时器初始值

    }

    else  //不是

    {

      t = millis();

      if (t - Time >= TMFQ) //检测计时器是否到达帧率控制的时间

      {

        Time = t;

        TM_Make_Data();    //到达发送时间,则组一帧遥测数据,并开始发送

      }

    }

  }

}

//********************************

// 子程序 TM_Make_Data()

// 功能:发送遥测数据

void TM_Make_Data()

{

  // 遥测帧协议结构

  //FB|80|61|AA|FF|BB|FF|BY|BY|BY|BY|BY|BY|CR

  //00|01|02|03|04|05|06|07|08|09|10|11|12|13

  byte CHK = 0xFB;  //赋值帧头

  CHK = CHK ^ 0x80; //赋值帧头

  CHK = CHK ^ 0x61; //赋值帧头


  TM_Data[3] = RunPWM;    //回写前后指令

  TM_Data[4] = 0xFF;

  CHK = CHK ^ TM_Data[3]; //计算校验码

  CHK = CHK ^ TM_Data[4]; //计算校验码


  TM_Data[5] = TurnPWM;   //回写转向指令

  TM_Data[6] = 0xFF;

  CHK = CHK ^ TM_Data[5]; //计算校验码

  CHK = CHK ^ TM_Data[6]; //计算校验码


  CHK = CHK ^ TM_Data[7]; //计算校验码

  CHK = CHK ^ TM_Data[8]; //计算校验码

  CHK = CHK ^ TM_Data[9]; //计算校验码

  CHK = CHK ^ TM_Data[10]; //计算校验码

  CHK = CHK ^ TM_Data[11]; //计算校验码

  CHK = CHK ^ TM_Data[12]; //计算校验码


  TM_Data[13] = CHK; //计算校验码

  TM_Index = 0; //清除遥测发送指针位置

}

//********************************

//子程序 Blink_LED()

//功能:闪烁内置LED灯

void Blink_LED(boolean Blink)

{

  if (Blink == false)

  {

    IS_Blink = false;

  }

  else

  {

    IS_Blink = !IS_Blink;

  }

  digitalWrite(LED, IS_Blink);

}




#includetemplatevoidinsertion_sort(biIterbegin,biIterend){typedeftypenamestd::iterator_traits::value_typevalue_type;biIterbond=begin;std::advance(bond,1);for(;bond!=end;std::advance(bond,1)){value_typekey=*bond;biIterins=bond;biIterpre=ins;std::advance(pre,-1);while(ins!=begin&&*pre>key){*ins=*pre;std::advance(ins,-1);std::advance(pre,-1);}*ins=key;}}

我做电子设计的



她叫石慧!暗恋她很久了!求大神能帮我做一首有她名字的诗
我暗恋隔壁班的一个女孩,她叫李楚君,谁能帮我写一首带有她名字的诗啊,让她知道我暗恋她 李家王朝几多愁 楚汉之争谁天下 君子何愁无人爱 等你几回梦己回 我暗恋她很久了,我加有她QQ,我该向她表白吗? 不该急于表白,不要太在意表不表白这种形式上的东西,既然你加了她QQ,她也加...

麻烦各位大神,帮我设计一个:手写,好看的英文签名~ 我的英文名叫:Elsa...
你好,以上图片是你要的签名 如果对我的回答满意,请点击我的回答下方选择满意回答按钮。谢谢~

求描写一个人的一篇文章,求文采好的大神帮忙,
上述三段都抓住了最能突出人物特点的动作。例一写的是一位高度近视的老教师。通过“用衣服的下摆擦镜片”、“手忙脚乱地在盘子里找”、“匆匆地往口袋里掏”等动作的描写,写出了一个高度近视、动作不利索且有点“糊涂”的老教师的特点;例二,主要抓住性格暴躁的人生气时,面部表情动作的特点来描写的。如:“气...

求大神帮忙编写一个Java程序显示指定目录中所有的文件和目录,包括文 ...
package Test2;import java.io.File;public class TestFile {\/** * @param args *\/public static void main(String[] args) {\/\/ TODO Auto-generated method stubFile file = new File("D:\\\\Java\\\\");printFile(file,0);}\/** * 输出文件树 * @param file * @param l *\/public static...

以“退路”为话题写一篇议论文,有哪位有文采的大神能帮我想一个...
不留退路,才有出路 古希腊著名演说家戴摩西尼年轻的时候为了提高自己的演说能力,躲在一个地下室里练习口才。由于耐不住寂寞,他时不时就想出去溜达溜达,心总也静不下来,练习的效果很差。无奈之下,他横下心,挥动剪刀把自己的头发剃去一半,变成一个怪模怪样的“阴阳头”。这样一来,因为头发羞于...

求求你们帮我写一个30字的道德日记!
求求你们帮我写一个30字的道德日记! < 日记就是每天记录你自己一天生活中比较有意义的事情或者比较重要的事情。每天写日记有助于我们写作文章和表达能力。那么我们小学生应该如何去写日记呢? 1、先在第一行中间写上某月某日,星期几,有的还要写上当天的天气情况。 2、第二行空两格开始写正文,转行要顶格。正文...

java 求大神帮我写个小程序,谢谢!(必定追加分数,我只想把分数留给对我...
import java.awt.Container;import java.awt.Dimension;import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.JPanel;public class Curve extends JFrame { private Circle circle = new Circle();\/ 构造函数 \/ public Curve() { setTitle("DrawCurve[绘制一份沿着曲线运动的圆形]"...

上周七天军训老师让写周记,可我没去在家写作业打篮球,哪位大神...
不管是流汗还是流泪,我们不能停止步伐,铁一样的纪律无时无刻不在约束着我们。在严格的要求下,有我们疲惫的身躯挺立。有我们酸痛的手脚重复的动作。烈日下,细雨中,我们坚强的身躯仍挺立在操场上。本来我以为这5天的军训会很有趣,可我错了,全程下来,像是过了几个世纪。军训生活是那么枯燥与乏味...

求大神写一个ID的藏头诗--据说我是大妖怪,在此谢过!!求大神帮助
我道本将忠许国, 是渠犹着小红裳。 大邦开国赏元勋, 妖娆能得几时赏。 怪我溪山惯来往。 据历雷声未当发, 说宣和锦片繁华。 我观文士多利用, 是生公子五侯家。 大抵人生乐其乐, 妖我共赋雄其夸。 怪石堆庭见吏衙。 据地一呼吾往矣, 说与人间好兄弟。 我今祝愿果初心, 是时新晴...

有会编麦词的吗,希望有大神能帮我写个关于消防兵的麦词。
战刀挥起那一幕,必要手掌伏魔琴,关外败将杀无数 既然选择霸武林,叛军如若不手刃。百战无敌斩秋鹤,边塞讨伐把天逆 嗜血刀剑划云霄,三年从未败过阵,一统江山为黎民 轮回一战东风破。手举七尺夺魂枪,就算战死又如何 醉舞长空似伯乐。从我踏入那天门,威名不败震八方 云中烈火战苍狼,恩师让我称...

红古区18272398576: 请高手给我分别编写一个Arduino的TX,RX串口通信代码 -
策钓六味: Arduino 库的例子中就有这样的代码了,只是接收到之后,稍改一下~ ~ ~

红古区18272398576: 我想用arduino编程C语言程序,使步进电机能正转200度,然后反转200度,最后停止.望有大神给予我程序,急 -
策钓六味: private void button1_Click(object sender, System.EventArgs e) public override void Display(int depth) { Console.WriteLine(new string('-', depth) + name); foreach (Component component in children) { component.Display(depth + 2); } }

红古区18272398576: 请大神帮我分别编写一个关于TX与RX的Arduino代码 -
策钓六味: void setup () { pinMode(4,INPUT); pinMode(11,OUTPUT); Serial.begin(9600); } void loop() { int n =digitalRead(4); if (n==HIGH) { char flag[]="x=10"; Serial.print(flag); delay(5000); digitalWrite(11,HIGH); delay(5000); digitalWrite(11,LOW); } } 接收端我用ARDUINO IDE的串口通信试过 接收到x=10后会动作

红古区18272398576: 用arduino写程序控制单片机电路循环10秒通 5秒断, 并记录反馈数据.纯小白一个, 求大神帮帮忙 -
策钓六味: 程序使用P13口做输出,高电平LED为亮,串口使用115200波特率,记录并返回循环周期.

红古区18272398576: 新手跪求大神帮忙:如何用arduino控制小型发动机??
策钓六味: 你说的发动机是小型马达吧...如果是马达的话,可以用L298N电机驱动模块驱动.可以通过Arduino编程实现电机正传、反转、停止、以及通过PWM调速.还有用ULN2803模块也可以..上淘宝搜索一大堆,都配备驱动代码的..

红古区18272398576: Arduino 单片机5 有哪位大神设计下电路图 1.点阵LED模块方形点阵 2个 3 - 4v 2. -
策钓六味: typedef struct lista{ struct lista *next; int data; }list; void insert(list *h); void del(list *h); int main() { int flag; list *head=(list *)malloc(sizeof(list)); head->next=NULL; while(1) {

红古区18272398576: 哪位大神能够帮我把这个单片机的程序写出来啊 -
策钓六味: 虽然做过DHT11和1602,但说句实在话,呵呵 大家都挺忙的.写程序是一件很麻烦的事,尤其是按键设置 按一下一个计算一个显示 并伴随光标闪烁,还得不停的检测按键并去抖

红古区18272398576: 求大神啊,买了个蓝牙模块,用arduino uno驱动,编了一个简单的程序,用手机连接蓝牙串口控制 -
策钓六味: 用的什么蓝牙模块呢?“电脑上用串口发送指定信息有反应,并且手机上能接收到串口返回内容”,表述的不是很清楚,不过自环测试没问题,说明手机与蓝牙的通讯是好的,检查蓝牙模块的串口通讯参数和电路连接情况.

红古区18272398576: 哪位大神帮我做一下,步骤越详细越好,十分感谢!在线等! -
策钓六味: 注意到Aₙ在y=2x上坐标设为(aₙ,2aₙ),Bₙ在y=(1/2)x上坐标设为(2bₙ,bₙ)因为OAₙ=OBₙ,所以√aₙ²+4aₙ²=√4bₙ²+bₙ²,即aₙ=bₙ又因为Aₙ横坐标等于Bₙ₋₁的横坐标,所以aₙ=2bₙ₋₁=2aₙ,由a₁=1,知a₂₀₁₈=2*2*…*2*1=2²⁰¹⁷所以b₂₀₁₈=a₂₀₁₈=2²⁰¹⁷所以B₂₀₁₈的坐标(2b₂₀₁₈,b₂₀₁₈)为(2²⁰¹⁸,2²⁰¹⁷)

红古区18272398576: 哪位大神能帮我写一个wincc Flexible v 3项目的脚本 -
策钓六味: 可以打开的,先打开2个WinCCFlexible,然后再分别选项目.或者直接打开项目内部的HMI后缀名的文件.如果想复制画面的话,直接选中要复制的画面,然后右键复制,直接贴到另一个项目的Screen目录下就行建议用简单复制,这样的话,不会在变量表中自动生成变量

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网