樹莓派筆記6 自製小車(手柄控制)

2021-08-15 12:32:54 字數 3780 閱讀 8292

繼續樹莓派小車的內容,這次記錄手柄控制小車運動的實現。

對於手動控制小車的工具,大概有這麼幾種:

①用紅外遙控器,小車上放乙個接收器,讀取遙控器資訊。實現應該比較簡單,紅外收發元件也很便宜,不過遙控器得對著小車,恐怕不太方便;

②藍芽手柄,因為樹莓派帶藍芽,可以通過藍芽接收手柄資料,不過乙個藍芽手柄可不便宜;

③有線手柄,相比無線裝置肯定low一點,不過我手頭就只有乙個有線手柄,50多塊錢的小雞g3,就是個xbox 360手柄;

④手機,如果寫個帶方向鍵的手機客戶端來控制小車應該是最酷的了,不過我不會android或ios開發。

最終選擇用有線手柄控制小車,而控制方式不是把手柄連到樹莓派上,而是連到我的筆記本上,用c#寫個客戶端程式,一方面讀取手柄資料,一方面與樹莓派通訊。至於通訊,採用tcp通訊,樹莓派上執行伺服器程式,接收控制資訊,電腦上執行客戶端程式,傳送手柄資料。

新增xinput的引用using sharpdx.xinput;,然後可以寫乙個手柄控制類:

class xinputcontroller

////// 讀取方向鍵資訊

//////

public

string

getdirection()

}

這個類**很短,因為我只需要讀取方向鍵、start和back鍵,如果要讀取搖桿和震動資料的話就需要麻煩一些了。controller物件就代表了手柄裝置,初始化的時候指定了裝置號為「userindex.one」,總共好像可以有四個裝置;gamepad物件儲存了手柄當前的狀態資訊,其中有乙個結構體為gamepadbuttonflags屬性,它以二進位制位的形式儲存了按鍵資訊,比如0x0001就表示「上」方向鍵處於按下狀態,0x0002就表示「下」方向鍵處於按下狀態,在上述**中,我讀取buttons屬性,判斷每一位的狀態來檢測哪個鍵被按下,如果是沒有鍵被按下或者除了方向鍵、start和back鍵外的鍵被按下,就返回「undefine」。

新建乙個winform專案,編寫pc客戶端程式。因為要做tcp客戶端,需要使用socket相關類;另外也需要考慮讀取手柄資訊的方式,是事件機制還是主動輪詢,怎麼處理手柄的事件我還不知道怎麼寫,我採用定時器的方式主動查詢手柄狀態。下圖是pc端程式的流程圖。

下面是程式主體**:

public

partial

class handlecontrolform : form

private

void

handlecontrolform_load(object sender, eventargs e)

}///

/// 啟動

///private

void

button1_click(object sender, eventargs e)

catch

this.textbox1.text += "connect to the car successfully...\r\n";

streamtoserver = client.getstream();

this.timer1.start();//開始接收手柄輸入

this.button1.enabled = false;

}///

/// 定時器處理

///private

void

timer1_tick(object sender, eventargs e)

this.textbox1.text += input + "\r\n";

//向小車傳送控制指令

byte buffer = encoding.utf8.getbytes(input);

streamtoserver.write(buffer, 0, buffer.length);

if (input == "back")

}private

void

textbox1_textchanged(object sender, eventargs e)

}

在傳送資料到小車的**中,是把字串編碼為utf-8格式的,一開始我用的unicode編碼,結果樹莓派上的python程式接收亂碼,因為python中的網路資料解析預設是按照utf-8格式的。下圖是程式介面,用了乙個文字框顯示程式資訊。

樹莓派上的python程式主要由電機控制模組和tcp伺服器**組成,程式流程如下圖所示:

python**如下:

#! /usr/bin/python3

import socket

import re

import motor_module

print("init motor module...")

try:

motor=motor_module.motor_module()

motor.setup()

except:

print("init motor module fail...")

exit()

server=socket.socket(socket.af_inet,socket.sock_stream)

host='192.168.1.17'

port=5150

try:

server.bind((host,port))

except:

print("socket bind fail...")

exit()

server.listen(5)

print("listening for connect...")

client,addr=server.accept()

print("accept the connect , now receving commands...")

duration=1

#不斷接收指令

while

true:

data=client.recv(1024)

info=bytes.decode(data) #解碼字串

if re.match('back',info):

break

elif re.match('up',info):

print("move ahead")

motor.ahead()

elif re.match('down',info):

print("move rear")

motor.rear()

elif re.match('left',info):

print("move left")

motor.left()

elif re.match('right',info):

print("move right")

motor.right()

elif re.match('undefine',info):

print("no control command")

motor.stop()

print("end the connection...")

motor.stop()

client.close()

樹莓派筆記15 手機控制樹莓派小車

小車 演示 購買現成的小車底座,包括電機馬達和車輪 使用l298n模組來控制小車底座上的電機,使樹莓派可以驅動小車運動 一塊12v的鋰電池,專門給l298n供電 樹莓派專用csi介面攝像頭,用來採集影象 由兩個sg90舵機構成的雲台,作為攝像頭的搭載平台 一塊oled顯示屏,簡要地顯示一些資訊 不用...

樹莓派 wifi小車製作(1)獲取手柄遙感輸入

這部分主要是通過某些模組獲取控制資訊,輸入單獨寫乙個模組,以後想要調整成其他的裝置只需要單獨改一下這部分的 哦 目前模仿我這個小車前提要求要有個手柄233 這部分主要是使用了pygame裡面的joystick模組 joystick的學習教程 使用joystick簡化只保留搖桿操作 最後貼上我新增的小...

樹莓派 python 控制小車上下左右移動

樹莓派 python 控制小車上下左右移動程式注釋 import rpi.gpio as gpio import time pwma 18 兩個方向位 ain1 22 ain2 27 pwmb 23 bin1 25 bin2 24 速度0 100 利用time.sleep t time 函式控制執行...