【課程設計】3.Joystick(版本二)搖桿驅動小車

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對小車進行初始化于颖;小車設置完畢后,使用遙感對小車進行控制厉萝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末恍飘,一起剝皮案震驚了整個濱河市榨崩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌章母,老刑警劉巖母蛛,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乳怎,居然都是意外死亡彩郊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門蚪缀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秫逝,“玉大人,你說我怎么就攤上這事询枚∥シ” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵金蜀,是天一觀的道長刷后。 經常有香客問我,道長渊抄,這世上最難降的妖魔是什么尝胆? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮护桦,結果婚禮上含衔,老公的妹妹穿的比我還像新娘。我一直安慰自己二庵,他們只是感情好贪染,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眨猎,像睡著了一般抑进。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睡陪,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天寺渗,我揣著相機與錄音,去河邊找鬼兰迫。 笑死信殊,一個胖子當著我的面吹牛,可吹牛的內容都是我干的汁果。 我是一名探鬼主播涡拘,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼据德!你這毒婦竟也來了鳄乏?” 一聲冷哼從身側響起跷车,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橱野,沒想到半個月后朽缴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡水援,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年密强,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜗元。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡或渤,死狀恐怖,靈堂內的尸體忽然破棺而出奕扣,到底是詐尸還是另有隱情薪鹦,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布惯豆,位于F島的核電站距芬,受9級特大地震影響,放射性物質發(fā)生泄漏循帐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一舀武、第九天 我趴在偏房一處隱蔽的房頂上張望拄养。 院中可真熱鬧,春花似錦银舱、人聲如沸瘪匿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棋弥。三九已至,卻和暖如春诚欠,著一層夾襖步出監(jiān)牢的瞬間顽染,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工轰绵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粉寞,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓左腔,卻偏偏與公主長得像唧垦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子液样,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理振亮,服務發(fā)現(xiàn)巧还,斷路器,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程坊秸,因...
    小菜c閱讀 6,444評論 0 17
  • 我不是一個鐵桿鎂粉麸祷。但是我喜歡阿妹。 第一次聽阿妹的歌是《聽焊窘铮》摇锋。還是在很小的時候,看著KTV里面哥哥姐姐深情的演...
    NI自然醒閱讀 215評論 0 0
  • 2017年8月13日 D3/阿爾法號/阿基米德艙/陳瀅118 一站超、今日任務 1.收聽晨間導讀(走出舒適區(qū)不該是一句...
    依小呆閱讀 139評論 0 0