自写app与树莓派制作智能小车
實現的功能有:
1.實現小車的前進,后退,左轉,右轉。
2.實時視頻的傳回,查看小車周圍的情況。
3.攝像頭的上下左右轉動,使用舵機云臺來實現。
需要的材料:
1.樹莓派一個(帶有python環境,現在的好像都有自帶python環境)。
2.安卓手機一部,用于安裝寫的APP。
3.杜邦線若干。
4.L298N電機驅動模塊(某寶9塊錢一個)。
5.舵機云臺一個(某寶有賣散件,買來自己裝,20幾塊錢)。
6.車架一個(同樣某寶…).
7.充電寶一個,用于樹莓派供電,和L298N電機驅動模塊供電,雖然L298N標的是12V的電源,但是5V也能使用。
8.電腦一臺。
首先要實現手機app與樹莓派的通信,這樣才能實現對樹莓派小車的控制。首先想到的就是socket通信,簡單易懂,但是寫的時候還是遇見了很多的問題,下面會說到。這篇文章只介紹實現app控制小車的前進后退左轉右轉。整體的思路就是:手機app向樹莓派發送不同的指令,樹莓派根據不同的指令進行指定的相應,來控制車體的運動。
一、車體的組裝以及連線這里就不仔細介紹了,這種東西還是比較簡單的。要注意的是將從樹莓派引出的GPIO引腳要記好,編程的時候還要用。其中L298N驅動的作用就是來為帶動小車運動的電機提供足夠的電源。
二、下面就是app進行編程了,這里使用的是Android studio,如何安裝,與配置環境百度一下都有,這里就不介紹了。下面拿控制小車前進作為一個例子進行解釋一下:
@Overridepublic void onClick(View v){if (v.getId() == R.id.forward){forward.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent){//抬起操作if (motionEvent.getAction() == MotionEvent.ACTION_UP) {sendRequestWithHttpURLConnection1();}//按下操作if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {sendRequestWithHttpURLConnection();}//移動操作if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {}return false;}});}} 上面的代碼是來監控你在app中按下了那個按鍵,如果是前進鍵,按下時調用sendRequestWithHttpURLConnection()函數向樹莓派發送指令,抬起按鍵時向樹莓派在此發送指令。其中sendRequestWithHttpURLConnection()這個函數很重要,在寫時遇到了很多的問題,主要就是在UI線程和通信socket線程的處理上,UI線程中不能使用socket通信必須要重新創建一個線程來進行通信。重點內容
private void sendRequestWithHttpURLConnection(){new Thread(new Runnable(){@Overridepublic void run() {int PORT = 1;InetAddress addr = null;try{addr = InetAddress.getByName("192.168.31.6");//此處是樹莓派的IP地址。}catch (UnknownHostException e){e.printStackTrace();}Socket socket = new Socket();try{socket.connect(new InetSocketAddress(addr, PORT), 30000);socket.setSendBufferSize(100);BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("forward");out.flush();}catch (SocketException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();StringBuilder response = new StringBuilder();String line="Iot";response.append(line);showResponse(response.toString());}finally{try{socket.close();}catch (IOException e){e.printStackTrace();}}}}).start();} 上面的代碼就是socket編程的關鍵所在,這只是前進指令的發送代碼,還有其他的指令的發送代碼,幾乎都是相同的,只是把write()括號中的內容改一下就行了。每次按下一個按鍵,就發送一個指令,使得樹莓派的GPIO改變狀態。每次抬起按鍵都發送停止的指令,使得小車停下來。三、樹莓派部分的代碼
樹莓派的代碼使用python寫的,它的作用是來對手機發送來的指令進行處理。
分為兩部分,一部分是用來封裝小車的控制代碼,一部分是用來識別接收到的指令,調用第一部分的代碼。
第一部分代碼:
重點內容
第二部分代碼:
```python from socket import * import sys import time from car import * def run_raspberry():commands ={'forward':Car.forward,'back': Car.back, 'stop': Car.stop,'left': Car.left,'right': Car.right}PORT = 1s= socket(AF_INET, SOCK_STREAM)s.bind(("", PORT)) #對所有的ip都能接收。s.listen(1)print ('raspberry pi is listening on port 8888')while 1:conn, addr = s.accept()print ('Connected by:', addr)while 1:command= conn.recv(1024).replace('\n','')if not command or command not in commands:breakcommands[command]()conn.close()if __name__ == '__main__':run_raspberry()```只需運行run_raspberry.py這個代碼就可以了。后續功能的實現,將在后面的博客中更新。參考了一下這個博客:
http://blog.csdn.net/AMDS123/article/details/70595127?locationNum=2&fps=1
總結
以上是生活随笔為你收集整理的自写app与树莓派制作智能小车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10 开机出现位置不可用C:\us
- 下一篇: 数据处理-拉伸中的strain-stre