本站改版新增arduino频道

Micropython
Arduino

arduino PS2 双轴按键摇杆实验


arduino PS2 双轴按键摇杆实验

#define PS2_X     15
#define PS2_Y     2
#define SW        4


void setup() {
  // 配置衰减器
//  analogSetAttenuation(ADC_11db);


  // 配置输入模式
  pinMode(PS2_X, INPUT);
  pinMode(PS2_Y, INPUT);
  pinMode(SW, INPUT_PULLUP);

  // 配置串口通信波特率
  Serial.begin(9600);

}

void loop() {
  // 读取数值
  Serial.printf("x: %d, y: %d, z: %d\n", analogRead(PS2_X), analogRead(PS2_Y), digitalRead(SW));

  delay(100);

}





#define PS2_X     15
#define PS2_Y     2
#define SW        4
#define RESOLUTION  12
#define SERVO       13
#define CHANNEL     0
#define FREQ        50

int value;

//20ms 周期内,高电平持续时长 0.5-2.5 ms,对应 0-180 度舵机角度。
//对应 0.5ms(0.5ms/(20ms/256))
int min_width = 0.6 / 20 * pow(2, RESOLUTION);
//对应 2.5ms(2.5ms/(20ms/256))
int max_width = 2.5 / 20 * pow(2, RESOLUTION);

void setup() {
  // 配置衰减器
  analogSetAttenuation(ADC_11db);

  // 设置 ADC 分辨率
  analogReadResolution(RESOLUTION);


  // 配置输入模式
  pinMode(PS2_X, INPUT);
  pinMode(PS2_Y, INPUT);
  pinMode(SW, INPUT_PULLUP);

  // 配置串口通信波特率
  Serial.begin(9600);

  // 用于设置 LEDC 通道的频率和分辨率
  ledcSetup(CHANNEL, FREQ, RESOLUTION);
  // 将通道与对应的引脚连接
  ledcAttachPin(SERVO, CHANNEL);
  
}


void loop() {
  
  // 将 ADC 的值映射到舵机的转动范围
  value = map(analogRead(PS2_Y), 0, pow(2, RESOLUTION), min_width, max_width);
  
  // 读取数值
  Serial.printf("x: %d, y: %d, z: %d, 映射后的 y: %d\n", analogRead(PS2_X), analogRead(PS2_Y), digitalRead(SW), value);
  
  ledcWrite(CHANNEL, value);
  delay(100);

}




第三方库 ESP32Servo.h,让 PS2 摇杆控制舵机转动,代码如下:#include#define PS2_X      15
#define PS2_Y      2
#define SW         4
#define SERVO      13
#define RESOLUTION 12
#define FREQ       50


// 定义 Servo 对象
Servo my_servo;

int value;

void setup() {
  // 配置输入模式
  pinMode(PS2_X, INPUT);
  pinMode(PS2_Y, INPUT);
  pinMode(SW, INPUT_PULLUP);

  // 配置串口通信波特率
  Serial.begin(9600);

  // 分配硬件定时器
  ESP32PWM::allocateTimer(0);
  // 设置频率
  my_servo.setPeriodHertz(FREQ);
  // 关联 servo 对象与  GPIO 引脚,设置脉宽范围
  my_servo.attach(SERVO, 500, 2500);
  
}

void loop() {

  value = map(analogRead(PS2_Y), 0, pow(2, RESOLUTION), 0, 180);
  
  // 读取数值
  Serial.printf("x: %d, y: %d, z: %d, 映射后的 y: %d\n", analogRead(PS2_X), 
                analogRead(PS2_Y), digitalRead(SW), value);

  // 输出PWM
  my_servo.write(value);

  delay(100);
}
------
著作权归极客侠 GeeksMan所有
基于GPL 3.0协议
原文链接:https://docs.geeksman.com/esp32/Arduino/21.esp32-arduino-ps2.html



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 ESP56.com All Rights Reserved
晋ICP备14006235号-22 晋公网安备14108102001165号

执行时间: 0.010941028594971 seconds