树莓派机械臂小车,玩具拾捡车(1)

        假期里孩子要做个手工参加学校的活动,正好孩子妈叫弟弟收拾房间,把零落满地的玩具捡到玩具盒里,于是突发想法做个玩具拾捡小车。说干就干,上京东淘个小R树莓派小车,组装之后长这样:


1221845b2e163242b7519efc4bb4f52.jpg

        第一个版本实现功能:直线前进,遇到障碍物停下,用机械臂拾取障碍物,放到左侧的篮子里,然后继续直线前进。
        孩子完全不懂Python,需要在短短十几天内做出上面这个功能,只能先和她沟通想法,然后我实现后再讲解代码给她听,让她先入门,再尝试做一些简单的调整。
        第一个版本的代码如下:

#coding:utf-8
# 首先,让小车一直前进,遇到障碍就停下
# 其次,停下后调整位置,用机械臂夹住障碍物
# 再次左转小车,将机械臂松开
# 最后回调车头,继续前进

import time
from _XiaoRGEEK_MOTOR_ import Robot_Direction
import _XiaoRGEEK_GLOBAL_variable_ as G_val
from _XiaoRGEEK_SERVO_ import XR_Servo
Servo = XR_Servo()
import _XiaoRGEEK_GPIO_ as XR

####################################################
# 函数名称:Get_Distance()
# 函数功能:超声波测距,返回距离(单位是厘米)
####################################################
def Get_Distance():
    time_count = 0
    time.sleep(0.01)
    XR.GPIOSet(XR.TRIG)
    time.sleep(0.000015)
    XR.GPIOClr(XR.TRIG)
    while not XR.DigitalRead(XR.ECHO):
        pass
    t1 = time.time()
    while XR.DigitalRead(XR.ECHO):
        if(time_count < 0xfff):
            time_count = time_count + 1
            time.sleep(0.000001)
            pass
        else :
            print 'NO ECHO receive! Please check connection '
            break
    t2 = time.time()
    Distance = (t2-t1)*340/2*100
    print 'Distance is %d'%Distance
    if (Distance < 500):
        print 'Distance is %d'%Distance
        return Distance
    else :
        print 'Distance is 0'
        return 0 

####################################################
# 函数名称:Avoid_wave()
# 函数功能:超声波避障函数
####################################################
def Avoid_wave():
    dis = Get_Distance()
    print 'Distance is %d'%dis
    if 300>dis>G_val.Radar_distance:
        go.forward()
        return False
    else:
        go.stop()
        return True

####################################################
# 函数名称:Angle_cal()
# 函数功能:舵机控制函数,设置角度保护,防止转到死区
####################################################
def Angle_cal(angle_from_protocol):
    angle=hex(eval('0x'+angle_from_protocol))
    angle=int(angle,16)
    if angle > G_val.servo_angle_max:
        angle = G_val.servo_angle_max
    elif angle < G_val.servo_angle_min:
        angle = G_val.servo_angle_min
    return angle

####################################################
# 函数名称:Pick_up()
# 函数功能:控制机械臂的舵机,将面前的物体拾起
####################################################
def Pick_up(buffer):
    ServoNum = eval('0x'+buffer[1])
    angle  = Angle_cal(buffer[2])
    Servo.XiaoRGEEK_SetServoAngle(ServoNum, angle)

####################################################
# 函数名称:Init_pick()
# 函数功能:设置机械臂初始状态
####################################################
def Init_pick():
    # 底部是1号
    buffer = ['01','01','40']
    Pick_up(buffer)
    # 爪子旋转是2号
    buffer = ['01','02','5A']
    Pick_up(buffer)
    # 机械臂第二节是3号
    buffer = ['01','03','6E']
    Pick_up(buffer)
    # 爪子开闭是4号
    buffer = ['01','04','5A']
    Pick_up(buffer)

####################################################
# 函数名称:Init_pick()
# 函数功能:恢复机械臂初始状态,不重置爪子
####################################################
def Reset_pick():
    # 底部是1号
    buffer = ['01','01','40']
    Pick_up(buffer)
    # 爪子旋转是2号
    buffer = ['01','02','5A']
    Pick_up(buffer)
    # 机械臂第二节是3号
    buffer = ['01','03','6E']
    Pick_up(buffer)

Init_pick()
isStop = False
go = Robot_Direction()
go.forward()
while True:
    go.M1_Speed(10)
    go.M2_Speed(10)
    time.sleep(1)
    isStop = Avoid_wave()
    if isStop == True:
        # 右转0.15秒移动到超声波对应的位置
        go.right()
        time.sleep(0.15)
        go.stop()
        time.sleep(1)
        # 张开爪子
        buffer = ['01','02','45']
        Pick_up(buffer)
        buffer = ['01','04','1A']
        Pick_up(buffer)
        # 停顿一秒再下降到物体位置
        time.sleep(1)
        buffer = ['01','01','16']
        Pick_up(buffer)
        buffer = ['01','03','72']
        Pick_up(buffer)
        # 停顿一秒合拢爪子,并回归原位
        time.sleep(1)
        buffer = ['01', '04', '32']
        Pick_up(buffer)
        time.sleep(1)
        Reset_pick()
        go.left()
        time.sleep(1)
        go.stop()
        # 松开爪子
        buffer = ['01','04','5A']
        Pick_up(buffer)
        go.right()
        time.sleep(0.75)
        go.stop()

        这短短100多行的代码,需要让孩子掌握:
1、导入库
2、函数
3、注释及代码格式
4、循环与判断
5、数组
6、变量与全局变量
7、代码里所有的英文单词

        我教孩子的思路是先解读一遍代码,然后让孩子记下单词。若是单词都不认识,看这些代码只能是天书,这样想来,python被认为是最接近自然语言的编程语言确实有其道理。认识单词也就读懂了代码,想写代码的时候就把思路用单词表现出来,代码也就写好了。
        然后讲解代码格式和注释,这样未来她自己写代码的时候,不至于在代码编写格式上犯错。
        再讲解函数的概念、数组的概念,这两点在这段代码里出现了较多次,也需要花多时间去理解。
        最后简单的讲讲变量、循环、判断、导入库,这些和孩子之前学过的Scratch有对照,很容易就懂了。

你可能感兴趣的:(树莓派机械臂小车,玩具拾捡车(1))