“Joystick控制舵机旋转”的版本间的差异
(Created page with "{{Language| Joystick控制舵机旋转}} {| style="width: 800px;" |- | ==目的== 通过Joystick摇杆来控制舵机进行旋转。 ==原理== ==设备== {|class="wikitable...") |
(→搭建硬件) |
||
(未显示同一用户的1个中间版本) | |||
第4行: | 第4行: | ||
| | | | ||
==目的== | ==目的== | ||
− | + | 通过检测Joystick精确控制舵机转动。 | |
==原理== | ==原理== | ||
+ | 通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在垂直方向上控制舵机的角度,从0-180°变化。在水平方向上控制舵机每走一步的角度的精度(快慢)。 | ||
==设备== | ==设备== | ||
第13行: | 第14行: | ||
|模块||数量||功能 | |模块||数量||功能 | ||
|- | |- | ||
− | |[[ | + | |[[mCookie-CoreUSB/zh]]||1||核心板 |
|- | |- | ||
− | |[[ | + | |[[mCookie-Hub/zh]]||1||传感器转接板 |
|- | |- | ||
− | | [[Microduino- | + | |[[Microduino-Joystick/zh]]||1||摇杆 |
|- | |- | ||
− | + | |[[Microduino-Servo Connector/zh]]||1||舵机连接板 | |
− | |||
− | | [[Microduino- | ||
− | |||
− | |||
|} | |} | ||
− | + | *其他硬件设备 | |
+ | **舵机 | ||
+ | **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 |
− | + | ||
− | + | int pose=5, angle = 90; | |
− | * | + | int data; |
− | [[ | + | |
− | * | + | void setup() { |
− | [[file: | + | // 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); | ||
+ | } | ||
+ | </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 | + | #define Pin_X A1 |
− | #define | + | #define Pin_Y A0 |
</source> | </source> | ||
− | * | + | *“uiStep()”Joystick检测函数。 |
− | + | *舵机需要使用舵机库“#include <Servo.h>”来驱动。 | |
− | + | *根据Joystick返回的函数值控制舵机角度(0-180°) | |
− | + | <source lang="cpp"> | |
− | + | if (uiStep() == 1) | |
− | + | { | |
− | + | angle += pose; | |
− | myservo.write(angle | + | if (angle > 180) |
− | + | 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准确控制舵机。 | |
==视频== | ==视频== | ||
|} | |} |
2015年11月24日 (二) 08:21的最新版本
Language | English |
---|
目的通过检测Joystick精确控制舵机转动。 原理通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在垂直方向上控制舵机的角度,从0-180°变化。在水平方向上控制舵机每走一步的角度的精度(快慢)。 设备
准备
调试
#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);
}
软件调试代码说明
#define Pin_X A1
#define Pin_Y A0
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;
}
结果垂直方向上控制舵机角度,水平方向调节舵机转动的精度。通过Joystick准确控制舵机。 视频 |