科技伊甸园产品应用区智能车/机器人产品区 → 【ASURO智能车快速入门】之头函数介绍


  共有14564人关注过本帖树形打印

主题:【ASURO智能车快速入门】之头函数介绍

帅哥哟,离线,有人找我吗?
61mcu
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
【ASURO智能车快速入门】之头函数介绍   发帖心情 Post By:2008-11-3 11:39:22

1、void Init(void)


    用来将小车的微处理器复位到初始状态,它是程序真正开始前必须执行的一个函数,如果没有这个函数,那么处理器就不知道如何工作。

 

    一个最简单的程序至少要有以下代码:


    #include “asuro.h”
    int main(void) { // 定义变量
    Init(); // 插入自己编写的程序
    while(1); // 无限循环
    return 0; //这一步不会被执行到
    }


    为什么我们要在main函数的末尾加上一个无限循环呢?这是因为正常情况下,main函数会通过返回值0结束——return标志着程序的结束,但是在asuro中,我们以前传入进去的程序可能仍然在微处理器的存储器中,也可能会被执行,这可能会导致一些不可预料的结果。为避免这些老的程序片断被执行,我们在程序当中加上一个无限循环,使这些程序片断永远没有机会被执行到,这样程序就可以按照我们预定的方式结束。



[本帖被加为精华]
支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:40:10

2、void StatusLED (unsigned char color)

 

    用来控制状态灯(D12)的开与关,合法参数是:OFF, GREEN, RED 和 YELLOW。例如:StatusLED (RED);会将状态灯变成红色。

 

    #include ?asuro.h“
    int main(void) {
    Init();
    StatusLED (YELLOW);
    while(1);
    return 0;
    }



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:42:25

3、void FrontLED (unsigned char status)


用来控制前面的灯(D11)的开与关,合法参数是:OFF和ON。例如:FrontLED(ON);


4、void BackLED (unsigned char left, unsigned char right)


用来控制后面两个灯(D15和D16)的开与关,其中第一个参数描述后面左边的灯D15的状态,而第二个参数描述的后面右边的灯D15的状态,合法参数是:OFF和ON。例如:BackLED(OFF,ON);左边的灯灭,而右边的灯亮。


5、void Sleep (unsigned char time72kHz)


这个函数可以使处理器等待一段时间。处理器等待的时间由一个参数决定,而这个参数的最大值只能是255,并且从一个72kHz的定时器计算周期。

例如:这个计算器会等待3ms

 

0.003S/(1/72KHz)=216

 

所以,sleep(216)会迫使处理器等待3ms



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:45:11

6、void MotorDir (unsigned char left_dir, unsigned char right_dir)

 

这个函数控制小车两个轮子的旋转方向,一般在速度控制函数之前使用,合法参数FWD (向前), RWD (向后), BREAK (停止)和FREE (惯性滑行)。例如:MotorDir(FWD,BREAK);将会使左边的轮子向前,而右边的轮子停止。

 

7、void MotorSpeed (unsigned char left_speed, unsigned char right_speed)

 

这个函数用来控制两个轮子的速度,最大速度是255。根据机械条件,发动机将会以大约60的值旋转。这个参数的值实际上控制的是发动机的功率,而实际的转速还受很多其他因素的限制,不如说摩擦力和坡面的倾斜度。

 

MotorSpeed (255,0);左边的轮子以最大速度转动,而右边的轮子不动,当然在这个函数调用之前,要有MotorDir()来设置轮子转动的方向。

 

8、void SerWrite (unsigned char *data, unsigned char length)

 

这个函数通过串行接口IR,以2400Bit/s,8位数据位,无奇偶校验,停止位1,无数据流的方式从ASURO接收数据。参数描述呢要传送的字符,和传送的长度。例如:SerWrite (“Hello how are you?”,18);如果启动超级中断,这时小车会将Hello how are you?传送到超级终端

[此贴子已经被作者于2008-11-3 11:45:21编辑过]


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:47:02

 

