(原) 程小奔升级记

原创文章,请后转载,并注明出处。

2023.10.24

又翻出了程小奔

  1. 如果是磁吸充电,或许可以让它自动到充电位充电
    换个思路,虽然它是固定的usb,但可以想办法改造一下。
    想办法告诉它"充电站"的位置,以便让它自己去充电。比如通过颜色传感器。

2019.10.16 网页中使用编程

之前安装了mlink依然不能在网页中进行连接,与官方沟通后,发现是后台没有启动此服务:sudo mblock-mlink start

作了一个alias cxb,简化启动。

根据Python与网络调用,很快增加了一点功能:通过网页设置在小程屏幕上显示内容

#
# 作者:Ease
# 时间:2019.10.16
# 功能:升级程小奔,让它更智能,更实用
#
import codey, event, time, rocky, random, iot
import urequests as requests

# 变量初始化
Dong = 0
Deng = 0
Statue = 0
Sleep = 0
Li = 0

#A按钮事件
@event.button_a_pressed
def on_button_a_pressed():
    global Dong, Deng, Statue, Sleep, Li
    """A键:启动"""
    Dong = 1
    Statue = 1

#B按钮事件
@event.button_b_pressed
def on_button_b_pressed1():
    global Dong, Deng, Statue, Sleep, Li
    """B键:停止"""
    Dong = 0
    Statue = 0
    codey.display.clear()
    codey.speaker.play_melody('switch.wav')

#C按钮事件
@event.button_c_pressed
def on_button_c_pressed2():
    global Dong, Deng, Statue, Sleep, Li
    """C键:灯的开关"""
    if Deng == 0:
        Deng = 1
        rocky.color_ir_sensor.set_led_color('white')
        # 并行能力有限,循环读取一会儿就停止
        for count in range(400):
            if Li == codey.potentiometer.get_value():
                codey.display.show(Li, wait = False)

            else:
                Li = codey.potentiometer.get_value()
                codey.speaker.play_melody('score.wav')

        codey.speaker.play_melody('right.wav')

    else:
        Deng = 0
        rocky.color_ir_sensor.set_led_color('black')
        codey.display.clear()

#当程小奔启动时
@event.start
def on_start():
    global Dong, Deng, Statue, Sleep, Li
    codey.led.off()
    rocky.color_ir_sensor.set_led_color('black')
    # 启动初始化并反馈
    codey.speaker.volume = (10)
    codey.wifi.start('Ease', 'yjz', codey.wifi.STA)
    codey.speaker.play_melody('wake.wav')
    while True:
        # 齿轮调节驱动力量
        Li = codey.potentiometer.get_value()
        if codey.is_rocky_connected():
            codey.led.off()
            if Dong == 1:
                if rocky.color_ir_sensor.is_obstacle_ahead():
                    codey.display.show_image("0000181c1c1800000000181c1c180000")
                    rocky.backward(Li, 1)
                    rocky.turn_right(Li, random.uniform(0.5, 2))

                else:
                    codey.display.show_image("00003c7e7e3c000000003c7e7e3c0000")
                    rocky.forward(Li)

                if codey.light_sensor.get_value() > 5:
                    rocky.color_ir_sensor.set_led_color('black')

                else:
                    rocky.color_ir_sensor.set_led_color('white')

                Sleep = 0

            else:
                rocky.stop()
                Sleep = Sleep + 1
                if Sleep//2000 == 1:
                    if codey.wifi.is_connected():
                        res = requests.get(url='http://s.scwy.net/cxb/Get')
                        codey.display.show(res.text, wait = False)
                        time.sleep(3)
                        codey.display.show("", wait = False)
                # 当静止不动太久,随机时间反馈一点声音和图案
                if Sleep > random.randint(50000, 100000):
                    codey.speaker.play_melody('meow.wav')
                    codey.display.show_image("00003c7e7e3c000000003c7e7e3c0000", time_s=0.5)
                    codey.display.show_image("00103030303010000010303030301000", time_s=0.5)
                    codey.display.clear()
                    Sleep = 0

        else:
            codey.led.show(255, 0, 0)

        if codey.motion_sensor.is_shaked():
            if codey.wifi.is_connected():
                codey.display.show(iot.weather('2158433', '1'), wait = False)

            else:
                codey.speaker.play_melody('wrong.wav')

