色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用樹莓派Pico編一個拼手速游戲

jf_zGNBEhbi ? 來源:趣無盡 ? 作者:趣無盡 ? 2023-08-17 10:10 ? 次閱讀

微控制器MCU)不僅存在于工業設備中,它們為包括玩具和游戲在內的許多家庭電子產品 供算力。在這一章中,你將創建一個簡單的反應計時游戲,看看你的朋友中誰會在燈熄滅時第一個按下按鈕。

你的反應時間,大腦來處理的時間以毫秒計:人類的平均反應時間大約是 200 – 250 毫秒。

對于這個項目,你需要:
樹莓派 Pico
– 面包板
– 任何顏色的 LED
– 一個 330Ω 電阻
– 兩個按鈕開關
– 若干公對公跳線
– 一根 microUSB 數據線

將 Pico 連接到樹莓派或其他運行 Thonny MicroPython IDE 的計算機。

單人游戲

如圖所示在面包板上搭建電路。LED 和 330Ω 限流電阻串聯在 Pico 的 GP15 和 GND 引腳之間。

c9244fb2-3ca2-11ee-ac96-dac502259ad0.jpg

接下來,添加按鈕開關。將按鈕一側的引腳連接到 Pico 的 GP14,另一側的引腳接到 Pico 的 3V3 引腳上。

為什么要連接 3v3?請記住,開關和 LED 一樣,需要電阻器才能正確工作,而且
Pico 上 GPIO 是有可編程電阻器的。在這本文的項目中,我們將它們設置為下拉電阻,這意味著當按鈕按下時,引腳電壓必須被拉高。

現在你的電路已經具備了作為一個單人游戲所需要的一切,LED 是輸出設備(類似電視機的作用),按鈕開關為控制器,而 Pico 是游戲主機,盡管它比你通常看到的要小得多!

現在你需要真正編寫游戲。和往常一樣,把樹莓派上的 Thonny 打開。創建一個新程序:

import machine
import utime

此外,你將需要一個新的庫:urandom,它用來創建隨機數并在這個游戲中使用,以防止曾經玩過它的玩家簡單地倒數一個固定的秒數點擊按鈕而一招制勝。

接下來,設置好 LED 和按鈕的引腳:

led = machine.Pin(15, machine.Pin.OUT)
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)

在前面的章節中,你已經了解如何在主程序或單獨的線程中使用按鈕。這一次我們將采 用一種不同的、更靈活的方法:中斷請求(IRQs)來處理按鈕的反饋。

這個名字聽起來很復雜,但其實很簡單。想象一下,你正在一頁一頁地閱讀一本書,有人走過來問你一個問題。那個人在執行一個打斷請求,要求你停止正在做的事情,回答他們的問題,然后讓你繼續讀你的書。

MicroPython 中斷請求以完全相同的方式工作,它允許某些東西(在這種情況下是按下按鈕 開關)中斷主程序。在某些方面,它和線程很相似,在主程序之外有一段代碼。然而,與線程不 同的是,代碼不是持續運行的,它只在中斷被觸發時運行。

首先定義中斷的處理程序。這個被稱為回調函數的代碼在中斷被觸發時運行。

def button_handler(pin):
button.irq(handler=None)
print(pin)

這兩行代碼首先關閉中斷,這樣它只觸發一次,然后打印有關觸發中斷的引腳編號。

繼續下面的程序:

led.value(1)
utime.sleep(urandom.uniform(5, 10))
led.value(0)

第一行將 LED 點亮,下一行暫停程序,最后一行再次關閉 LED 燈。玩家按下按鈕之后,LED 被點亮的時間并不是固定的,而是利用 urandom 庫將程序暫停 5 到 10 秒,換句話說,就是 LED 會亮 5 到 10 秒。

然而,目前還沒有什么東西在等待著按鈕被按下。你需要為此設置中斷,方法是在程序末尾增加一行:

button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

設置中斷需要兩個東西:觸發器和處理程序。觸發器告訴 Pico 它應該尋找什么作為中斷它正在做的事情的有效信號;handler 就是中斷被觸發后運行的函數名。

在這個程序中,你的觸發器是 IRQ_RISING,這意味著中斷是由引腳電壓從低電平升到高電平時觸發。而 IRQ_FALLING 這是引腳電壓從高電平到低電平時觸發。如果你需要寫一個程序,在一個引腳改變時觸發一個中斷,而不關心它是上升還是下降,你可以使用「|」組合這兩個觸發器:

button.irq(trigger=machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING, andler=button_handler)

本項目中,代碼將變成下面這樣:

import machine
import utime
import urandom


led = machine.Pin(15, machine.Pin.OUT)
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)


def button_handler(pin):
  button.irq(handler=None)
  print(pin)


led.value(1)
utime.sleep(urandom.uniform(5, 10))
led.value(0)
button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

