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

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

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

3天內不再提示

使用樹莓派Pico實現交通燈控制程序

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

微控制器MCU)幾乎存在于你日常使用的所有電子產品中,例如交通燈。交通燈在控制器的作用下,控制器確保整個交通網絡保持順暢。

雖然構建大型交通管理系統是一個非常高級的項目,但構建由樹莓派 Pico 驅動的微型模擬器本身就很簡單。通過這個項目,你將看到如何控制多個 LED,設置不同的時 間,以及如何在程序的其余部分繼續運行時監控一個按鈕輸入,使用一種稱為線程的技術。

搭建這個項目,你需要:
– 樹莓派 Pico
– 面包板
– 紅色、黃色、綠色的 LED
– 330Ω 電阻 3 個
– 一個有源蜂鳴器
– 一組公對公跳線
– microUSB 數據線

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

簡易的交通燈

首先用面包板搭建一個簡單的紅綠燈系統電路,如圖所示。拿起你的紅色LED燈,把紅色 LED 插到面包板上,讓它跨過中間的分割線。使用一個 330Ω 電阻和跳線串連到 Pico 上。其中,LED 較長的腳和電阻連接,較短的腳和 Pico 的 GND 引腳通過跳線連通。

黃色和綠色的 LED 也類似處理,但使用的 Pico 引腳不同,參考圖片所示。

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

啟動 Thonny。創建一個新的程序,然后開始導入 machine 庫,以便你可以控制你的 GPIO 引腳:

import machine

你還需要導入 utime 庫,以便你可以在亮燈與滅燈之間添加延遲:

import utime

在你控制你 Pico 的 GPIO 口的任何程序里,在使用前都你將需要對它進行設置:

led_red = machine.Pin(15, machine.Pin.OUT)
led_amber = machine.Pin(14, machine.Pin.OUT)
led_green = machine.Pin(13, machine.Pin.OUT)

這些線將 GP15、GP14 和 GP13 引腳設置為輸出,每個引腳都有一個述性的名稱,以便于代碼通俗易懂。

真正的紅綠燈不會一閃而過然后停下來,它們會不停地開著,即使那里不塞車,但為了讓你 的程序實現類似的效果,你需要建立一個無限循環:

while True:

下面的每一行都需要縮進四個空格,這樣 MicroPython 就知道它們是循環的一部分:

led_red.value(1)
utime.sleep(5)
led_amber.value(1)
utime.sleep(2)
led_red.value(0)
led_amber.value(0)
led_green.value(1)
utime.sleep(5)
led_green.value(0)
led_amber.value(1)
utime.sleep(5)
led_amber.value(0)

單擊 Run 并將程序保存到 Pico 中,文件名為 Traffic_Lights.py。觀察 LED,首先紅色的 LED 燈會亮起來,告訴交通停止;接下來,黃色 LED 將會亮起,警告司機信號燈即將改變;接下來,兩個 LED 都關閉,綠色 LED 亮起,讓車輛知道它可以通過;然后綠色的 LED 熄滅,黃色的 LED 亮起來,警告司機信號燈又要變了;最后,黃色 LED 熄滅,回路從開始重新啟動,紅色 LED 亮起。

這個顯示狀態會一直循環直到你按下停止按鈕,因為它形成了一個無限循環。它是基于現實 世界中英國交通控制系統中使用的交通燈模式。

然而,真正的紅綠燈不僅僅是道路車輛的紅綠燈,它們也在那里保護行人,讓他們有機會安全 地穿過繁忙的道路。在英國,最常見的類型這些燈被稱為行人操作用戶友好型智能交叉口。行人要過馬路的時候手動按下按鈕,蜂鳴器發出提示讓行人過馬路。

要實現這個功能,需要兩樣東西:一個按鈕開關,這樣行人就可以要求車燈讓他們過馬路;一個蜂鳴器,讓行人知道什么時候輪到他們穿越馬路。將這些連接到你的面包板,如圖所示。

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

開關通過面包板連接 Pico 的 GP16 和 3V3 上,蜂鳴器則連接 GP12 和 GND 上。

如果你再次運行你的程序,你會發現按鈕和蜂鳴器沒有什么反應。那是因為你還沒有告訴你的 程序如何使用它們。在 Thonny 中,請返回編輯控制 LED 的行,并在下面添加以下兩條新行:

button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
buzzer = machine.Pin(12, machine.Pin.OUT)

