1. 前言
在【課程設計】2.Joystick(版本一)按鍵驅動小車中實現(xiàn)了Joystick使用按鍵控制小車上下左右跑動僧凰,但是玩耍程度不夠高探颈。
版本二來實現(xiàn)使用遙感來控制小車,同時利用簡單的線性算法識別和讀取搖桿上的方向和速度
2. 功能實現(xiàn)
首先在Visual Studio用C++實現(xiàn)點坐標的處理训措,得到方向值和速度值伪节。
之所以先在VS上寫,完全是因為方便測試和調試隙弛。
測試完成后架馋,只要將結構體和4個函數(shù)拷貝過去用即可。
#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個值萍启,分別代表上下左右总珠;
通過判斷點分別位于兩條交線的上下位置,來判斷點所在的區(qū)間勘纯。
在這里粗略地將兩條交線上的點不作考慮局服,影響很小。
草稿圖
速度有0~4驳遵,5個值淫奔,分別代表無速度,一檔堤结、二擋唆迁、三擋、四擋速度竞穷。
對應區(qū)間范圍都是200唐责,以一個類似于同心圓的方式劃分速度檔數(shù)。
草稿圖
版本二:Joystick端代碼考慮到要發(fā)送方向和速度瘾带,所以對兩個數(shù)據(jù)進行編碼后發(fā)送鼠哥。
高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); //根據(jù)P點獲得速度
direc_get=directionGet(p); //根據(jù)P點獲得方向
signal_send |= direc_get<<4 | speed_get; //編碼
//Serial.println(signal_send,BIN);
if(speedGet(p)) //速度不為0時發(fā)送信號
{
Serial.write(signal_send);
delay(DELAY);
}
版本二:修改motor.h 使其適應多速度觸發(fā)
這里只展示UP_Run函數(shù)的修改朴恳,其他函數(shù)類似。
這里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對小車進行初始化于颖;小車設置完畢后,使用遙感對小車進行控制厉萝。