單擊 Run 按鈕,并將程序保存到 Pico 上命名為 Reaction_Game.py。你會看到 LED 燈亮起來,這是信號,用你的手指放在按鈕上。當 LED 熄滅時,盡可能快地按下按鈕。

當你按下按鈕時,它會觸發你之前編寫的處理程序代碼。查看 Shell 區域,你將看到 Pico 打印了一條消息,確認中斷是由 GP14 引腳觸發的。你還會看到另一個細節:mode=IN 告訴你引腳被配置為輸入。不過,這個信息并沒有給游戲造成多大的影響,為此,你需要一種方法來加快玩家的反應速度。首先從按鈕處理程序中刪除 print(pin) 這一行,你不再需要它了。

轉到程序的底部并添加一條新行,就在你設置中斷的位置的正上方:

timer_start = utime.ticks_ms()

這里創建了一個名為 timer_start 的新變量,并賦予了 utime.ticks_ms() 函數的輸出,該函數計算自 utime 庫開始計數以來已過的毫秒數。這給在 LED 熄滅之后和中斷觸發器準備好讀取按鈕之前,提供了一個參考的時間點。

接下來,回到按鈕處理程序,添加以下兩行:

timer_reaction = utime.ticks_diff(utime.ticks_ms(), timer_start)
print("Your reaction time was " + str(timer_reaction) + "milliseconds!")

第一行創建了另一個變量,這一次是中斷實際觸發的時刻,換句話說,就是按下按鈕的時 候。但是,它不像以前那樣簡單地從 utime.ticks_ms() 中讀取數據,而是使用 utime.ticks_diff() 這個函數,它得到了觸發這行代碼的時間與變量 timer_start 中保存的參考點之間的差異。

第二行代碼打印出計算結果。

最后的代碼如下:

import machine
import utime
import urandom


led = machine.Pin(15, machine.Pin.OUT)
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)


def button_handler(pin):
  button.irq(handler=None)
  timer_reaction = utime.ticks_diff(utime.ticks_ms(), timer_start)
  print("Your reaction time was " + str(timer_reaction) + " milliseconds!")


led.value(1)
utime.sleep(urandom.uniform(5, 10))
led.value(0)
timer_start = utime.ticks_ms() button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

再次點擊 Run 按鈕,等待 LED 熄滅,然后按下按鈕。這一次,你將看到一條消息,告訴你按下按鈕的速度,而不是觸發中斷的針的報告,這是對你反應時間的測量。

再次點擊運行按鈕,看看你是否可以更快的速度按下按鈕,在這個游戲中,你正在嘗試盡可能低的分數!

雙人游戲

單人游戲很有趣,但是讓你的朋友參與進來會更好。你可以先邀請他們玩你的游戲,比較你 的高分或低分,看看誰的反應最快。然后,你可以修改你的游戲,讓他們和你一起玩。

首先在你的電路中添加第二個按鈕。如圖所示。確保兩個按鈕之間有足夠的距離,以便玩家能夠將手指放在按鈕上。

c9414cac-3ca2-11ee-ac96-dac502259ad0.jpg

雖然第二個按鈕現在已經連接到 Pico,但它還不知道如何使用它。回到你在 Thonny 的程序 中,找到你設置第一個按鈕的地方。在這一行下面,添加:

right_button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)

你將注意到,名稱現在指定了你正在使用的按鈕(右側的按鈕)。為了避免混淆,請編輯
上面的一行,這樣你就可以清楚地看到,原來黑板上唯一的按鈕現在變成了左邊的按鈕:

left_button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)

你還需要在程序的其他地方進行相同的更改。轉到按鈕處理器功能并更改行:

button.irq(handler=None)

它讀取:

left_button.irq(handler=None)

接下來,為第二個按鈕添加:

right_button.irq(handler=None)

向下滾動到程序的底部,并更改設置中斷觸發器的行,以便它進行讀取:

left_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

同樣,在它下面添加另一行,以在新按鈕上設置中斷觸發器:

right_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

你的程序現在應該看起來像這樣:

import machine
import utime
import urandom


led = machine.Pin(15, machine.Pin.OUT)
left_button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)right_button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)


def button_handler(pin):
  left_button.irq(handler=None)
  right_button.irq(handler=None)
  timer_reaction = utime.ticks_diff(utime.ticks_ms(), timer_start) print("Your reaction time was " + str(timer_reaction) +
  " milliseconds!")


led.value(1)
utime.sleep(urandom.uniform(5, 10))
led.value(0)
right_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)
left_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)

點擊 Run 圖標,等待 LED 熄滅,然后按下左邊的按鈕開關,你會看到游戲和之前一樣,將你的反應時間打印到 Shell 區域。再次點擊運行圖標,但這一次,當 LED 熄滅時,按右邊的按鈕也在正常工作,打印你們的反應時間。

