鹹魚ZTMR實例—機械臂

鹹魚ZTMR實例—機械臂

1個舵機不過癮,來4個搞搞機械臂。


SG90舵機X4
範圍180°(-90°~90°)
在這裏插入圖片描述

引腳 說明
暗灰(棕色) GND
紅色 5V
橙色 X1

PS2手柄
在這裏插入圖片描述

PS2手柄數字 代表舵機 機械臂狀態
5&7 2號&3號舵機 支架上下運動
6&8 1號舵機 機身左右轉
16(方塊)&14(圓圈) 4號舵機 爪開合

在這裏插入圖片描述

例程:“粗糙機械臂”
main.py

# main.py -- put your code here!
import ps2
from pyb import Servo,delay

#定義舵機
s1=Servo(1)
s2=Servo(2)
s3=Servo(3)
s4=Servo(4)
#定義舵機初始位置
s1.angle(0)
s2.angle(0)
s3.angle(0)
s4.angle(0)



def setServoTurn1(flag1):
    turn_angle1 = s1.angle()
    if flag1:
        #逆時針 值遞增 最大值90度
        turn_angle1 += 10 #每按一次轉10度
        if turn_angle1 <= 90:
            s1.angle(turn_angle1)
    else:
        #順時針 值遞減 最小值-90度
        turn_angle1 -= 10
        if turn_angle1 >= -90:
            s1.angle(turn_angle1)
         

def setServoTurn2(flag2):
    turn_angle2 = s2.angle()
    if flag2:
        #逆時針 值遞增 最大值90度
        turn_angle2 += 10 #每按一次轉10度
        if turn_angle2 <= 90:
            s2.angle(turn_angle2)          
    else:
        #順時針 值遞減 最小值-90度
        turn_angle2 -= 10
        if turn_angle2 >= -90:
            s2.angle(turn_angle2)
            

def setServoTurn3(flag3):
    turn_angle3 = s3.angle()
    if flag3:
        #逆時針 值遞增 最大值90度
        turn_angle3 += 10 #每按一次轉10度
        if turn_angle3 <= 90:
            s3.angle(turn_angle3)          
    else:
        #順時針 值遞減 最小值-90度
        turn_angle3 -= 10
        if turn_angle3 >= -90:
            s3.angle(turn_angle3)
            

def setServoTurn4(flag4):
    turn_angle4 = s4.angle()
    if flag4:
        #逆時針 值遞增 最大值90度
        turn_angle4 += 10 #每按一次轉10度
        if turn_angle4 <= 90:
            s4.angle(turn_angle4)
          
    else:
        #順時針 值遞減 最小值-90度
        turn_angle4 -= 10
        if turn_angle4 >= -90:
            s4.angle(turn_angle4)

#比較粗糙,因爲佔時沒有機械臂的套件測試
#不過4個舵機可以按照要求轉動了到時候微調即可


while True: 
    pyb.delay(100)
    print(ps2.ps2_key())  
    if (ps2.ps2_key()==5):        #5或7  舵機2和3轉
        setServoTurn2(True) 
        setServoTurn3(True)             
    elif (ps2.ps2_key()==7):
        setServoTurn2(False)
        setServoTurn3(False)
    elif (ps2.ps2_key()==6):      #6或8  舵機1轉
        setServoTurn1(True)
    elif (ps2.ps2_key()==8):
        setServoTurn1(False)
    elif (ps2.ps2_key()==16):     #16或14  舵機4轉(爪開合)
        setServoTurn4(True)
    elif (ps2.ps2_key()==14):
        setServoTurn4(False)

 

參考
在這裏插入圖片描述

ps2.py

hon
from machine import Pin
import time
def ps2_test():
  print('test ok')
di=Pin(Pin.cpu.C0,Pin.IN,Pin.PULL_DOWN)                     
do=Pin(Pin.cpu.C1,Pin.OUT, )                                             
cs=Pin(Pin.cpu.C2,Pin.OUT,)     #PULL_UP                                          
clk=Pin(Pin.cpu.C3,Pin.OUT,)   
#D0 16  dat=DI
#D2 04  cmd=DO
#D3  0  CS =CS
#D4  02  CLK=CLK                                                      
def DO_H():
  do.value(1)
def DO_L():
  do.value(0)
def CS_H ():
  cs.value(1)
def CS_L():
  cs.value(0)
def CLK_H ():
  clk.value(1)
def CLK_L():
  clk.value(0)

#常量按鈕
PSB_SELECT     = 1
PSB_L3         = 2
PSB_R3         = 3
PSB_START      = 4
PSB_PAD_UP     = 5
PSB_PAD_RIGHT  = 6
PSB_PAD_DOWN   = 7
PSB_PAD_LEFT   = 8
PSB_L2         = 9
PSB_R2         = 10
PSB_L1         = 11
PSB_R1         = 12
PSB_GREEN      = 13
PSB_RED        = 14
PSB_BLUE       = 15
PSB_PINK       = 16
PSB_TRIANGLE   = 13
PSB_CIRCLE     = 14
PSB_CROSS      = 15
PSB_SQUARE     = 26
# 左搖桿
PSS_RX = 5                
PSS_RY = 6
PSS_LX = 7
PSS_LY = 8
mask=[
PSB_SELECT,
    PSB_L3,
    PSB_R3 ,
    PSB_START,
    PSB_PAD_UP,
    PSB_PAD_RIGHT,
    PSB_PAD_DOWN,
    PSB_PAD_LEFT,
    PSB_L2,
    PSB_R2,
    PSB_L1,
    PSB_R1 ,
    PSB_GREEN,
    PSB_RED,
    PSB_BLUE,
    PSB_PINK]
comd=[0x01,0x42]
data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
def ps2_init():
  CLK_H()
  DO_H()
  time.sleep_ms(10)
def ps2_cmd(cmd):
  global data
  data[1]=0
  for ref in (1,2,4,8,16,32,64,128):
    if ( ref & cmd):
     DO_H()
    else:
     DO_L()
    CLK_H ()
    time.sleep_us(50)
    CLK_L()
    time.sleep_us(50)
    CLK_H ()
    if(di.value()==1):
     data[1]=ref|data[1]
def ps2_red():
  global data
  global comd
  CS_L()
  ps2_cmd(comd[0])
  ps2_cmd(comd[1])
  CS_H()
  if(data[1]==57):
    return 0#red light
  else:
    return 1#not red
def ps2_read():
  global data
  global comd
  byte=0
  ref=0x01
  CS_L()
  ps2_cmd(comd[0])
  ps2_cmd(comd[1])
  for byte in (2,3,4,5,6,7,8):
    for ref in (1,2,4,8,16,32,64,128):
     CLK_H ()
     CLK_L()
     time.sleep_us(50)
     CLK_H ()
     if(di.value()==1):
      data[byte]= ref|data[byte]
    time.sleep_us(50)
  CS_H ()
def ps2_clear():#ok
  global data
  for i in range(0,9,1):
    data[i]=0

def ps2_andata(button):
  global data
  return data[button]
def ps2_key():
  global data
  global mask
  ps2_clear()
  ps2_read()
  handkey=(data[4]<<8)|data[3]
  for index in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):
    if (( handkey&(1<<(mask[index]-1)))==0):
     return index+2
  return 0

到時候補充個機械臂的效果視頻(/捂臉笑)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章