@event.greater_than(60, 'sound_sensor')
def on_greater_than():
    global Dong, Deng, Statue, Sleep, Li
    """对外界声音的反馈:启停
    响度值太小时容易被自己的声音影响"""
    if Statue == 1:
        if Dong == 1:
            Dong = 0
            codey.speaker.play_note(60, 0.25)

        else:
            Dong = 1
            codey.speaker.play_note(36, 0.25)

2019.10.15 升级中…

它现在已经能在家里自由奔跑了…

希望我的升级就到这里,孩子能有更好的想法。不过觉得孩子要达到现在这些代码至少要到小三年级了…有点迫不急待的想让他们超过爸爸。

我可以研究的主要是:网络扩展能力,以及它现有的接口扩展。

功能:

  1. A键启动小奔
  2. B键停止小奔
  3. C键开关车灯,并在开灯时,可以调节滚轮,控制小奔的速度(移动力量)
  4. 根据环境灯光的亮度,自己判断是否开车灯
  5. 根据环境声音,自动启动或停止小奔
  6. 遇到障碍物自动避开
  7. 当长时间(随机时长)未使用时,它自己发出声音(现在是猫叫),提醒主人它还活着
  8. 启动过程中可以随时使用滚轮,控制小奔的速度

完善:

  1. 因为它的传感器在下部,所以有时候障碍物在上方时,它不能检测。解决:通过姿态传感器(x,y,z)来统合判断,如果行进过程中,某柱的值没有变化,表示卡起的。可以试图自己脱困(后退),三次尝试失败后,发出警报声。
  2. 因为声音传感器在下方,导致自己拾自己的音。建议官方将拾音器改为向上,朝上开。
  3. 因为(障碍)传感器只有一个,当遇到悬崖时,小奔并不知道,官方可以再加一个传感器,或者另想办法解决。
  4. 来个太阳能充电?

# generated by mBlock5 for codey & rocky
# codes make you happy
import codey, event, time, rocky, random
# initialize variables
Dong = 0
Deng = 0
Statue = 0
Sleep = 0
Li = 0

@event.button_a_pressed
def on_button_a_pressed():
    global Dong, Deng, Statue, Sleep, Li
    """AŒü£ºÆô¶¯"""
    Dong = 1
    Statue = 1

@event.button_b_pressed
def on_button_b_pressed1():
    global Dong, Deng, Statue, Sleep, Li
    """BŒü£ºÍ£Ö¹"""
    Dong = 0
    Statue = 0
    codey.display.clear()
    codey.speaker.play_melody('switch.wav')

@event.button_c_pressed
def on_button_c_pressed2():
    global Dong, Deng, Statue, Sleep, Li
    """CŒü£ºµÆµÄ¿ª¹Ø"""
    if Deng == 0:
        Deng = 1
        rocky.color_ir_sensor.set_led_color('white')
        # ²¢ÐÐÄÜÁŠÓÐÏÞ£¬Ñ­»·¶ÁÈ¡Ò»»á¶ùŸÍÍ£Ö¹
        for count in range(600):
            if Li == codey.potentiometer.get_value():
                codey.display.show(Li, wait = False)

            else:
                Li = codey.potentiometer.get_value()
                codey.speaker.play_melody('score.wav')

        codey.speaker.play_melody('right.wav')

    else:
        Deng = 0
        rocky.color_ir_sensor.set_led_color('black')
        codey.display.clear()

