Arduino实训-可移动机械臂(智能小车)

本文详述了一位新手通过Arduino UNO和AndroidAPP实现蓝牙连接,控制可移动机械臂的全过程。利用Arduino代码实现了机械臂各个关节的运动,并通过AndroidAPP发送指令进行远程控制。同时,提到了使用AppInventor作为简化版的APP开发工具,以积木式编程快速搭建蓝牙连接和控制界面。
摘要由CSDN通过智能技术生成

Arduino课程设计的实训要求通过UNO开发板设计工程项目并且与自主开发的AndroidAPP实现连接,最后选择了完成一个可移动机械臂。下面是最终成果图。

最终的效果:可通过手机开发的AndroidApp实现控制小车上的蓝牙模块进行连接并且控制小车的运动和机械臂的运动。 

这是开发的AndroidApp(时间受限,UI设计比较简陋。。。)

这是APP的蓝牙连接部分

 接下来展示一下关于Arduino代码片段

#include <Servo.h>

Servo myservo1,myservo2,myservo3,myservo4;  // create servo object to control a servo
const int SERVOS = 4;  //舵机数4个
int  value[SERVOS], idle[SERVOS], currentAngle[SERVOS], MIN[SERVOS], MAX[SERVOS], INITANGLE[SERVOS], previousAngle[SERVOS],ANA[SERVOS]; 


char command;    //read the char
#define ServoDelayTime 50

int delta = 5;  //舵机转动幅度
int delta_bottom = 2; //底座舵机转动幅度

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);         //The monitor UART
  //-----电机IO口定-
  pinMode( 8, OUTPUT);
  pinMode( 9, OUTPUT);
  pinMode( 10, OUTPUT);
  pinMode( 11, OUTPUT);
  
  //机械手爪定义端口
  myservo1.attach(2);  //手爪电机
  myservo2.attach(7);  //上臂电机
  myservo3.attach(12); //下臂电机
  myservo4.attach(13); //底座电机   
  
//手爪 Servo
  MIN[0] = 10;
  MAX[0] = 50;
 INITANGLE[0] = 30;

  
  //上臂电机
  MIN[1] = 10; // This should bring the lever to just below 90deg to ground
  MAX[1] = 140;
  INITANGLE[1] = 90; // This should bring the lever parallel with the ground

  
  //下臂电机
  MIN[2] = 40;
  MAX[2] = 170;
  INITANGLE[2] = 90;

  
  //底座电机
  MIN[3] = 0;
  MAX[3] = 170;
  INITANGLE[3] = 90;
 
  //初始化电机
  myservo1.write(INITANGLE[0]);  
  myservo2.write(INITANGLE[1]);  
  myservo3.write(INITANGLE[2]);
  myservo4.write(INITANGLE[3]);  

   currentAngle[0]=INITANGLE[0];
   currentAngle[1]=INITANGLE[1];
   currentAngle[2]=INITANGLE[2];
   currentAngle[3]=INITANGLE[3];  
}

void loop() 
{
    // put your main code here, to run repeatedly:
    if(Serial.available()>0)
    {
      command = Serial.read();
      Serial.println(command);
    }  
    switch (command)
    {
      case 'F':
        forward(); //机器人前进
        break;
      case 'B':
        back();    //机器人后退
        break;
      case 'R':
         right();  //机器人右转
        break;
      case 'L':
         left();    //机器人左转
        break;
      case 'S':
        stop();    //机器人停止
        Serial.println("S");
        break;        
      case '0':
        Serial.println("Servo all stop");
        delay(ServoDelayTime);
        break;
      case '1':
        Serial.println("MeArm turn Left");
        BottomLeft();
        delay(ServoDelayTime);
        break;
      case '2':
        Serial.println("MeArm turn Right");
        BottomRight();
        delay(ServoDelayTime);
        break;
      case '3':
        Serial.println("Arm A Up");
        Arm_A_Up();        
        delay(ServoDelayTime);
        break;
      case '4':
        Serial.println("Arm A Down");
        Arm_A_Down();      
        delay(ServoDelayTime);
        break;
      case '5':
        Serial.println("Arm B Up");
        Arm_B_Up();      
        delay(ServoDelayTime);
      break;
      case '6':
        Serial.println("Arm B Down");
        Arm_B_Down();      
        delay(ServoDelayTime);
        break;
      case '7':
        Serial.println("Clamp Open");
        ClampOpen();         //打开手爪  
        break;
      case '8':
        Serial.println("Clamp Close");
        ClampClose();     // 闭合手爪
        break;      
    }
 }
 //---------------------------------手爪函数定义---------------------------------------
 void ClampOpen()                //手爪打开
{
  myservo1.write(MAX[0]);
  delay(300);
}

void ClampClose()
{
    myservo1.write(MIN[0]);     //手爪闭合
    delay(300);
}
void BottomLeft()             // 底座左转
{
  if(currentAngle[3] + delta_bottom < MAX[3]) 
    {currentAngle[3] += delta_bottom;}
    myservo4.write(currentAngle[3]);
}

