一披粟、介紹
??樹(shù)莓派綜合項(xiàng)目2:智能小車(六)黑線循跡
??樹(shù)莓派基礎(chǔ)實(shí)驗(yàn)
??在樹(shù)莓派項(xiàng)目2中昧诱,我學(xué)到了很多東西腻扇,主要是通過(guò)實(shí)踐掌握了樹(shù)莓派小車的無(wú)線電控制和自動(dòng)化避障控制,雖然不是特別的高深和難懂倒庵,但是增強(qiáng)了我學(xué)習(xí)的動(dòng)力和信心曾棕,萬(wàn)丈高樓平地起,2018年6月買的小車現(xiàn)在才學(xué)習(xí)吸收完革娄,原因還是先學(xué)完基礎(chǔ)實(shí)驗(yàn)內(nèi)容后倾贰,才能學(xué)懂項(xiàng)目2,推及以后更難的內(nèi)容拦惋,若沒(méi)有項(xiàng)目2做鋪墊匆浙,估計(jì)也學(xué)不來(lái),更不用說(shuō)自己創(chuàng)作了厕妖。
??目前我仍處于學(xué)習(xí)的初級(jí)階段首尼,正向?qū)W習(xí)的中級(jí)階段邁進(jìn)。項(xiàng)目2學(xué)習(xí)完后言秸,下一步做什么呢软能?我有兩個(gè)想法:
一是學(xué)物聯(lián)網(wǎng)的自動(dòng)化控制。我對(duì)農(nóng)業(yè)很感興趣举畸,也喜歡養(yǎng)花種菜查排,想做智能溫室的樹(shù)莓派物聯(lián)網(wǎng),但是我家里沒(méi)有院子抄沮,房間也小跋核,做個(gè)mini的都困難;
二是AI視覺(jué)和機(jī)械臂叛买。在各類樹(shù)莓派創(chuàng)客書籍中發(fā)現(xiàn)砂代,視覺(jué)識(shí)別是一個(gè)主要內(nèi)容,是信息輸入的重要方式率挣,而機(jī)械臂是機(jī)器人輸出刻伊、工作的重要方式,比如農(nóng)業(yè)采摘機(jī)器人难礼。
??于是我選擇了繼續(xù)做機(jī)器人娃圆,在網(wǎng)上慢慢選了一個(gè)月的時(shí)間,終于找到一款適合我現(xiàn)在的套件蛾茉。
??做視覺(jué)處理對(duì)硬件的計(jì)算力有要求,為了讓運(yùn)行更流暢撩鹿,我選擇了樹(shù)莓派4B 8G版本谦炬,整個(gè)套件花了我1777大洋,雖然有點(diǎn)心疼节沦,但是投資學(xué)習(xí)是不會(huì)虧的键思。
如果不是4B8G的主板,價(jià)格會(huì)少很多的甫贯,同學(xué)們可以自己選擇吼鳞。或者看我的文章就可以了叫搁,歡迎大家關(guān)注我赔桌,點(diǎn)贊哦供炎!我會(huì)把這套學(xué)習(xí)資料吃透后分享給大家,如果能再開(kāi)發(fā)疾党,做一個(gè)草莓采摘機(jī)器人就更棒了音诫!
與項(xiàng)目2的小車做對(duì)比要大許多,操作升級(jí)雪位、再開(kāi)發(fā)的空間很大竭钝。
二、組件
三雹洗、實(shí)驗(yàn)原理
看過(guò)我項(xiàng)目2的同學(xué)香罐,相信對(duì)小車控制這部分已經(jīng)很熟悉了,但項(xiàng)目2中的python代碼都是我自己寫的时肿,在這個(gè)套件中我們來(lái)學(xué)習(xí)下專業(yè)人士的代碼是怎么寫的庇茫。
這個(gè)課程的第一個(gè)實(shí)驗(yàn)就是蜂鳴器實(shí)驗(yàn),作為開(kāi)局實(shí)驗(yàn)是比較基礎(chǔ)的嗜侮,就是不知道后面的復(fù)雜實(shí)驗(yàn)里是否會(huì)用到蜂鳴器港令。
我的基礎(chǔ)實(shí)驗(yàn)里做過(guò)有源蜂鳴器和無(wú)源蜂鳴器,它的基礎(chǔ)原理大家可以點(diǎn)擊參考:
樹(shù)莓派基礎(chǔ)實(shí)驗(yàn)9:蜂鳴器實(shí)驗(yàn)
本實(shí)驗(yàn)中使用的是無(wú)源蜂鳴器锈颗,和電磁揚(yáng)聲器一樣顷霹,需要接在音頻輸出電路中才能周期性地振動(dòng)發(fā)聲。只要輸出不同頻率的PWM波击吱,即可發(fā)出不同的音符淋淀,不同的音符組合起來(lái)就是一個(gè)曲子了。
在樹(shù)莓派功能轉(zhuǎn)接板上看到覆醇,蜂鳴器是直接焊接在板子上的朵纷,連接的板載模式第11針,不用像基礎(chǔ)實(shí)驗(yàn)中一樣去接線永脓,但初學(xué)者最好看一下基礎(chǔ)實(shí)驗(yàn)9袍辞,學(xué)習(xí)下基本接線方法。
四常摧、實(shí)驗(yàn)步驟
??第1步: 蜂鳴器焊接在板子上搅吁,不用連接電路。這里說(shuō)下樹(shù)莓派4B8G是64位的操作系統(tǒng)落午,與4G谎懦、2G版本不能混用。
??第2步: 編寫程序溃斋。原始代碼為python2版本界拦,為適應(yīng)發(fā)展,我還是轉(zhuǎn)換成了python3版本梗劫,并有中文注釋享甸,更詳細(xì)講解請(qǐng)參考樹(shù)莓派基礎(chǔ)實(shí)驗(yàn)9:蜂鳴器實(shí)驗(yàn)截碴。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
Buzzer = 11
CL = [0, 131, 147, 165, 175, 196, 211, 248] # 低音C調(diào)音符對(duì)應(yīng)的頻率
CM = [0, 262, 294, 330, 350, 393, 441, 495] # 中音C調(diào)音符對(duì)應(yīng)的頻率
CH = [0, 525, 589, 661, 700, 786, 882, 990] # 高音C調(diào)音符對(duì)應(yīng)的頻率
song_1 = [ CM[3], CM[5], CM[6], CM[3], CM[2], CM[3], CM[5], CM[6], # 歌曲1的音符
CH[1], CM[6], CM[5], CM[1], CM[3], CM[2], CM[2], CM[3],
CM[5], CM[2], CM[3], CM[3], CL[6], CL[6], CL[6], CM[1],
CM[2], CM[3], CM[2], CL[7], CL[6], CM[1], CL[5] ]
beat_1 = [ 1, 1, 3, 1, 1, 3, 1, 1, # 歌曲1的節(jié)拍, 1 指 1/8 拍
1, 1, 1, 1, 1, 1, 3, 1,
1, 3, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1,
1, 1, 3 ]
song_2 = [ CM[1], CM[1], CM[1], CL[5], CM[3], CM[3], CM[3], CM[1], # 歌曲2的音符
CM[1], CM[3], CM[5], CM[5], CM[4], CM[3], CM[2], CM[2],
CM[3], CM[4], CM[4], CM[3], CM[2], CM[3], CM[1], CM[1],
CM[3], CM[2], CL[5], CL[7], CM[2], CM[1] ]
beat_2 = [ 1, 1, 2, 2, 1, 1, 2, 2, # 歌曲2的節(jié)拍, 1 指 1/8 拍
1, 1, 2, 2, 1, 1, 3, 1,
1, 2, 2, 1, 1, 2, 2, 1,
1, 2, 2, 1, 1, 3 ]
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # 根據(jù)物理位置對(duì)gpio進(jìn)行編號(hào)
GPIO.setup(Buzzer, GPIO.OUT) # 設(shè)置引腳模式為輸出
global Buzz # 指定一個(gè)全局變量來(lái)替換GPIO.PWM
Buzz = GPIO.PWM(Buzzer, 440) # 440 是初始頻率
Buzz.start(50) # 啟動(dòng)蜂鳴器PWM50%的占空比
def loop():
while True:
print('\n Playing song 1...')
for i in range(1, len(song_1)): # 播放歌曲1
Buzz.ChangeFrequency(song_1[i]) # 沿著歌曲的音符改變頻率
time.sleep(beat_1[i] * 0.5) # 一個(gè)節(jié)拍為0.5s的時(shí)長(zhǎng)
time.sleep(1) #
print('\n\n Playing song 2...')
for i in range(1, len(song_2)):
Buzz.ChangeFrequency(song_2[i])
time.sleep(beat_2[i] * 0.5)
def destory():
Buzz.stop() # 停止PWM
GPIO.output(Buzzer, 1) # 將蜂鳴器引腳設(shè)置為輸出高電平
GPIO.cleanup() # 釋放資源
if __name__ == '__main__': # 程序從這里開(kāi)始
setup()
try:
loop()
except KeyboardInterrupt: # 當(dāng)輸入'Ctrl+C'時(shí), 函數(shù)destroy()會(huì)被執(zhí)行
destory()