论文部分内容阅读
摘要:Arduino是一个灵活、开放的平台,易于上手,便于二次开发。与常用的单片机、可编程逻辑控制器(PLC)等不同,它具有编程简单,便于操作,性价比高等诸多优点。本文是基于Arduino的机器人下位机控制系统,通过主板发出指令给电机驱动器来控制电机运动,并配有超声波测距模块实现机器人避障功能,测试结果表明系统稳定可靠,具有较强的实用价值。
关键字:Arduino;步进电机;步进电机驱动器;超声波测距模块
1引言
随着科技的迅猛发展,使得早期的单片机越来越无法满足人们的需求,各种功能强大、性能良好的处理器应运而生。本文要介绍的是操作简单、便于上手的Arduino板控制步进电机驱动器来驱动步进电机。与工业化生产和日常生活中大量应用的DSP、51系列单片机、PLC等驱动步进电机相比,编程编写简单,操作更方便、性价比更高等优点。
Arduino是免费的开放软件,入门门槛低[1]。例如:一步指令就可以定义步进电机的步数和方向,简单方便地完成系统功能,使得它在信息技术飞速发展,各行业的人机交互界面日趋人性化的今天,有着较强的影响和实用意义。
2硬件部分
2.1硬件组成
系统硬件主要由2块Arduino主控板、传感器控制板、2个超声波测距模块、2台步进电机、2个步进电机驱动器步等组成。
主控板选用Arduino UNO,芯片型号为ATmega328P,它有14个I/O端口, 6个AI输入口,1个串口,1个USB接口,晶振频率16MHz,带有复位功能按钮。提供3.3V和5V电压输出。只需1根USB数据线连接电脑就能供电,程序下载和数据通讯。实物详见下图2-1:
传感器控制板是与Arduino主控板可以对插,通过超声波测距模块来控制行走的机器人避障。详见下图2-2:
2个超声波模块采用JSN-SR0T4-2.0 超声波测距模块,该模块的工作电压为DC3.0~5.5V,工作电流8mA以下,射程在0.2m到6m之间,精度2mm,适宜在-20~70℃的环境中工作,简洁的设计理念,使得它性能优良,兼容性好。详见下图2-3:
2台步进电机采用菲普德57BYC250C,2相,步距角1.8°,扭矩1.8N,电压DC24V,最大电流3A,可配套使用的驱动器DM542或TB6600,详见下图2-4:
2个步进电机驱动器的型号为DM542,它是一款细分型两相混合式驱动器, DC18~50V宽电压输入,输出额定电流为1.2~4.0A,性能可靠等。详见下图2-5:
2.2系统功能
Arduino是一个开源的平台,开放的源代码和电路图方便用户根据自己的需要选择接线方式,免费的程序开发接口使用户可根据需要随时修改程序并下载。与各种传感器、电子元件连接简单,节省布线成本。使用的微处理器价格较低,具有较高的性价比。下面控制系统功能框图2-6:
3软件部分
3.1 Arduino简介
Arduino电路板是由意大利的baiMassimo Banzi在2005年1月与西班牙籍芯片工程师David Cuartielles合作设计的[2]。目的是能给学生们提供一种便宜好用的微控制器平台,解决当时微处理器价格昂贵且不易使用的问题。
Arduino支持C语言开发,编程门槛低,具有大量的库[3]。硬件集成度高,外部电路接线简单。软件模块化设计完善,简洁高效,支持多平台开发。
3.2控制系统驱动程序
下面是arduino驱动步进电机运动及超声波测距模块的避障部分程序:
// 控制中心 arduino_motor
// #include <Enerlib.h>
// #include <avr/wdt.h>
#include “global.h”
#include “mode.h”
#include “wlc_stop.h”
#include “uc_command.h”
#include “motor.h”
#include “uc_stop.h”
unsigned char tx_data[8];
unsigned char rx_start[1];
unsigned char rx_data[7];
unsigned char rx_buffer[10][8];
void setup() {
// 步进电机
pinMode(ENA_L, OUTPUT);
pinMode(DIR_L, OUTPUT);
pinMode(ENA_R, OUTPUT);
pinMode(DIR_R, OUTPUT);
pinMode(PUL_LR, OUTPUT);
// 遙控
pinMode(D0, INPUT);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
pinMode(D3, INPUT);
pinMode(VT, INPUT);
// 超声波
pinMode(pinLeft, INPUT);
pinMode(pinRight, INPUT);
pinMode(RelayPin1, OUTPUT); pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
// 超声波活跃初始化
pinMode(PIN_ACTIVE, OUTPUT);
pinMode(PIN_DISTANCE_LEVEL, OUTPUT);
digitalWrite(PIN_ACTIVE, LOW);
digitalWrite(PIN_DISTANCE_LEVEL, LOW);
memset(&active, 0, sizeof(active));
// 蜂鸣器初始化
pinMode(PIN_BUZZER, OUTPUT); digitalWrite(PIN_BUZZER, HIGH);
// 随机数种子
randomSeed(analogRead(0));
memset(¤t_uc_cmd,0, sizeof(current_uc_cmd));
memset(¤t_uc_cmd_pre,0, sizeof(current_uc_cmd_pre));
uc_sensor_release_count = 0;
uc_sensor_get_count = 0;
compensation_move_forward = 0;
compensation_turn_left = 0;
compensation_turn_right = 0;
// uc命令初始標识
command_flag = TXD_SUCCESS;
command_busy_answer= C_Busy_Sta_Ans_Free;
// uc模式下,wlc状态,用于UC模式下遥控器控制
uc_wlc_sta= uc_wlc_sta_type::WLC_DEFAULT;
// TODO - 初始化statu
current_status = status::uc_stop;
mode = modes::uc; // 默认->上位机控制模式
current_status = status::wlc_stop;
mode = modes::wlc; // 默认->下位机控制模式
last_status = status::default_status;
wlc_status = status::default_status;
sensor_status = status::default_status;
max_wivelen= WLC_SPEED_LEVEL3;
/* 修改通信方式之后的运行逻辑 start */
// 接受cmd
want_to_get_next_cmd = true;
next_cmd_is_same_with_last = false;
same_cmd_add_time_bool = false;
cmd_null_flag = true;
cmd_pre_null_flag = true;
// 预判走位
current_uc_cmd_pattern = 0x00;
// 空挡
gear_now = gear[0];
// 暂停默认为继续走, 值false
uc_pause = false;
…
#define DIR_L 3 // 方向,低向前
#define ENA_L 4 // 使能,低有效
#define PUL_LR 5 // PWM方波
#define DIR_R 6
#define ENA_R 7
/* 遥控器针脚, 键位如下
A B
C D
*/
#define D0 8 // D0 -> B按键
#define D1 9 // D1 -> D按键
#define D2 10 // D2 -> A按键
#define D3 11 // D3 -> C按键
#define VT 12 // VT
// active statu pin
#define PIN_ACTIVE A2 // to sensor1
#define PIN_DISTANCE_LEVEL 13 // to sensor2
// buzzer
#define PIN_BUZZER 12
int g_count; bool uc_pause; // true -> 停止;
false -> 继续走
#endif
//mode.h
#ifndef _MODE_H
#define _MODE_H
typedef enum _modes{
wlc, // 手控模式
u, // 上位机模式
sensor // 传感器模式
}modes;
modes mode;
typedef enum _status{
wlc_stop=0, wlc_right,
wlc_left, wlc_forward,
uc_stop=10 , uc_right,
uc_left, uc_forward ,
uc_upshift,
uc_downshift,
uc_switch,
sensor_stop=20,
sensor_right,
sensor_left,
sensor_forward,
sensor_gear, s
ensor_switch,
default_status=255
}status;
typedef struct _auto_state{
status state;
int count;
}auto_state;
// wlc status struct
typedef struct _wlc_stop_state{
auto_state parenet_state;
}wlc_stop_state;
wlc_stop_state wlc_stop_state_var
}
tone(PUL_LR, speed_frequency)
delay(2);
4結束语
本系统通过Arduino主控板来控制步进电机驱动器驱动步进电机运动,结合超声波测距模块实现医用导诊机器人的运动及避障等功能,结合上位机语音导诊等功能测试表明该系统稳定可靠,避障精确,程序简单易懂,且成本较低,具有较大的实用价值。
参考文献
[1]Arduino开发从入门到实战[M]. 清华大学出版社, 李明亮, 2018,1
[2]基于Arduino系统控制的物体定位[J]. 禅翔,郭焕萍.电子世界. 2019(02)
[3] 基于Arduino UNO平台用于分拣机械臂系统研究[J].程雨鑫,富晓乾,马奇旭,张璇,郭岳.电子世界. 2020(02)
南京惟思得交通设备有限公司 江苏 南京 210012
关键字:Arduino;步进电机;步进电机驱动器;超声波测距模块
1引言
随着科技的迅猛发展,使得早期的单片机越来越无法满足人们的需求,各种功能强大、性能良好的处理器应运而生。本文要介绍的是操作简单、便于上手的Arduino板控制步进电机驱动器来驱动步进电机。与工业化生产和日常生活中大量应用的DSP、51系列单片机、PLC等驱动步进电机相比,编程编写简单,操作更方便、性价比更高等优点。
Arduino是免费的开放软件,入门门槛低[1]。例如:一步指令就可以定义步进电机的步数和方向,简单方便地完成系统功能,使得它在信息技术飞速发展,各行业的人机交互界面日趋人性化的今天,有着较强的影响和实用意义。
2硬件部分
2.1硬件组成
系统硬件主要由2块Arduino主控板、传感器控制板、2个超声波测距模块、2台步进电机、2个步进电机驱动器步等组成。
主控板选用Arduino UNO,芯片型号为ATmega328P,它有14个I/O端口, 6个AI输入口,1个串口,1个USB接口,晶振频率16MHz,带有复位功能按钮。提供3.3V和5V电压输出。只需1根USB数据线连接电脑就能供电,程序下载和数据通讯。实物详见下图2-1:
传感器控制板是与Arduino主控板可以对插,通过超声波测距模块来控制行走的机器人避障。详见下图2-2:
2个超声波模块采用JSN-SR0T4-2.0 超声波测距模块,该模块的工作电压为DC3.0~5.5V,工作电流8mA以下,射程在0.2m到6m之间,精度2mm,适宜在-20~70℃的环境中工作,简洁的设计理念,使得它性能优良,兼容性好。详见下图2-3:
2台步进电机采用菲普德57BYC250C,2相,步距角1.8°,扭矩1.8N,电压DC24V,最大电流3A,可配套使用的驱动器DM542或TB6600,详见下图2-4:
2个步进电机驱动器的型号为DM542,它是一款细分型两相混合式驱动器, DC18~50V宽电压输入,输出额定电流为1.2~4.0A,性能可靠等。详见下图2-5:
2.2系统功能
Arduino是一个开源的平台,开放的源代码和电路图方便用户根据自己的需要选择接线方式,免费的程序开发接口使用户可根据需要随时修改程序并下载。与各种传感器、电子元件连接简单,节省布线成本。使用的微处理器价格较低,具有较高的性价比。下面控制系统功能框图2-6:
3软件部分
3.1 Arduino简介
Arduino电路板是由意大利的baiMassimo Banzi在2005年1月与西班牙籍芯片工程师David Cuartielles合作设计的[2]。目的是能给学生们提供一种便宜好用的微控制器平台,解决当时微处理器价格昂贵且不易使用的问题。
Arduino支持C语言开发,编程门槛低,具有大量的库[3]。硬件集成度高,外部电路接线简单。软件模块化设计完善,简洁高效,支持多平台开发。
3.2控制系统驱动程序
下面是arduino驱动步进电机运动及超声波测距模块的避障部分程序:
// 控制中心 arduino_motor
// #include <Enerlib.h>
// #include <avr/wdt.h>
#include “global.h”
#include “mode.h”
#include “wlc_stop.h”
#include “uc_command.h”
#include “motor.h”
#include “uc_stop.h”
unsigned char tx_data[8];
unsigned char rx_start[1];
unsigned char rx_data[7];
unsigned char rx_buffer[10][8];
void setup() {
// 步进电机
pinMode(ENA_L, OUTPUT);
pinMode(DIR_L, OUTPUT);
pinMode(ENA_R, OUTPUT);
pinMode(DIR_R, OUTPUT);
pinMode(PUL_LR, OUTPUT);
// 遙控
pinMode(D0, INPUT);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
pinMode(D3, INPUT);
pinMode(VT, INPUT);
// 超声波
pinMode(pinLeft, INPUT);
pinMode(pinRight, INPUT);
pinMode(RelayPin1, OUTPUT); pinMode(RelayPin2, OUTPUT);
pinMode(RelayPin3, OUTPUT);
// 超声波活跃初始化
pinMode(PIN_ACTIVE, OUTPUT);
pinMode(PIN_DISTANCE_LEVEL, OUTPUT);
digitalWrite(PIN_ACTIVE, LOW);
digitalWrite(PIN_DISTANCE_LEVEL, LOW);
memset(&active, 0, sizeof(active));
// 蜂鸣器初始化
pinMode(PIN_BUZZER, OUTPUT); digitalWrite(PIN_BUZZER, HIGH);
// 随机数种子
randomSeed(analogRead(0));
memset(¤t_uc_cmd,0, sizeof(current_uc_cmd));
memset(¤t_uc_cmd_pre,0, sizeof(current_uc_cmd_pre));
uc_sensor_release_count = 0;
uc_sensor_get_count = 0;
compensation_move_forward = 0;
compensation_turn_left = 0;
compensation_turn_right = 0;
// uc命令初始標识
command_flag = TXD_SUCCESS;
command_busy_answer= C_Busy_Sta_Ans_Free;
// uc模式下,wlc状态,用于UC模式下遥控器控制
uc_wlc_sta= uc_wlc_sta_type::WLC_DEFAULT;
// TODO - 初始化statu
current_status = status::uc_stop;
mode = modes::uc; // 默认->上位机控制模式
current_status = status::wlc_stop;
mode = modes::wlc; // 默认->下位机控制模式
last_status = status::default_status;
wlc_status = status::default_status;
sensor_status = status::default_status;
max_wivelen= WLC_SPEED_LEVEL3;
/* 修改通信方式之后的运行逻辑 start */
// 接受cmd
want_to_get_next_cmd = true;
next_cmd_is_same_with_last = false;
same_cmd_add_time_bool = false;
cmd_null_flag = true;
cmd_pre_null_flag = true;
// 预判走位
current_uc_cmd_pattern = 0x00;
// 空挡
gear_now = gear[0];
// 暂停默认为继续走, 值false
uc_pause = false;
…
#define DIR_L 3 // 方向,低向前
#define ENA_L 4 // 使能,低有效
#define PUL_LR 5 // PWM方波
#define DIR_R 6
#define ENA_R 7
/* 遥控器针脚, 键位如下
A B
C D
*/
#define D0 8 // D0 -> B按键
#define D1 9 // D1 -> D按键
#define D2 10 // D2 -> A按键
#define D3 11 // D3 -> C按键
#define VT 12 // VT
// active statu pin
#define PIN_ACTIVE A2 // to sensor1
#define PIN_DISTANCE_LEVEL 13 // to sensor2
// buzzer
#define PIN_BUZZER 12
int g_count; bool uc_pause; // true -> 停止;
false -> 继续走
#endif
//mode.h
#ifndef _MODE_H
#define _MODE_H
typedef enum _modes{
wlc, // 手控模式
u, // 上位机模式
sensor // 传感器模式
}modes;
modes mode;
typedef enum _status{
wlc_stop=0, wlc_right,
wlc_left, wlc_forward,
uc_stop=10 , uc_right,
uc_left, uc_forward ,
uc_upshift,
uc_downshift,
uc_switch,
sensor_stop=20,
sensor_right,
sensor_left,
sensor_forward,
sensor_gear, s
ensor_switch,
default_status=255
}status;
typedef struct _auto_state{
status state;
int count;
}auto_state;
// wlc status struct
typedef struct _wlc_stop_state{
auto_state parenet_state;
}wlc_stop_state;
wlc_stop_state wlc_stop_state_var
}
tone(PUL_LR, speed_frequency)
delay(2);
4結束语
本系统通过Arduino主控板来控制步进电机驱动器驱动步进电机运动,结合超声波测距模块实现医用导诊机器人的运动及避障等功能,结合上位机语音导诊等功能测试表明该系统稳定可靠,避障精确,程序简单易懂,且成本较低,具有较大的实用价值。
参考文献
[1]Arduino开发从入门到实战[M]. 清华大学出版社, 李明亮, 2018,1
[2]基于Arduino系统控制的物体定位[J]. 禅翔,郭焕萍.电子世界. 2019(02)
[3] 基于Arduino UNO平台用于分拣机械臂系统研究[J].程雨鑫,富晓乾,马奇旭,张璇,郭岳.电子世界. 2020(02)
南京惟思得交通设备有限公司 江苏 南京 210012