---
# System prepended metadata

title: '**CyberPi程式機**'

---

# **CyberPi程式機**
##  mBot2 按鍵微編程

### 撰寫原因

一般寫程式都會使用到電腦及手機來控制自走車
但是在控制的時候常常發現需要安裝各種軟硬體
導致教學上十分的不方便
因此，決定利用Python來撰寫用CyberPi按鈕來直接控制mBot2的程式
![](https://i.imgur.com/qKIkKwY.jpg =40%x)


### 按鍵思考

想法上先從按鍵設計起
觀察了CyberPi後，發現CyberPi本身就有一些按鈕
上 下 左 右 中 A按鍵 B按鍵
自走車來說其實後退沒甚麼用
上左右就可以完成大部分的路線





### 按鈕規劃

上按鈕 往前
左按鈕 往左90度
右按鈕 往右90度
下按鍵 迴圈
A按鍵  為清除按鍵
B按鍵  為執行程式的按鈕

![](https://i.imgur.com/4ONJMWe.png=30%x )
這樣按鈕規劃就完成了

然後上左右比較容易完成，基本上就是
各個按鍵做完就將指令print到CyberPi的螢幕中
和存入字串中即可

開始的時候先將空字串設定好
```Python=2
import event, time, cyberpi, mbot2,mbuild
# initialize variables
way = 0
n = 0
times=0

@event.start
def on_start():
    global way
    cyberpi.console.println('按下B按鍵開始')
    cyberpi.console.println('按下A按鍵重來')
    way =''
```

上按鍵被按下後 就將上按鍵按鈕寫入字串中
```Python=
@event.is_press('up')
def is_joy_press():
    global  way, n
    way = str(way) + str('↑')
    cyberpi.display.show_label(way, 12, "bottom_mid", index= 0)

```

加入左右按鍵
```Python=

@event.is_press('left')
def is_joy_press2():
    global  way, n
    way = str(way) + str('←')
    cyberpi.display.show_label(way, 12, "bottom_mid", index= 0)
    
@event.is_press('right')
def is_joy_press3():
    global  way, n
    way = str(way) + str('→')
    cyberpi.display.show_label(way, 12, "bottom_mid", index= 0) 
```

但是下按鈕的迴圈
就必須分別 
第一次按下時是印出前括號
第二次按下則是印出後括號
第三次按下按壓次數歸零
程式上如下
```python=

@event.is_press('down')
def is_joy_press1():
    global way, n,times
    times=times+1
    if times==1:
        way = str(way) + str('[')
    elif times==2:
        way = str(way) + str(']')
        times = 0 
    cyberpi.display.show_label(way, 12, "bottom_mid", index= 0)
```



最後是執行按鈕
基本上就是字串從頭讀到尾，但是字串中讀到後括號後開始往前讀
直到前括號才結束，讀到前括號後開始先判斷是否有需要跳出，
如果沒有就繼續在前後括號中間運行指令，如果有就挑出迴圈往下讀，不過由於涉及到讀指令的位置，因此在撰寫前不得不紀錄目前讀到的位置，然後再根據位置判定，這部分就比較需要思考了


### 最後完成的程式碼如下

```Python=2

import event, time, cyberpi, mbot2, mbuild

# 初始化變數
way = ""
start = 0
end = 0
times = 0

@event.start
def on_start():
    cyberpi.console.println('按下B按鍵開始')
    cyberpi.console.println('按下A按鍵重來')

@event.is_press('down')
def is_joy_press1():
    global way, times
    times += 1
    if times == 1:
        way += '['
    elif times == 2:
        way += ']'
        times = 0  # 重置計數器
    cyberpi.display.show_label(way, 12, "bottom_mid", index=0)

@event.is_press('up')
def is_joy_press():
    global way
    way += '↑'
    cyberpi.display.show_label(way, 12, "bottom_mid", index=0)

@event.is_press('left')
def is_joy_press2():
    global way
    way += '←'
    cyberpi.display.show_label(way, 12, "bottom_mid", index=0)
    
@event.is_press('right')
def is_joy_press3():
    global way
    way += '→'
    cyberpi.display.show_label(way, 12, "bottom_mid", index=0)    

@event.is_press('b')
def is_btn_press():
    global way
    n = 0
    for n in range(len(way)):
        if way[n] == '↑':
            mbot2.straight(15)
        elif way[n] == '←':
            mbot2.turn(-90)
        elif way[n] == '→':
            mbot2.turn(90)
        elif way[n] == ']':
            end = n
            while way[n] != '[':
                n -= 1
            start = n 
            while  mbuild.ultrasonic2.get(1) > 10:
                for n in range(start, end): 
                    if mbuild.ultrasonic2.get(1) > 10:
                        if way[n] == '↑':
                            mbot2.straight(15)
                        elif way[n] == '←':
                            mbot2.turn(-90)
                        elif way[n] == '→':
                            mbot2.turn(90)
                    else:
                        mbot2.EM_stop("ALL")  # 當檢測到超聲波距離大於10時，立即停止機器人
                        break  # 立即跳出迴圈
                break
            n = end
            break  # 退出外層迴圈，因為內層迴圈已經完成任務
    way = ''
    cyberpi.display.show_label(way, 12, "bottom_mid", index=0)

@event.is_press('a')
def is_btn_press1():
    cyberpi.stop_other()
```