程序將引腳 GP16 上的按鈕設置為輸入模式,控制蜂鳴器引腳的引腳 GP12 上的設置為輸出。請記住,Pico 有內置的可編程電阻的輸入,我們為本書中的項目設置為下拉模式。這 意味著引腳的電壓被拉到 0V(它的邏輯電平是0),除非它連接到 3.3V 電源(在這種情況下,它 的邏輯電平將是1,直到斷開)。

接下來,你需要一種方法來讓程序不斷監控按鈕的價值。以前,你的所有程序都通過一系列說 明一步一步地工作,一次只做一件事。你的紅綠燈程序同樣,當它運行時,MicroPython 會一步一步地瀏覽你的指示,打開和關閉 LED。

對于一套基本的紅綠燈,這就足夠了。不過,對于設置了行人手動按鈕的交叉口,你的程序需要能夠記錄按鈕是否以不中斷紅綠燈的方式按下。要做到這一點,你需要使用到一個新的庫:_thread。返回到程序的開始部分,在那里你導入 machine 和 utime 庫,并導入 _thread 庫:

import _thread

線程實際上是一個小的、部分獨立的程序。你可以將前面編寫的控制燈的循環視為程序的主線程,并使用 _thread 庫創建一個同時運行的額外線程。

可視化線程的簡單方法是將每個線程都想象成廚房里的獨立人員,當廚師準備主菜時,其 他人正在制作醬汁。目前,你的程序只有一個線程:控制紅綠燈的線程。然而,為 Pico 提供算力的 RP2040 微控制器有兩個處理核心,意思是,就像廚房中的廚師和副廚師一樣,你可以同時運行兩個線程來完成更多的工作。

在制作另一個線程之前,你需要一種方法讓新線程將信息傳回主線程,并且你可以使用全局 變量做到這一點。在此之前,你一直在處理的變量稱為局部變量,并且僅在程序的一個部分工作:一個全局變量在任何地方都有效,這意味著一個線程可以更改值,另一個線程可以檢查它是否已更改。

首先,你需要創建一個全局變量。在 buzzer = 這行下面,添加以下內容:

global button_pressed
button_pressed = False

這將把 button_pressed 設置為一個全局變量,并給它一個默認值 False,意思是當程序啟動時,按鈕還沒有被按下。下一步是定義線程,通過添加下面的行讓程序更具有可讀性:

def button_reader_thread():
global button_pressed
while True:
if button.value() == 1:
button_pressed = True

添加的第一行定義了線程,并給它一個名稱來述它的用途:讀取按鈕輸入的線程。就像在編寫 循環時,MicroPython 需要將線程中包含的所有內容縮進 4 個空格,這樣它就知道線程從哪里開始和結束。

下一行讓 MicroPython 知道你將更改全局 button_pressed 變量的值。如果你只想檢查該值,則不需要這一行—但是沒有這一行,你就不能對變量進行任何更改。

接下來,你設置了一個新的循環,這意味著接下來需要一個新的四空格縮進,總共是八個縮進,這樣 MicroPython 就知道循環是線程的一部分,下面的代碼也是循環的一部分。這個嵌套代碼在多個水平 MicroPython 縮進是很常見的。

下一行是一個條件語句,用于檢查按鈕的值是否為 1。因為 Pico 使用一個內部下拉電 阻,當按鈕沒有被按下時,讀取的值是 0,表示在條件下的代碼永遠不會運行。只有當按鈕被按下時,線程的最后一行才會運行:這一行將 button_pressed 變量設置為 True,讓程序的其余部分知道按鈕已被按下。

你可能注意到,在線程中沒有任何東西可以將 button_pressed 變量重置回當按鈕被按下后 釋放時為 False。這是有原因的,雖然你可以在交通燈周期的任何時候按下過馬路的按鈕,但它只有在交通燈變紅、你可以安全過馬路時才會生效。你的新線程需要做的就是在按鈕被按下時改變變量;當行人安全過馬路時,主線程會將其重置為 False。

定義一個線程并不會使它自動運行,可以在程序中的任何地方啟動一個線程,并且需要明確地告訴 _thread 庫何時啟動線程。與運行普通代碼不同,運行線程不會停止程序的其余部分,當線程啟動時,MicroPython 將繼續運行程序的下一行。

在你的線程下面新建一行,刪除所有 Thonny 為你自動添加的縮進,如下所示:

