新手求助蓝牙小车-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 931|回复: 9

[未解决] 新手求助蓝牙小车

[复制链接]
发表于 2021-12-17 23:33 | 显示全部楼层 |阅读模式
本帖最后由 bgsdd 于 2021-12-22 21:11 编辑

新手用2个28步进电机做了一个蓝牙小车,用的那种工业驱动器,2个电动轮子一个万向轮,操作方式是前后左右4个方向,各按键一次就连续走,中间要切换方向需要按9停止,在按其他方向键,现在想弄成 前,左,右3个方向一组和后,左,右3个方向 一组   随意连续切换,不需要按9中断电机,前后组切换需要按9中断,,模拟真实驾车,找不到思路





小车1.jpg
小车2.jpg
 楼主| 发表于 2021-12-18 15:23 | 显示全部楼层
本帖最后由 bgsdd 于 2021-12-24 09:34 编辑

现在有新的问题,听别人说用这个驱动器接arduino控制板的话,需要把驱动器电源20v锂电池的负极和arduino控制板END连接,但是我这个没连接好像也能用?还有一个就是想在小车转向的时候2个电机转速不同,外边块内边慢,在程序里分别写了2个电机脉冲,但是实际运行还是一样速度,而且是按慢速度的一起转动,有点不明白要怎么才能不同速转动。

//小车每次按键持续行走,如需换向需要按9中断才能换向,不能连续:行走-换向-行走
//手机蓝牙 HC-06遥控2轮小车, NEMA28步进电机配工业步进驱动器DM430
//步进电机由18V锂电池单独供电,驱动器共阳极接法
//需下载Accelstepper库,DIR+PUL+接控制板5V,PUL-接49引脚 DIR-接58引脚
//利用HC-06蓝牙模块控制,HC-06 RX引脚需使用分压电路确保信号电压为3.3V
//需先将此程序上传到UNO后,再将HC-06连接在UNO开发板上,需断电连接
//1前进,2后退,3左转,4右转,9停止

//#include <AccelStepper.h> //好像不需要**
const int xdirPin = 5;     // 左前轮电机方向引脚
const int xstepPin = 4;    // 左前轮电机步进速度引脚
const int ydirPin = 8;     // 右前轮电机方向引脚
const int ystepPin = 9;    // 右前轮电机步进速度引脚
char seria1Data; //建立字符型变量:seria1Data

//AccelStepper stepper1(1,xstepPin,xdirPin); //创建左前轮电机对象,好像不需要**
//AccelStepper stepper2(1,ystepPin,ydirPin); //创建右前轮电机对象,好像不需要**

void setup(){
  Serial.begin(9600); //启动串口通信,波特率:9600
  pinMode(xstepPin,OUTPUT);     // 左前轮速度引脚为输出模式
  pinMode(xdirPin,OUTPUT);      // 左前轮方向引脚为输出模式
  pinMode(ystepPin,OUTPUT);     // 右前轮速度引脚为输出模式
  pinMode(ydirPin,OUTPUT);      // 右前轮方向引脚为输出模式  
}

void loop(){
  //if(Serial.available()>0){ //判断串口有无接收到数据 ,好像不需要**
  seria1Data= Serial.read();//如有,则通过Serial.read函数读入字符变量中

  if(seria1Data == '1' ){while(1){ //if判断串口是否1,while循环判断是否成立,1是前进
    if(seria1Data=='9'){break;}else{ //while循环内判断是否接收9,如是则break跳出
     digitalWrite(xdirPin,LOW);      //如不是则往下循环,输出脉冲,控制轮子转动
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(200);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200); //延迟2毫秒
     seria1Data= Serial.read(); }} //while循环内设置接收串口,如9则配合跳出循环

  }else if(seria1Data == '2' ){while(1){  //以下相同,按串口信息控制方向  2是后退
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);  //左前轮正转
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(200);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);  //右前轮正转
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200);
     seria1Data= Serial.read();      }}//延迟2毫秒   

  }else if(seria1Data == '3' ){while(1){  //3是左转,两个轮子设置不同速度,左慢右快,但是实际2轮按慢的一起走
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(800); //延迟2毫秒,左轮脉冲慢
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(800);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平,右轮脉冲快
     delayMicroseconds(400); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(400);
     seria1Data= Serial.read();      }}//延迟2毫秒  

  }else if(seria1Data == '4' ){while(1){  //4是右转,2个轮子设置不同速度,左快右慢,但是实际2轮按慢的一起走
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,LOW);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(400); //延迟2毫秒,左轮脉冲快
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(400);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);   //右轮脉冲慢
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(800); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(800);
     seria1Data= Serial.read();      }}//延迟2毫秒  
  }}

