1. 程式人生 > >Micropython Turnipbit自動窗簾模擬系統

Micropython Turnipbit自動窗簾模擬系統

太陽 一定的 線圖 含義 tab html 旋轉 round 直接

今天我們繼續來研究Turnipbit這塊板子的功能,這個實驗靈感並不是我想出來的,辦公室是背陰的,早上中午都見不到太陽,坐在對面的同事每天下午四點,都要去拉窗簾,我都能感覺到太陽直曬他眼睛,(瞇瞇眼)。所以就想到了這個。

所需器件:

ü TurnipBit 開發板 1塊

ü 下載數據線 1條

ü 微型步進電機(28BYJ-48) 1個

ü 步進電機驅動板(ULN2003APG) 1塊

ü 光敏傳感器 1個

ü TurnipBit 擴展板 1塊

ü 接入網絡的電腦 1臺

ü 在線可視化編程器

http://turnipbit.com/PythonEditor/editor.html

步進電機的介紹

本次實驗采用的是28BYJ-48 四相八拍電機,電壓DC5V~12V。

24BYJ48名稱的含義:

24:電機外徑24mm

B:步進電機中步字的拼音首字母

Y:永磁中永字的拼音首字母

J:減速的減字拼音首字母

48:四相8步

步進電機是將電脈沖信號轉變為角位移或線位移的開環控制電機,是現代數字程序控制系統中的主要執行元件,應用極為廣泛。在非超載的情況下,電機的轉速、停止的位置只取決於脈沖信號的頻率和脈沖數,而不受負載變化的影響,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。

驅動原理

當連續不斷的給電機發送控制脈沖時,電機就會不斷的轉動。每一個脈沖信號對應步進電機的某一相或兩相繞組的通電狀態改變一次,對應轉子就會轉過一定的角度(步距角)。當通電狀態的改變完成一個循環時,轉子轉過一個齒距。

四相步進電機可以在不同的通電方式下運行,常見的通電方式:

四拍(單相繞組通電):A-B-C-D-A…

雙四拍(雙相繞組通電):AB-BC-CD-DA-AB-...

八拍: A-AB-B-BC-C-CD-D-DA-A…

器件的連接

1、將步進電機白色接頭插到驅動板對應的座子上。

2、TurnipBit對應插入擴展板,記住帶有LED燈和按鍵的一面朝向擴展板帶有針腳的一側。

3、將驅動板與TurnipBit擴展板連接起來。接線圖如下:

TurnipBit擴展板

ULN2003APG驅動板

P5

IN1

P8

IN2

P11

IN3

P12

IN4

+5V

5V正極

GND

負極

4、將光敏傳感器與TurnipBit擴展板連接起來。接線圖如下:

TurnipBit擴展板

光敏傳感器

3.3V

VCC

GND

GND

P0

AO

開始編程

之前的教程一直都是使用拖拽可視化編程,這種方式可以快速讓零基礎小夥伴入門,但是在實際項目或工作中,還是要直接敲代碼的。今天就給大家介紹一下TurnipBit的可視化編程器的另一項功能——代碼編程。(其實是這個拼插編程太麻煩了 )

之前看過編程的小夥伴,不難發現,一打開編輯器首先進入的就是代碼編程器界面。

5.4.2、接下來用代碼實現對步進電機的控制和光照數據的采集。

ü 當光照變弱時,步進電機順時針旋轉一周,模擬關閉窗簾的操作;

ü 當光照變強時,步進電機逆時針旋轉一周,模擬打開窗簾的操作;

完成源代碼:

# 在這裏添加Python代碼

from microbit import *

 

Pin_All=[pin5,pin8,pin11,pin12]

 

#轉速(ms) 數值越大轉速越慢 最小值1.8ms

speed=5

 

STEPER_ROUND=512 #轉動一圈(360度)的周期

ANGLE_PER_ROUND=STEPER_ROUND/360 #轉動1度的周期

 

isOpen=False#表示窗簾的狀態 True:打開 False:關閉

 

def SteperWriteData(data):

    count=0

    for i in data:

        Pin_All[count].write_digital(i)

        count+=1

def SteperFrontTurn():

    global speed

   

    SteperWriteData([1,1,0,0])

    sleep(speed)

 

    SteperWriteData([0,1,1,0])

    sleep(speed)

 

    SteperWriteData([0,0,1,1])

    sleep(speed)

   

    SteperWriteData([1,0,0,1])  

    sleep(speed)

   

def SteperBackTurn():

    global speed

   

    SteperWriteData([1,1,0,0])

    sleep(speed)

   

    SteperWriteData([1,0,0,1])  

    sleep(speed)

   

    SteperWriteData([0,0,1,1])

    sleep(speed)

 

    SteperWriteData([0,1,1,0])

    sleep(speed)

 

def SteperStop():

    SteperWriteData([0,0,0,0])

   

def SteperRun(angle):

    global ANGLE_PER_ROUND

 

    val=ANGLE_PER_ROUND*abs(angle)

    if(angle>0):

        for i in range(0,val):

            SteperFrontTurn()

    else:

        for i in range(0,val):

            SteperBackTurn()

    SteperStop()

   

while True:

    light=pin0.read_analog()#讀取光敏傳感器傳遞過來的模擬量數據

    #數值越大說明光照度越小

    if light>400:

        if isOpen:

            isOpen=False

            SteperRun(-360)#光照小於設定的值,關閉窗簾

    else:

        if isOpen==False:

            isOpen=True

            SteperRun(360)#光照大於設定的值,打開窗簾

 

 

  

Micropython Turnipbit自動窗簾模擬系統