基于 Arduino和WiFi 远程控制小车加机械臂

 花了两周的时间的,和同学一起做了一个遥控小车,上面又加了一个机械臂。总之收获颇丰。

设计使用了一个Arduino UNO 开发板,四个舵机,一个DT-06 TTL WiFi模块,一个L298N电机驱动板(红板) ,两个电机。和机械臂的支架,小车框架等。小车是两轮驱动的,后轮是一个万向轮。机械臂是四自由的。本来我们的Arduino是有扩展板的,但是坏了,然后我们又不想再买,就将这一个arduino开发板插满了。拿了咱们平常用的充电宝给整个设计供电。

实物图如下:

代码如下:


#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())      // 如果要选择新的模式:逆时针转,停止

    {

        Serial.println(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())      // 如果要选择新的模式:逆时针转,停止

    {

        

        Serial.println(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())      // 如果要选择新的模式:逆时针转,停止

    {

        

        Serial.println(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())      // 如果要选择新的模式:逆时针转,停止

    {

        

        Serial.println(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);           //使舵机转动至指定角度

       

        delay(30);

        if(Serial.available())      // 如果要选择新的模式:逆时针转,停止

        {

            

            Serial.println(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); 

       

        delay(30);

        if(Serial.available())        // 如果要选择新的模式:顺时针转,停止

        {

            

            Serial.println(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);

  

 

}

//-----------------------------------------------------------------------------------

void loop()

{

    if(Serial.available())            // 等待接收控制信号(非阻塞)

    {

        Serial.print("read words: ");

        Serial.println(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;

            }

        }

    }

}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值