发表于 2021-12-18 16:34 | 显示全部楼层
本帖最后由 lwq1947 于 2021-12-18 16:52 编辑

seria1Data值又变了,你用Serial.println(seria1Data);通过串口观察一下找出原因.此外你写的do while 循环也是一次的,若条件满足则是靠loop 循环的.
 楼主| 发表于 2021-12-18 16:53 | 显示全部楼层
本帖最后由 bgsdd 于 2021-12-22 21:11 编辑

顶下,期望高手指点
 楼主| 发表于 2021-12-18 20:42 | 显示全部楼层
本帖最后由 bgsdd 于 2021-12-22 21:20 编辑

这个是现在用的一步一中断的,用if...else判断+while循环+break跳出,达到目的,这个28步进电机需要一直输入脉冲信号,手机端点一下小车就一直走,然后点停止小车就停下,然后在点一下小车又继续走。。想改成前左右一组,后左右一组的,有高手指点思路不?

//手机蓝牙 HC-06遥控2轮小车, NEMA28步进电机配工业步进驱动器DM430
//步进电机由18V锂电池单独供电,驱动器共阳极接法
//需下载Accelstepper库,DIR+PUL+接控制板5V,PUL-接49引脚 DIR-接58引脚
//利用HC-06蓝牙模块控制,HC-06 RX引脚需使用分压电路确保信号电压为3.3V
//需先将此程序上传到UNO后,再将HC-06连接在UNO开发板上,需断电连接
//1前进,2后退,3左转,4右转,9停止

#include <AccelStepper.h>
const int xdirPin = 5;     // 左前轮电机方向引脚
const int xstepPin = 4;    // 左前轮电机步进速度引脚
const int ydirPin = 8;     // 右前轮电机方向引脚
const int ystepPin = 9;    // 右前轮电机步进速度引脚
char seria1Data; //建立字符型变量:seria1Data

AccelStepper stepper1(1,xstepPin,xdirPin); //创建左前轮电机对象
AccelStepper stepper2(1,ystepPin,ydirPin); //创建右前轮电机对象

void setup(){
  Serial.begin(9600); //启动串口通信,波特率:9600
  pinMode(xstepPin,OUTPUT);     // 左前轮速度引脚为输出模式
  pinMode(xdirPin,OUTPUT);      // 左前轮方向引脚为输出模式
  pinMode(ystepPin,OUTPUT);     // 右前轮速度引脚为输出模式
  pinMode(ydirPin,OUTPUT);      // 右前轮方向引脚为输出模式  
}

void loop(){
  //if(Serial.available()>0){ //判断串口有无接收到数据
  seria1Data= Serial.read();//如有,则通过Serial.read函数读入字符变量中

  if(seria1Data == '1' ){while(1){ //if判断串口是否1,while循环判断是否成立
    if(seria1Data=='9'){break;}else{ //while循环内判断是否接收9,如是则break跳出
     digitalWrite(xdirPin,LOW);      //如不是则往下循环,输出脉冲,控制轮子转动
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(200);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200); //延迟2毫秒
     seria1Data= Serial.read(); }} //while循环内设置接收串口,如9则配合跳出循环
  }else if(seria1Data == '2' ){while(1){  //以下相同,按串口信息控制方向
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);  //左前轮正转
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(200);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);  //右前轮正转
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(200);   //延迟2毫秒
     seria1Data= Serial.read();      }}  //while循环内设置接收串口,如9则配合跳出循环

  }else if(seria1Data == '3' ){while(1){
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,HIGH);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(1200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(1200);  //延迟2毫秒
     digitalWrite(ydirPin,HIGH);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(1200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(1200);   //延迟2毫秒
     seria1Data= Serial.read();      }}  while循环内设置接收串口,如9则配合跳出循环

  }else if(seria1Data == '4' ){while(1){
    if(seria1Data=='9'){break;}else{
    digitalWrite(xdirPin,LOW);
     digitalWrite(xstepPin,HIGH); //左前轮输出高电平,配合下面低电平产生脉冲
     delayMicroseconds(1200); //延迟2毫秒
     digitalWrite(xstepPin,LOW);  //左前轮输出低电平
     delayMicroseconds(1200);  //延迟2毫秒
     digitalWrite(ydirPin,LOW);
     digitalWrite(ystepPin,HIGH); //右前轮输出高电平
     delayMicroseconds(1200); //延迟2毫秒
     digitalWrite(ystepPin,LOW);  //右前轮输出低电平
     delayMicroseconds(1200);   //延迟2毫秒
     seria1Data= Serial.read();      }}  while循环内设置接收串口,如9则配合跳出循环
  }}