void BottomRight()             // 底座右转
{
  if(currentAngle[3] - delta_bottom > MIN[3]) 
    currentAngle[3] -= delta_bottom;
    myservo4.write(currentAngle[3]);
}


void Arm_A_Up()            //上臂舵机向上
{
  if(currentAngle[1] + delta < MAX[1])
    currentAngle[1] += delta;
   myservo2.write(currentAngle[1]);
}

void Arm_A_Down()      //上臂舵机向下
{
  if(currentAngle[1] - delta > MIN[1])
    currentAngle[1] -= delta;
   myservo2.write(currentAngle[1]);
}

void Arm_B_Up()     //下臂舵机上升
{
  if(currentAngle[2] - delta >  MIN[2])
    currentAngle[2] -= delta;
   myservo3.write(currentAngle[2]);
}

void Arm_B_Down()  //下臂舵机下降
{
  if(currentAngle[2] + delta < MAX[2])
    currentAngle[2] += delta;
    myservo3.write(currentAngle[2]);
}
void Servo_stop() //停止所有舵机
{
  myservo1.write(currentAngle[0]);
  myservo2.write(currentAngle[1]);
  myservo3.write(currentAngle[2]);
  myservo4.write(currentAngle[3]);
}
 //---------------------------------运动函数定义---------------------------------------
void forward()
{
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
   
  digitalWrite(11, LOW); 
  digitalWrite(10, HIGH);
}

void right()
{
   digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
}

void back()
{
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
}

void left()
{
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
}

void stop()
{
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  
  digitalWrite(11, LOW);
  digitalWrite(10, LOW); 
}

简单解释一下代码:初始化端口后,设置运动函数对应着小车的前进、后退、停止等运动,然后通过switch语句通过接收到的不同的字符来实现对小车的控制(字符就是从蓝牙客户端接收到的字符)。

接下来讲一下AndroidApp开发部分,本项目选择的是蓝牙的方式实现连接,这一部分的原生开发网上都找得到,就不多赘述了。这边简单介绍一个更简单的方法进行App开发—Appinventor

App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。除此之外它也正式支持乐高NXT机器人,对于Android初学者或是机器人开发者来说是一大福音。因为对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。

这个是Appinventor中文版网址:MIT App Inventor

下面是我的蓝牙App的组件设计

在左边的选框中选择你需要的组件拖到右边的屏幕中,在拖动组件前先选择布局-如何放置你的组件。

因为是用蓝牙连接,所以需要在左边组件面板栏内选择通信连接中的蓝牙模块,然后添加客户端和服务端。到这边组件设计就基本完成,想要好看的界面可以再多琢磨一下。

接下来是逻辑设计(点击右上角的逻辑设计转换设计视图) 

 

这边的是蓝夜的连接部分(就是点击连接可以出现搜索到的蓝牙) 

先点击逻辑,从中找到当...执行的拼图,然后点击列表选择框1,就会出现可对列表选择框1进行的操作,点击拼图移动到对应的位置可自动完成连接,蓝牙拼图点击蓝牙客户端就可以找到。

蓝牙断开按钮的设计

 

按钮控制运动部分的设计,都是选择要设置的按钮,选择对应的松开或者按压操作,然后选择蓝牙客户端的发送文本拼图,接着点击文本选择字符框,然后填入之前在Arduino代码设置的字符。到这App的设计就彻底完成。

打包对应的apk发送到手机上,下载安装即可。

本人也是菜鸟,希望本文章能对在学习过程中遇到同样问题的人一些帮助。 

 

  • 16
    点赞
  • 140
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
基于Arduino小车的机械臂智能搬运研究是一项以Arduino小车为基础,研究如何通过机械臂实现智能搬运的科学研究工作。 Arduino小车是一种开源硬件平台,具有拓展性强、易于操作和灵活性高的特点。在这项研究中,我们将Arduino小车作为一个基础平台,通过添加机械臂来实现物体的智能搬运。 首先,我们需要使用Arduino控制小车的移动。通过编程,我们可以实现小车的自主导航能力,使其能够在室内环境中自由移动。通过搭载传感器,如红外线传感器或超声波传感器,小车可以避开障碍物,并在目标位置停下。 接下来,我们需要设计和搭建一个机械臂机械臂的设计要考虑到抓取、抬起和放置物体的能力。通过添加舵机和关节,我们可以实现机械臂的自由度和灵活性,使其能够完成复杂的动作。 然后,在小车和机械臂之间建立通信。通过将Arduino机械臂连接,我们可以实现两者之间的数据传输和指令控制。这样,小车就可以接收到需要搬运的物体的位置和大小信息,并将指令传递给机械臂来完成搬运动作。 最后,我们需要实现智能搬运算法。通过对物体进行图像识别或机器学习,小车可以判断目标物体的位置和形状,以及最佳抓取点。通过实时控制舵机和关节的运动,机械臂可以实现精确的抓取和放置动作。 基于Arduino小车的机械臂智能搬运研究可以应用于许多领域,如物流、仓储、制造业等。通过实现智能搬运技术,可以提高工作效率和减少人力成本,为人们的生活和工作带来便利。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值