arduino nano与Ps2手柄通过任意IO口控制舵机旋转至任意角度

1、首先,本次的控制程序属于是进阶版Ps2手柄舵机控制。要想实现要想实现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 just belong to Niu Lao.
 Don't spread it on website casually. 
 Auther: Niu Lao
 Function:1、实现Ps2手柄与arduino nano通信
           2、实现舵机转至任意角度
           3、实现任意IO引脚控制舵机
******************************************/
#include <PS2X_lib.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 PWM;//舵机脉宽变量
int sck = 2; //定义舵机输出引脚

void duoji(int sck, int jiaodu) {  //舵机角度控制子函数
  PWM = (jiaodu * 11) + 500; //将角度值转化为500—2480
  digitalWrite(sck, HIGH); //将舵机输出引脚拉高
  delayMicroseconds(PWM);//设定高电位脉冲宽度
  digitalWrite(sck, LOW); //将舵机输出引脚拉低
  delayMicroseconds(20000 - PWM); //设定低电位脉冲宽度
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(sck, OUTPUT);
  delay(300);
  type = ps2x.readType();
  error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);
}

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( sck,  0);
        delay(50);
      }
      if (ps2x.Button(PSB_PINK)) {
        duoji( sck,  30);
        delay(50);
      }
      if (ps2x.Button(PSB_BLUE)) {
        duoji(sck, 60);
        delay(50);
      }
      if (ps2x.Button(PSB_RED)) {
        duoji( sck, 90);
        delay(50);
      }
    }
    else {
      digitalWrite(sck, LOW); //将舵机输出引脚拉低
      delay(50);
    }
    if (ps2x.Button(PSB_L2) || ps2x.Button(PSB_R2)) {
      duoji(sck, ly);
      delay(50);
    }
    else {
      digitalWrite(sck, LOW); //将舵机输出引脚拉低
      delay(50);
    }
  }
}

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

7、本次老牛的目的所在就是为了让更多的小伙伴能够实现自己手动创建任意占空比的PWM,并且通过任意的IO口进行输出。

有问题欢迎私信老牛~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值