_thread.start_new_thread(button_reader_thread, ())

這告訴 _thread 庫啟動前面定義的線程。此時,線程將開始運行,并迅速進入循環:每秒檢查按鈕數千次,看它是否被按下。與此同時,主線程將繼續執行程序的主要部分。

現在點擊 Run 按鈕。你會看到交通燈和以前一樣,沒有延遲或停頓。但是,如果你按下按鈕,什么也不會發生,因為你還沒有添加代碼來實際響應按鈕。

轉到你的主循環的開始,在 True: 的正下方,添加以下代碼:記住要注意嵌套縮進:

if button_pressed == True:
  led_red.value(1)
  for i in range(10):
    buzzer.value(1)
    utime.sleep(0.2)
    buzzer.value(0)
    utime.sleep(0.2)
  global button_pressed
  button_pressed = False

這段代碼檢查 button_pressed 全局變量,以查看自上次循環運行以來,按鈕開關是否在任何時候被按下。如果有,就像你之前的按鈕閱讀線程報告的那樣,它開始運行一段代碼,首先打開紅色 LED 燈來阻止交通,然后蜂鳴器響十次——讓行人知道該過馬路了。

最后,最后兩行將 button_pressed 變量重置為 False,因此下次循環運行時,除非再次按下按鈕,否則不會觸發行人過馬路代碼。你將看到,在條件語句中不需要使用 global button_pressed 來檢查變量的狀態;只有當你想要更改變量并使該更改影響程序的其他部 分時,才需要使用它。

最終程序如下:

import machine
import utime
import _thread


led_red = machine.Pin(15, machine.Pin.OUT)
led_amber = machine.Pin(14, machine.Pin.OUT)
led_green = machine.Pin(13, machine.Pin.OUT)
button = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
buzzer = machine.Pin(12, machine.Pin.OUT)


global button_pressed
button_pressed = False


def button_reader_thread():
  global button_pressed
  while True:
    if button.value() == 1:
      button_pressed = True


_thread.start_new_thread(button_reader_thread, ())


while True:
  if button_pressed == True:
    led_red.value(1)
    for i in range(10):
      buzzer.value(1)
      utime.sleep(0.2)
      buzzer.value(0)
      utime.sleep(0.2)


    global button_pressed
    button_pressed = False


led_red.value(1)
utime.sleep(5)
led_amber.value(1)
utime.sleep(2)
led_red.value(0)
led_amber.value(0)
led_green.value(1)
utime.sleep(5)
led_green.value(0)
led_amber.value(1)
utime.sleep(5)
led_amber.value(0)

點擊 Run 圖標。首先,程序將正常運行,交通燈將按照通常的模式亮和關。按下按鈕開關:如果程序當前在它的循環過程中,在到達終點并再次循環之前不會發生任何事情,這時紅燈會變亮,蜂鳴器會提示你可以在道路上安全通過了。

過馬路的時候按下按鈕,紅燈保持點亮,蜂鳴器響 10 次。之后蜂鳴器不再響了,紅燈仍然亮著,所以任何在蜂鳴器發出時開始過馬路的人 都有時間在車輛允許通行之前到達另一邊。

恭喜你!你已經建立了你自己的海雀交叉口!

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

    關注

    48

    文章

    7542

    瀏覽量

    151316
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17123

    瀏覽量

    350986
  • 交通燈
    +關注

    關注

    13

    文章

    324

    瀏覽量

    39750
  • 樹莓派
    +關注

    關注

    116

    文章

    1706

    瀏覽量

    105607
  • 控制程序
    +關注

    關注

    1

    文章

    51

    瀏覽量

    9026

原文標題:樹莓派 Pico 實現交通燈控制程序

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