@event.start
def on_start():
    global Dong, Deng, Statue, Sleep, Li
    codey.led.off()
    rocky.color_ir_sensor.set_led_color('black')
    # Æô¶¯³õÊŒ»¯²¢·ŽÀ¡
    codey.speaker.volume = (10)
    codey.speaker.play_melody('wake.wav')
    while True:
        # ³ÝÂÖµ÷œÚÇý¶¯ÁŠÁ¿
        Li = codey.potentiometer.get_value()
        if codey.is_rocky_connected():
            if Dong == 1:
                if rocky.color_ir_sensor.is_obstacle_ahead():
                    codey.display.show_image("0000181c1c1800000000181c1c180000")
                    rocky.backward(Li, 1)
                    rocky.turn_right(Li, random.uniform(0.5, 2))

                else:
                    codey.display.show_image("00003c7e7e3c000000003c7e7e3c0000")
                    rocky.forward(Li)

                if codey.light_sensor.get_value() > 5:
                    rocky.color_ir_sensor.set_led_color('black')

                else:
                    rocky.color_ir_sensor.set_led_color('white')

                Sleep = 0

            else:
                rocky.stop()
                Sleep = Sleep + 1
                # µ±Ÿ²Ö¹²»¶¯Ì«ŸÃ£¬Ëæ»úʱŒä·ŽÀ¡Ò»µãÉùÒôºÍÍŒ°ž
                if Sleep > random.randint(50000, 100000):
                    codey.speaker.play_melody('meow.wav')
                    codey.display.show_image("00003c7e7e3c000000003c7e7e3c0000", time_s=0.5)
                    codey.display.show_image("00103030303010000010303030301000", time_s=0.5)
                    codey.display.clear()
                    codey.led.off()
                    Sleep = 0

        else:
            codey.emotion.uh_oh()

@event.greater_than(60, 'sound_sensor')
def on_greater_than():
    global Dong, Deng, Statue, Sleep, Li
    """¶ÔÍâœçÉùÒôµÄ·ŽÀ¡£ºÆôÍ£
    Ïì¶Èֵ̫СʱÈÝÒ×±»×ÔŒºµÄÉùÒôÓ°Ïì"""
    if Statue == 1:
        if Dong == 1:
            Dong = 0
            codey.speaker.play_note(60, 0.25)

        else:
            Dong = 1
            codey.speaker.play_note(36, 0.25)

2019.10.14 盘古

为我家新客人程小奔(点这里看看它,以及它的由来)升级,让它更智能。或许以后可以加入点其它的,一起让它为家里服务。

在线编程环境,似乎只能谷歌浏览器 https://ide.makeblock.com/

功能:

  1. A键启动小奔
  2. B键停止小奔
  3. C键开关车灯
  4. 根据环境灯光的亮度,自己判断是否开车灯
  5. 根据环境声音,自动启动或停止小奔
  6. 遇到障碍物自动避开

问题或需求:

  1. 环境声音变化时,自己就动或停,需要在A键启动后,再执行此功能。
  2. 长时间没动时,它应该有所反应。
  3. 通过网络接收指令(既然它能够接收天气信息,就能够完成这个功能,不过似乎需要python)

# generated by mBlock5 for codey & rocky
# codes make you happy
import codey, event, time, rocky
# initialize variables
Dong = 0
Deng = 0

@event.greater_than(10, 'sound_sensor')
def on_greater_than():
    global Dong, Deng
    if Dong == 1:
        codey.speaker.play_melody('wow.wav')
        Dong = 0

    else:
        codey.speaker.play_melody('annoyed.wav')
        Dong = 1

@event.button_a_pressed
def on_button_a_pressed():
    global Dong, Deng
    Dong = 1

@event.button_b_pressed
def on_button_b_pressed1():
    global Dong, Deng
    Dong = 0

@event.start
def on_start():
    global Dong, Deng
    while True:
        if Dong == 1:
            if rocky.color_ir_sensor.is_obstacle_ahead():
                codey.display.show_image("0000181c1c1800000000181c1c180000")
                rocky.backward(10, 1)
                rocky.turn_right(10, 1)

            else:
                codey.display.show_image("00003c7e7e3c000000003c7e7e3c0000")
                rocky.forward(50)

            if codey.light_sensor.get_value() > 5:
                rocky.color_ir_sensor.set_led_color('black')

            else:
                rocky.color_ir_sensor.set_led_color('white')

        else:
            rocky.stop()

@event.button_c_pressed
def on_button_c_pressed2():
    global Dong, Deng
    if Deng == 0:
        Deng = 1
        rocky.color_ir_sensor.set_led_color('white')

    else:
        Deng = 0
        rocky.color_ir_sensor.set_led_color('black')

相关文章