2021.4.14/彰安自造教育及科技中心
彰安國中 陳清文老師
D1 MINI控制板與Thonny 開發環境簡介與安裝
gameESP-micropython 遊戲模組,螢幕輸出、圖案設計
按鈕、遊戲控制、音效輸出
Mu程式編輯器與Pyamge Zero簡介與安裝
Flappy Bird 遊戲設計
Snake 遊戲設計
彰安自造與教育中心 陳清文老師很用心準備,並用實物投影機說明組裝焊接的方式,最後再進入程式設計的區塊。
今天的講師陳清文老師,將這次遊戲機的線路設計,從麵包板的接線方式,直接洗成板子,只要將電路設計圖上傳給廠商,即可線上完成訂做下單,平均一片成本30元+運費60,30片上課用的板子,大約只要960元左右。
左圖是本次遊戲機的電路設計,總共使用了:
印刷電路板×1
D1 Mini ×1
I2C 0.96 吋 OLED 螢幕×1
按鍵×6
蜂鳴器×1
10K電阻×1
開關×1
4AAA電池盒×1
今天的第一個挑戰就是焊接所有的電子零件
先將按鈕×6、蜂鳴器與電阻焊好
可以選擇用公母頭+公公頭(D1Mini)做成活動式,可隨時拆下D1Mini(ESP8266);或者直接用公公頭焊死。
要焊得好真的要好的焊錫,今天真的發現加銀的焊錫超級好焊接的。
將2邊8pin的公公頭焊一一焊接
完成雙邊的8個pin腳焊接
將D1Mini焊接上去時,因為USB接頭有厚度的關係,必需接著USB線來焊接
焊接上4pin接腳,2pin電源,2pin資料,因為屬於簡易型,僅用2pin傳遞資料,所以速度會比較慢。
再焊接上額外的2個8pin與1個4pin的擴充接腳,可以擴充安裝不同的感應器等物件
側面來看就知道,無法將D1Mini焊接到底的最主要原因,就是USB線的厚度,為了避免屆時USB線無法插入,焊接時就要先連接著USB線
隨便挑選6個
安裝按鍵很簡單,就用力向下壓就行了。
若使用usb時,電源開關要關閉,不然電路板會向電池充電(除非是充電電池),單純使用電池供電時,則打開電源。
D1Mini的pin腳號碼,與python程式的實際pin碼不一樣,要參照右方說明圖來指定正確的pin。
再安裝上預先設計好的雷切盒子
從側面可以看到組件的方式
由於D1mini上有個reset鍵是傳輸時必要的按鍵,因此,傳程式時得打開上蓋。
螺絲起子指著小小的reset鍵,不同的ESP8266設計也有所不同
晶片板上有一顆pin碼為2號的led
今天滿桌的零件
GPIO13 D7------ Right
GPIO12 D6—— Left
GPIO14 D5—— UP
GPIO2 D4—— Down
GPIO0 D3—— A
GPIO16 D0 —— B
(connect 10K pullup resistor to 3.3V)
GPIO15 D8—— Speaker
*Tie the other end of the buttons to GND
# I2C OLED
# SSD1306 # ESP8266
# GND -------- GND
# VCC --------- VCC
# D0/SCL ------ D1 (=GPIO5)
# D1/SDA ---- D2 (=GPIO4)
板子腳位 ESP8266 腳位 功能
D0 GPIO16 IO
D1 GPIO5 IO, SCL
D2 GPIO4 IO, SDA
D3 GPIO0 IO, 內建 10K 上拉電阻
D4 GPIO2 IO, 內建 10K 上拉電阻與 LED
D5 GPIO14 IO, SCK
D6 GPIO12 IO, MISO
D7 GPIO13 IO, MOSI
D8 GPIO15 IO, SS, 內建 10K 上拉電阻
TX TXD UART 送端
RX RXD UART 收端
A0 ADC 類比輸入 (0~3.3V)
下載網址:thonny.org
Thonny是個很簡潔的Python的編輯環境,上方為程式編輯區,下方為Python的終端機,可直接在此輸入語法執行,也可執行上方的程式時,在下方看執行的成果。
「檢視」→「檔案」
將「檔案」分頁打開時,則可看到本機與連接的晶片中的檔案,可以直接將檔案複製到晶片中。
因為時間關係,今天老師也直接分享了ESP8266的遊戲檔案,複製進去,即可直接開玩。
name = input('Hello, May I have your name? ')
print('Hi, ', name)
>>> %Run hello.py
Hello, May I have your name? Tommy
Hi, Tommy
>>> print('I','am','Tommy')
I am Tommy
>>> name='Tony'
>>> Name='Tim'
>>> print('Hi,',name)
Hi, Tony
命名規則
與大多數程式語言一樣,可包含英文字母、數字與下底線,但不能以數字開頭。
英文字母區分大寫小。(A與a是不同的)
結尾語句不加分號
縮排(空白格式)
Python 和其他語言最大的不同就是使用縮排來切分程式碼,這和其他語言使用 {} 不同。
模組
Import , from import
註解 單行 # 多行 ‘’’ 或 ###
「執行」→「選擇直譯器」 或 「工具」→「選項」
下拉式選單選擇「ESP8266」
若已經連接好晶片了與基本的驅動程式,就可以選擇「CH340」
按右下方的「安裝或更新韌體」,並選擇檔案「esp8266-20210202-v1.14.bin」(老師附的),也可以在「https://micropython.org/download/」下載
按「安裝」後就稍等一下,會顯示燒錄的進度
完成後下方會出現如上圖的紅色文字
直接在下方終端機輸入語法來測試晶片上方的led燈(Pin=2)
>>> from machine import Pin #載入Pin類別
>>> led = Pin(2,Pin.OUT)#設定變數led為pin2輸出
>>> led.value(0)#設定變數led值為0(代表通路led燈亮)
>>> led.value(1)#設定變數led值為1(代表斷路led燈滅)
0/1代表通路或斷路,不同晶片的設計有所不同。
上述的語法,也可以打在上方的程式編輯區來執行。
from machine import Pin, PWM#載組machine載入Pin類別,PWM類別
import time#載入time類別
beeper = PWM(Pin(15), freq=440, duty=512)#設定變數beeper為pin15輸出頻率440Khz與duty=512的聲音
time.sleep(0.5)#暫停500毫秒
beeper.deinit()#關閉pin15蜂嗚器
PWM 類別一樣放在 machine 模組內,但因為需指定哪支 Pin 腳,所以需要import PWM 和 Pin。
beeper.freq(1000):指定 pwm 的基本頻率,如果括號內不填值可以取得目前 pwm 腳位的頻率也就是 beeper.freq()。
beeper.duty(512):指定 pwm 的 duty cycle,duty 內的值可以填入 0-1023,也就是代表 0-100%,如果想要 duty 為 30% 時,就是填入1024×0.3=307 就可以啦!那如果要取得目前的 duty 值就可以直接beeper.duty()就會回傳目前的duty值。
beeper.deinit():這個方法就是把 pwm 功能關掉,如果在 pwm 的操作結束後,可以放入這個方法,避免該隻腳位為仍然有波型輸出,導致誤動作發生。
電路板中有分別將D1min的所有接腳另外拉出針腳,可以擴充不同的設備。
此次主要是設計以6個按鍵+蜂嗚器+OLED來進行遊戲的設計。
from machine import Pin#從machine模組載入Pin類別
import time#載入time類別
led = Pin(2, Pin.OUT)#設定變數led為pin2輸出
L_button = Pin(12, Pin.IN, Pin.PULL_UP)#設定變數L-button為pin12(D6 GPIO 12)
while True:#在此為無限迴圈的意思
if L_button.value() == 0:#如果數值為0
led.value(not led.value())#修改數值為另一個值(即0→1,1→0)
time.sleep_ms(300)#暫停300毫秒
from machine import Pin, PWM#從machine模組載入Pin類別與PWM類別
import time#載入time類別
led = Pin(2, Pin.OUT)#設定變數led為pin2輸出
L_button = Pin(12, Pin.IN, Pin.PULL_UP)#設定變數L_button為pin12(D6 GPIO 12)
R_button = Pin(13, Pin.IN, Pin.PULL_UP)#設定變數R_button為PIN13(D7 GPIO 13)
while True:#無限循環
if L_button.value() == 0:#若值為0則變1,若為1則變0,並暫停300毫秒
led.value(not led.value())
time.sleep_ms(300)
if R_button.value() == 0:#若為0則發出聲音→暫停100毫秒→關閉蜂鳴器。
beeper = PWM(Pin(15), freq=440, duty=512)
time.sleep(0.1)#暫停100毫秒
beeper.deinit()#關閉蜂嗚器
from machine import Pin, PWM#從machine模組載入Pin類別與PWM類別
import time#載入time類別
tempo = 5#設定變數tempo值為5
tones = {#設定變數tones值為2維陣列
'c': 262,
'd': 294,
'e': 330,
'f': 349,
'g': 392,
'a': 440,
'b': 494,
'C': 523,
' ': 0,
}
beeper = PWM(Pin(15, Pin.OUT), freq=440, duty=512)#設定變數beeper為蜂鳴器(使用pin15)
#The maximum frequency of PWM is currently 1000Hz
melody = 'cdefgabC'#設定變數melody為cdefgabC
rhythm = [8, 8, 8, 8, 8, 8, 8, 8]#設定變數rhythm為1維陣列,值為8個8
for tone, length in zip(melody, rhythm):
beeper.freq(tones[tone])
time.sleep(tempo/length)
beeper.deinit()#關閉蜂鳴器