Arduino 控制小车加机械臂

  是菜鸟的作品,实现了机械臂的控制,和小车前后左右的控制。连接 WiFi 后可实现TCP 通信。主要模块用到了一个Arduino nuo 板、一个红板、一个 TD-06 WiFi模块、四个舵机和两个小车驱动电机。

  实物图如下

在这里插入图片描述
  代码如下

#include <Servo.h>

//--------------------------------------------------舵机引脚
#define PIN_SERV7 7 //舵机号(IO口)
#define PIN_SERV8 8 //舵机号(IO口)
#define PIN_SERV9 9 //舵机号(IO口)
#define PIN_SERV10 10 //舵机号(IO口)
//--------------------------------------------------小车引脚
#define input1 3 // 定义uno的pin 3 向 input1 输出
#define input2 4 // 定义uno的pin 4 向 input2 输出----//3、4引脚控制左轮
#define input3 5 // 定义uno的pin 5 向 input3 输出
#define input4 6 // 定义uno的pin 6 向 input4 输出----//5、6引脚控制右轮
//-----------------------------------------------------------------------------------
//两驱动小车

Servo myservo_7, myservo_8, myservo_9, myservo_10;

//----------------------小车控制函数--------------------------------------------------

char Forward() //前进
{
  digitalWrite(input1, HIGH); //给高电平1
  digitalWrite(input2, LOW); //给低电平0
  digitalWrite(input3, HIGH); //给高电平1
  digitalWrite(input4, LOW); //给低电平0
  while(1)
  {
    if(Serial.available())      // 如果要选择新的模式:逆时针转,停止
    {
        char mode = Serial.read();
        Stop();
        return mode;            // 返回新的指令
    }
   }
}

char Backward() //后退
{
  digitalWrite(input1, LOW);
  digitalWrite(input2, HIGH);
  digitalWrite(input3, LOW);
  digitalWrite(input4, HIGH);
  while(1)
  {
    if(Serial.available())      // 如果要选择新的模式:逆时针转,停止
    {
        char mode = Serial.read();
        Stop();
        return mode;            // 返回新的指令
    }
   }
}

void Stop()//------------------停止
{
  digitalWrite(input1, LOW);
  digitalWrite(input2, LOW);
  digitalWrite(input3, LOW);
  digitalWrite(input4, LOW);
}

char  TurnRight()//-------------右转
{
  digitalWrite(input1, HIGH);
  digitalWrite(input2, LOW);
  digitalWrite(input3, HIGH);
  while(1)
  {
    digitalWrite(input4, LOW);
    delay(80);
    digitalWrite(input4, HIGH);
    delay(20);
    if(Serial.available())      // 如果要选择新的模式:逆时针转,停止
    {
        char mode = Serial.read();
        Stop();
        return mode;            // 返回新的指令
    }
  }
}

char TurnLeft()//--------------左转
{
  digitalWrite(input2, LOW);//左轮
  digitalWrite(input3, HIGH);//右轮
  digitalWrite(input4, LOW);
  while(1)
  {
    digitalWrite(input1, HIGH);
    delay(80);
    digitalWrite(input1, LOW);
    delay(20);
    if(Serial.available())      // 如果要选择新的模式:逆时针转,停止
    {
        char mode = Serial.read();
        Stop();
        return mode;            // 返回新的指令
    }
  }
}


//------------------------舵机控制函数-------------------------------------------------

char clockwise(Servo myservo, int stop_angle=0) //顺时针    角度减小   后 下 抓 顺
{                                               //                      2, 4, 5, 7   
    int start_angle = myservo.read();//读取舵机目前角度
    
    for(int i=start_angle; i>stop_angle; i--)
    {
        myservo.write(i);           //使舵机转动至指定角度
        //Serial.println(i);
        delay(30);
        if(Serial.available())      // 如果要选择新的模式:逆时针转,停止
        {
            char mode = Serial.read();
            return mode;            // 返回新的指令
        }
    }
    return '9';
}


char anticlockwise(Servo myservo, int stop_angle=180)//逆时针       角度增大  前 上 放 逆
{                                                    //                        1, 3, 6, 8
    int start_angle = myservo.read();         //读取舵机目前角度
    
    for(int i=start_angle; i<stop_angle; i++)
    {
        myservo.write(i); 
        //Serial.println(i);
        delay(30);
        if(Serial.available())        // 如果要选择新的模式:顺时针转,停止
        {
            char mode = Serial.read();
            return mode;
        }
    }
    return '9';
}
//-----------------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);        //初始化串口
  myservo_7.attach(PIN_SERV7);// 将Servo变量附加到引脚,将7号引脚设置为7号舵机控制端口
  myservo_8.attach(PIN_SERV8);
  myservo_9.attach(PIN_SERV9); 
  myservo_10.attach(PIN_SERV10);

  pinMode(input1, OUTPUT);//小车串口设置为输出模式
  pinMode(input2, OUTPUT);
  pinMode(input3, OUTPUT);
  pinMode(input4, OUTPUT);
  //Serial.println("Test start ");

}
//-----------------------------------------------------------------------------------
void loop()
{
    if(Serial.available())            // 等待接收控制信号(非阻塞)
    {
        char mode_9g = Serial.read(); // 读取模式选择指令
        int jump=1;
        while(1)
        {
            switch(mode_9g)
            {
                case '1':       //-----前 角度增大
              {   
                mode_9g = anticlockwise(myservo_8);// 93/110 --> 180     
                break;
              }
            case '2':       //-----后 角度减小
              {   
                mode_9g = clockwise(myservo_8, 110);// 180 --> 110      
                break;
              }
            case '3':       //-----上 角度增大
              {   
                mode_9g = anticlockwise(myservo_9);// 93/65/80 -->180
                break;
              }
            case '4':       //-----下 角度减小
              {   
                int zz=myservo_8.read();
                if (zz>115)
                  mode_9g = clockwise(myservo_9, 65);// 180 --> 65
                else
                  mode_9g = clockwise(myservo_9, 85);// 93/180 --> 80
                break;
              }
            case '5':       //-----抓 角度减小
              {
                mode_9g = clockwise(myservo_10,90);// 93/180 --> 90
                break;
              }
            case '6':       //-----放 角度增大
              {
                mode_9g = anticlockwise(myservo_10);// 93/85 --> 180
                break;
              }
            case '7':       //-----底座右转(顺) 角度减小
              {
                mode_9g = clockwise(myservo_7); // 93/180 --> 0
                break;
              }
            case '8':       //----底座左转(逆) 角度增大
              {
                mode_9g = anticlockwise(myservo_7);// 93/0 --> 180
                break;
              }
            case 'a':       //左转
              {
                mode_9g = TurnLeft();
                break;
              }
            case 'w':       //前进
              {
                mode_9g = Forward();
                break;
              }
            case 'd':       //右转
              {
                mode_9g = TurnRight();
                break;
              }
            case 's':       //后退
              {
                mode_9g = Backward();
                break;
              }
            case 'p':       //停止
              {
                Stop();
                jump = 0;
                break;
              }
            default:
              {
                 if(mode_9g=='9') // 模式 9 结束转动 或 因转到极限位置而停止
                    Serial.println("over");
                 else
                    Serial.println("Input error");
                 jump = 0;
                 Stop();
                 break;
               }
            }
            if (jump==0)//跳出 while 以接收新的模式指令 
            { 
               break;
            }
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值