Arduino在嵌入式開發中應用案例之arduino點亮LED

2020-11-30 電子發燒友

    你了解什麼是Arduino嗎?你知道Arduino能做些什麼嗎?今天就讓我們來認識一下Arduino!

    Arduino是一款便捷靈活、方便上手的開源電子原型平臺。

    包含硬體(各種型號的Arduino板)和軟體(Arduino IDE)。由一個歐洲開發團隊於2005年冬季開發。其成員包括Massimo Banzi、David CuarTIelles、Tom Igoe、Gianluca MarTIno、David Mellis和Nicholas ZambetTI等。

    本分享一個通過arduino點亮LED的案例。

需要的工具

硬體設備

  • Arduino Uno開發板

  • 臺式機

  • Arduino到臺式機連接線

軟體

文檔

開啟Arduino之旅

項目介紹

    這個小項目主要是帶大家入門嵌入式開發領域。

初識Arduino硬體

    我們的核心是Arduino Uno開發板,下面這張圖是Arduino的電路圖。我把它的幾個大塊標記出來,下面我一一來說明下。

  • Voltage Regulator: 它的任務是為系統提供穩定的3.3V和5V的電壓。在藍色區域有兩個voltage regulator,一個是LP2985,輸入5V,輸出3.3V;一個是NCP1117,輸入最高20V,輸出5V。Arduino的供電有兩種,一種是USB供電,這時候只從藍色區域左下角的USBVCC為板子提供5V電壓,然後通過一個regulator為板子提供3.3V電壓。另一種供電是通過供電插口(在板子上USB插口的下方有個圓形的黑色電源插口),這個供電插口是藍色區域中靠中間的長方形區域,它的電壓可以最高到20V,然後通過NCP1117變成5V電壓,然後再通過LP2985變成3.3V電壓。這裡面有個值得注意的地方是藍色區域的USBVCC出來後連接了一個三極體,三極體上面有個比較器,比較器的正向輸入端連接了一個分壓電路,反向輸入端連接著3.3V。它的目的是如果從供電插口輸入的電壓不足5V,那就用USB的5V電壓,否則就用供電插口的5V電壓。

  • USB Control chip: USB的控制晶片,買回來的Arduino中這個晶片的固件都是已經在裡面的,它的作用是把USB接口的東西轉成串行通信數據(在電路圖紅色的Serial Comm部分)發送給CPU,還用把CPU從串行通信發出來的東西,傳換成USB信號發送給PC機。

  • Main CPU: 主CPU是Atmel328P。8-bit CPU, 因為Arduino沒有外接的serial flash 或者外接的SDRAM,所以根據晶片手冊,一共有32KB 晶片上的programming flash,編譯的代碼可以放在這個flash裡面。有2KB的SRAM,一些寄存器的信息,stack和heap,全局變量等都放在RAM裡。

  • Crystal: 16MHz的晶振

  • LED: LED的輸入標記是SCK,對應連接的是atmel328P上的B5管腳。LED連接了一個放大器,目的是電流不通過放大器,只是通過電壓來控制LED,這樣的話B5管腳可以做其他用途。

  • Serial Comm: 串口通信埠,在CPU上通過usart給PC端發送數據。

點亮Arduino LED小燈

創建項目

點亮LED燈

DDRB |= (1 << PB5); //配置PB5的data direction registerPORTB |= (1 << PB5); //使PB5輸出高電平PORTB &= ~(1 << PB5); //使PB5輸出低電平

串口通信

  • 當能夠控制LED的開關,這時候可以說明編譯器和Avrdude的代碼下載也沒問題。這時候為了我們更好地debug程序,我們需要讓串口通信正常工作,這樣可以把信息列印到PC端。

  • 根據Arduino電路圖,我們需要讓紅色區域的serial comm正常工作。USB controller chip可以把數據從USB埠輸出到PC端。

  • 在atmel328P的data sheet, section 24。有詳細的USART的描述,對於USART來說,首先肯定是要配置波特率了,然後需要配置USART的一些傳輸模式,比如一次發8 bit 或者一次發7 bit,有沒有stop bit等等。

  • 在傳輸過程,就是不斷的把想要發送的數據寫到寄存器裡,然後Atmel328P會通過兩個pin發送到USB controller chip,然後USB controller chip再發送給PC端。

//配置USARTUBRR0H = (uint8_t)(BAUDRATE_9600_UBRR >> 8); // 配置波特率UBRR0L = (uint8_t)BAUDRATE_9600_UBRR;UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1 << RXCIE0); //enable接收和發送數據 UCSR0C = (3<<UCSZ00); //配置發送模式,8 bit 數據 1 bit stop bit

//發送數據void USART_Transmit(uint8_t * Data, uint16_t Length){ uint16_t i; for (i = 0; i < Length; i++) { /* Wait for empty transmit buffer */ while (!( UCSR0A & (1<<UDRE0))); /* Put data into buffer, sends the data */ UDR0 = Data[i]; }}

