arduino nano实现Ps2手柄控制舵机旋转至任意角度

1、首先,要想实现要想实现Ps2手柄控制舵机任意角度控制,必须要了解怎样实现Ps2手柄与arduino nano的通信和解码以及舵机的工作原理,这个比较简单,大家去自行了解一下就OK了。

2、舵机的工作原理是:向舵机发送周期为20ms的脉冲信号,当这段脉冲中高电位占比为0.5ms的时候,舵机会转至0度,当高电位占比为2.5ms的时候,舵机会转至180度。(这部分做一下简单了解,在程序中并未体现)。

3、本次采用arduino的库函数文件Servo.h。可以轻松地实现舵机旋转任意角度。具体功能在程序中也有标注出来,比较清晰,读者可以自行观看。(老牛的程序是可以直接COPY过去使用的,没有的库文件,老牛已经放在百度网盘,建议大家自己下载一下)。链接:https://pan.baidu.com/s/1XTgef2rl0iQFTJU2PuGJ5A 
提取码:66ln

链接:https://pan.baidu.com/s/1Fozo8eEGHAFu-ZLSgziuKg 
提取码:66ln

4、基本原理很简单,废话不多说,上连接图。

 

5、代码。

​/*****************************************
 This program is just belong to Niu Lao.
 Don't spread it on website casually. 
 Auther: Niu Lao
 Function:1、实现Ps2手柄与arduino的通信和数据解析
           2、实现舵机任意角度的旋转控制
******************************************/
#include <PS2X_lib.h>
#include <Servo.h>
#define PS2_DAT        13
#define PS2_CMD        11
#define PS2_SEL        10
#define PS2_CLK        12
#define pressures   false
#define rumble      false
int error = 0;
//int speed = 0;
byte type = 0;
byte vibrate = 0;
PS2X ps2x;
void (* resetFunc) (void) = 0;
//以上为手柄配置
int sck = 9;
Servo duoji;//伺服舵机

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(sck, OUTPUT);
  duoji.attach(9);//舵机连接9号引脚
  type = ps2x.readType();
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
  delay(300);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (error == 1) {
    resetFunc();
  }

  if (type == 2) {
    ps2x.read_gamepad();
  }
  else {
    ps2x.read_gamepad(false, vibrate);

    vibrate = ps2x.Analog(PSAB_CROSS);

    int LY1 = ps2x.Analog(PSS_LY);
    int LX1 = ps2x.Analog(PSS_LX);
    int RY1 = ps2x.Analog(PSS_RY);
    int RX1 = ps2x.Analog(PSS_RX);
    int ly = map(LY1, 0, 255, 0, 170);
    int lx = map(LX1, 0, 255, 0, 170);
    int ry = map(RY1, 0, 255, 0, 170);
    int rx = map(RX1, 0, 255, 0, 170);
    Serial.print(LY1);
    Serial.print(',');
    Serial.print(LX1);
    Serial.print(',');
    Serial.print(RY1);
    Serial.print(',');
    Serial.print(RX1);
    Serial.print('\n');
    if (ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) {
      if (ps2x.Button(PSB_GREEN)) {
        duoji.write(0);
        delay(700);
      }
      if (ps2x.Button(PSB_PINK)) {
        duoji.write(30);
        delay(700);
      }
      if (ps2x.Button(PSB_BLUE)) {
        duoji.write(60);
        delay(700);
      }
      if (ps2x.Button(PSB_RED)) {
        duoji.write(90);
        delay(700);
      }
    }
    else {
      digitalWrite(sck, LOW); //将舵机输出引脚拉低
      delay(50);
    }
    if (ps2x.Button(PSB_L2) || ps2x.Button(PSB_R2)) {
      duoji.write(ly);
      delay(700);
    }
    else {
      digitalWrite(sck, LOW); //将舵机输出引脚拉低
      delay(50);
    }
  }
}

​

6、简单总结一下,本次介绍了arduino实现Ps2手柄控制舵机任意角度。需要掌握的部分有:map(Value,Min1,Max1,Min2,Max2)函数,实现不同限定变化范围的转换、调用库文件函数(本次基本是库文件程序作用)、基础电路知识、基础C语言知识、Servo库函数的调用(程序中标注比较详细,就不再赘述)。老牛也会努力让更多小白能够触摸到电路控制的乐趣,后续还会继续更新一些遥控小车,语音遥控等等一些有趣的开发项目。

老牛

  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值