收藏 人收藏

    評論

    相關推薦

    基于labview的交通燈程序下載

    代碼代碼版本控制:-功能說明:一個自己寫的交通燈控制程序。寫這個程序只是為了練習一下邏輯處理能力。其中使用了隊列和狀態機。目的是以最簡潔的代碼,最少的CPU占用,完成一個邏輯處理,如果
    發表于 11-14 11:01

    基于51的交通燈控制程序

    用51完成東西走向的一組交通燈控制,用數碼管顯示時間
    發表于 01-11 07:57

    樹莓遙控視頻小車的方法

    樹莓遙控視頻小車實現功能硬件材料控制程序PS2手柄驅動程序運動控制程序源碼鏈接擴展功能
    發表于 02-08 06:02

    基于FPGA的交通燈控制實現

    傳統交通燈控制器多數由單片機或PLC 實現。本論文介紹一種用FPGA 實現交通燈控制器的設計方法
    發表于 06-12 11:12 ?90次下載

    交通信號燈控制程序設計與調試

    交通信號燈控制程序設計與調試 定時指令的使用順序控制的原理PLC在人們實際的生活中,應用還是比較廣泛的,而與我們的生命安全息息相關的交通燈,也可以
    發表于 06-14 10:27 ?0次下載

    紅外遙控電路及控制程序

    紅外遙控電路及控制程序
    發表于 03-11 09:41 ?199次下載

    交通燈控制實驗

    交通燈控制實驗一)實驗目的通過并行接口8255實現十字路口交通燈的模擬控制,進一步掌握對并行口的
    發表于 03-25 11:03 ?7811次閱讀
    <b class='flag-5'>交通燈</b><b class='flag-5'>控制</b>實驗

    交通燈控制程序設計實驗

    實驗  交通燈控制程序設計實驗 一 、 實驗目的1、 掌握S系列PLC的硬件組成和軟件結構。2、 進一步熟悉S7-200系列PLC
    發表于 05-17 10:15 ?3560次閱讀

    交通信號燈控制_匯編

    匯編編寫的交通燈控制程序,適用于點片機的設計
    發表于 01-07 16:35 ?14次下載

    LED模擬交通燈

    課程設計LED模擬交通燈,通過51單片機控制實現交通燈的功能。
    發表于 05-13 10:17 ?18次下載

    PLC控制LED數碼顯示控制程序

    PLC控制LED數碼顯示控制程序,初次來到此地,請多關照。
    發表于 05-19 14:31 ?0次下載

    交通燈程序設計 交通燈protues仿真程序基于51單片機交通燈

    交通燈程序設計 交通燈protues仿真程序基于51單片機交通燈仿真
    發表于 01-14 22:32 ?359次下載

    如何使用51單片機進行簡單的交通燈控制程序資料說明

    本文檔的主要內容詳細介紹的是如何使用51單片機進行簡單的交通燈控制程序資料說明。
    發表于 05-30 17:55 ?2次下載
    如何使用51單片機進行簡單的<b class='flag-5'>交通燈</b><b class='flag-5'>控制程序</b>資料說明

    51單片機上實現交通燈程序

    這是我前幾天無聊自己寫的交通燈程序,在51單片機上實現的。基本的定時的交通燈轉換是實現了,根據時間來改變
    發表于 07-15 17:34 ?1.1w次閱讀

    單片機交通燈程序設計中斷系統

    隨著社會的發展,交通問題逐漸突出,特別是城市交通問題愈加嚴重。為了更好地管理和調控交通,提高交通流暢度和安全性,交通燈系統成為了城市
    的頭像 發表于 01-24 16:16 ?1095次閱讀
    主站蜘蛛池模板: 国产精品久久久久久日本| 月夜直播免费观看全集| 精品一区二区三区高清免费观看| 一起洗澡的老师免费播放| 免费国产足恋网站| 国产99久久久国产精品成人| 亚洲精品AV中文字幕在线| 久久中文字幕免费高清| 超碰97 总站 中文字幕| 性VIDEOSTV另类极品| 狼好色有你好看| 大乳牛奶女magnet| 亚洲精品一区二区在线看片| 蜜桃成人在线| 国产成人亚洲精品午夜国产馆| 野花4在线观看| 青青草原成人| 国产真实女人一级毛片| 91久久精品国产亚洲| 叔叔 电影完整版免费观看韩国| 精品一区二区三区免费毛片| jizz老师| 亚洲日韩中文字幕区| 欧美日韩一区不卡在线观看| 国产亚洲精品首页在线播放 | 国产精品欧美亚洲| 中文字幕乱码在线人视频 | 麻豆国产成人AV在线| 国产www视频| 1000视频在线播放| 无码人妻丰满熟妇区五十路久久| 老熟人老女人国产老太| 国产成人高清在线观看播放 | 亚洲看片无码免费视频| 欧美精品九九99久久在观看| 国产亚洲精品品视频在线| ewp系列虐杀在线视频| 亚洲色欲色欲WWW在线成人网| 欧洲美女人 一级毛片| 精品国产一区二区三区久久影院 | 和老外3p爽粗大免费视频|