“Joystick控制直流电机”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
设备
视频
 
(未显示1个用户的3个中间版本)
第40行: 第40行:
 
[[File: _304_DozingDonkey _Motor.jpg|600px|center]]
 
[[File: _304_DozingDonkey _Motor.jpg|600px|center]]
 
*Setup 3:将CoreUSB,Motor,Hub连接在一起。通过USB数据线将接入电脑。
 
*Setup 3:将CoreUSB,Motor,Hub连接在一起。通过USB数据线将接入电脑。
[[file:mCookie-Joystick-motor-pc.JPG|600px|center]]
+
[[file:mCookie-Joystick-motor1-pc.JPG|600px|center]]
  
 
==调试==
 
==调试==
 
*打开Arduino IDE,把原来IDE里的代码都删除,将下列代码复制到IDE中。
 
*打开Arduino IDE,把原来IDE里的代码都删除,将下列代码复制到IDE中。
 
<source lang="cpp">
 
<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>
 
</source>
 
*选择正确的板卡和COM端口
 
*选择正确的板卡和COM端口
第65行: 第156行:
  
 
==软件调试==
 
==软件调试==
*Joystick及电机控制引脚定义。
+
*Joystick及电机控制引脚定义。Joystick控制引脚可以更改,电机控制引脚不可以改。
 
<source lang="cpp">
 
<source lang="cpp">
#define PI 3.1415926
+
#define Pin_X A1
#define JoystickX_PIN A1  //Joystick的X轴输出
+
#define Pin_Y A0
#define JoystickY_PIN A0  //Joystick的Y轴输出
+
 
#define PIN_MOTORA 5   //电机输出引脚A
+
//D6,D8控制1A,1B的电机
#define PIN_MOTORB 6    //电机输出引脚B
+
#define OUT1A 6
 +
#define OUT1B 8
 +
//D5,D7控制2A,2B的电机
 +
#define OUT2A 5
 +
#define OUT2B 7
 
</source>
 
</source>
 
+
*“uiStep()”Joystick检测函数
*计算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>
 +
*根据Joystick返回的函数值控制方向
 
<source lang="cpp">
 
<source lang="cpp">
    valueX = (float)(analogRead(JoystickX_PIN)-512);   
+
  else if (uiStep() == 3)
    valueY = (float)(analogRead(JoystickY_PIN)-512);
+
     data = 0;
    valueL = sqrt(sq(valueX)+sq(valueY));
+
  else if (uiStep() == 4)
    angle = asin(valueX/valueL)*180/PI;    //通过反三角函数计算摇杆的角度
+
     data = 1;
     motorSpeed = (int)(angle*255/180);    //根据角度计算电机的转速
 
    if(motorSpeed > 0)                    //角度为正,电机正转
 
    {
 
      digitalWrite(PIN_MOTORA, LOW);
 
      analogWrite(PIN_MOTORB, motorSpeed);
 
    }
 
    else if(motorSpeed < 0)              //角度为负,电机反转
 
    {
 
      digitalWrite(PIN_MOTORB, LOW);
 
      analogWrite(PIN_MOTORA, abs(motorSpeed));
 
     }
 
    else                                  //角度为零,电机停止
 
    {
 
      digitalWrite(PIN_MOTORA, LOW);
 
      digitalWrite(PIN_MOTORB, LOW);
 
    }
 
    delay(500);   
 
 
 
 
</source>
 
</source>
  
第103行: 第198行:
 
将Joystick的摇杆推到不同方向,可以看到电机的转速及方向也会跟着变化。
 
将Joystick的摇杆推到不同方向,可以看到电机的转速及方向也会跟着变化。
  
==视频==
+
 
  
 
|}
 
|}

2017年4月12日 (三) 03:26的最新版本

Language English

目的

通过Joystick摇杆来控制直流电机的转动。

原理

通过检测Joystick摇杆在水平和垂直两个方向上的模拟量来做出控制。在水平方向上控制电机的速度,用PWM来调节速度。在垂直方向上控制电机的方向,通过控制高低电平信号。

设备

模块 数量 功能
mCookie-CoreUSB/zh 1 核心板
mCookie-Hub/zh 1 传感器转接板
mCookie-Motor/zh 1 电机驱动
mCookie-BM/zh 1 电池管理
mCookie-BM shield/zh 1 电池管理扩展
Microduino-Joystick/zh 1 摇杆传感器
  • 其他设备
    • N20直流减速电机
    • 2节电池
    • USB数据线
    • 传感器连接线*1

准备

  • Setup 1:将Joystick和Hub的A0,A1接起来。
  • Setup 2:将电机接到Motor的OUT1A,OUT1B引脚上。
  • Setup 3:将CoreUSB,Motor,Hub连接在一起。通过USB数据线将接入电脑。

调试

  • 打开Arduino IDE,把原来IDE里的代码都删除,将下列代码复制到IDE中。
#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);
  }
}
  • 选择正确的板卡和COM端口
Upload.JPG
  • 编译
    • 编译时会提示保存项目,用户可以自己命名保存到你的文件夹即可。
  • 下载
    • 编译成功后可以直接下载,提示下载成功表示程序下载完毕。
  • 将激活后的电池盒与BM模块相连。Motor模块必须结合BM使用才能工作
CoreUSB Ble steup2.jpg
pinout
pinout
  • 将电池盒与BM模块连接,所有模块都连接在一起。打开电源
  • 结果
    • 在水平方向上控制电机的速度,往右拨动速度越来越快,往左拨动速度越来越慢。
    • 在垂直方向上控制电机的方向,往上拨动正转,往下拨动反转。

软件调试

  • Joystick及电机控制引脚定义。Joystick控制引脚可以更改,电机控制引脚不可以改。
#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
  • “uiStep()”Joystick检测函数
  • “motor_sta(int num, int fadeValue)”电机驱动函数
    • num表示正反转方向
    • fadeValue表示电机的速度,速度的变化从0-255。
  • 根据Joystick返回的函数值控制速度
  if (uiStep() == 1)
  {
    value += 5;
    if (value > 255)
      value = 255;
  }
  else if (uiStep() == 2)
  {
    value -= 5;
    if (value < 0)
      value = 0;
  }
  • 根据Joystick返回的函数值控制方向
  else if (uiStep() == 3)
    data = 0;
  else if (uiStep() == 4)
    data = 1;

结果

将Joystick的摇杆推到不同方向,可以看到电机的转速及方向也会跟着变化。