中斷和中斷處理函數

你創建的每個中斷都需要一個處理程序,但單個處理程序可以處理任意數量的中斷。在這個程序中,有兩個中斷都指向同一個處理程序,這意味著無論觸發哪個中斷,它們都將運行相同的代碼。不同的程序可能有兩個處理程序,讓每個中斷運行不同的代碼,這完全取決于你需要你的程序做什么。

為了讓游戲更精彩一點,你可以讓它報告兩個玩家中哪一個是第一個按下按鈕的。回到程序的 頂部,就在下面,你可以設置 LED 和兩個按鈕,并添加以下內容:

fastest_button = None

這將設置一個新變量 fastest_button,并將其初始值設置為 None,因為還沒有按下任何按鈕。

接下來,到按鈕處理程序的底部,刪除處理計時器和打印的兩行,然后用以下代碼替換它們:

global fastest_button
fastest_button = pin

這兩行代碼讓 fastest_button 成為變量,并將其設置為相應按鈕的引腳編號。

現在直接轉到程序的底部,并添加以下兩行:

while fastest_button is None:
utime.sleep(1)

這里創建了一個循環,但它不是一個無限循環。這里,你告訴 MicroPython 只有在 fastest_button 變量仍然為 None 時才在循環中運行代碼。實際上,這會暫停程序的主線程,直到中斷處理程序更改了變量的值。

如果兩個玩家都沒有按下按鈕,程序就會暫停。

最后,你需要一種方法來確定哪位選手獲勝,并向他們表示祝賀。在程序的底部輸入以下代碼:

if fastest_button is left_button:
print("Left Player wins!")
elif fastest_button is right_button:
print("Right Player wins!")

第一行設置了一個 if 條件,用于查看 fastest_button 變量是否為 left_button(這意味著 IRQ 是由左手按鈕觸發的)。如果是這樣,它將打印一條消息祝賀左邊的玩家(他的按鈕連接到 GP14 引腳)。

如果條件不成立,它將查看 fastest_button 變量是否為 right_button。如果是,則打印一條消息祝賀右邊的玩家,該玩家的按鈕已連接到 GP16。

完成的程序如下:

import machine
import utime
import urandom


led = machine.Pin(15, machine.Pin.OUT)
left_button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN) right_button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)


fastest_button = None


def button_handler(pin):
  left_button.irq(handler=None)
  right_button.irq(handler=None)
  global fastest_button
  fastest_button = pin


led.value(1)
utime.sleep(urandom.uniform(5, 10))
led.value(0)
left_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)
right_button.irq(trigger=machine.Pin.IRQ_RISING, handler=button_handler)


while fastest_button is None:
  utime.sleep(1)


if fastest_button is left_button:
  print("Left Player wins!")
elif fastest_button is right_button:
  print("Right Player wins!")

點擊 Run 按鈕運行程序,等待 LED 熄滅,但不要按下任何一個按鈕開關。

你將看到 Shell 區域仍然是空白的,并且不會返回「>>>」提示符。這是因為主線程仍在運行,處于你創建的循環中。

現在按左手按鈕(GP14)。你將看到一條祝賀你的消息「Left Player wins!」打印到 Shell 上。

再次單擊 Run 運行,并嘗試在 LED 熄滅后按下右手按鈕。你將看到另一條消息「Right Player wins!」打印出來,這一次祝賀你的右手。

再次點擊 Run 運行,這次每個按鈕上都有一個手指,同時按下它們,看看你的右手還是左手更快!

現在你已經創造了一個雙人游戲,你可以邀請你的朋友一起玩,看看你們誰的反應速度最快!

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7646

    瀏覽量

    151879
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17316

    瀏覽量

    352248
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    108253
  • 計算機
    +關注

    關注

    19

    文章

    7534

    瀏覽量

    88457
  • 樹莓派
    +關注

    關注

    117

    文章

    1710

    瀏覽量

    105807

原文標題:用樹莓派 Pico 編一個拼手速游戲

