“Joystick控制直流电机”的版本间的差异
(→设备) |
Zhangfengfeng(讨论 | 贡献) (→视频) |
||
(未显示1个用户的5个中间版本) | |||
第7行: | 第7行: | ||
==原理== | ==原理== | ||
− | + | 通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在水平方向上控制电机的速度,用PWM来调节速度。在垂直方向上控制电机的方向,通过控制高低电平信号。 | |
==设备== | ==设备== | ||
第32行: | 第32行: | ||
**传感器连接线*1 | **传感器连接线*1 | ||
− | [[File:_Joystick_motor.jpg|600px|center | + | [[File:_Joystick_motor.jpg|600px|center]] |
− | == | + | ==准备== |
− | *Setup | + | *Setup 1:将Joystick和Hub的A0,A1接起来。 |
− | [[File: | + | [[file:mCookie-Joystick-motor-sensor.JPG|600px|center]] |
− | * | + | *Setup 2:将电机接到Motor的OUT1A,OUT1B引脚上。 |
− | [[file: | + | [[File: _304_DozingDonkey _Motor.jpg|600px|center]] |
− | [[ | + | *Setup 3:将CoreUSB,Motor,Hub连接在一起。通过USB数据线将接入电脑。 |
+ | [[file:mCookie-Joystick-motor1-pc.JPG|600px|center]] | ||
+ | |||
+ | ==调试== | ||
+ | *打开Arduino IDE,把原来IDE里的代码都删除,将下列代码复制到IDE中。 | ||
+ | <source lang="cpp"> | ||
+ | #define Pin_X A1 | ||
+ | #define Pin_Y A0 | ||
+ | |||
+ | //D6,D8控制1A,1B的电机 | ||
+ | #define OUT1A 6 | ||
+ | #define OUT1B 8 | ||
+ | //D5,D7控制2A,2B的电机 | ||
+ | #define OUT2A 5 | ||
+ | #define OUT2B 7 | ||
+ | |||
+ | int value, data; | ||
+ | |||
+ | void setup() { | ||
+ | // put your setup code here, to run once: | ||
+ | Serial.begin(9600); //串口初始化 | ||
+ | pinMode(Pin_X, INPUT); | ||
+ | pinMode(Pin_Y, INPUT); | ||
+ | pinMode(OUT1A, OUTPUT); | ||
+ | pinMode(OUT1B, OUTPUT); | ||
+ | pinMode(OUT2A, OUTPUT); | ||
+ | pinMode(OUT2B, OUTPUT); | ||
+ | } | ||
+ | |||
+ | 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) | ||
+ | { | ||
+ | value += 5; | ||
+ | if (value > 255) | ||
+ | value = 255; | ||
+ | } | ||
+ | else if (uiStep() == 2) | ||
+ | { | ||
+ | value -= 5; | ||
+ | if (value < 0) | ||
+ | value = 0; | ||
+ | } | ||
+ | else if (uiStep() == 3) | ||
+ | data = 0; | ||
+ | else if (uiStep() == 4) | ||
+ | data = 1; | ||
+ | motor_sta(data, value); | ||
+ | |||
+ | Serial.print(data); | ||
+ | Serial.print(" "); | ||
+ | Serial.println(value); | ||
+ | } | ||
+ | void motor_sta(int num, int fadeValue) | ||
+ | { | ||
+ | if (num == 0) | ||
+ | { | ||
+ | analogWrite(OUT1A, fadeValue); | ||
+ | digitalWrite(OUT1B, LOW); | ||
+ | analogWrite(OUT2A, fadeValue); | ||
+ | digitalWrite(OUT2B, LOW); | ||
+ | } | ||
+ | else if (num == 1) | ||
+ | { | ||
+ | digitalWrite(OUT1A, LOW); | ||
+ | analogWrite(OUT1B, fadeValue); | ||
+ | digitalWrite(OUT2A, LOW); | ||
+ | analogWrite(OUT2B, fadeValue); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | *选择正确的板卡和COM端口 | ||
+ | [[file:upload.JPG|600px|center]] | ||
+ | *编译 | ||
+ | **编译时会提示保存项目,用户可以自己命名保存到你的文件夹即可。 | ||
+ | *下载 | ||
+ | **编译成功后可以直接下载,提示下载成功表示程序下载完毕。 | ||
+ | [[file:upload-Joystick-motor.JPG|600px|center]] | ||
+ | *将激活后的电池盒与BM模块相连。'''Motor模块必须结合BM使用才能工作'''。 | ||
+ | [[File:CoreUSB_Ble_steup2.jpg|600px|center]] | ||
+ | [[file:mCookie-BMPin1.jpg|800px|center|pinout]] | ||
+ | [[file:mCookie-BMPin2.jpg|800px|center|pinout]] | ||
+ | *将电池盒与BM模块连接,所有模块都连接在一起。打开电源 | ||
+ | [[file:mCookie-Joystick-motor-all.JPG|600px|center]] | ||
+ | *结果 | ||
+ | **在水平方向上控制电机的速度,往右拨动速度越来越快,往左拨动速度越来越慢。 | ||
+ | **在垂直方向上控制电机的方向,往上拨动正转,往下拨动反转。 | ||
==软件调试== | ==软件调试== | ||
− | * | + | *Joystick及电机控制引脚定义。Joystick控制引脚可以更改,电机控制引脚不可以改。 |
<source lang="cpp"> | <source lang="cpp"> | ||
− | #define | + | #define Pin_X A1 |
− | + | #define Pin_Y A0 | |
− | #define | ||
− | |||
− | |||
+ | //D6,D8控制1A,1B的电机 | ||
+ | #define OUT1A 6 | ||
+ | #define OUT1B 8 | ||
+ | //D5,D7控制2A,2B的电机 | ||
+ | #define OUT2A 5 | ||
+ | #define OUT2B 7 | ||
+ | </source> | ||
+ | *“uiStep()”Joystick检测函数 | ||
+ | *“motor_sta(int num, int fadeValue)”电机驱动函数 | ||
+ | **'''num'''表示正反转方向 | ||
+ | **'''fadeValue'''表示电机的速度,速度的变化从0-255。 | ||
+ | *根据Joystick返回的函数值控制速度 | ||
+ | <source lang="cpp"> | ||
+ | if (uiStep() == 1) | ||
+ | { | ||
+ | value += 5; | ||
+ | if (value > 255) | ||
+ | value = 255; | ||
+ | } | ||
+ | else if (uiStep() == 2) | ||
+ | { | ||
+ | value -= 5; | ||
+ | if (value < 0) | ||
+ | value = 0; | ||
+ | } | ||
</source> | </source> | ||
− | + | *根据Joystick返回的函数值控制方向 | |
− | * | ||
<source lang="cpp"> | <source lang="cpp"> | ||
− | + | else if (uiStep() == 3) | |
− | + | data = 0; | |
− | + | else if (uiStep() == 4) | |
− | + | data = 1; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | == | + | ==结果== |
− | + | 将Joystick的摇杆推到不同方向,可以看到电机的转速及方向也会跟着变化。 | |
− | |||
− | |||
− | |||
|} | |} |
2017年4月12日 (三) 03:26的最新版本
Language | English |
---|
目的通过Joystick摇杆来控制直流电机的转动。 原理通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在水平方向上控制电机的速度,用PWM来调节速度。在垂直方向上控制电机的方向,通过控制高低电平信号。 设备
准备
调试
#define Pin_X A1
#define Pin_Y A0
//D6,D8控制1A,1B的电机
#define OUT1A 6
#define OUT1B 8
//D5,D7控制2A,2B的电机
#define OUT2A 5
#define OUT2B 7
int value, data;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //串口初始化
pinMode(Pin_X, INPUT);
pinMode(Pin_Y, INPUT);
pinMode(OUT1A, OUTPUT);
pinMode(OUT1B, OUTPUT);
pinMode(OUT2A, OUTPUT);
pinMode(OUT2B, OUTPUT);
}
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)
{
value += 5;
if (value > 255)
value = 255;
}
else if (uiStep() == 2)
{
value -= 5;
if (value < 0)
value = 0;
}
else if (uiStep() == 3)
data = 0;
else if (uiStep() == 4)
data = 1;
motor_sta(data, value);
Serial.print(data);
Serial.print(" ");
Serial.println(value);
}
void motor_sta(int num, int fadeValue)
{
if (num == 0)
{
analogWrite(OUT1A, fadeValue);
digitalWrite(OUT1B, LOW);
analogWrite(OUT2A, fadeValue);
digitalWrite(OUT2B, LOW);
}
else if (num == 1)
{
digitalWrite(OUT1A, LOW);
analogWrite(OUT1B, fadeValue);
digitalWrite(OUT2A, LOW);
analogWrite(OUT2B, fadeValue);
}
}
软件调试
#define Pin_X A1
#define Pin_Y A0
//D6,D8控制1A,1B的电机
#define OUT1A 6
#define OUT1B 8
//D5,D7控制2A,2B的电机
#define OUT2A 5
#define OUT2B 7
if (uiStep() == 1)
{
value += 5;
if (value > 255)
value = 255;
}
else if (uiStep() == 2)
{
value -= 5;
if (value < 0)
value = 0;
}
else if (uiStep() == 3)
data = 0;
else if (uiStep() == 4)
data = 1;
结果将Joystick的摇杆推到不同方向,可以看到电机的转速及方向也会跟着变化。
|