//接收數據, 使用中斷接收數據ISR(USART_RX_vect){ uint8_t ReceivedData; ReceivedData = UDR0;}

Command Line Interface

  • 當確定Arduino和PC端可以正常通信,我們就可以開始寫command line interface。顧名思義,是通過PC端輸入指令,Arduino做相應的動作。一般大部分的電子產品都有自己的cli用來和產品通信,很多情況如果要開發新的功能,就增加一條新的command,然後PC端的driver可以發送這個新的command給嵌入式設備,這樣它就可以執行新的功能了。

  • command line interface源碼, 裡面可以輸入指令使Arduino的LED開啟或者關閉。

  • 在command line interface的實現過程中,有些蠻有趣的地方。

    • 我用了一個circular buffer來實現數據的接收和處理,有一個read index和一個write index,使用buffer的目的就在於用戶輸入命令的速度要和計算機處理的速度不同,所以我們需要一個buffer來平衡它們。比如計算機要處理某個命令需要很久,而用戶在這個命令後又連續輸入了好幾個其他的命令,所有其他的命令都會放到這個circular buffer然後依次處理。

    • 這個小project使用了這個volatile來定義一個變量, USART_StartCmdProcess,用來記錄當前在receive buffer中有多少個命令。原因是我們是在中斷中把這個變量自加1,當編譯器編譯這段代碼的時候,如果沒有volatile的話,編譯器並不知道什麼時候這個變量什麼時候會加1,因為中斷在任何時候都可能發生。因此在主函數裡面有if (變量 > 0),這個判斷會被編譯器認為永遠不會發生(編譯器將這個判斷為永遠false)。所以加了volatile就強制編譯器在編譯去真正判斷地判斷變量的值,簡單地說是不會優化主函數裡面地if (變量 > 0)。

  • 輸入GetLedStatus, Arduino返回LED OFF

  • 輸入SetLed ON,Arduino點亮LED

  • 輸入GetLedStatus, Arduino返回LED ON

  • 輸入SetLed OFF, Arduino關閉LED