9、void SerRead(unsigned char *data, unsigned char length, unsigned int timeout)

 

    与上面的函数相反,这个函数的作用是用于ASURO接收我们发出去的字符串,第一个参数用来保存字符串指针,第二个参数描述希望小车接收到多少个字符串,第三个参数描述的是延时时间。

 

    Timeout参数用来防止当小车没有接收到足够多的字符的时候,无限等待。如果在延时时间之内没有足够多的字符接收到,那么这个函数将会被忽略,而接收到的字符将会被‘T’ (=Timeout)代替。如果你把Timeout参数定义为0,那么这个函数将会一直等待,直到接收到所有期望的字符。

 

    #include “asuro.h”
    int main(void) {
    char data;                   //用于存放接收到的字符串
    Init();
    SerRead (data,1,0);         //读取数据
    If(data==’G’){            /如果接收到的字符是G那么小车就向前走。
    MotorDir(FWD,FWD);
    MotorSpeed(120,120);
    }
    while(1); // Eternal loop
    return 0;
    }



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:49:14

10、void LineData(unsigned int *data)


    这个函数用来读取在小车车底两侧光敏晶体管的强度。

 

    你首先必须要定义一个能够存放两个int型数据的指针。这个函数将两个光敏晶体管的模拟量转换成数字量,而数组里面的第一个值存放的就是左边晶体管的数字量,第二个存放的是右边的。最大强度是1023,而全黑的时候,就是0。

 

    通常情况下,不会有这些极限数据检测到,而实际能够检测到的值就是在0到1023之间。例如:


    unsigned int data[2];
    LineData(data);
    data[0] 描述左边晶体管的强度
    data[1] 描述右边晶体管的强度


    int main(void) {
    unsigned int data[2];    //定义数组
    Init();
    FrontLED(ON);             // 前面灯亮
    MotorDir(FWD,FWD);   // 两个轮子方向都向前
    while(1){
    LineData(data);            //读取晶体管的强度
    if (data[0]>data[1])       //左边比右边强
    {MotorSpeed(200,150);} // 左边轮子加速
    else
    {MotorSpeed(150,200);} //右边轮子加速
    }
    return 0;
    }



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:50:03

11、void OdometrieData(unsigned int *data)


    这个函数扫描反射的光敏元件(D13, D14)。当这两个传感器是激活的,那么这个函数就返回光敏传感器(T11, T12)的数模转换值。和LineData()函数一样,这些数据同样的放在data数组中,其中第一个整数描述的是左边的传感器(T11)的数模转换值,而第二个整数描述的是右边(T12)的值。其中,最大的亮度是0,而全黑的时候就是1023。通常情况下,不会有这些极限数据检测到,而实际能够检测到的值就是在0到1023之间。


data[0] 描述左边晶体管的强度
data[1] 描述右边晶体管的强度


注意:这个函数并不是提供的旋转的数据,而实际上描述的是反射的光敏元件的数据。通过辨别明暗,计算明暗过渡的次数,而要计算旋转的次数,这个就留给编程员自己去做了。



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:51:17

12、unsigned char PollSwitch (void)


    这个函数扫描接触开关(K1-K6),并且返回一个字节,这个字节描述了哪个开关被触碰了。其中K1对应的是字节的第0位,K2对应第1位,依次类推K6对应字节第5位。所以有下面结论:

  • Bit0 (1) -> K6
  • Bit1 (2) -> K5
  • Bit2 (4) -> K4
  • Bit3 (8) -> K3
  • Bit4 (16) -> K2
  • Bit5 (32) -> K1


    所以如果开关1、3、5被触碰,那么返回的值就是42 (32+8+2 = 42).

    注意:如果想得到准确数据,电容C7必须要先放电,这可能要花费你一些时间。



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
61mcu
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:380 积分:3884 威望:0 精华:3 注册:2008-10-20 9:01:19
  发帖心情 Post By:2008-11-3 11:55:43

 

