2018-1-23 15:36:40 [显示全部楼层]
8586浏览
查看: 8586|回复: 4

[项目] Arduino小车系列1 [胡萝卜创客]

[复制链接]
写在前面
为什么要写这样一系列文章,网上很早就有并且还很多此类文章了呀,对于电子相关专业的人分分钟可以搞定的事呀。但,我要写一个和那些文章视角不同的系列,就是我的文章的目标读者是小白人士,可以是各行业对编程和电子硬件都不了解的人,可以是正在小学初中读书的学生。让这些人,通过价格低廉、资料丰富的开源硬件和编程来做一些有意思的事情。
做个什么样的小车
目标是一个小车平台,后续可以基于这个平台做巡线小车、语音小车、监控小车等等有意思的事情。这样的话,我选择了4个轮子车架,空间更大。通过Arduino板子控制小车,原因是arduino产品丰富,高中低端都有,可以使用价格很低的arduino的pro mini或nano,便宜的10几块钱就可以搞到。并且arduino的资料是相当丰富了,基于它做小车的教程也好多。通信模块选择zigbee,比蓝牙的障碍物穿透性好,隔一堵墙是没有问题的,正好手里有这样的板子,很容易上手。
Step By Step
  • 最基础的车架,我选择了最常见的亚克力材料树莓派小车车架购买链接(42元购入)。包括了4个直流电机,1个18650电池的3节电池盒。这个小车底盘可以多层,也有安装树莓派的地方,当时就是冲着这些可扩展性买的。提醒一点:这个底盘组装并不容易,安装电机的卡槽不是很吻合,我使了好大力气才完成。
    Arduino小车系列1 [胡萝卜创客]图1
    第二层车架,用来安装电池盒、控制器、L298N等。
    Arduino小车系列1 [胡萝卜创客]图2
  • 使用L298N电机驱动板购买链接(7.9元入手)。它有两个作用,一是连接控制器和电机,达到控制器编程控制电机的目的。二是把12V的输入降压为5V输出,用来给控制器Zduino供电。具体硬件连接:OUT1连接左侧两个电机的负极,OUT2连接左侧两个电机的正极。OUT3连接右侧两个电机的正极,OUT4连接右侧两个电机的负极。
    • L298N本身的供电,它的输入是5V-35V,我选择12V的电源输入。使用3节18650电池购买链接(每节4.9元入手,一节3.7V)串联得到约12V输入。说明:这个电池可以充电,多次使用,绿色环保。相关配套:18650电池充电器购买链接(8.5元),18650电池盒(3节串联,和小车底盘一并购入)购买链接
      Arduino小车系列1 [胡萝卜创客]图3
  • 控制器选择Zduino pro mini购买链接(28元入,它属于Arduino Pro Mini类型)。这款控制器用来控制电机和控制通信模块,可以对它进行编程。Arduino小车系列1 [胡萝卜创客]图4
    • Zduino本身的供电,它的输入电压是5V,这里使用L298N的5V输出。说一个惨痛经历:在前一天,使用12v电源给Zduino pro mini供电,可以驱动两个电机转动。今天同样连线,通电后电机也转动了一下,然后就不转了,同时闻到焦味,一摸Zduino芯片烫手,看来是板子烧了。然后,尝试使用USB串口写入程序,发现烧录程序失败,看来结果就是这样了。分析原因,第二次使用时,电池是充满了电的,电压达到了12V,之前电池虚电并没有12V那么高。
    • 控制电机使用了引脚5,6,9,10, 它们依次连接L298N的IN1,IN2,IN3,IN4这4个输入,IN1和IN2控制输出OUT1和OUT2,IN3和IN4控制输出OUT3和OUT4。
    • 控制ZigBee模块(下图1),有两点,一是给Zigbee模块供电(Zduino输出电压5V,Zigbee模块输入电压3.3V,故用降压板),二是与Zigbee模块通过串口进行通信。具体连线是:Zduino的VCC,GND,RXI,TXO依次连接Zigbee模块的降压板(下图2)的5V,GND,引脚1,引脚2,降压板的3V3,GND,引脚1,引脚2依次连接Zigbee板的VCC,GND,Tx,Rx。说明一下,串口的连接也就是RXI和TXO,需要对调连接,即RXI连接Tx,TXO连接Rx。这里的名字不太一致,命名规范问题,功能是一样的。
      Arduino小车系列1 [胡萝卜创客]图5
      Arduino小车系列1 [胡萝卜创客]图6
  • 其他硬件还包括杜邦线,小车还是比较紧凑的,不需要太长的杜邦线,否则显得凌乱,10cm以内刚刚好。杜邦线分为公对公,母对母,公对母,每种都采购一些,非常便宜。面包板,有了它,可以把Zduino的引脚扩展出来,可以很方便与其他硬件模块连接,电源的连接也会方便很多,最大的好处,就是让我们的小车显得很清爽,不至于邋遢。
