“Joystick控制舵机旋转”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
(Created page with "{{Language| Joystick控制舵机旋转}} {| style="width: 800px;" |- | ==目的== 通过Joystick摇杆来控制舵机进行旋转。 ==原理== ==设备== {|class="wikitable...")
 
搭建硬件
 
(未显示同一用户的1个中间版本)
第4行: 第4行:
 
|
 
|
 
==目的==
 
==目的==
通过Joystick摇杆来控制舵机进行旋转。
+
通过检测Joystick精确控制舵机转动。
  
 
==原理==
 
==原理==
 +
通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在垂直方向上控制舵机的角度,从0-180°变化。在水平方向上控制舵机每走一步的角度的精度(快慢)。
  
 
==设备==
 
==设备==
第13行: 第14行:
 
|模块||数量||功能
 
|模块||数量||功能
 
|-
 
|-
|[[Microduino-CoreUSB/zh]]||1||核心板
+
|[[mCookie-CoreUSB/zh]]||1||核心板
 
|-
 
|-
|[[Microduino-Sensorhub/zh]]||1||传感器转接板
+
|[[mCookie-Hub/zh]]||1||传感器转接板
 
|-
 
|-
| [[Microduino-Servo/zh]]||1||舵机转接板
+
|[[Microduino-Joystick/zh]]||1||摇杆
 
|-
 
|-
| [[Mirco Servo/zh]]||1||舵机
+
|[[Microduino-Servo Connector/zh]]||1||舵机连接板
|-
 
| [[Microduino-Joystick/zh]]||1||摇杆传感器
 
|-
 
| [[Microduino-BM/zh]]||1||电源管理
 
 
|}
 
|}
[[File: Joystick_Servo.jpg|600px|center|thumb]]
+
*其他硬件设备
 +
**舵机
 +
**USB数据连接线
 +
**传感器连接线*2
 +
[[File: Joystick_Servo.jpg|600px|center]]
 +
 
 +
==准备==
 +
*Setup 1:将Microduino-Servo Connector和舵机连接,接到上一排排针上。
 +
[[file:mCookie-Servo Connector-sensor.JPG|600px|center]]
 +
*Setup 2:将Microduino-Servo Connector和Hub的模拟口IIC接起来。将Joystick连接到A0,A1接口上。
 +
[[file:mCookie-Servo Connector-joystick-hub.JPG|600px|center]]
 +
*Setup 3:将所有设备连接在一起。通过USB数据线将接入电脑。
 +
[[file:mCookie-servo-joystick-pc.JPG|600px|center]]
 +
 
 +
==调试==
 +
*打开Arduino IDE,将下列代码复制到IDE中。
 +
<source lang="cpp">
 +
#include <Servo.h>
 +
Servo myservo;
 +
 
 +
#define Pin_X A1
 +
#define Pin_Y A0
  
==搭建硬件==
+
#define servo_pin SDA
* Setup 1:将CoreUSB接到电脑。打开示例程序,选择好板卡和串口下载程序。
+
 
[https://github.com/Microduino/Microduino_Tutorials/tree/master/MCookie_Tutorial/Joystick_Servo Joystick_Servo]
+
int pose=5, angle = 90;
*Setup 2:将CoreUSB与Sensorhub叠堆。
+
int data;
[[File:CoreUSB_Sensorhub.jpg|600px|center|thumb]]
+
 
*Setup 3:将舵机连到舵机转接板,再将舵机转接板接到Sensorhub的D8引脚上,将Joystick摇杆传感器接到A0、A1引脚上。
+
void setup() {
[[file:Microduino-sensorhub_rule.JPG|thumb|800px|center]]
+
  // put your setup code here, to run once:
[[File:Joystick_Servo_all.jpg|600px|center|thumb]]
+
  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);
 +
}
 +
</source>
 +
*选择正确的板卡和COM端口
 +
[[file:upload.JPG|600px|center]]
 +
*编译
 +
**编译时会提示保存项目,用户可以自己命名保存到你的文件夹即可。
 +
*下载
 +
**编译成功后可以直接下载,提示下载成功表示程序下载完毕。
 +
[[file:upload-Joystick-servo.JPG|600px|center]]
 +
*结果
 +
**垂直方向上控制舵机角度
 +
**水平方向调节舵机转动的精度
  
 
==软件调试==
 
==软件调试==
第40行: 第137行:
 
*Joystick控制引脚定义:  
 
*Joystick控制引脚定义:  
 
<source lang="cpp">
 
<source lang="cpp">
#define JoystickX_PIN A1
+
#define Pin_X A1
#define JoystickY_PIN A0
+
#define Pin_Y A0
 
</source>
 
</source>
*计算Joystick摇杆所在的角度,然后将舵机旋转到对应的角度。
+
*“uiStep()”Joystick检测函数。
<source lang="cpp">
+
*舵机需要使用舵机库“#include <Servo.h>”来驱动。
 
+
*根据Joystick返回的函数值控制舵机角度(0-180°)
     float valueX = (float)(analogRead(JoystickX_PIN)-512);
+
<source lang="cpp">
     float valueY = (float)(analogRead(JoystickY_PIN)-512);
+
  if (uiStep() == 1)
     float valueL = sqrt(sq(valueX)+sq(valueY));      
+
  {
     float angle = asin(valueX/valueL)*180/PI;     //通过反三角函数计算摇杆的角度
+
     angle += pose;
     myservo.write(angle+90);       //舵机旋转到对应角度
+
    if (angle > 180)
     delay(100);
+
      angle = 180;
 
+
  }
 +
  else if (uiStep() == 2)
 +
  {
 +
    angle -= pose;
 +
     if (angle < 0)
 +
      angle = 0;
 +
  }
 +
</source>
 +
*根据Joystick返回的函数值控制控制舵机移动的精度(1-10°)
 +
<source lang="cpp">
 +
  else if (uiStep() == 3)
 +
  {
 +
    pose++;
 +
     if (pose > 10)
 +
      pose = 10;
 +
  }
 +
  else if (uiStep() == 4)
 +
  {
 +
    pose--;
 +
     if (pose < 1)
 +
      pose = 1;
 +
  }
 +
</source>
 +
*如果角度有变化,舵机转动
 +
<source lang="cpp">
 +
  if (data != angle)
 +
  {
 +
     myservo.write(angle);
 +
     data=angle;
 +
  }
 
</source>
 
</source>
 
 
==结果==
 
==结果==
将Joystick的摇杆推到不同的角度,舵机也会旋转到对应的角度。
+
垂直方向上控制舵机角度,水平方向调节舵机转动的精度。通过Joystick准确控制舵机。
  
 
==视频==
 
==视频==
  
 
|}
 
|}

2015年11月24日 (二) 08:21的最新版本

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准确控制舵机。

视频