发表于 2021-12-18 22:32 | 显示全部楼层
本帖最后由 topdog 于 2021-12-18 22:56 编辑

小车的电机一般用直流电机,不会使用步进电机。可以选用美科科技的mCookie使用积木板来研究小车

核心+模块 MC
https://www.ideaxcollege.cn/module/59e72f131dc8530005221be2

直流电机驱动+ MC
https://www.ideaxcollege.cn/module/59e72f131dc8530005221bed

N20减速电机 x2
https://www.ideaxcollege.cn/module/59e72f131dc8530005221c58

车轮,47mm x2
https://www.ideaxcollege.cn/module/59e72f131dc8530005221c0e

蓝牙通信模块 MC
https://www.ideaxcollege.cn/module/59e72f131dc8530005221c25

电池盒 MC
https://www.ideaxcollege.cn/module/59e72f131dc8530005221c40

软件集:
https://www.microduino.cn/download/

作品集
https://www.ideaxcollege.cn/asset


控制部分用手机蓝牙来完成。

发表于 2021-12-18 23:16 | 显示全部楼层
本帖最后由 topdog 于 2021-12-19 10:46 编辑

软件Mixly 1.4.4图形化编程,初学者很方便掌握。
mixly_蓝牙小车.JPG

蓝牙的接收基于SoftwareSerial库
[pre]//MCookie-Motor - Microduino Wiki (microduinoinc.com)
//MCookie-BT - Microduino Wiki (microduinoinc.com)

#include <SoftwareSerial.h>
#include <Microduino_Motor.h>

String Command = "";

SoftwareSerial my_Serial(2, 3);

Motor MotorLeft(MOTOR0_PINA, MOTOR0_PINB);
Motor MotorRight(MOTOR1_PINA, MOTOR1_PINB);

void setup()
{
  Serial.begin(9600);
  my_Serial.begin(9600);

  MotorLeft.begin();
  MotorRight.begin();
}

void loop()
{
  if (my_Serial.available() > 0) {
    Command = my_Serial.readStringUntil('\n');

    if (Command == "go") {
      MotorLeft.setSpeed(255);
      MotorRight.setSpeed(255);
    } else  if (Command == "retreat") {
      MotorLeft.setSpeed(-100);
      MotorRight.setSpeed(-100);
    } else if (Command == "stop") {
      MotorLeft.Brake();
      MotorRight.Brake();
    } else if (Command == "left") {
      MotorLeft.setSpeed(0);
      MotorRight.setSpeed(100);
    } else  if (Command == "right") {
      MotorLeft.setSpeed(100);
      MotorRight.setSpeed(0);
    } else if (Command == "close") {
      MotorLeft.setSpeed(FREE);
      MotorRight.setSpeed(FREE);
    }
  }
  String Command = "";
}[/pre]

发表于 2021-12-20 07:04 | 显示全部楼层
bgsdd 发表于 2021-12-18 20:42
自己瞎改乱改突然就改好了,用if...else判断+while循环+break跳出,达到目的,这个28步进电机需要一直输入 ...

请问楼主手机控制用的什么app?
 楼主| 发表于 2021-12-20 08:12 来自手机 | 显示全部楼层
本帖最后由 bgsdd 于 2021-12-22 21:16 编辑

网上教程里下载的一个叫arduino bluetooth controller 的手机apk软件,用那个和游戏机手柄差不多的图标,主要想先了解下工业步进电机怎么用的,攒点经验以后折腾机械手。不明白调用那个步进电机库和不调用有什么区别
发表于 2021-12-26 11:08 | 显示全部楼层
bgsdd 发表于 2021-12-18 20:42
这个是现在用的一步一中断的,用if...else判断+while循环+break跳出,达到目的,这个28步进电机需要一直输 ...

能否将你用的APP下载地址传上来学习学习,谢谢了.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 17:54 , Processed in 0.262877 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表