您知道什麼是arduino嗎?您知道arduino可以做什麼嗎?今天讓我們認識一下arduino!
arduino是一個開源的電子原型平臺,方便,靈活,方便,方便。
包括硬體(各種型號的arduino板)和軟體(ArduinoIDE)。由歐洲開發團隊在冬季開發。其成員包括MassimoBanzi,DavidCuarTIelles,TomIgoe,GianlucaMarTIno,DavidMellis和NicholasZambetTI。
這是通過arduino點亮led的案例。
從arduino到臺式機連接線軟體。
安裝atmelstudio,其中將包含atmel的編譯器,並在pc端安裝valcommportdriver以列印信息到teraterm。
當然,您也可以下載一個arduinoide。arduinoide可以快速編程arduino,但是我更習慣於使用atmelstudio。
該軟體可以通過埠將代碼下載到arduino。
串擾通信軟體,putty或teraterm。
代碼編輯軟體,atom或任何可以編輯文本的軟體文檔。
arduino的cpuatmel328p晶片手冊,下載連結。打開arduino旅行項目介紹。
這個小項目主要帶您進入嵌入式開發領域。
編寫一個簡單的commandlineinterface來與板通信初步識別arduino硬體。
我們的核心是arduinouno開發板。下面的圖片是arduino的路線圖。我標記了它的幾個大塊,下面我將一一解釋。
voltageregulartor:其任務是為系統提供穩定的3.3v和5v電壓。藍色區域有兩個voltageregulartor,一個是lp2985,輸入5v,輸出3.3v;另一個是ncp1117,輸入最高20v,輸出5v。arduino有兩種電源,一種是usb電源。這時,僅從藍色區域左下角的usb vcc為板提供5v電壓,然後通過regulartor為板提供3.3v電壓。另一種電源是通過電源插座「在主板上的usb插座下方有一個圓形黑色電源插座」。該電源插座是中間的矩形區域,藍色區域。它的電壓可以高達20v,然後通過ncp1117變為5v電壓,然後通過lp2985變為3.3v電壓。在藍色區域出現usbvcc後,有一個值得注意的地方。連接到電晶體。電晶體上有一個比較器。比較器的正向輸入端連接到分壓電路,反向輸入端連接到3.3v。其目的是,如果從供電插座輸入的電壓小於5v,則使用usb的5v電壓,否則將使用電源插座的5v電壓。
USBControlchip:USB的控制晶片,買回來的Arduino中這個晶片的固件都是已經在裡面的,它的作用是把USB接口的東西轉成串行通信數據(在電路圖紅色的SerialComm部分)發送給CPU,還用把CPU從串行通信發出來的東西,傳換成USB信號發送給PC機。
maincpu:主cpu是atmel328p。8-bitcpu,由於arduino沒有外部serialflash或外部sdram,因此根據晶片手冊,共有32kb晶片上的programmingflash,並且可以在此flash中包含編譯的代碼。有2kb sram,一些內存信息,stack和heap,全局變化等,都放在ram中。
crystal:16mhz晶振。
led:led的輸入標記是sck,對應於atmel328p上的b5管腳. led連接到放大器,目的是電流不通過放大器,而僅通過電壓控制led,因此b5管腳可以用於其他目的。
serialcomm:埠通信埠,通過cpu上的usart向pc發送數據。
點亮arduinoled小燈創建項目。
選擇file-project-gccexecutableproject。
輸入項目名稱,請選擇atmel328p之後的晶片。
然後您需要配置avrdude,選擇tool--externaltool開始配置avrdude。
TItle:avrdudeprogrammer。
command:c:avrdudeavrdude. exe,請填寫通往avrdude的路徑。
Arguments:-F-V-carduino-pATMEGA328P-PCOM6-b115200-Uflash:w:"$(ProjectDir)Debug$(ItemFileName).hex":i裡面的COM6請從devicemanager中找出當前的commport.點亮LED燈
要點亮led燈,需要配置pb5gpio存儲設備。通過atmel328p的datasheet和arduino的電路圖,輸出高功率使led亮,而低功率則使led熄滅。ddrb|=(1<<PB5);;;配置pb5 datadirectionregisterportb|=(1<<PB5);;|讓pb5輸出高電平portb+=(1<<PB5);;.讓pb5輸出低電平埠通信。
當可以控制led開關時,可以解釋編譯器和avrdude代碼下載也可以說是正確的。這時,為了更好地進行debug程序,我們需要使埠通信正常工作,以便信息可以列印到pc端。
根據arduino的路線圖,我們需要讓紅色區域的serialcomm正常工作. usbcontrollerchip可以將數據從usb埠輸出到pc端。
atmel328p的datasheet,section24。USART的描述詳細。對於USART,必須首先配置波特率,然後需要配置一些USART傳輸模式,例如一次發送8bit或一次發送7bit,是否有stopbit等。
注意的是datasheet中的如何將波特率計算為存儲容量所需的值。計算公式與板的晶振頻率有關。具體在數據手冊的227頁中。
在傳輸過程中,它將不斷將要發送的數據寫入存儲容量中,然後atmel328p將通過兩個pin發送到usbcontrollerchip,然後usbcontrollerchip將其發送到pc端。//配置USARTUBRR0H=(uint8_t)(BAUDRATE_9600_UBRR>>8);//配置波特率UBRR0L=(uint8_t)BAUDRATE_9600_UBRR;UCSR0B=(1<1<1<< RXCIE0);//enable接收和發送數據UCSR0C=(3
=/*Waitforemptytransmitbuffer*/while!!(UCSR0A&(1
當確定arduino和pc可以正常通信時,我們可以開始編寫commandlineinterface。顧名思義,是通過pc端輸入指令,而arduino則是相應的動作。通常,大多數電子產品都有自己的cli用於與產品通信。在許多情況下,如果要開發新功能,則需要添加一個新的command,然後pc端的driver可以將此新的command發送到嵌入式設備,以便它可以執行新功能。
commandlineinterface原始碼,您可以輸入指示來打開或關閉arduino的led。
在實現commandlineinterface的過程中,有些有趣。
我使用circularbuffer來實現數據的接收和處理。有readindex和buildindex。使用buffer的目的是用戶輸入命令的速度與計算機處理的速度不同,因此我們需要buffer來平衡它們。例如,計算機需要很長時間才能處理某個命令,並且用戶在此命令之後連續輸入了多個其他命令。所有其他命令將放在此circularbuffer上,然後依次處理。
這個小project使用此volatile定義一個變量,即usart startcmdprocess,用於記錄當前receivebuffer中有多少命令。原因是我們在中斷期間將此變量添加到1。當編譯器編譯此代碼時,如果沒有volatile,編譯器將不知道變量何時添加1,因為中斷可能隨時發生。因此,主函數中有if(變量>0)。編譯器將永遠不會做出此判斷。編譯器將此判斷視為永久的true,因此此判斷將被編譯器視為永久的true。因此,添加volatile,強制編譯器在編譯中真正判斷變量的值,簡單地說,它不會優化主函數中的if(變量>0)。
輸入getledstatus,arduino返回ledoff。
輸入setledon,arduino點亮led。
輸入getledstatus,arduino返回ledon。
輸入setledoff,arduino關閉led。