Joystick控制舵机旋转

来自Microduino Wikipedia
跳转至: 导航搜索
Language English

目的

通过检测Joystick精确控制舵机转动。

原理

通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在垂直方向上控制舵机的角度,从0-180°变化。在水平方向上控制舵机每走一步的角度的精度(快慢)。

设备

模块 数量 功能
mCookie-CoreUSB/zh 1 核心板
mCookie-Hub/zh 1 传感器转接板
Microduino-Joystick/zh 1 摇杆
Microduino-Servo Connector/zh 1 舵机连接板
  • 其他硬件设备
    • 舵机
    • USB数据连接线
    • 传感器连接线*2

准备

  • Setup 1:将Microduino-Servo Connector和舵机连接,接到上一排排针上。
  • Setup 2:将Microduino-Servo Connector和Hub的模拟口IIC接起来。将Joystick连接到A0,A1接口上。
  • Setup 3:将所有设备连接在一起。通过USB数据线将接入电脑。

调试

  • 打开Arduino IDE,将下列代码复制到IDE中。
#include <Servo.h>
Servo myservo;

#define Pin_X A1
#define Pin_Y A0

#define servo_pin SDA

int pose=5, angle = 90;
int data;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);    //串口初始化
  pinMode(Pin_X, INPUT);
  pinMode(Pin_Y, INPUT);
  myservo.attach(servo_pin);
}

int uiStep()
{
  if (analogRead(Pin_Y) < 100)  //Y-up
  {
    delay(50);
    if (analogRead(Pin_Y) < 100)
      return 1;
  }
  if (analogRead(Pin_Y) > 900)  //Y-down
  {
    delay(50);
    if (analogRead(Pin_Y) > 900)
      return 2;
  }
  if (analogRead(Pin_X) < 100)
  {
    delay(50);
    if (analogRead(Pin_X) < 100)  //X-Right
      return 3;
  }
  if (analogRead(Pin_X) > 900)    //X-Left
  {
    delay(50);
    if (analogRead(Pin_X) > 900)
      return 4;
  }
  return 0;
}

void loop() {
  if (uiStep() == 1)
  {
    angle += pose;
    if (angle > 180)
      angle = 180;
  }
  else if (uiStep() == 2)
  {
    angle -= pose;
    if (angle < 0)
      angle = 0;
  }
  else if (uiStep() == 3)
  {
    pose++;
    if (pose > 10)
      pose = 10;
  }
  else if (uiStep() == 4)
  {
    pose--;
    if (pose < 1)
      pose = 1;
  }
  if (data != angle)
  {
    myservo.write(angle);
    data=angle;
  }
  Serial.print(pose);
  Serial.print("   ");
  Serial.println(angle);
}
  • 选择正确的板卡和COM端口
Upload.JPG
  • 编译
    • 编译时会提示保存项目,用户可以自己命名保存到你的文件夹即可。
  • 下载
    • 编译成功后可以直接下载,提示下载成功表示程序下载完毕。
  • 结果
    • 垂直方向上控制舵机角度
    • 水平方向调节舵机转动的精度

软件调试

代码说明

  • Joystick控制引脚定义:
#define Pin_X A1
#define Pin_Y A0
  • “uiStep()”Joystick检测函数。
  • 舵机需要使用舵机库“#include <Servo.h>”来驱动。
  • 根据Joystick返回的函数值控制舵机角度(0-180°)
  if (uiStep() == 1)
  {
    angle += pose;
    if (angle > 180)
      angle = 180;
  }
  else if (uiStep() == 2)
  {
    angle -= pose;
    if (angle < 0)
      angle = 0;
  }
  • 根据Joystick返回的函数值控制控制舵机移动的精度(1-10°)
  else if (uiStep() == 3)
  {
    pose++;
    if (pose > 10)
      pose = 10;
  }
  else if (uiStep() == 4)
  {
    pose--;
    if (pose < 1)
      pose = 1;
  }
  • 如果角度有变化,舵机转动
  if (data != angle)
  {
    myservo.write(angle);
    data=angle;
  }

结果

垂直方向上控制舵机角度,水平方向调节舵机转动的精度。通过Joystick准确控制舵机。

视频