操作示例

 

    #include "asuro.h"

    #include <stdlib.h>

    //接收字符定义

    #define DIARWD 'b'    //减速

    #define DIAFWD 'g'    //加速

    #define DIALEFT 'l'    //左传

    #define DIARIGHT 'r'    //右转

    #define DIASTOP 's'    //停止

    #define OFFSET 255

    int STEP=40;    //速度变化速度

    int speedLeft,speedRight;    //左轮速度,右轮速度

    void IRFwd(void)    //小车加速

    {

    speedRight += STEP;

    speedLeft += STEP;

    if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;

    if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;

    FrontLED(ON);

    BackLED(OFF,OFF);

    SerWrite("\tgogo",5);

    }

    void IRRwd(void)    //小车减速

    {

    speedRight -= STEP;

    speedLeft -= STEP;

    if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;

    if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;

    FrontLED(OFF);

    BackLED(ON,ON);

    SerWrite("\tback",5);

    }

    void IRLeft (void)    //小车左转

    {

    speedLeft -= STEP;

    if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;

    speedRight += STEP;

    if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;

    FrontLED(OFF);

    BackLED(ON,OFF);

    SerWrite("\ttrun left",9);

    }

    void IRRight (void)    //小车右转

    {

    speedLeft += STEP;

    if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;

    speedRight -= STEP;

    if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;

    FrontLED(OFF);

    BackLED(OFF,ON);

    SerWrite("\ttrun right",9);

    }

    void IRStop(void)    //小车停止

    {

    speedRight = speedLeft = 0;

    FrontLED(OFF);

    BackLED(OFF,OFF);

    SerWrite("\tstop",5);

    }

    void Speed(void)

    {

    unsigned char leftDir = FWD, rightDir = FWD;

    if (speedLeft > 0 && speedLeft < OFFSET) speedLeft += OFFSET;

    if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;

    if (speedRight > 0 && speedRight < OFFSET) speedRight += OFFSET;

    if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;

    leftDir = rightDir = FWD;

    if (speedLeft < 0) leftDir = RWD;

    if (speedRight < 0) rightDir = RWD;

    if (speedLeft > 255) speedLeft = 255;

    if (speedLeft < -255) speedLeft = -255;

    if (speedRight > 255) speedRight = 255;

    if (speedRight < -255) speedRight = -255;

    MotorDir(leftDir,rightDir);

    MotorSpeed(abs(speedLeft),abs(speedRight));

    }

    int main(void)

    {

    unsigned char cmd;

    unsigned int i;

    unsigned char sw;

    Init();

    SerWrite("\n\rHello I love you really?\\n",30);

    while(1)

    {

    for (i = 0; i < 0xFE; i++)

    {

    SerRead(&cmd,1,0xFFFE);

    switch (cmd) {

    case DIARWD : STEP=40; IRRwd(); break;

    case DIAFWD : STEP=40; IRFwd(); break;

    case DIALEFT: STEP=40; IRLeft(); break;

    case DIARIGHT: STEP=40; IRRight(); break;

    case DIASTOP : STEP=40; IRStop(); break;

    }

    Speed();

    }

    for (i = 0; i < 0xFE; i++)

    {

    sw = PollSwitch();

    if (sw == 0x01) {STEP=20; IRLeft();Speed();IRFwd();Speed();}

    if (sw == 0x02) {STEP=20; IRStop();Speed();IRLeft();Speed();IRFwd();Speed();}

    if (sw == 0x04) {STEP=20; IRStop();Speed();IRLeft();Speed();IRFwd();Speed();}

    if (sw == 0x08) {STEP=20; IRStop();Speed();IRLeft();Speed();IRFwd();Speed();}

    if (sw == 0x10) {STEP=20; IRStop();Speed();IRLeft();Speed();IRFwd();Speed();}

    if (sw == 0x20) {STEP=20; IRRight();Speed();IRFwd();Speed();}

    }

    }

    }

        



支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

【ASURO智能车快速入门】之头函数介绍








签名