宜昌老张

《Arduino开发实战指南》与慧鱼遥控车

0
阅读(18514)

 Arduino是一个神奇的工具。它可以让你的计算机能够拥有更强的感应、控制真实世界的能力,而不仅局限于键盘、鼠标、屏幕、扬声器等单一的标准I/O设备。它同时也能作为独立的核心,作为机器人、智能车、激光枪等电子设备的控制器,应用非常简单。

    Arduino系统在欧美发达国家的创客界十分风靡,为什么人们都选择Arduino作为创意工具,我认为原因有两点:1、易用;2、好用

易用:只要您具备C语言的编程能力和基本的硬件常识,就可以立即上手,制作出基于单片机技术的创意作品。Arduino系统的核心CPU是AVR单片机,但您不需了解CPU、存储器和接口电路之间的结构关系,也不需要了解数据总线、地址总线和控制总线在程序机器码执行时如何相互配合的,甚至不用考虑那些决定CPU如何工作的寄存器参数如何设置,您可以把Arduino当成一个魔盒,只要知道,如按钮、传感器、指示灯和电机等输入输出模块的传输线连接到Arduino控制器的哪个端子上即可,然后就可以在Arduino软件强大而丰富的库文件支撑下,用简明通俗的语言编制程序,让输入模块与输出模块产生互动。

好用:过去我们做电子创意作品,往往用一个个电阻、电容、运放和变压器等分立的元件在面包板或实验板上进行搭接,或许只能制作出如走马灯和秒表计时器等低端的作品。现在Arduino控制器拥有非常丰富的周边模块(可以在淘宝上购买),如直流电机驱动模块、无线通信模块和液晶显示及各类传感器模块,这些模块之间相互配套,您采用Arduino模块就能放大自己的创意能力,像搭积木一样方便高效地制作更酷更显档次的作品,如遥控履带车、仿生机械手和双足机器人。

   今天我推荐的这本《Arduino开发实战指南》一书中的内容就充分体现了这两点。该书首先介绍了基于Arduino的C语言语法和函数,然后是常用Arduino周边硬件模块使用和库文件详解,最后推出了几个有趣的实战Arduino创意作品。

 

内容简介

  目前,在国内关注Arduino的人越来越多,但介绍Arduino的书籍却很少。Arduino是一个注重实际动手操作应用的产品,所以本书以实际应用为纽带将各个章节联系起来。本书首先介绍Arduino的一些基础知识,接着针对具体应用介绍了一些扩展板以及Arduino扩展库,最后应用之前的内容完成了具有视频监控功能的履带车、遥控机械臂以及双足机器人的制作。内容是循序渐进,使读者深刻的理解Arduino的优点,本书会引领您走入Arduino的精彩世界。

 

《Arduino开发实战指南》的当当网购买网址:http://product.dangdang.com/product.aspx?product_id=22618399


     这本Arduino书是第一本国人自著的Arduino中文著作,原先几本Arduino中文书籍都是译著,所以作为专注于Arduino应用和博客写作的我,非常欣喜,第一时间买到了这本书,如饥似渴的阅读和消化其中的内容,并根据本书多处知识点的学习,制作出了一台慧鱼遥控车。

      这个三轮慧鱼车,前面是一个万向轮,后面两个是主动轮,由两个直流电机带动,通过两个电机的转速和转向的变化实现小车的前后、左右的行走,小车的前方还有一个车灯,天黑时,可以照亮周围活动场地。小车的电控系统源于DFrobot公司出品的Arduino电子积木,控制器、电机驱动板、传感器扩展板和无线通信模块由下而上地层叠在一起,很是节约空间,这也充分体现了Arduino电控系统不仅易用,而且好用!

视频请看:

 

       个PS这个摇杆遥控慧鱼智能车的作品是我通过学习《Arduino开发实战指南》一书的相关知识点,再创作而成。具体知识点如下:

一、3.9  串口通信  45页

二、  4.2 串行通信口的使用  55页

三、5.1  L293 Motor Shield(L293 电机驱动板)  68页

四、 5.2.5  使用摇杆控制直流电机转速  81页

五、第7章  无线模块的应用 7.1 APC220  224页

六、第8章  打造自己的遥控履带车 8.1 履带车的驱动 242页

七、8.3  添加无线模块  261页

八、8.4  制作遥控器  264页

     慧鱼创意组合套件(fischertechnik)在我国高校界得到了普遍地认可,许多工科高校都有慧鱼实验室,您可以在百度很容易搜索到慧鱼用到大学生创新活动的报道。今年全国慧鱼机械创意大赛在我所在的三峡大学举办,学院为此增加购置了一批慧鱼套件,并组织学生准备大赛,祝学生们能够取得好成绩!

http://gcf.xjtu.edu.cn/detail.php?id=231

http://me.zju.edu.cn/chinese/display.php?newsId=2394

http://gxy.zjnu.edu.cn/show.asp?id=323

http://gczx.hrbust.edu.cn/cxsj/cxjh/2009/3/09320103459686.html

     慧鱼创意组合模型官网:http://www.ft2008.com/

    我在学院的慧鱼实验室用积木迅速搭建一个智能车车体,安装上了Arduino系统,创建了一个可以遥控的智能车。

 

     慧鱼遥控车的任务是:通过PS摇杆无线遥控小车的前进、后退、转弯和停止,并且开关车灯。

 