相關焦點

  • 大牛輕鬆帶你玩轉Arduino智能硬體三-arduino入門:打造LED流水燈
    (三)arduino入門:打造LED流水燈  學完上節課的內容,學會了如何控制led燈之後,我相信這幾科的內容一會非常容易的。這節課是控制多個led燈。  一、準備材料arduino uno開發板一塊led燈6個(顏色隨意)杜邦線若干usb數據線  二、編程環境Arduino IED  三、原理講解控制單個LED燈是只需要引腳給高低電平,就可以控制燈的亮滅流水燈:多個led燈需要使用多個引腳控制,所以這裡使用2到7號引腳。分別控制燈的亮滅,就可以實現流水燈的效果。
  • 用Arduino開發物聯網設備之初識Arduino
    最近幾年,物聯網發展的非常迅速,周圍很多設備基本上都聯網了,越來越多的小夥伴不滿足大企業大公司提供的固定的物聯網設備,大家都想嘗試開發出屬於自己的設備。那麼最簡單、應用範圍最廣的開發方式當然是Arduino,那麼什麼是Arduino呢?Arduino到底是什麼?
  • 大牛輕鬆帶你玩轉Arduino智能硬體(二)arduino入門:點亮一個LED
    (二)arduino入門:點亮一個LED我為大家展示如何在Arduino開發板上點亮一個LED。這個是Arduino最基礎的項目,我們將使用Arduino在每次閃爍之間延遲1秒鐘打開和關閉。這可能看起來很容易,但實際上編寫程序最重要的想法,步驟1:要求在這個項目中,需要準備以下材料:1. 1x - 麵包板2. 1x – USB數據線(連接arduino板和電腦,通常配有arduino板)3. 2x – 公對公杜邦線,4. 1x - Arduino板(我使用UNO,但你也可以使用任何其他版本
  • Arduino教程5:製作流水燈
    在這一篇文章中新朋將帶大家做一個簡單而且又有趣好玩的東西——流水燈,在製作的過程中我們將學習如何使用Arduino進行數字輸出(開關LED燈)並了解如何通過程序實現多個LED燈有順序的點亮與熄滅。
  • Arduino為什麼這麼火
    正文:這一兩年間,arduino作為一個能夠快速表現設計想法的工具,日漸火了起來,愛好者們自發性、非官方組織起來的論壇社區日漸豐富和活躍,近一兩年小夥伴們的作品集中也越來越多地涉及arduino相關的項目案例,那麼我們就簡單地來看一下arduino究竟好在哪裡。
  • arduino項目:發光逗趣口罩
    Arduino做的各種應用廣泛被開源硬體愛好者喜歡。
  • 用Arduino點亮OLED模塊學習筆記
    說實話,網上關於7腳OLED與arduino相連的教程比較亂,查找了一些資料,自我總結了一下,這樣我以後搞開發就方便了。我的OLED模塊採用的是SSD1306控制晶片,程序裡最核心的一句:U8GLIB_SSD1306_128X32 u8g(10, 9, 12, 11, 13);所以我總結函數裡面的順序應該是(D0,D1,CS,DC,RES),導入庫文件自帶的示例程序,效果如下圖:接線方法:OLED中的GND引腳與arduino 的GND連接;VCC與arduino的5V連接;D0 為時鐘線
  • 二、在arduino中搭建ESP32開發環境以及程序下載
    目錄arduino編譯器下載arduino編譯器安裝添加ESP32開發環境編輯器界面程序燒錄arduino編譯器燒錄flash_download_tool程序下載>這裡我們開始學習使用ESP32使用arduino IDE來編寫ESP32的程序,本篇文章主要開始在arduino的編譯器中搭建ESP32的開發環境,關於arduino IDE個人認為是一個非常成熟的編譯器,雖然也有很多地方用起來不如KEIL ,IAR一類的軟體方便,軟體安裝包可以在arduino社區安裝下載,官網:https://www.arduino.cn/,進入之後點擊下方圖示的軟體下載
  • Arduino_集合Arduino教程、Arduino IDE及設計應用的技術專題
    在線等挺急的 詳細點 回答28# eepwlover:Arduino開發工具(arduino IDE) 1.0.5 綠色免費版
  • arduino從零開始(4)PWM與呼吸燈
    是在數字電路中 達到 模擬輸出效果的一種手段。即:使用數字控制產生佔空比不同的方波(一個不停在開與關之間切換的信號)來控制模擬輸出。我們要在數字電路中輸出模擬信號,就可以使用PWM技術實現。在arduino中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。
  • LABVIEW+Arduino
    而arduino可以模擬這些操作,再與LABVIEW相結合,可以在同一程序能實現切換頻點、通道等的操作,並根據測試需要將所需要的測試數據記錄在相應的表格內。一、什麼是arduinoArduino是一款便捷靈活、方便上手的開源電子原型平臺。包含硬體(各種型號的Arduino板)和軟體(Arduino IDE)。由一個歐洲開發團隊於2005年冬季開發。
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • 硬體創業應該從arduino的成功中學到什麼
    本文引用了網絡大神喻時耕宇的部分觀點,在此向其真知灼見表示敬意傳統機器人退出歷史舞臺,在模塊化機器人誕生那一刻就已經註定(儘管由於人類認知的慣性力量,在沒有實際案例支撐前,要改變之前的保守印象是非常之難的)。
  • arduino:飛鏢數據,迷宮遊戲,LED冰球……
    arduino一個科學,兩個遊戲資訊1.無人機在難以到達的地方發射Sense飛鏢以收集數據[1]
  • arduino 從零開始(2)探索arduino開發板和arduino IDE
    1、你將會探索arduino開發板2、你將會打開並上傳程序到arduino 板3、你將會學到arduino程序的基本框架和基本函數4、你將會自己編寫並上傳arduino程序一、arduino 板簡單來說,arduino(硬體)就是一個可以用來根據你的要求進行編程從而可以和很多輸入輸出設備進行交互的一個微型電腦系統。
  • Python:與Arduino進行交互
    接下來我們展示一段通過串口輸入「Y」替代按鈕來點亮LED燈的代碼。所以,我們的python代碼應該變成如下的樣子,並且我們已能夠通過串口控制led燈。參照Arduino – Arduino的官方網站,你可以找到最詳盡的Arduino編程知識(程序案例,參考資料,硬體信息)Arduino tutorial – 一個入門級的Arduino編程教程。
  • 怎樣為arduino藍牙模塊HC-06製作一個Android應用程式
    打開APP 怎樣為arduino藍牙模塊HC-06製作一個Android應用程式 發表於 2019-08-08 10:32:09
  • RS推出新開放源碼Arduino入門套件
    、學生和愛好者開發的Arduino低成本、開源電子產品原型板。該套件由電機、伺服電機和驅動器組成,同時為那些希望將機電一體化應用到設計中的用戶提供特定優勢。  Arduino Uno基於Atmel ATmega328 32位微控制器構建,具有32KB的快閃記憶體、2KB的SRAM和1KB的EEPROM。
  • Arduino最小系統設計
    Arduino在電子愛好者和設計師中的影響力極其深遠,可能都不亞於早些年代個人電腦所帶來的影響(例如家庭計算機俱樂部等等)。市場上的Arduino數以百萬計,據估計,如果把衍生產品中的Arduino也算在內就更多了。預測在接下來的 5到10年裡,學校將會使用Arduino來教授電子學和交互式系統原理。
  • 如何用Matlab連接控制Arduino:GUI界面製作與電機控制
    MATLAB是用於算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和交互式環境。而Arduino開發板是一種越來越受到歡迎的開源硬體。  一個是什麼都能算的軟體,一個是最火爆的開源硬體,兩者結合能碰撞出什麼樣的火花呢?