1. 功能说明
本文示例将通过程序控制模拟立体仓储系统的运动效果--模拟立体仓储系统进行运输货物时各个结构的运动方式。立体仓储系统的运动有整体系统的水平移动、载货台的纵向移动、货叉的平动,所有的运动表现形式都是旋转运动转化为平动。
2. 结构说明
该立体仓储系统的水平移动使用丝杠平移,丝杠平移可以承载较重的物体;载货台的纵向移动使用丝杠平移,其稳定性较强,位移距离长;货叉的平动使用滑块平移机构,平移距离较短。
3. 电子硬件
本实验中采用了以下硬件:
主控板 | Basra控制板(兼容Arduino Uno) |
扩展板 | Bigfish2.1扩展板 |
传感器 | 触碰传感器 |
电池 | 7.4v锂电池 |
电路连接说明:在下图所示的2个位置分别安装一个触碰传感器作为限位(限位:限定机械设备的运动极限位置)。
① 2个触碰传感器分别连接在Bigfish扩展板的A0、A4端口;
② 舵机连接在Bigfish扩展板的D4端口;
③ 2个电机分别连在Bigfish扩展板的D5,D6接口和D9,D10接口。
4. 功能实现
4.1 实现思路
实现模拟立体仓储系统运输一个物体的功能。
初始位置:整体立体仓库的运输机构沿-X向移动到极限位置(2号电机控制,传感器限位);载货台沿-Z向移动到极限位置(1号电机控制,传感器限位);货叉收回(3号舵机角度控制);
装货:货叉伸出去,停顿(3号舵机角度控制,大概延迟0.3s);货叉收回,停顿(3号舵机角度控制,大概延迟0.3s);
运输:载货台沿+X向移动到中间位置(2号电机控制,运动所需延迟时间大概7s);载物台沿+Z向移动到中间位置(1号电机控制,运动所需延迟时间大概7s);
卸货:货叉伸出去,停顿(3号舵机角度控制,大概延迟0.3s);货叉收回,停顿(3号舵机角度控制,大概延迟0.3s);
复位:整体立体仓库的运输机构沿-X向移动到极限位置(2号电机控制,传感器限位);载货台沿-Z向移动到极限位置(1号电机控制,传感器限位);货叉收回(3号舵机角度控制)。
4.2 示例程序
编程环境:Arduino 1.8.19
下面提供一个参考例程(smartStoreHouse.ino),具体实验效果可参考演示视频。
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-06-15 https://www.robotway.com/
------------------------------*/
int sensor[4]= {A0,A2,A4,A3}; //定义数组~传感器接口
/* 宏定义舵机角度,以及延时时间 */
#define SERVO_OUT 70
#define SERVO_IN 120
#define Delay_right 7000
#define Delay_up 7000
#include <Servo.h>
Servo myservo;
void setup() {
// put your setup code here, to run once:
for(int i=0;i<4;i++) //传感器接口设置为输入
pinMode(sensor[i],INPUT_PULLUP);
/* 电机接口设置为输出*/
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
Serial.begin(9600); //串口初始化
myservo.attach(4);
myservo.write(SERVO_IN); // 3号舵机收回来
delay(300);
motorReset(); // 电机初始化,回到复位位置
}
void loop()
{
myservo.write(SERVO_OUT); // 3号舵机伸出去
delay(300);
myservo.write(SERVO_IN); // 3号舵机收回来
delay(300);
X_Motor_right(); // 2 号电机右移 Delay_right时间,然后停止
delay(Delay_right);
X_Motor_stop();
Y_Motor_up(); // 1号电机上移 Delay_up时间,然后停止
delay(Delay_up);
Y_Motor_stop();
myservo.write(SERVO_OUT); // 3号舵机伸出去
delay(300);
myservo.write(SERVO_IN); // 3号舵机收回来
delay(300);
motorReset(); // 电机初始化,回到复位位置
}
/***************************** MOTOR **************************************/
void X_Motor_left()
{
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
}
void X_Motor_right()
{
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
}
void X_Motor_stop()
{
digitalWrite(5,LOW);
digitalWrite(6,LOW);
}
void Y_Motor_up()
{
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
}
void Y_Motor_down()
{
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
}
void Y_Motor_stop()
{
digitalWrite(9,LOW);
digitalWrite(10,LOW);
}
void motorReset(){
while(!SensorTrigger(0)) //A0传感器不触发,2号电机左移
{
X_Motor_left();
Serial.print("A0: ");
Serial.println(digitalRead(A0));
}
X_Motor_stop(); //A0传感器触发,2号电机停止
while(!SensorTrigger(2))//A4传感器不触发,1号电机向下移动
{
Y_Motor_down();
Serial.print("A4: ");
Serial.println(digitalRead(A4));
}
Y_Motor_up();//A0传感器触发,2号电机向上300ms,然后停止
delay(300);
Y_Motor_stop();
}
/***********************************************************************************/
boolean SensorTrigger( int which )
{
boolean where = false;
if( !digitalRead( sensor[ which ] ) )
{
delay( 100 );
if( !digitalRead( sensor[ which ] ) ) where = true;
}
return( where );
}
程序源代码及样机3D文件详见 智能立体仓储系统模型