小车最终形象
我又重新按照上面文章的步骤,重新组装了一遍小车,一次成功。
Arduino小车系列1 [胡萝卜创客]图7
Arduino小车系列1 [胡萝卜创客]图8
整体原理介绍
L298N用来控制4个电机,比如,向前转、向后转,左侧轮子向前转而右侧向后转,从而实现向右转弯,控制电机转速快慢。但是,光有L298N是完不成这么多复杂动作的,它只是执行具体任务的小兵,还需要一个指挥官来指挥它才行。这个指挥官就是arduino板子,它可以支持编写程序,通过程序来给L298N下发指令,叫它完成响应的动作。arduino板子程序编写完成后,这个指挥官就有了一些控制电机的技能了。但是,我们希望可以再指挥arduino这个指挥官,比如,我说“启动”,它就让小车开动起来;我说“停止”,它就让小车停下来。要想arduino这个指挥官可以随时听从我的指挥,就需要zigbee这个通讯员了,它可以进行无线数据传输,我们就可以把我们的指令通过zigbee告诉给arduino这个指挥官了。
软件编程// hardware:Zduino pro mini
//Zduino pro mini only has one serial.
// this program is used to control car
// zigbee as communication protocol throgh DL-LN33
unsigned char returnFlag[8] = {0xfe, 0x05, 0x91, 0x90, 0x14, 0x10, 0x01, 0xff};
int input1 = 5; // 定义uno的pin 5 向 input1 输出   
int input2 = 6; // 定义uno的pin 6 向 input2 输出  
int input3 = 9; // 定义uno的pin 9 向 input3 输出  
int input4 = 10; // 定义uno的pin 10 向 input4 输出  
int carState = 1;
void setup() {
  Serial.begin(115200); //RX TX serial port
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(8, OUTPUT);
  //初始化各IO,模式为OUTPUT 输出模式  
    pinMode(input1,OUTPUT);  
    pinMode(input2,OUTPUT);  
    pinMode(input3,OUTPUT);  
    pinMode(input4,OUTPUT);  
}
String myPtHex(int g){ // 把 g 最右邊 byte 印成 Hex 倆位
  String ret = "";
   int a = g& 0xf0;  // 左邊 4 bits
   a = a >> 4;  // 右移 4 bits
   int b = g& 0x0f;  // 右邊 4 bits
   char c = a < 10 ? a + '0' : a + 'A' - 10;
//   Serial.print(c);
   ret += c;
   c = b < 10 ? b + '0' : b + 'A' - 10;
//   Serial.print(c);
   ret += c;
//   Serial.print("#" + ret + "#");
   return ret;
}
void blinkLed(int pinNumber){
  digitalWrite(pinNumber, HIGH);
  delay(1);
  digitalWrite(pinNumber, LOW);
}
void loop() {
  // have zigbee data to come
  int dataIndex = 1;
   if (Serial.available()) {
    digitalWrite(LED_BUILTIN, HIGH);
    //send back to zigbee board.
//    Serial.write(returnFlag, 8);
    myPtHex((char)Serial.read());  
    dataIndex ++;
    while(Serial.available()){
      String dataFlag = myPtHex((char)Serial.read());
      if(dataIndex == 7){
//        Serial.print("$"+dataFlag);
//if zigbee send data 01, start car.
        if(dataFlag == "01"){
          blinkLed(8);
          carState = 1;
        }
        // if zigbee send data 00, start car.
        if(dataFlag == "00"){
          blinkLed(8);
          carState = 0;
        }
      }
      dataIndex ++;
    }
    digitalWrite(LED_BUILTIN, LOW);
   }
  if(carState == 0){
    stopCar();
  }
  if(carState == 1){
    startCar();
  }
}
void startCar(){
  //forward 向前转  
      digitalWrite(input1,HIGH); //给高电平  
      digitalWrite(input2,LOW);  //给低电平  
      digitalWrite(input3,HIGH); //给高电平  
      digitalWrite(input4,LOW);  //给低电平
      delay(1000);  //延时0.5秒   
}
void stopCar(){
     digitalWrite(input1,LOW);  
     digitalWrite(input2,LOW);   
     digitalWrite(input3,LOW);  
     digitalWrite(input4,LOW);
     delay(1000);  //延时0.5秒      
}
  • 以上程序如何烧录到Zduino板子中呢,需要两个工具,一是需要一个硬件USB转串口模块购买地址(25元购入,现在12.5元)。二是需要Arduino的开发工具Arduino IDE下载地址

    • USB转串口模块和Zduino的连线方式,该模块的GND,VCC,DTR/RTS,TX,RX依次连接Zduino的GND,VCC,DTR,RXI,TXO。
      Arduino小车系列1 [胡萝卜创客]图9
    • 打开Arduino IDE,点击IDE的菜单:工具(tools)-->开发板(board),选择Arduino Pro or Pro Mini,然后点击这个菜单的下一个:端口(port),选择/dev/ttyUSB0。
      Arduino小车系列1 [胡萝卜创客]图10
    • 把上面的代码粘贴到编辑区,点击菜单:项目-->上传。
      Arduino小车系列1 [胡萝卜创客]图11



电池通电,4个强劲的轮子转起来
微信公众号:huluobospace(胡萝卜创客)

happycool  学徒
 楼主|

发表于 2018-1-23 15:47:43

markdown排版造成很多绿色。sorry
看来,我的markdown还是太过凌乱,把markdown编辑器搞蒙了。
回复

使用道具 举报

pATAq  版主

发表于 2018-1-26 21:02:51

我的Markdown为啥没颜色,,,
回复

使用道具 举报

 初级技匠

发表于 2022-4-24 09:18:02

不错不错
回复

使用道具 举报

 初级技匠

发表于 2022-4-24 09:19:14

pATAq 发表于 2018-1-26 21:02
我的Markdown为啥没颜色,,,

我的也没有
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail