日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自写app与树莓派制作智能小车

發布時間:2024/1/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自写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寫的,它的作用是來對手機發送來的指令進行處理。
分為兩部分,一部分是用來封裝小車的控制代碼,一部分是用來識別接收到的指令,調用第一部分的代碼。
第一部分代碼:
重點內容

import threading import RPi.GPIO as GPIO import timeclass Info:@staticmethoddef p(message):print 'Info: '+message class Wheel:pins ={'a':[13,15],'b':[16,18]}def __init__(self,name):self.name = nameself.pin = Wheel.pins[self.name]GPIO.setmode(GPIO.BOARD)GPIO.setup(self.pin[0],GPIO.OUT)GPIO.setup(self.pin[1],GPIO.OUT)self.stop()def st(self):print 'ss'def forward(self):Info.p('wheel ' + self.name + ' is forwarding')GPIO.output(self.pin[0],GPIO.HIGH)GPIO.output(self.pin[1],GPIO.LOW)def stop(self):GPIO.output(self.pin[0],False)GPIO.output(self.pin[1],False)def back(self):Info.p('wheel ' +self.name + ' is backing')GPIO.output(self.pin[0],False)GPIO.output(self.pin[1],True)class Car:wheel=[Wheel('a'),Wheel('b'),Wheel('c'),Wheel('d')] @staticmethoddef init():GPIO.setmode(GPIO.BOARD)Info.p('initialize the smart car ....') Info.p('Smart car is ready to fly!')@staticmethoddef forward():Info.p('go straight forward')for wheel in Car.wheel:wheel.forward()@staticmethoddef left():Info.p('turn left ')Car.wheel[0].forward() Car.wheel[1].back()@staticmethoddef right():Info.p('turn left ')Car.wheel[0].back()Car.wheel[1].forward()@staticmethoddef bleft():Info.p('turn left ')Car.wheel[2].back() @staticmethoddef stop():Info.p('turn left ')Car.wheel[0].stop() Car.wheel[1].stop() @staticmethoddef back():Info.p('go straight back')for wheel in Car.wheel:wheel.back()@staticmethoddef lforward():Info.p('go forward and turn left')@staticmethoddef rforward():Info.p('go forward and turn right')@staticmethoddef lback():Info.p('go back and turn left')@staticmethoddef rback():Info.p('go back and turn right')@staticmethoddef stop():Info.p('try to stop the car ...')for wheel in Car.wheel:wheel.stop() @staticmethoddef bark():Info.p('try to slow down the car ...')@staticmethoddef speedup():Info.p('try to speed up the car ...')if __name__ =='__main__':print '....'

第二部分代碼:

```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与树莓派制作智能小车的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。