現在無線控制已經成為了電子科學領域的主流,這次就來教大家做一個主流中的主流–無線控制的小車,先給大家看一下最終的成品示範視訊:
://v.youku.com/v_show/id_XMTY2MzAzNDAzNg==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2
首先介紹一下需要用到的材料:
TPYBoardv102開發闆兩塊
小車底盤一個
LORA無線子產品兩塊
充電寶一個
9014三極管兩個(為什麼用到它呢,後面再說)。
在這個開發闆上有一個及速度傳感器,我是看到開發闆上有個加速度傳感器才想起來這樣做的,這裡的呢我們先介紹一下加速度傳感器。
加速度傳感器,包括由矽膜片、上蓋、下蓋,膜片處于上蓋、下蓋之間,鍵合在一起;一維或二維納米材料 、金電極和引線分布在膜片上,并采用壓焊工藝引出導線;工業現場測振傳感器,主要是壓電式加速度傳感器。其工作原理主要利于壓電敏感元件的壓電效應得到與振動或者壓力成正比的電荷量或者電壓量。目前工業現場典型采用IEPE型加速度傳感器,及内置IC電路壓電加速度傳感器,傳感器輸出與振動量正正比的電壓信号,例如:100mV/g (每個加速度機關輸出100mV電壓值。1g=9.81m/s-2)。
關于上面的介紹你是不是沒看懂?沒看懂也沒關系,那是我參照官方的介紹寫的,其實我也看不懂。其實通俗的說吧,加速度傳感器就是通過測量由于重力引起的加速度,你可以計算出裝置相對于水準面的傾斜角度。通過分析動态加速度,你可以分析出裝置移動的方式。是不是還是不太懂怎麼擷取這個傾斜的值?那也沒關系,我們的Python語言裡有獲得這個傾斜值的函數,直接使用就可以啦。但是這裡值得注意的是,這個函數傳回的傾斜度是一個值,每一個傳感器因為做工時的差異,傳回值不同,這個需要大家自己做實驗看一下。
得到傾斜值後,下面的工作的就簡單了,那就是判斷闆子在怎麼傾斜,然後把傾斜的信号傳出去,這樣就OK啦,妥妥哒。
介紹完了這控制端的,那咱們得說說怎麼把控制的信号傳出吧。這裡呢主要是使用了lora子產品,這個子產品現在還是挺流行的。我親自去做過一個傳輸距離的實驗,具體的距離我沒測,但是我感覺最起碼也得有個二三裡地吧,這距離對于做個小車妥妥哒夠用啦。
說一下lora子產品的使用吧,lora子產品的使用呢,也很簡單,序列槽通信,無線透傳。就是說你使用單片機通過序列槽給子產品什麼,子產品就給你傳輸什麼(定點的話需要帶上位址信道),這個lora子產品說明說的很詳細。但是是不是覺得還要用序列槽,感覺好麻煩?我也覺得麻煩,但是Python語言和這個開發闆的功能都很強大,有一個寫好的使用序列槽的方法,直接調用就可以(瞬間感覺開發好簡單啦)。
上面介紹了控制端的工作和原理,下面說一下被控制端(就是按在小車上的)。
被控制端就是要使用開發闆控制小車地盤的電機轉動,這裡被我被坑了一次,我在某寶上買這架車的時候,問了客服需不需要其他的東西,客服說不用。我感覺現在連電機的驅動都不用啦,感覺好高端,但是買回來發現還是需要一個L298N驅動。瞬間感覺被騙了,但是,悲憤的同時,我的兩個9014上場了,簡單的做了一個三極管開關電路,妥妥哒(雖然速度略慢)。
信号接收部分,這個和控制端差不多的,都是使用了lora子產品,然後把收到的資料做判斷。判斷後再按照自己的邏輯驅動電機,小車就開起來了(小車怎麼拐彎的我就不介紹了,網上教程大把多)。
上面說了這麼多,其實也很抽象啦,下面來個聚象的,上圖。
先上一個自己畫的簡單的原理圖。
控制器
被控制端
這兩張圖是我畫來幫助大家了解的(我這樣做的被控制端的電路,速度略慢。大家可以在驅動那裡做個放大電路,速度可以上去的,但是不能後退,大家可以直接使用L298N驅動。),我做的時候是使用杜邦線的,并沒有電路圖,再上一張成品圖給大家
成品圖
這些都是給大家參考的,大家做的時候多學習多看看,親身體驗了才能真的學到東西。
下面的程式給大家,大家可以參考一下。
控制端源代碼:
[code]
import pyb
xlights = (pyb.LED(2), pyb.LED(3))
ylights = (pyb.LED(1), pyb.LED(4))
from pyb import UART
from pyb import Pin
#from ubinascii import hexlify
from ubinascii import *
accel = pyb.Accel()
u2 = UART(2, 9600)
i=0
K=1
[/code]
*********************主程式************************
[code]
print('while')
while (K>0):
_dataRead=u2.readall()
if(1>0):
x = accel.x()
print("x=")
print(x)
if x > 10:
xlights[0].on()
xlights[1].off()
u2.write('\x00\x05\x18YOU')
#pyb.delay(1000)
print('\x00\x01\x18YOU')
elif x < -10:
xlights[1].on()
xlights[0].off()
u2.write('\x00\x05\x18ZUO')
print('\x00\x01\x18ZUO')
#pyb.delay(1000)
else:
xlights[0].off()
xlights[1].off()
y = accel.y()
print("y=")
print(y)
if y > 15:
ylights[0].on()
ylights[1].off()
#u2.write('\x00\x05\x18HOU')
#pyb.delay(1000)
#print('\x00\x01\x18HOU')
elif y < -15:
ylights[1].on()
ylights[0].off()
u2.write('\x00\x05\x18QIAN')
#pyb.delay(1000)
print('\x00\x01\x18QIAN')
else:
ylights[0].off()
ylights[1].off()
pyb.delay(10)
[/code]
被控制端源代碼:
[code]import pyb
from pyb import UART
from pyb import Pin
from ubinascii import hexlify
from ubinascii import *
M1 = Pin(‘X1’, Pin.OUT_PP)
M3 = Pin(‘Y1’, Pin.OUT_PP)
u2 = UART(2, 9600)
i=0
K=1
[/code]
*********************主程式************************
[code]“print(‘while’)
while (K>0):
M1.high()
pyb.delay(3)
M3.high()
if(u2.any()>0):
print(‘1234’)
M1.low()
M3.low()
pyb.delay(3)
_dataRead=u2.readall()
print(‘123’,_dataRead)
if(_dataRead.find(b’QIAN’)>-1):
M1.low()
M3.low()
print(‘QIAN’)
pyb.delay(250)
elif(_dataRead.find(b’ZUO’)>-1):
M1.low()
M3.high()
print(‘ZUO’)
pyb.delay(250)
elif(_dataRead.find(b’YOU’)>-1):
M1.high()
M3.low()
print(‘ZUO’)
pyb.delay(250)
[/code]