概述
有幾種編程微控制器的方法。有些方法比其他方法困難,這通常取決于人們對(duì)編程基礎(chǔ)的熟悉程度。
本指南主要供Arduino開發(fā)人員通過演示程序的使用來學(xué)習(xí)使用CircuitPython的來龍去脈。兩種語言的代碼。這可能是對(duì)人們熟悉CircuitPython技能的參考。
同樣有效的可能是從未使用過Arduino的Python或CircuitPython程序員。顯示Arduino用于各種用途的代碼可能有助于使自己更適應(yīng)Arduino環(huán)境。
來源:https://www.xkcd.com/303/(CC BY-NC 2.5)
解釋與編譯
Arduino從大量使用中的工具中獲取了很多東西數(shù)十年。這包括已編譯代碼的概念。代碼是在沒有調(diào)試的情況下在文本編輯器類型的環(huán)境中編寫的。然后,在被命令時(shí),將其饋送到一系列程序,這些程序?qū)@取代碼,最后將其從C或C ++編譯為微控制器的機(jī)器語言。在市場(chǎng)上有各種各樣的微控制器,機(jī)器代碼是該代碼和處理器所獨(dú)有的。
如果需要在Arduino中更改代碼,則必須編輯文本代碼并通過編譯過程將其提交回去。 。在每次發(fā)生的編譯和加載過程中,進(jìn)行更改,修復(fù)語法錯(cuò)誤,“插入”最佳值可能會(huì)花費(fèi)大量時(shí)間。
Python通常和CircuitPython特別是解釋的。直到必須將代碼轉(zhuǎn)換為機(jī)器代碼。這有很多優(yōu)點(diǎn)。該代碼可以在運(yùn)行時(shí)給出錯(cuò)誤消息。隨后的任何更改都不需要重新編譯。加載代碼就像將代碼文本文件復(fù)制到閃存驅(qū)動(dòng)器一樣簡(jiǎn)單。 CircuitPython程序開發(fā)通常只是Arduino程序所需時(shí)間的一小部分。該代碼對(duì)于其他微控制器也具有高度的可移植性。
解釋的代碼的缺點(diǎn)是速度。將代碼轉(zhuǎn)換為機(jī)器代碼是即時(shí)進(jìn)行的,因此需要時(shí)間。解釋器還使用微控制器上的RAM和Flash,而不是等效的Arduino用戶代碼和庫。
材料:MS Word 2010剪貼畫
Reality
現(xiàn)代微控制器的速度和存儲(chǔ)容量不斷提高,其價(jià)格通常與較舊的微控制器相似或更低(制造商可能希望在某個(gè)時(shí)候停產(chǎn))。在現(xiàn)代芯片中,在微控制器上使用Python不會(huì)帶來速度上的損失。 Python的靈活性以及在學(xué)校中教授的靈活性的優(yōu)勢(shì)使Python成為人們關(guān)注的焦點(diǎn)。
在這個(gè)時(shí)代,提供幫助將Arduino編碼器遷移到CircuitPython的工具似乎特別合適,因?yàn)檫@無疑是行業(yè)發(fā)展的方向
您可能會(huì)很慢,但仍然會(huì)贏。而且烏龜?shù)膲勖荛L。
計(jì)算機(jī)Python
那Linux板呢?
Arduino代碼通常不能在Raspberry Pi,BeagleBone等小型Linux板上運(yùn)行。為什么?
Linux是一個(gè)完整的操作系統(tǒng),它可以一次運(yùn)行許多東西。 Arduino代碼必須學(xué)會(huì)共享資源,而不要使用整個(gè)處理器,尤其是在無限循環(huán)中。也許有一天會(huì)添加此功能,但現(xiàn)在不可用。
Python在Linux板上非常流行。 CircuitPython可以通過Adafruit提供的名為Blinka的幫助程序?qū)釉谛⌒蚅inux板上運(yùn)行。這提供了CircuitPython在微控制器上可以做什么以及如何在Linux上運(yùn)行之間所需的映射。它們旨在共同發(fā)揮作用(只要您的代碼也寫得很好。
因此,對(duì)于基于Linux的小型單板計(jì)算機(jī),CircuitPython是目前的唯一選擇。但這是一個(gè)不錯(cuò)的選擇。
在本指南中,我們將不介紹在Linux上通過CircuitPython使用硬件的詳細(xì)信息。在此處查看有關(guān)Blinka的指南
簡(jiǎn)單的代碼結(jié)構(gòu)
Arduino strong》
上圖顯示了最簡(jiǎn)單的Arduino程序,即從菜單中選擇文件-》 新建會(huì)得到的結(jié)果。有兩個(gè)強(qiáng)制性函數(shù)調(diào)用:
setup-程序啟動(dòng)時(shí)將執(zhí)行一次的代碼
loop-連續(xù)的代碼一遍又一遍地循環(huán)運(yùn)行
這兩個(gè)函數(shù)都不做任何事情。有些草圖僅在setup中執(zhí)行所有操作,而有些程序根本不使用setup而僅使用loop。但是,即使它們是空的(如上所示),也必須同時(shí)定義兩者。
CircuitPython
CircuitPython并沒有限制像Arduino setup函數(shù)這樣的開始執(zhí)行的代碼重復(fù)的主要代碼,例如Arduino loop函數(shù)。
也就是說,許多CircuitPython程序的結(jié)構(gòu)與Arduino素描程序的結(jié)構(gòu)非常相似。
一個(gè)簡(jiǎn)單的示例。程序?qū)⒆兞縱ar定義為值5,然后一遍又一遍地打印該值,類似于舊的BASIC Hello World程序。在Arduino中,您可以這樣編寫:
程序會(huì)添加一些代碼以打開串行連接并輸出輸出。
等效的CircuitPython程序?yàn)椋?/p>
任何setup類型語句放在程序頂部附近。
可以在Python中通過loop循環(huán)將條件設(shè)置為while,因此它永遠(yuǎn)不會(huì)退出True。
串行監(jiān)視器已“嵌入”到CircuitPython中,用戶無需設(shè)置任何內(nèi)容即可使用它,并且將對(duì)此進(jìn)行詳細(xì)討論。
沒有任何限制,CircuitPython完全必須執(zhí)行無限循環(huán)。一個(gè)簡(jiǎn)單的程序可以讀取溫度傳感器,打印輸出并結(jié)束。
但是,Arduino和CircuitPython都在微控制器上運(yùn)行。在課堂上,您可能想要做一次讀取和打印溫度值之類的操作。如果將這個(gè)項(xiàng)目部署到農(nóng)民的田地中,它可能會(huì)一遍又一遍地反復(fù)讀取溫度,可能每分鐘或一小時(shí)讀取一次。在農(nóng)民的田野里,代碼永遠(yuǎn)都不應(yīng)停止。
因此執(zhí)行某些功能的無限循環(huán)非常有用,并且在大多數(shù)微控制器程序中都使用。這就是Arduino為初學(xué)者簡(jiǎn)化事情的原因,以表明您可能想擁有while和setup。您可以在CircuitPython中執(zhí)行完全相同的操作,只需構(gòu)建代碼以提供相同的功能即可。
處理數(shù)字
照片Nick Hillier在Unsplash上發(fā)表的文章
您會(huì)認(rèn)為所有語言中的“數(shù)字就是數(shù)字”,但事實(shí)并非如此。所有數(shù)字在內(nèi)部都以二進(jìn)制形式在微控制器/計(jì)算機(jī)內(nèi)部表示,但是編程語言如何提供數(shù)字支持會(huì)因語言而異。
數(shù)字類型
整數(shù)
浮點(diǎn)數(shù)
布爾值(true/false)
通常,您需要了解 precision -選擇最佳的使用方式,數(shù)字的大小可能是多少它在計(jì)算機(jī)程序中。這使使用數(shù)字有些棘手,但學(xué)習(xí)起來卻很容易。
Arduino
在Arduino中,您具有以下類型的變量:
int 表示整數(shù),一個(gè)值沒有小數(shù)點(diǎn)。整數(shù)的典型范圍是-32,768到零到32,767。例如279、1001、0,-23,-990。
long 是一個(gè)大整數(shù),值可以是-2,147,483,648到2,147,483,647。
float (浮點(diǎn)數(shù))(浮點(diǎn)數(shù)(帶小數(shù)點(diǎn)和小數(shù)的數(shù)字))。例子是3.1415,-22.2、0.0、430000.01。單個(gè)字符的數(shù)字最大為38 x的3 x 10
char 。例如,讀取串行數(shù)據(jù)可能涉及在接收到數(shù)據(jù)時(shí)提供字符值的接收功能。字符基本上可以是鍵盤上的任何符號(hào)(0到255)。
types.h 庫提供了趨于表現(xiàn)的數(shù)字的更現(xiàn)代表示形式
函數(shù)經(jīng)常使用無符號(hào)短整數(shù) uint8_t ,它的范圍也從0到255。
布爾數(shù)學(xué)通常使用 int 值完成。 0是 false ,而任何非零的值(例如1)都是 true 。
Python/CircuitPython
CircuitPython嘗試盡可能接近標(biāo)準(zhǔn)的Python實(shí)現(xiàn)(通常稱為CPython) 。給定微控制器沒有操作系統(tǒng),某些事情會(huì)有所不同,但已記錄在案。
以下是CircuitPython中的當(dāng)前類型:
整數(shù),但不是當(dāng)前的長整數(shù)
浮點(diǎn)數(shù)。
字符串
布爾值
布爾值是CircuitPython中的實(shí)際類型,可以是值 True 或 False 。
CircuitPython具有專用的 Strings 類型,而不是像Arduino那樣使用字符數(shù)組(以零/零終止)。請(qǐng)注意,CircuitPython 字符串不是以零/零結(jié)尾的,所以使用length屬性是您處理字符串長度的方法。
更改數(shù)字類型
在Arduino/C中,這稱為轉(zhuǎn)換。
下載:文件
復(fù)制代碼
int a;
float b;
b = (float)a;
a = (int)b; int a;
float b;
b = (float)a;
a = (int)b;
在CircuitPython中,您使用類似于函數(shù)的語法:
下載:文件
復(fù)制代碼
x = 5
y = 3.14
z = float(x)
z = int(y) x = 5
y = 3.14
z = float(x)
z = int(y)
除法,一個(gè)斜杠對(duì)兩個(gè)斜杠
兩種語言中的單個(gè)正斜杠/是浮點(diǎn)除法。
Python中的雙斜杠//很特殊。它將除以小數(shù)點(diǎn)后的任何值(通常稱為下限函數(shù))并進(jìn)行除法。
示例:
下載:文件
復(fù)制代碼
# Python code for / and // operators
x = 15
y = 4
# Output: x / y = 3.75
print(‘x / y =’, x/y)
# Output: x // y = 3
print(‘x // y =’, x//y) # Python code for / and // operators
x = 15
y = 4
# Output: x / y = 3.75
print(‘x / y =’, x/y)
# Output: x // y = 3
print(‘x // y =’, x//y)
邏輯運(yùn)算符
邏輯運(yùn)算符主要用于if語句和其他塊/循環(huán)語句中。這些不是用于按位運(yùn)算符和/或/或僅用于構(gòu)造邏輯比較的運(yùn)算符。
AND
OR
不是
Arduino/C
&&
||
!Python/CircuitPython
和
或
不是
下載:文件
復(fù)制代碼
// Arduino / C Logical Operators
a = 5;
b = 7;
if( a 》 2 && b 《 10) {
Serial.println(“Success”);
} // Arduino / C Logical Operators
a = 5;
b = 7;
if( a 》 2 && b 《 10) {
Serial.println(“Success”);
}
下載:文件
復(fù)制代碼
# CircuitPython Logical Operators
a = 5
b = 7
if a 》 2 and b 《 10:
print(“Success”) # CircuitPython Logical Operators
a = 5
b = 7
if a 》 2 and b 《 10:
print(“Success”)
變量,類型,范圍
從Wikipedia中,沒有列出創(chuàng)建者
快速參考
變量
Arduino
int a;
int b = 5;
CircuitPython
b = 5
陣列
Arduino
int a[5];
int a = {1, 2, 3, 4, 5};
CircuitPython
a = [1, 2, 3, 4, 5]
討論
變量
變量就像計(jì)算機(jī)內(nèi)存中的小盒子或信箱,可以在其中保留值。
要在C/C ++中創(chuàng)建變量,必須對(duì)其進(jìn)行聲明。這就需要給它一個(gè)類型,名稱和可選的值。
下載:文件
復(fù)制代碼
int a;
int b = 5; int a;
int b = 5;
在CircuitPython中,您無需聲明變量。第一次分配值時(shí)便會(huì)分配它們。
下載:文件
復(fù)制代碼
b = 5 b = 5
您只需使用名稱即可在兩種語言中使用變量的值。
下載:文件
復(fù)制代碼
int x = a_number; // in C/C++
x = a_number # in CircuitPython int x = a_number; // in C/C++
x = a_number # in CircuitPython
在兩種語言中,使用未知變量都是錯(cuò)誤的:尚未聲明(在C/C ++中)或未初始化(在CircuitPython中)
在C/C ++中,變量使用類型聲明,并被靜態(tài)類型化。它們僅具有該類型的值。
相反,CircuitPython是動(dòng)態(tài)類型的。變量沒有關(guān)聯(lián)的類型,并且可以在不同時(shí)間具有不同類型的值。每種方法都有優(yōu)點(diǎn)和缺點(diǎn),但是在閱讀某人的CircuitPython代碼時(shí),您應(yīng)該記住這一點(diǎn),以防某人重復(fù)使用變量并更改其類型。
集合
兩種語言都可以創(chuàng)建和操作值的集合。
“終極”-比其他任何集合都要好。只是不要單擊它。
(來自維基百科的圖像,已獲得合理使用許可)
Arduino
Arduino只有一種創(chuàng)建集合作為語言一部分的方法:數(shù)組。由于語言是C ++,因此您可以使用大多數(shù)C ++庫。具有足夠的CPU性能和內(nèi)存,您甚至可以將Arduino版本的標(biāo)準(zhǔn)C ++和Boost庫及其集合類一起使用,但是出于討論的目的,我們假設(shè)您使用的是基本語言功能。 p》
數(shù)組是簡(jiǎn)單的固定大小,固定順序的值序列。 C數(shù)組中的所有值都具有相同的類型。實(shí)際上,由于C是靜態(tài)類型的,所以數(shù)組項(xiàng)的類型是數(shù)組本身類型的一部分。
例如,如果要?jiǎng)?chuàng)建一個(gè)可以容納5個(gè)變量int中的值,您可以將其聲明為:
下載:文件
復(fù)制代碼
a int a[5];
如果在編譯時(shí)已知初始值,則可以初始化數(shù)組創(chuàng)建時(shí),并忽略其大小,因?yàn)閷某跏贾档臄?shù)量中推斷出大小。
下載:文件
復(fù)制代碼
int a[5]; int a[] = {1, 2, 3, 4, 5};
要訪問數(shù)組中的特定項(xiàng)目,請(qǐng)使用下標(biāo)符號(hào)。可以用來從數(shù)組中獲取值,或?qū)⑵湓O(shè)置為新值。
下載:文件
復(fù)制代碼
int a[] = {1, 2, 3, 4, 5}; int x = a[0];
a[1] = x + 1;
CircuitPython 》
基本的CircuitPython集合是List,其外觀和工作方式與C的數(shù)組非常相似。但是,它是一個(gè)動(dòng)態(tài)得多的結(jié)構(gòu):您可以自由地刪除和插入項(xiàng)目。它的長度是其中當(dāng)前有多少個(gè)項(xiàng)目的函數(shù),而不是它要保留的內(nèi)容的函數(shù)。由于它們是動(dòng)態(tài)的,因此通常不需要提前分配它們。您可以通過將項(xiàng)目放在方括號(hào)中來創(chuàng)建列表。
下載:文件
復(fù)制代碼
int x = a[0];
a[1] = x + 1; 》》》 a = [1, 2, 3, 4, 5]
與C數(shù)組一樣,您使用下標(biāo)符號(hào)來訪問項(xiàng)目。
下載:文件
復(fù)制代碼
》》》 a = [1, 2, 3, 4, 5] x = a[0]
a[1] = x + 1
CircuitPython的列表提供了比C數(shù)組更多的功能,但這超出了本指南的范圍。 CircuitPython還具有其他內(nèi)置集合:元組和字典。請(qǐng)參閱本指南,了解有關(guān)Python的基本數(shù)據(jù)結(jié)構(gòu),以及該指南的更多內(nèi)容,重點(diǎn)是列表和流。
Arduino/C和Python都在0處開始元素/數(shù)組組。因此對(duì)于3元素項(xiàng),它是x [0],x [1],x [2],這與某些語言(例如FORTRAN)在數(shù)組處開始元素1。
范圍
來自Elborgo用戶的維基百科
變量的作用域是代碼中何時(shí)何地可用。 C/C ++和CircuitPython都在詞法范圍內(nèi)。這意味著變量的范圍由代碼的結(jié)構(gòu)定義。如果您在函數(shù)中創(chuàng)建變量,則該變量在該函數(shù)中可用,但不在外部。
下載:文件
復(fù)制代碼
x = a[0]
a[1] = x + 1 void f() {
int a = 5;
print(a); // 1
}
print(a); // 2
由于void f() {
int a = 5;
print(a); // 1
}
print(a); // 2為范圍。即它在函數(shù)a中定義,可以使用。但是,第2行會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)榇藭r(shí)名稱f尚不清楚。在CircuitPython中,情況類似:
下載:文件
復(fù)制代碼
a def f():
a = 5
print(a) # 1
print(a) # 2
Local and Global
上面的代碼說明了本地狀態(tài)。即局部于功能。這就是為什么從函數(shù)外部引用變量是一個(gè)問題。另一個(gè)范圍是全局范圍。在整個(gè)代碼中都可以使用具有全局范圍的內(nèi)容。
下載:文件
復(fù)制代碼
def f():
a = 5
print(a) # 1
print(a) # 2 int b = 1;
void f() {
int a = 5;
print(a + b);
}
print(b);
// prints:
// 6
// 1
這是可行的,因?yàn)閕nt b = 1;
void f() {
int a = 5;
print(a + b);
}
print(b);
// prints:
// 6
// 1具有全局作用域,因此可以在。在CircuitPython中也是如此。
下載:文件
復(fù)制代碼
b f
如果我們具有相同名稱但在兩個(gè)作用域中都有變量,該怎么辦。現(xiàn)在事情開始不同了。在C/C ++中沒有麻煩。
Download:file
Copy代碼
b = 1
def f():
a = 5
print(a + b)
print(b)
# prints:
# 6
# 1 b = 1
def f():
a = 5
print(a + b)
print(b)
# prints:
# 6
# 1
但是,CircuitPython中的工作方式卻大不相同。
下載:文件
復(fù)制代碼
int a = 1;
void f() {
int a = 5;
print(a);
}
print(a);
// prints:
// 5
// 1 int a = 1;
void f() {
int a = 5;
print(a);
}
print(a);
// prints:
// 5
// 1
a = 1
def f():
a = 5 # 1
print(a)
print(a)
# prints:
# 5
# 1的分配可能存在問題。這是因?yàn)樵诒镜刈饔糜蛑袥]有名為“ a”的變量,因此將創(chuàng)建一個(gè)變量,因?yàn)檫@是該作用域中對(duì)a = 1
def f():
a = 5 # 1
print(a)
print(a)
# prints:
# 5
# 1的第一個(gè)賦值。對(duì)于該功能的其余部分,將使用此局部變量a,并且將保持不變(且未使用)全局范圍內(nèi)的變量a。
如果這正是您想要的,很好。但是,您的意圖可能是將全局a的值更改為5。如果是這種情況,那么您就有問題了。像pylint這樣的工具將提醒您以下事實(shí):外部范圍(在本例中為全局范圍)的名稱“ a”正在重新定義。那至少會(huì)引起您的注意。如果確實(shí)要使用全局a,則可以使用a語句告訴CircuitPython這是您的意圖。
下載:文件
復(fù)制代碼
a global
現(xiàn)在pylint可能會(huì)警告您,您正在使用全局語句。這是因?yàn)槿肿兞客ǔ2槐唤邮堋5怯靡粋€(gè)簡(jiǎn)單的腳本就可以了(在作者看來)。在更大,結(jié)構(gòu)更強(qiáng)的程序中,它們使用較少,您有辦法避免使用它們。
CircuitPython和C/C ++不能共享的一項(xiàng)有趣功能是能夠關(guān)閉。
數(shù)字輸入/輸出
格雷厄姆·詹金斯(Grahame Jenkins)提供的UnSplash免費(fèi)許可證
微控制程序的一部分正在使用I/O。 I/O的最基本形式是數(shù)字I/O引腳。這些被稱為GPIO引腳( G 通用 P 設(shè)置 I 輸入 O utput)
快速參考 配置輸出引腳
Arduino
pinMode(13, OUTPUT);
CircuitPython
import digitalio
import board
led = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT
為輸入引腳配置而不上拉
Arduino
pinMode(13, INPUT);
CircuitPython
import digitalio
import board
button_a = digitalio.DigitalInOut(board.BUTTON_A)
button_a.direction = digitalio.Direction.INPUT
配置帶有上拉的輸入引腳
Arduino
pinMode(13, INPUT_PULLUP);
CircuitPython
import digitalio
import board
button_a = digitalio.DigitalInOut(board.BUTTON_A)
button_a.direction = digitalio.Direction.INPUT
button_a.pull = digitalio.Pull.UP
從引腳讀取
Arduino
int pinValue = digitalRead(inputPin);
CircuitPython
pinValue = button_a.value
寫到別針
Arduino
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
CircuitPython
led.value = True
led.value = False
討論
配置數(shù)字I/O引腳
在使用引腳進(jìn)行輸入或輸出之前,必須對(duì)其進(jìn)行配置。這涉及將其設(shè)置為輸入或輸出,以及在需要時(shí)附加上拉或下拉。
Arduino
Arduino框架提供了pinMode為此。它帶有兩個(gè)參數(shù):
正在配置的引腳號(hào)。您以后可以使用相同的引腳號(hào)來使用I/O線
模式:INPUT,OUTPUT或INPUT_PULLUP。
要將標(biāo)準(zhǔn)的插針13板載LED設(shè)置為可用,您將使用:
下載:文件
復(fù)制代碼
pinMode(13, OUTPUT); pinMode(13, OUTPUT);
CircuitPython
在CircuitPython中,還有很多工作要做。您需要?jiǎng)?chuàng)建一個(gè)DigitalInOut實(shí)例。為此,您必須首先導(dǎo)入digitalio模塊。像在Arduino示例中一樣,給它提供要使用的引腳號(hào)。
在上面的Arduino示例中,我們?nèi)绾沃酪褂玫囊_號(hào)?簡(jiǎn)短的答案是我們剛剛做了。在此示例中,一個(gè)約定是板載LED位于引腳13上。對(duì)于其他GPIO引腳,您需要檢查所使用的板,以查看可用的引腳以及將電路連接到的引腳。
在Arduino中,沒有編譯時(shí)檢查您選擇的引腳是否有效或存在。 CircuitPython只允許您使用板子知道的管腳,這可以防止您輸入錯(cuò)誤。
(如果您導(dǎo)入板子模塊(稍后再介紹),您可以使用它列出可用的管腳。 )
下載:文件
復(fù)制代碼
》》》 import digitalio
》》》 import board
》》》 led = digitalio.DigitalInOut(board.D13)
》》》 led.direction = digitalio.Direction.OUTPUT 》》》 import digitalio
》》》 import board
》》》 led = digitalio.DigitalInOut(board.D13)
》》》 led.direction = digitalio.Direction.OUTPUT
如果需要輸入,可以使用digitalio.Direction.INPUT,如果需要設(shè)置上拉,則可以單獨(dú)進(jìn)行。
下載:文件
復(fù)制代碼
》》》 import digitalio
》》》 import board
》》》 button_a = digitalio.DigitalInOut(board.BUTTON_A)
》》》 button_a.direction = digitalio.Direction.INPUT
》》》 button_a.pull = digitalio.Pull.UP 》》》 import digitalio
》》》 import board
》》》 button_a = digitalio.DigitalInOut(board.BUTTON_A)
》》》 button_a.direction = digitalio.Direction.INPUT
》》》 button_a.pull = digitalio.Pull.UP
CircuitPython運(yùn)行的SAMD板還支持在輸入引腳上設(shè)置下拉。為此,您將使用
下載:文件
復(fù)制代碼
》》》 pin.pull = digitalio.Pull.DOWN 》》》 pin.pull = digitalio.Pull.DOWN
使用數(shù)字I/O引腳
現(xiàn)在您已經(jīng)設(shè)置了引腳,如何讀取和寫入值?
Arduino
該框架提供了digitalRead函數(shù),該函數(shù)以引腳號(hào)作為參數(shù)。
下載:文件
復(fù)制代碼
int pinValue = digitalRead(inputPin); int pinValue = digitalRead(inputPin);
從digitalRead返回的值是int類型,將是常量HIGH或LOW之一。
digitalWrite功能用于設(shè)置引腳值。它的參數(shù)是引腳號(hào)和將其設(shè)置為的值:HIGH或LOW。例如,假設(shè)已如上所述將其設(shè)置為輸出,則打開連接到引腳13的LED,您可以使用:
下載:文件
復(fù)制代碼
digitalWrite(13, HIGH); digitalWrite(13, HIGH);
并關(guān)閉它:
下載:文件
復(fù)制代碼
digitalWrite(13, LOW); digitalWrite(13, LOW);
此處的示例顯示了如何使用數(shù)字輸出引腳來閃爍內(nèi)置的LED:微控制器編程的事實(shí)上的 Hello World 。
下載:文件
復(fù)制代碼
void setup()
{
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop()
{
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
void setup()
{
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop()
{
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
將數(shù)字輸入和輸出放在一起,下面是一個(gè)示例,該示例從開關(guān)讀取并控制LED作為響應(yīng)。
下載:文件
復(fù)制代碼
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button‘s value
} int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button’s value
}
CircuitPython
假設(shè)led和switch的設(shè)置如上所述。
輸入引腳可以通過查詢其value屬性進(jìn)行讀取:
下載:文件
復(fù)制代碼
》》》 button_a.value 》》》 button_a.value
我們可以通過設(shè)置value屬性來打開和關(guān)閉led = 1》反對(duì)一個(gè)布爾值:
下載:文件
復(fù)制代碼
DigitalInOut 》》》 led.value = True
》》》 led.value = False
要在CircuitPython中實(shí)現(xiàn)閃爍的演示,我們將做一些類似的事情:
下載:文件
復(fù)制代碼
》》》 led.value = True
》》》 led.value = False 》》》 import time
》》》 import digitalio
》》》 import board
》》》 led = digitalio.DigitalInOut(board.D13)
》》》 led.direction = digitalio.Direction.OUTPUT
》》》 while True:
。.. led.value = True
。.. time.sleep(0.5)
。.. led.value = False
。.. time.sleep(0.5)
模擬輸入
快速參考
配置模擬輸入引腳
Arduino
不需要
CircuitPython
import board
import analogio
adc = analogio.AnalogIn(board.A0)
使用模擬輸入引腳
Arduino
int val = analogRead(3);
CircuitPython
adc.value
討論
配置模擬輸入引腳
Arduino
配置模擬輸入引腳不需要任何特殊操作。需要以與數(shù)字輸出引腳相同的方式將模擬輸出引腳配置為輸出。請(qǐng)注意,僅某些引腳可以用作模擬引腳。查看特定電路板的文檔以查找哪些電路板。
CircuitPython
在CircuitPython中使用模擬引腳類似于
像以前一樣,使用board模塊可以按名稱訪問正確的引腳。另外,analogio模塊為您提供模擬I/O類。
要讀取模擬輸入,您需要?jiǎng)?chuàng)建AnalogIn的實(shí)例:
下載:文件
復(fù)制代碼
》》》 import board
》》》 import analogio
》》》 adc = analogio.AnalogIn(board.A0) 》》》 import board
》》》 import analogio
》》》 adc = analogio.AnalogIn(board.A0)
要設(shè)置模擬輸出,請(qǐng)創(chuàng)建一個(gè)AnalogOut實(shí)例。
下載:文件
復(fù)制代碼
》》》 import board
》》》 import analogio
》》》 led = analogio.AnalogOut(board.A0) 》》》 import board
》》》 import analogio
》》》 led = analogio.AnalogOut(board.A0)
使用模擬輸入引腳
Arduino
模擬I/O與數(shù)字類似。不同的板可以具有不同數(shù)量和位置的模擬引腳。查看您的文檔以獲取有關(guān)主板功能的詳細(xì)信息。
下載:文件
復(fù)制代碼
int val = analogRead(3); int val = analogRead(3);
返回的值是一個(gè)介于0和1023之間(包括0和1023)的int。該范圍假設(shè)一個(gè)10位模數(shù)轉(zhuǎn)換器。通常,模數(shù)轉(zhuǎn)換器中的位數(shù)決定范圍,范圍是0到2 bits -1。例如。一個(gè)12位轉(zhuǎn)換器將得出0到4095之間的值。請(qǐng)參考您開發(fā)板的文檔以找到轉(zhuǎn)換器的大小。
CircuitPython
具有上面所示的AnalogIn對(duì)象后,只需獲取其value屬性:
下載:文件
復(fù)制代碼
adc.value adc.value
在CircuitPython中,模擬如上所示,您輸入的輸入值將始終在0到65535之間。這并不意味著總會(huì)有一個(gè)16位轉(zhuǎn)換器。相反,將從轉(zhuǎn)換器讀取的值映射到16位范圍。這使您不必?fù)?dān)心板上的轉(zhuǎn)換器的詳細(xì)信息。
AnalogIn對(duì)象為您提供了一種方便的方法來查詢轉(zhuǎn)換器的參考電壓,因此如果您需要了解要測(cè)量實(shí)際電壓,只需使用以下代碼即可。請(qǐng)記住,其結(jié)果將根據(jù)引腳上的電壓以及參考電壓而有所不同。
下載:文件
復(fù)制代碼
》》》 adc.value / 65535 * adc.reference_voltage
3.2998 》》》 adc.value / 65535 * adc.reference_voltage
3.2998
模擬和PWM輸出
快速參考
配置模擬輸出引腳
Arduino
大多數(shù)開發(fā)板沒有真正的模擬輸出。
CircuitPython
import board
import analogio
dac = analogio.AnalogOut(board.A1)
使用模擬輸出引腳
Arduino
大多數(shù)板子都沒有真正的模擬輸出。
CircuitPython
dac.value = 32767
PWM輸出引腳
Arduino
不需要
CircuitPython
import board
import pulseio
led = pulseio.PWMOut(board.A1)
使用PWM輸出引腳
Arduino
analogWrite(9, 128);
CircuitPython
led.duty_cycle = 32767
討論 Arduino
直接寫入模擬引腳。從技術(shù)上講,這通常不是真正的模擬值,而是PWM信號(hào)。即您正在寫入的值將設(shè)置PWM信號(hào)的占空比。范圍是0-255(含)。 analogWrite用于此目的,和digitalWrite一樣,用于獲取引腳和值。
Arduino DUE具有2個(gè)實(shí)際的模數(shù)轉(zhuǎn)換器,可輸出實(shí)際的模擬電壓,而不是輸出
下載:文件
復(fù)制代碼
analogWrite(pin, val);
analogWrite(pin, val);
將它們放在一起,我們可以從模擬引腳讀取并寫入另一個(gè)引腳。區(qū)別在于需要容納值范圍,這就是4的除法。
下載:文件
復(fù)制代碼
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
} int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}
CircuitPython
》 CircuitPython硬件上有兩種類型的模擬輸出:真實(shí)模擬和PWM(與Arduino一樣)。
對(duì)于真實(shí)模擬輸出,AnalogOut對(duì)象的value參數(shù)設(shè)置為a值介于0到65535之間,與AnalogInput的值范圍相同:0將輸出設(shè)置為0v,65535將其設(shè)置為參考電壓。
下載:文件
復(fù)制代碼
dac.value = 32767 dac.value = 32767
一個(gè)相關(guān)的輸出功能是PWM(脈沖寬度調(diào)制)。它以完全不同的方式完成。代替使用analogio模塊,您需要使用pulseio并使用要在其上生成信號(hào)的Pin創(chuàng)建一個(gè)PWMOut對(duì)象。
下載:文件
復(fù)制代碼
》》》 import board
》》》 import pulseio
》》》 led = pulseio.PWMOut(board.A1) 》》》 import board
》》》 import pulseio
》》》 led = pulseio.PWMOut(board.A1)
一個(gè)PWMOut對(duì)象,可以將其占空比(輸出為高的時(shí)間百分比)設(shè)置為16位整數(shù)(0-65535)。例如:
下載:文件
復(fù)制代碼
# set the output to 100% (always high)
》》》 led.duty_cycle = 65535
# set the output to 0% (always low)
》》》 led.duty_cycle = 0
# set the output to 50% (high half the time)
》》》 led.duty_cycle = 32767 # set the output to 100% (always high)
》》》 led.duty_cycle = 65535
# set the output to 0% (always low)
》》》 led.duty_cycle = 0
# set the output to 50% (high half the time)
》》》 led.duty_cycle = 32767
時(shí)間
蘇甘斯攝在Unsplash
快速參考
延遲
Arduino
delay(1500);
CircuitPython
import time
time.sleep(1.5)
》
系統(tǒng)時(shí)間
Arduino
unsigned long now = millis();
CircuitPython
import time
now = time.monotonic()
討論
能夠等待特定的時(shí)間時(shí)間在許多項(xiàng)目中都很重要。
Arduino和CircuitPython的處理方法非常相似。
延遲 Arduino
該函數(shù)用于等待特定時(shí)間, delay,已內(nèi)置在Arduino框架中。不需要#include。單個(gè)參數(shù)是延遲時(shí)間,以毫秒為單位。
一個(gè)示例是如下所示的簡(jiǎn)單閃爍LED代碼:
下載:文件
復(fù)制代碼
int ledPin = 13; // LED connected to digital pin 13
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
} int ledPin = 13; // LED connected to digital pin 13
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
每次打開或關(guān)閉delay以創(chuàng)建閃爍的燈光時(shí),ledPin函數(shù)都會(huì)等待一秒鐘(1000毫秒)。
CircuitPython
CircuitPython中與delay等效的函數(shù)是time.sleep函數(shù)。默認(rèn)情況下不包含time模塊,必須將其導(dǎo)入到程序中。
傳遞給time.sleep的參數(shù)是延遲時(shí)間(以秒為單位)。 》(不是毫秒)。該值可以是十進(jìn)制,因此如果要等待一秒鐘,請(qǐng)放入1.0,如果要等待50毫秒,則為0.050。
下面的代碼重復(fù)打印單詞Hello。打印件之間的間隔為0.1秒,即100毫秒。
下載:文件
復(fù)制代碼
import time
while True:
print(“Hello”)
time.sleep(0.1) import time
while True:
print(“Hello”)
time.sleep(0.1)
Djim Loic在Unsplash上拍攝的照片
獲取系統(tǒng)時(shí)間
通常,微控制器和單板計(jì)算機(jī)通常缺少實(shí)時(shí)時(shí)鐘(RTC)模塊來了解時(shí)間。每個(gè)系統(tǒng)通常具有的功能是對(duì)自打開電源以來的時(shí)間進(jìn)行計(jì)數(shù)。對(duì)于完成一段時(shí)間的某些工作而言,這仍然很有用。
Arduino
要獲取自Arduino開發(fā)板以來的時(shí)間,常用功能是millis。它沒有任何參數(shù),并返回自從上次打開該板電源以來的毫秒數(shù)。
以下代碼草圖顯示了每秒從串行端口上電以來的時(shí)間(1000毫秒)。
下載:文件
復(fù)制代碼
unsigned long initial;
void setup(){
Serial.begin(9600);
initial = millis();
}
void loop(){
unsigned long now;
now = millis();
if( now - initial 》 3 ) { // Print done after 3 milliseconds elapses
Serial.print(“done”);
}
else {
initial = now;
}
} unsigned long initial;
void setup(){
Serial.begin(9600);
initial = millis();
}
void loop(){
unsigned long now;
now = millis();
if( now - initial 》 3 ) { // Print done after 3 milliseconds elapses
Serial.print(“done”);
}
else {
initial = now;
}
}
CircuitPython
Python具有許多時(shí)間函數(shù)。但是許多板卡都遇到了與Arduino發(fā)現(xiàn)的相同的問題-沒有RTC。
CircuitPython具有與Arduino delay類似的功能,稱為time.monotonic。但是它返回的是秒,而不是像delay那樣的毫秒。
注意,不建議比較大于一小時(shí)的時(shí)間,因?yàn)樵撝祵㈤_始四舍五入,可能會(huì)浪費(fèi)時(shí)間,從而造成準(zhǔn)確性。
下載:文件
復(fù)制代碼
import time
initial = time.monotonic() # Time in seconds since power on
while True:
now = time.monotonic()
if now - initial 》 0.003: # If 3 milliseconds elapses
print(“done”)
else:
initial = now import time
initial = time.monotonic() # Time in seconds since power on
while True:
now = time.monotonic()
if now - initial 》 0.003: # If 3 milliseconds elapses
print(“done”)
else:
initial = now
參考 Arduino
Arduino參考
延遲
millis
CircuitPython
時(shí)間-與時(shí)間和計(jì)時(shí)相關(guān)的功能
庫和模塊
長愛爾蘭都柏林三一學(xué)院室內(nèi)。來自Wikipedia的用戶Diliff,CC BY-SA 4.0
快速參考
Arduino
include
CircuitPython
import time
討論
Arduino和CircuitPython都提供了一種從正在處理的文件外部提取代碼的方法。這可能是您編寫的另一個(gè)文件,是框架的一部分,或者是傳感器支持模塊。
Arduino
C和C ++將代碼分為代碼文件(分別以.c或.cpp結(jié)尾)和頭文件(以.h結(jié)尾)。 Arduino環(huán)境為您的草圖/程序的主文件收取了少量費(fèi)用。它以.ino結(jié)尾。
頭文件通常包含函數(shù)和全局變量聲明以及宏和類型定義。在C ++中,類定義也位于此處。代碼文件包含函數(shù)定義。頭文件提供了到庫的接口,告訴您的代碼如何訪問/調(diào)用庫的工具。
要使用頭文件(及其包含的庫)您包括它:
下載:文件
復(fù)制代碼
#include #include
現(xiàn)在,您的代碼可以使用string.h中定義的函數(shù)和類型,該函數(shù)和類型是字符串的集合操作功能,例如strcpy()用于復(fù)制字符串。
CircuitPython
所有CircuitPython代碼文件均具有.py擴(kuò)展名(結(jié)束)。沒有定義接口的單獨(dú)文件。
CircuitPython具有與Arduino/C相似的機(jī)制,稱為模塊。代碼創(chuàng)建者為特定目的收集了一組功能并創(chuàng)建了一個(gè)模塊。
預(yù)編譯的模塊具有.mpy文件擴(kuò)展名。并非所有模塊都必須預(yù)先編譯,這樣只會(huì)節(jié)省空間。
使用CircuitPython模塊,則應(yīng)將適當(dāng)?shù)奈募ㄍǔJ?mpy文件)放置在開發(fā)板閃存驅(qū)動(dòng)器上的/lib文件夾中。
“時(shí)間”頁面上的較早位置, time模塊已導(dǎo)入,并提供了兩個(gè)功能:time.sleep和time.monotonic。
請(qǐng)注意,當(dāng)您如上所述導(dǎo)入模塊時(shí),不能僅引用里面的東西,你必須給它們加上模塊名的前綴。即time.monotonic(),而不僅僅是monotonic()。有很多方法可以避免這種情況,但這超出了本指南的范圍。
下載:文件
復(fù)制代碼
import time
while True:
print(“Hello”)
time.sleep(0.1) import time
while True:
print(“Hello”)
time.sleep(0.1)
CircuitPython無法將完整的Python/CPython可用的大型模塊導(dǎo)入為微控制器上的內(nèi)存非常有限。
Adafruit致力于提供大量模塊來支持廣泛的硬件。這包括傳感器,顯示器,智能LED(NeoPixel等)等等。正如Adafruit是提供開源Arduino庫的領(lǐng)導(dǎo)者一樣,Adafruit也在Python世界中努力做到這一點(diǎn)。
Python模塊有更多功能,但以上內(nèi)容基礎(chǔ)。有關(guān)更多信息,請(qǐng)參見此類Python參考。
有關(guān)最新的CircuitPython模塊的信息,請(qǐng)參考Adafruit GitHub存儲(chǔ)庫。
董事會(huì)模塊
圖片作者:Unsplash上的rawpixel
您正在微控制器板上編寫嵌入式代碼。這幾乎總是意味著您正在通過董事會(huì)的一些圖釘與外界互動(dòng)。您如何知道哪些代碼在做什么,以及在代碼中使用哪些代碼?
Arduino
在編譯之前在Arduino IDE中,選擇要使用的板。這基本上告訴了編譯器信息,該信息需要專門針對(duì)MCU和該特定板的配置進(jìn)行編譯。但是,那無助于知道使用什么引腳。您必須查看電路板的文檔并弄清楚。 Arduino硬件平臺(tái)提供了一些有用的標(biāo)準(zhǔn)。您將始終有一些以“ D”為前綴的引腳。這些用于數(shù)字I/O。有些將以“ A”為前綴。這些可以用于模擬信號(hào),但并非全部都支持真實(shí)的模擬輸出。
將有I2C(SCL和SDA)和SPI(MOSI,MISO和SCK)引腳。在代碼中,您將使用適當(dāng)?shù)墓苣_編號(hào),盡管某些板具有在Arduino IDE中選擇板時(shí)可使用的那些管腳的預(yù)定義值。
CircuitPython
CircuitPython采用了非常不同的方法來處理各種受支持的電路板。首先,CircuitPython駐留在板上,而Arduino是計(jì)算機(jī)上的一組工具,該工具會(huì)生成一個(gè)二進(jìn)制文件,然后將其保存在板上。
進(jìn)行此項(xiàng)工作的一部分是制作以下版本的CircuitPython:特定于每個(gè)受支持的板。例如,如果您想將CircuitPython與Feather M4 Express一起使用,則可以得到CircuitPython的Feather M4 Express版本,并將其放到Feather M4 Express板上。有關(guān)詳細(xì)信息,請(qǐng)參見本指南。
之所以如此重要,是因?yàn)镃ircuitPython知道其運(yùn)行在哪個(gè)板上,并且知道該板上的功能,以及該板上的引腳是什么。以及他們可以做什么。
要使此功能可用,您可以導(dǎo)入board模塊。該模塊包含特定板上引腳的常數(shù)。 CircuitPython中用于另一塊板的board模塊將具有特定于該板的不同常量。知道,用戶不必告訴CircuitPython它在什么板上運(yùn)行。
所有這些使使用板模塊成為使用板引腳的最安全,最可靠的方法。它使您不必?fù)?dān)心板子引腳連接到哪個(gè)MCU引腳。對(duì)于圍繞ARM內(nèi)核構(gòu)建的更復(fù)雜的MCU(例如SAMD或nRF52系列MCU),這更是一個(gè)問題。
例如,可以將I2C信號(hào)連接到MCU有多種方式(我們將不介紹),但是使用板卡模塊,您可以輕松執(zhí)行以下操作:
下載:文件
復(fù)制代碼
import board
import busio
i2c = busio.I2C(board.SCL, board.SDA) import board
import busio
i2c = busio.I2C(board.SCL, board.SDA)
這將在CircuitPython中任何受支持的板上工作。/p》
那么您如何知道板上有哪些引腳可用?他們叫什么?您可以使用CircuitPython的dir函數(shù)。這是在Circuit Playground Express上:
下載:文件
復(fù)制代碼
》》》 import board
》》》 dir(board)
[‘A0’, ‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’, ‘A6’, ‘A7’, ‘A8’, ‘A9’,
‘ACCELEROMETER_INTERRUPT’, ‘ACCELEROMETER_SCL’,
‘ACCELEROMETER_SDA’, ‘BUTTON_A’, ‘BUTTON_B’, ‘D0’, ‘D1’,
‘D10’, ‘D12’, ‘D13’, ‘D2’, ‘D3’, ‘D4’, ‘D5’, ‘D6’, ‘D7’,
‘D8’, ‘D9’, ‘I2C’, ‘IR_PROXIMITY’, ‘IR_RX’, ‘IR_TX’, ‘LIGHT’,
‘MICROPHONE_CLOCK’, ‘MICROPHONE_DATA’, ‘MISO’, ‘MOSI’,
‘NEOPIXEL’, ‘REMOTEIN’, ‘REMOTEOUT’, ‘RX’, ‘SCK’, ‘SCL’,
‘SDA’, ‘SLIDE_SWITCH’, ‘SPEAKER’, ‘SPEAKER_ENABLE’, ‘SPI’,
‘TEMPERATURE’, ‘TX’, ‘UART’]
》》》 》》》 import board
》》》 dir(board)
[‘A0’, ‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’, ‘A6’, ‘A7’, ‘A8’, ‘A9’,
‘ACCELEROMETER_INTERRUPT’, ‘ACCELEROMETER_SCL’,
‘ACCELEROMETER_SDA’, ‘BUTTON_A’, ‘BUTTON_B’, ‘D0’, ‘D1’,
‘D10’, ‘D12’, ‘D13’, ‘D2’, ‘D3’, ‘D4’, ‘D5’, ‘D6’, ‘D7’,
‘D8’, ‘D9’, ‘I2C’, ‘IR_PROXIMITY’, ‘IR_RX’, ‘IR_TX’, ‘LIGHT’,
‘MICROPHONE_CLOCK’, ‘MICROPHONE_DATA’, ‘MISO’, ‘MOSI’,
‘NEOPIXEL’, ‘REMOTEIN’, ‘REMOTEOUT’, ‘RX’, ‘SCK’, ‘SCL’,
‘SDA’, ‘SLIDE_SWITCH’, ‘SPEAKER’, ‘SPEAKER_ENABLE’, ‘SPI’,
‘TEMPERATURE’, ‘TX’, ‘UART’]
》》》
這是在Gemma M0上:
下載:文件
復(fù)制代碼
》》》 import board
》》》 dir(board)
[‘A0’, ‘A1’, ‘A2’, ‘APA102_MOSI’, ‘APA102_SCK’, ‘D0’,
‘D1’, ‘D13’, ‘D2’, ‘I2C’, ‘L’, ‘RX’, ‘SCL’, ‘SDA’, ‘SPI’,
‘TX’, ‘UART’]
》》》 import board
》》》 dir(board)
[‘A0’, ‘A1’, ‘A2’, ‘APA102_MOSI’, ‘APA102_SCK’, ‘D0’,
‘D1’, ‘D13’, ‘D2’, ‘I2C’, ‘L’, ‘RX’, ‘SCL’, ‘SDA’, ‘SPI’,
‘TX’, ‘UART’]
您可以看到有一些共同的引腳,但也有特定于主板的引腳。
責(zé)任編輯:wv
-
編程
+關(guān)注
關(guān)注
88文章
3596瀏覽量
93610 -
Arduino
+關(guān)注
關(guān)注
187文章
6464瀏覽量
186681
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論