遥控器主机程序:

 

int JoyStick_X = 0; //PS摇杆的X轴连在模拟端口0
int JoyStick_Y = 1; //PS摇杆的Y轴连在模拟端口1
int button = 3; //PS按键连在数字端口3
char flag;//存储遥控器主机向遥控车上的从机发送数据
int val;//存储PS按键的当前读取值
int old_val;//存储PS按键上次程序执行时的读取值
int state=0;//存储主机向遥控车上的LED发送的亮灭状态
//初始化
void setup()
{
  pinMode(button, INPUT);//设置与PS按键相连的数字端口为输入端口
  Serial.begin(9600); // 启动串口通信,通信波特率为9600 bps
}
//主程序
void loop()
{
      int x,y,z;
      x=analogRead(JoyStick_X);//读取PS摇杆X轴的模拟量信息
      y=analogRead(JoyStick_Y);//读取PS摇杆Y轴的模拟量信息
      //如果PS摇杆向前推
      if(y>812)
      {
         flag='a';
         Serial.print(flag);//向遥控车从机发送小车前进命令
      }
      //如果PS摇杆向后推
      else if(y<212)
      {
         flag='b';
         Serial.print(flag);//向遥控车从机发送小车后退命令
      }
      //如果PS摇杆向左推
      else if(x>812)
      {
         flag='c';
         Serial.print(flag);//向遥控车从机发送小车向左命令
      }
      //如果PS摇杆向右推 
      else if(x<212)
      {
         flag='d';
         Serial.print(flag);//向遥控车从机发送小车向右命令
      }
      //否则
      else
      {
         flag='e';
         Serial.print(flag);//向遥控车从机发送小车停止命令
      }
      //读取PS摇杆按键的数字量信息
      //按下PS摇杆按键,遥控车上的车灯LED亮,
      //再按一次PS摇杆按键,遥控车上的车灯LED灭,以此往复
      val=digitalRead(button);
      if((val==LOW)&&(old_val==HIGH))
      {
        state=1-state;
        delay(10);
      }
      old_val=val;
      if(state==1)
      {
         flag='f';
         Serial.print(flag);//向从机发送灯亮标志
      }
      else
      {
        flag='g';
        Serial.print(flag);//向从机发送灯灭标志
      }
      delay(50);
}
 
遥控车从机程序:
 
int E_right =5; //连接电机1的使能端口到数字接口5
int M_right =4; //连接电机1的转向端口到数字接口4
int E_left =6;//连接电机2的使能端口到数字接口6
int M_left=7; //连接电机2的转向端口到数字接口7
int LED=2;//车灯LED连在数字端口2
int val;//存储遥控器主机向遥控车上的从机发送数据
float velocity=255;//车速调节
void setup()
{
   //给各数字接口设置输入输出状态  
   pinMode(M_right, OUTPUT);
   pinMode(E_right, OUTPUT);
   pinMode(M_left, OUTPUT);
   pinMode(E_left, OUTPUT);
   pinMode(LED,OUTPUT);
   digitalWrite(LED, HIGH);
  Serial.begin(9600);//设置串行通信的波特率
}
void advance()//前进
{
     digitalWrite(M_right,HIGH);
     analogWrite(E_right,int(velocity));
     digitalWrite(M_left,HIGH);
     analogWrite(E_left,int(velocity));
}
void back()//后退
{
     digitalWrite(M_right,LOW);
     analogWrite(E_right,int(velocity));
     digitalWrite(M_left,LOW);
     analogWrite(E_left,int(velocity));
}
void left()//左转
{
     digitalWrite(M_right,HIGH);
     analogWrite(E_right,int(velocity));
     digitalWrite(M_left,HIGH);
     analogWrite(E_left,int(0));
}
void right()//右转
{
     digitalWrite(M_right,HIGH);
     analogWrite(E_right,int(0));
     digitalWrite(M_left,HIGH);
     analogWrite(E_left,int(velocity));
}
void Stop()//停止
{
     digitalWrite(E_right, LOW); //右电机停
     digitalWrite(E_left, LOW); //左电机停
}
void loop()
{
  if(Serial.available()>0) //查询串口有无数据
  {
        val=Serial.read();//读取主机发送的数据
        if(val=='a')//如果主机发送字符'a',
        {
          advance();//前进          
        }
        if(val=='b')//如果主机发送字符'b',
        {
           back();//后退           
        }
        if(val=='c')//如果主机发送字符'c',
        {
          left();//左转   
                     
        }
        if(val=='d')//如果主机发送字符'd',
        {
           right();//右转          
        }
        if(val=='e')//如果主机发送字符'e',
        {
          Stop();//停止
         }
        if(val=='f')
        {digitalWrite(LED, LOW); //车灯LED灯亮
         }
        if(val=='g')
        {digitalWrite(LED, HIGH);//车灯LED灯灭
        }
  }   
    《Arduino开发实战指南》中还有很多知识点,我很感兴趣,如任天堂Wii游戏手柄,蓝牙及XBee无线模块、W5100以太网控制器和WIFI摄像头wiCam等,希望今后能够用这些学到的技术,制作出更酷、更炫的机电一体化作品。