树莓派结课总结
一、認識樹莓派
1.1對樹莓派的認識
Raspberry Pi是新手用來學習Linux系統的絕佳入門工具,具有便攜性、較易操作性、廉價等多種優點,但由于機能不足只能勝任一些簡單的工作,在一部分功能上甚至可以達到pc的效果,由于“魔鏡”等項目的出現,使我對其產生了興趣,并自行購入pi400進行pc體驗。
入學后,見到有選修課可以學習樹莓派,為我開啟了全新的旅程。
1.2 材料準備
樹莓派4b開發板一塊、樹莓派IO口擴展板一塊、40P排線+連接線若干、4B亞克力外殼、16G SD卡一張、讀卡器一只、電源、面包板一塊(可選:激光傳感器、開關、超聲波傳感器、小車套裝)
1.3 組裝樹莓派
由于上一屆班級的優秀遺留,我們得以不用組裝亞克力外殼,只需要把面包板連接并且第一次學習風扇引線即可,我很快組裝成功,發現風扇有問題,經過老師幫助了解了面包板電源的分布。
1.4 安裝操作系統
操作系統可謂是一波三折,由于第一次安裝python后出現較大失誤,第二次系統重裝裝錯了鏡像 ,最終才算是折騰好了系統,同時注意到pi400的鏡像和4b型號是不通用的。
1.5 配置樹莓派
利用scaanner查看IP地址
開啟VNC服務并進行連接
樹莓派官方系統raspbian自帶的是國外的軟件源,在國內使用經常會遇到無法下載軟件的問題。需要修改sources.list文件
?sudo nanos/etc/apt/sources.list將初始化中的代碼中默認的官方軟件源注釋掉 # ,并且添加:
?deb http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpideb-src http://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi1.6 啟動樹莓派
插電即可啟動,在此期間連接手機熱點,利用scanner搜索IP利用VNC連接
1.7 樹莓派上的Linux
這里采用的是樹莓派官方鏡像老師定制版,基本操作和之前學習過的Ubuntu類似,只不過python最高版本只支持二系,這就意味著編程語法的部分改變,同時由于機能不足,操作略微有些卡頓,漢化不全,這對我來說是個算不得挑戰的問題。
1.8 總結
樹莓派(Raspberry Pi)是個好東西,只有信用卡大小,卻有電腦的功能。 自問世以來,受眾多計算機發燒友和創客的追捧,曾經一“派”難求。別看其外表“嬌小”,內“心”卻很強大,視頻、音頻等功能通通皆有,可謂是“麻雀雖小,五臟俱全”。
二、通過樹莓派控制LED燈
2.1 原理
通過GPIO 庫
2.2 實現過程
?GPIO.setup(num, GPIO.IN)?GPIO.setup(num, GPIO.OUT)我們可以通過GPIO.setup方法將相應引腳設置為輸入模式或者輸出模式
設置完之后,我們就可以通過GPIO.input和GPIO.output來接收或者發送高低電平,要是想點亮LED燈,我們只需要向相應的端口發送高電平即可。
2.3 源碼
?import RPi.GPIO as GPIOimport time ? ?GPIO.setmode(GPIO.BOARD)GPIO.setup(16,GPIO.OUT) ? ?GPIO.output(16,GPIO.HIGH) ? ?time.sleep(3) ? ?GPIO.output(16,GPIO.LOW) ? ?time.sleep(3) ? ?GPIO.output(16,GPIO.HIGH) ? ?time.sleep(3) ? ?GPIO.claenup() ? ? ? ? ? ?2.4 總結
通過加入延時,我們就可以實現燈的持續亮滅,由此我想到可以控制燈的閃爍頻率實現信息摩斯電碼傳遞。
三、設置小游戲
3.1準備工具
3.2 實現過程
由于圖形化的頁面和簡易的控件,這次小實驗并不需要編寫源碼,我們通過拖拽控件并輸入相應的步數實現了人物的簡單動作
3.3進階玩法:設計小游戲
通過畫圖導入人物素材,子彈,戰機,編程使按下相應按鍵的時候,戰機發射子彈,通過默認碰撞面積實現擊落敵機效果
3.4 總結
非常好玩的一個小游戲,兒童編程的良好引路工具,我覺得它降低了使用門檻,使編程的思想貫徹到孩提時期,而未來的世界編程一定是一項基本的技能,從此不難看出這項工具的易用性和前瞻性,scratch使非常好的從小孩入手的教育類工具。
四、python語言基礎
4.1 python語言的歷史
實質上是C++代碼的封裝。Python由荷蘭數學和計算機科學研究學會的Guido van Rossum于1990 年代初設計,作為一門叫做ABC語言 的替代品。 Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用于獨立的、大型項目的開發。
其特色是一個一個的工具包可以實現非常強大的功能,我同時期選修的人工智能與ai中便用python實現神經網絡深度學習,讓我體會到了只需要調用工具包即可完成C++中數百行內容的便利。
4.2 Linux系統
學語言逃離不了學習系統,而本門課程不需要太過于艱深的系統知識,只需要掌握諸如 sudo -I apt-get install pip等基本指令即可,對于Linux來說也是一種入門。
4.3 基本語法
打印 print(“ ”)
定義常量 #define
文本注釋 # """p"""
布爾類型 True和False
列表賦值 names_python_pc = ['1','2','3','4']
字典 name_dictionary = {'老爸':300,'老婆':1000,'老媽':800,'自己':600,'孩子。':200}
在Python語言中,Python根據縮進來判斷代碼行與前一行的關系。如果代碼的縮進相同,Python認為它們為一個語句塊;否則就是兩個語句塊。一般使用tab按鍵縮進代碼,有的IDE自動縮進代碼,比如Pycharm.
條件有 if else
循環有for while
控制中有pass continue break
4.4 總結:
樹莓派的編程離不開python語言的助力,在接下來的學習和今后的其他課程的學習,我相信先行學習過python的人會培養出編程的思維,另外還有熟練度的提升,從而使學習獲得更大的助力。由此可見,本門課的開展對于提升我們的動手能力和實踐能力使非常有幫助的。
五、python控制LED燈
同二不同,這里我們采用PWM調光等操作。
5.1 原理:
我們用到了一個保護電阻用來保護led燈的安全,剩下的事情便是學習pwm頻率調光
具體語法是引用GPIO庫里的pwm功能,期中需要兩個參數,第一個是GPIO的引腳,第二個是頻率,當然過高的頻率可能會讓CPU難以運算,一般會取到人眼觀測范圍內進行測試學習。
5.2 源碼:
?import RPi.GPIO as GPIOimport time?GPIO.setmode(GPIO.BCM)GPI0.setup(17,GPI0.0UT)GPIO.setup(18,GPIO.OUT)GPIO.output(19,False)pwm.start(O)while True:for i in range(0,101,1):pwm.ChangeDutyCycle((i)time.sleep(.02)?for i in range(100,-1,-1):pwm.ChangeDutyCycle(i)time.sleep(.02)5.3 總結:
我將端口設置好輸入輸出格式后,便全然調用pwm模塊進行控制,由于python庫的簡便性,我控制pwm自動遞增遞減頻率,利用了changedutycycle的功能,最終的效果比直接控制端口輸出更加精細化的控制和自動化的調節, 獲得了極大的收獲和樂趣。
六、紅外避障傳感器
測試圖:
6.1原理:
紅外線檢測模塊可以識別模塊前方是否有物體阻擋,并在有物體阻擋時輸出信號并亮起綠色燈光,并且值得一提的是,無論輸出端是否有接入,綠燈獨立亮起。
6.2 目的:
不難猜到,這樣的一個模塊如果裝在小車上,對其的避障功能是一種很大的提升,通過程序設計,可以實現檢測物體從而自動避障。
6.3 源碼:
?import RPi.GPIO as GPIO?ObstaclePin = 18?def setup():GPIO.setmode(GPIO.BOARD) ? ? ? # Numbers GPIOs by physical locationGPIO.setup(ObstaclePin, GPIO.IN, pull_up_down=GPIO.PUD_UP)?def loop():while True:if (0 == GPIO.input(ObstaclePin)): ?#當檢測到障礙物時,輸出低電平信號print "Barrier" ? else :print "Nothing"?def destroy():GPIO.cleanup() ? ? ? ? ? ? ? ? ? ? # Release resource?if __name__ == '__main__': ? ? # Program start from heresetup()try:loop()except KeyboardInterrupt:edestroy()6.4 代碼解釋及總結:
由于模塊本身便可顯示預知障礙能力,在加上本節課的機器失誤較大,沒能完成,后期補完代碼,發現加了一些輸出的功能,具體就是用起了輸送的高低電平型號輸出是否有障礙,可謂是非常有趣。
七、超聲波測距
7.1 原理:
在超聲波發射裝置發出超聲波,它的根據是接收器接到超聲波時的時間差。超聲波在空氣中的傳播速度為340m/s,根據計時器記錄的時間t,就可以計算出發射點距障礙物面的距離s,即:s=340t/2
7.2 源碼:
?import RPi.GPIO as GPIOimport timeGPIO.setmode(GPIO.BCM)GPIO_TRIGGER = 17GPIO_ECHO = 18GPIO.setup(GPIO_TRIGGER, GPIO.OUT)GPIO.setup(GPIO_ECHO, GPIO.IN)?def distance():GPIO.output(GPIO_TRIGGER, True)?time.sleep(0.00001)GPIO.output(GPIO_TRIGGER, False)start_time = time.time()stop_time = time.time()# 記錄發送超聲波的時刻1while GPIO.input(GPIO_ECHO) == 0:start_time = time.time()# 記錄接收到返回超聲波的時刻2while GPIO.input(GPIO_ECHO) == 1:stop_time = time.time()# 計算超聲波的往返時間 = 時刻2 - 時刻1time_elapsed = stop_time - start_time# 聲波的速度為 343m/s, 轉化為 34300cm/s。distance = (time_elapsed * 34300) / 2return distanceif __name__ == '__main__':try:while True:dist = distance()print("Measured Distance = {:.2f} cm".format(dist))time.sleep(1)# Reset by pressing CTRL + Cexcept KeyboardInterrupt:print("Measurement stopped by User")GPIO.cleanup()7.3 模塊展示:
7.4 總結:
除掉4端口接地沒用之外,這也是我第一次接觸這么多線,高中畢業以來,對于工學的追求沒有這么苛刻,但是動手能力在這一次實驗中得到了充分的展現,光是接線的錯誤,就已經讓我焦頭爛額,而且又經歷了三輪超聲波測距,結果返回只有一毫米的情況,調了幾次單位也無濟于事,相比較第一節課風扇都不會結的情況來說,我的能力已經有了很大的進步,這門課的效果可見一斑。所幸最后成功實現了輸出,并且真正第一次掌握了地線、導線、不同端口的意義。
八、遙控小車
成品圖:
PART 1
8.1 原理:
通過對于兩個電機步進的調整,實現小車的前進、停止、左轉、右轉功能。具體來說,便用DC調整頻率,使電機不斷轉動,帶動輪子轉動,而左右電機的指令不同,小車便能完成轉彎和旋轉的動作。同時定義速度功能,即通過dc頻率控制運動速度。
8.2 源碼:
?import RPi.GPIO as GPIOfrom time import sleepEN1 = 17IN1 = 16IN2 = 13EN2 = 20IN3 = 19IN4 = 18def setup():GPIO.setmode(GPIO.BCM)GPIO.setup(EN1,GPIO.OUT)GPIO.setup(IN1,GPIO.OUT)GPIO.setup(IN2,GPIO.OUT)GPIO.setup(EN2,GPIO.OUT)GPIO.setup(IN3,GPIO.OUT)GPIO.setup(IN4,GPIO.OUT)def speed(i1,i2):dc1=i1dc2=i2p1.ChangeDutyCycle(dc1)p2.ChangeDutyCycle(dc2)def forward():GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)def backward():GPIO.output(IN1,GPIO.LOW)GPIO.output(IN2,GPIO.HIGH)GPIO.output(IN3,GPIO.LOW)GPIO.output(IN4,GPIO.HIGH)def left():GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)GPIO.output(IN3,GPIO.LOW)GPIO.output(IN4,GPIO.HIGH)def right():GPIO.output(IN1,GPIO.LOW)GPIO.output(IN2,GPIO.HIGH)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)def stop():GPIO.output(EN1,0)GPIO.output(EN2,0)def clean():GPIO.cleanup()if __name__=="__main__":setup()p1 = GPIO.PWM(EN1,250)p1.start(0)p2 = GPIO.PWM(EN2,250)p2.start(0)try:forward()speed(100,100)sleep(5)left()speed(30,30)sleep(5)right()speed(30,30)sleep(5)speed(0,0)stop()clean()except KeyboardInterrupt as e:clean() ?8.3 功能簡述:
小車先是全速前進,停止五秒,左轉,停止五秒,右轉,停止五秒,停止,清除端口信息。
PART 2
8.4 原理
在上述程序的基礎上,調用python的多線程的對鍵盤映射實現讀取,從而調動指令,控制小車。
8.5 源碼
!!注意不能直接用idle運行,要到存放目錄采用 python 1.py運行
?import RPi.GPIO as GPIOfrom time import sleepimport threadingimport sysimport sys, tty, termios?def getch(): ? ? ? ? ? ? ? ? fd = sys.stdin.fileno()old = termios.tcgetattr(fd)try:tty.setraw(fd)return sys.stdin.read(1)finally:termios.tcsetattr(fd, termios.TCSADRAIN, old)?class KeyEventThread(threading.Thread): ?def run(self):print("thread");Fun()?def Fun():print("Fun")while True:key=getch() ? ? ? ? ? ? ? ? ? ? if key=='q':funExit()exit()returnelif key=='1':print('speed 1')funSpeed(100,100)elif key=='2':print('speed 2')funSpeed(70,70)elif key=='3':print('speed 3')funSpeed(20,20)elif key=='w':print('forward') ? ? ? ? ? ? ? ? ? ? ? GPIO.output(MotorIN1,GPIO.HIGH)GPIO.output(MotorIN2,GPIO.LOW)GPIO.output(MotorIN3,GPIO.HIGH)GPIO.output(MotorIN4,GPIO.LOW)funSpeed(50,50)elif key=='x': ? ? ? ? ? ? ? ? ? ? ? ? ? ? print('backward')GPIO.output(MotorIN1,GPIO.LOW)GPIO.output(MotorIN2,GPIO.HIGH)GPIO.output(MotorIN3,GPIO.LOW)GPIO.output(MotorIN4,GPIO.HIGH)funSpeed(50,50)elif key=='a': ? ? ? ? ? ? ? ? ? ? ? ? ? ? print('left')GPIO.output(MotorIN1,GPIO.HIGH)GPIO.output(MotorIN2,GPIO.LOW)GPIO.output(MotorIN3,GPIO.LOW)GPIO.output(MotorIN4,GPIO.HIGH)funSpeed(50,50)elif key=='d': ? ? ? ? ? ? ? ? ? ? ? ? ? ? print('right')GPIO.output(MotorIN1,GPIO.LOW)GPIO.output(MotorIN2,GPIO.HIGH)GPIO.output(MotorIN3,GPIO.HIGH)GPIO.output(MotorIN4,GPIO.LOW)funSpeed(50,50)elif key=='s':print('stop')funSpeed(0,0)else:print("key="+key)return??def funSpeed(i1,i2):dc1=i1dc2=i2p1.ChangeDutyCycle(dc1)p2.ChangeDutyCycle(dc2)??def funInit():GPIO.setmode(GPIO.BCM) ? ? ? ? ? ?GPIO.setup(MotorIN1,GPIO.OUT)GPIO.setup(MotorIN2,GPIO.OUT)GPIO.setup(MotorEN1,GPIO.OUT)GPIO.setup(MotorIN3,GPIO.OUT)GPIO.setup(MotorIN4,GPIO.OUT)GPIO.setup(MotorEN2,GPIO.OUT)??def funExit(): ? ? ? ? ? ? ? ? ? ? ? ? ?print ("Stopping motor")GPIO.output(MotorEN1,GPIO.LOW)GPIO.output(MotorEN2,GPIO.LOW)GPIO.cleanup()??MotorIN1 = 16MotorIN2 = 13MotorEN1 = 17?MotorIN3 = 19MotorIN4 = 18MotorEN2 = 20?print("Press 'q' to exit")print("'w'=forward,'x'=backward,'a'=left,'d'=right,'s'=stop")print("'1','2','3' motor speed")funInit()p1 = GPIO.PWM(MotorEN1,250) ? ?p1.start(0)p2 = GPIO.PWM(MotorEN2,250)p2.start(0)?kethread = KeyEventThread()kethread.start()8.6 實現:
最終小車能根據鍵盤指令實時啟動,不過由于部分原因,我組裝的小車并不完善,頗有趕工的嫌疑,而且調速之后小車直接啟動,也是一個不盡人意的小bug,但是能看見自己的小車能按照自己的指令如臂使指的運動,還是有非常大的成就感。
結課總結
課程結束了,但是工程的那種務實和動手精神深深地眷刻在了我的腦海中,對于實現自動化控制小車,還有之前的一系列小實驗,我都感到非常的欣喜。雖然這只是一項入門,甚至說,樹莓派的機能不足以實現復雜的功能,但是通過這次入門,我深深切切的感受到了python的便利和工程學的魅力。
最后感謝孫老師這幾周的努力和孜孜不倦的教誨,把我們領進了一扇大門。
那迷人的世界,盡在我眼前
總結
- 上一篇: python职位应聘_我去面试Pytho
- 下一篇: 97岁的诺奖得主,活着就会有好事发生