1. 前言
在【课程设计】2.Joystick(版本一)按键驱动小车中实现了Joystick使用按键控制小车上下左右跑动,但是玩耍程度不够高。
版本二来实现使用遥感来控制小车,同时利用简单的线性算法识别和读取摇杆上的方向和速度
2. 功能实现
首先在Visual Studio用C++实现点坐标的处理,得到方向值和速度值。
之所以先在VS上写,完全是因为方便测试和调试。
测试完成后,只要将结构体和4个函数拷贝过去用即可。
#include <iostream>
using namespace std;
typedef struct
{
int x,y;
}Point;
// y=x line, explore Point(p)'s location
// return 1 means above
// return 0 means below
int yEx(Point p)
{
return p.x<p.y;
}
// y=-x+1024 line, explore Point(p)'s location
// return 1 means above
// return 0 means below
int yEx4(Point p)
{
return -p.x+1024<p.y;
}
// return p's loc on map
// return 1 means up, 2 means down
// return 3 means left, 4 means right
int directionGet(Point p)
{
int dir_1=yEx(p);
int dir_2=yEx4(p);
if(dir_1 && dir_2) return 1;
if(dir_1 && dir_2+1) return 3;
if(dir_1+1 && dir_2) return 4;
return 2;
}
// According to p, return speed
// return 0-4 means no v or 1-4 v
// X Y according 0-1024
int speedGet(Point p)
{
int x=p.x,y=p.y;
if(p.x<112 || p.x>912 || p.y<112 || p.y>912) return 4;
if(p.x<212 || p.x>812 || p.y<212 || p.y>812) return 3;
if(p.x<312 || p.x>712 || p.y<312 || p.y>712) return 2;
if(p.x<412 || p.x>612 || p.y<412 || p.y>612) return 1;
return 0; // p.x:412-612 p.y:412-612
}
int main()
{
Point p;
p.x=512; p.y=512;
cout<<"directionGet="<<directionGet(p)<<endl;
cout<<"speedGet="<<speedGet(p)<<endl;
return 0;
}
在设计中,方向有1~4,4个值,分别代表上下左右;
通过判断点分别位于两条交线的上下位置,来判断点所在的区间。
在这里粗略地将两条交线上的点不作考虑,影响很小。
速度有0~4,5个值,分别代表无速度,一档、二挡、三挡、四挡速度。
对应区间范围都是200,以一个类似于同心圆的方式划分速度档数。
版本二:Joystick端代码考虑到要发送方向和速度,所以对两个数据进行编码后发送。
高4位为方向值,低4位为速度值。
Point p;
unsigned char speed_get=0,direc_get=0;
unsigned char signal_send;
p.x=analogRead(PIN_ANALOG_X); //获取X值
p.y=analogRead(PIN_ANALOG_Y); //获取Y值
speed_get=speedGet(p); //根据P点获得速度
direc_get=directionGet(p); //根据P点获得方向
signal_send |= direc_get<<4 | speed_get; //编码
//Serial.println(signal_send,BIN);
if(speedGet(p)) //速度不为0时发送信号
{
Serial.write(signal_send);
delay(DELAY);
}
版本二:修改motor.h 使其适应多速度触发
这里只展示UP_Run函数的修改,其他函数类似。
这里INCREMENT_SPEED是为了对传进来的速度值进行一个增量位移
#ifndef __MOTOR_H
#define __MOTOR_H
#define INCREMENT_SPEED 2 //速度增量
void UP_Run(unsigned char speedGet)
{
speedGet += INCREMENT_SPEED;
unsigned char i;
//A轮 正转
CLR_INA1();
SET_INA2();
//B轮 正转
CLR_INB1();
SET_INB2();
for(i=0;i<5;i++)
{
if(i%2==0)
{
CLR_ENB();
CLR_ENA();
delay(10-speedGet);
}else
{
SET_ENB();
SET_ENA();
delay(speedGet);
}
}
CLR_ENB();
CLR_ENA();
}
#endif
版本二:Arduino-Board 端代码
#define UP 0x01
#define DOWN 0x02
#define LEFT 0x03
#define RIGHT 0x04
void loop()
{
unsigned char signalGet,speedGet,direcGet;
signalGet = Serial.read(); //获取信号
direcGet = signalGet>>4; //解码
speedGet = signalGet&0x0F;
switch(direcGet)
{
case UP: UP_Run(speedGet); break;
case DOWN: DOWN_Run(speedGet); break;
case LEFT: LEFT_Run(speedGet); break;
case RIGHT: RIGHT_Run(speedGet); break;
default: STOP_Run(); break;
}
}
3. 功能延伸
小车启动前,使用按键和OLED对小车进行初始化;小车设置完毕后,使用遥感对小车进行控制。
网友评论