文章出處:【微信號:趣無盡,微信公眾號:趣無盡】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    樹莓pico入門學習筆記()相關資料推薦

    樹莓pico入門學習筆記選擇自己熟悉的編程語言樹莓pico提供C/C++和micropyth
    發表于 07-01 09:28

    樹莓pico如何入門?

    樹莓pico如何入門?
    發表于 10-13 08:11

    樹莓Pico的相關資料分享

    關注、星標公眾號,直達精彩內容1月22日,樹莓基金會最新發布款低成本、高性能的微控制器開發板Raspberry Pi Pico,新產品相比普通
    發表于 11-03 08:44

    使用樹莓Pico開發板的些思考與應用實踐資料分享

    本博文根據樹莓基金會2021年1月21日公開的兩部最新官方英文技術文獻[1]、[2]以及博主最近使用樹莓Pico開發板的
    發表于 11-12 06:07

    使用樹莓Pico做了自動駕駛小車

    樹莓Pico做了自動駕駛小車,連接上藍牙,可以用手機控制它的移動了。
    發表于 01-05 07:32

    樹莓Pico的相關資料推薦

    1月22日,樹莓基金會最新發布款低成本、高性能的微控制器開發板Raspberry Pi Pico,新產品相比普通樹莓
    發表于 02-07 07:37

    遠程控制樹莓3b上的pi pico

    樹莓pi pico樹莓4相比差別很大,但是pi pico
    的頭像 發表于 03-05 17:23 ?4017次閱讀

    樹莓也出MCU了?樹莓Pico來了!

    關注、星標公眾號,直達精彩內容1月22日,樹莓基金會最新發布款低成本、高性能的微控制器開發板Raspberry Pi Pico,新產品相比普通
    發表于 10-28 10:36 ?11次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>也出MCU了?<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>來了!

    樹莓Pico:僅4美元的MCU

    1月22日,樹莓基金會最新發布款低成本、高性能的微控制器開發板Raspberry Pi Pico,新產品相比普通樹莓
    發表于 12-04 13:06 ?13次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>:僅4美元的MCU

    樹莓pico入門學習筆記(

    樹莓pico入門學習筆記選擇自己熟悉的編程語言樹莓pico提供C/C++和micropyth
    發表于 12-17 18:42 ?21次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>pico</b>入門學習筆記(<b class='flag-5'>一</b>)

    距離檢測報警使用樹莓Pico

    電子發燒友網站提供《距離檢測報警使用樹莓Pico.zip》資料免費下載
    發表于 11-09 11:49 ?0次下載
    距離檢測報警使用<b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>

    基于樹莓pico的可編程游戲手柄設計

    方案介紹組件12x12x7.3mm 瞬時觸覺按鈕按鈕樹莓Pico通用 D1286464 OLED 顯示屏操縱桿模塊 PS210 歐姆電阻?組裝將樹莓
    發表于 12-26 15:10 ?0次下載

    樹莓Pico Flash驅動踩坑記錄

    樹莓 pico 帶有 2MB 的 Flash 資源,以下是我基于官方 Pico C/C++ SDK 對接 Flash 驅動時踩到的些坑和
    的頭像 發表于 10-20 11:44 ?1608次閱讀

    樹莓Pico文件系統應用:數據記錄器

    在前面的章節中,你直在使用樹莓 Pico 連接到樹莓或其他電腦。不過,與所有微控制器
    的頭像 發表于 10-24 10:51 ?1450次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b><b class='flag-5'>Pico</b>文件系統應用:數據記錄器

    樹莓單片機-Raspberry Pi Pico

    樹莓Pi Pico樹莓基金會在2021年1月份發布的款新的基于RP2040定制芯片的單片
    的頭像 發表于 10-31 17:07 ?1822次閱讀
    <b class='flag-5'>樹莓</b><b class='flag-5'>派</b>單片機-Raspberry Pi <b class='flag-5'>Pico</b>
    主站蜘蛛池模板: 亚洲国产精品久久又爽黄A片 | yin乱教师系列合集 yin荡体育课羞耻play双性 | 中文字幕在线永久 | 美女脱衣服搞鸡 | 高H短篇辣肉纯肉 | 国产成人高清在线观看播放 | 被强J高H纯肉公交车啊 | 亚洲 欧美 国产 综合 播放 | chinese学生gv video | 国产在线观看www鲁啊鲁免费 | 成人小视频在线观看 | 国产亚洲欧美ai在线看片 | zxfuli午夜福利在线 | 做a爱片的全过程 | 精品国产在天天线在线麻豆 | 丁香美女社区 | 成在线人免费视频 | 乱h好大噗嗤噗嗤烂了 | 欧美国产影院 | 久久精品热线免费 | 边吃胸边膜下床震免费版视频 | 久久成人a毛片免费观看网站 | 一本道在线综合久久88 | 日韩精品久久日日躁夜夜躁影视 | 俄罗斯xxxxxbbbbb | 狠狠色丁香婷婷久久综合五月 | 午夜十八岁禁 | 第一怡春院 | 亚洲精品乱码8久久久久久日本 | 亚洲AV久久无码精品热九九 | 狂野欧美性猛XXXX乱大交 | 国产午夜久久影院 | 伊人亚洲综合网色 | 中文字幕在线观看国产 | 亚洲a视频在线观看 | 99er久久国产精品在线 | 91麻豆精品一二三区在线 | 牛牛在线(正)精品视频 | 一区二区三区国产亚洲网站 | 亚洲国产五月综合网 | 7723日本高清完整版在线观看 |