提交 e04a9e17 编写于 作者: 福明 提交者: yilu.myl

IssueID:1685:Python example playing with cats

[Detail]
New Python example: playing with cats.

[Verified Cases]
Build Pass: <py_engine_demo>
Test Pass:  <py_engine_demo>
上级 dd5332b6
# 自动逗猫机
养宠物猫的家庭经常遇到“逗猫”的需求:使用逗猫棒或者激光笔引导猫做出类似捕猎的动作,起到锻炼、消耗体力和精力的效果。如果不经常逗猫,精力过剩的宠物猫往往会在夜晚或主人不在家的时候做出各种破坏家具的行为。
<br>
本案例使用激光笔、继电器、步进电机等设备在地面上形成闪烁移动的光点,激发宠物猫的捕猎本能,达到无人操作自动逗猫的效果。
<div align="center">
<img src=./../../../images/playing_with_cats/cat.gif width=50%/>
</div>
<br>
## 准备
1. NodeMCU32S开发板一套<br>
2. ULN2003步进电机控制器一个<br>
3. 28BYJ4步进电机、减速器一套<br>
4. 继电器一个<br>
5. 激光笔<br>
6. 母对母杜邦连接线若干<br>
涉及到的硬件购买链接如下,仅供参考,不负责商家发货的品质保障等问题!
<br>
| 名称 | 数量 | 参考链接 |
| --- | --- | --- |
| NodeMCU32S开发板 | 1 | [NodeMCU32S开发板](https://haas.iot.aliyun.com/solution/detail/hardware?spm=a2cpu.b17028610.0.0.6c2360b1yDodxD&versionId=800C9562896F994200000001&dataId=800C9562896F9942)|
| ULN2003步进电机控制器 | 1 | [ULN2003步进电机控制器](https://detail.tmall.com/item.htm?id=41303683115) |
| 28BYJ4步进电机、减速器 | 1 | [28BYJ4步进电机、减速器](https://detail.tmall.com/item.htm?id=41303683115) |
| 继电器 | 1 | [继电器](https://detail.tmall.com/item.htm?id=530650857798) |
| 激光笔 | 1 | [激光笔](https://item.taobao.com/item.htm?id=541521090282) |
| 母对母杜邦线 | 9 | [母对对母杜邦线](https://detail.tmall.com/item.htm?id=14466195609&ali_refid=a3_430582_1006:1104520036:N:MsF9mE9KLTC2IibWJh+K1A==:21c5b519e28c4b0cd17ec4383141281f&ali_trackid=1_21c5b519e28c4b0cd17ec4383141281f&spm=a230r.1.14.1&skuId=3108214440213) 请选用10cm长即可 |
### 硬件连线图
硬件连线图如下图所示:
<div align="center">
<img src=./../../../images/playing_with_cats/hardware_connection.png width=100%/>
</div>
<br>
## 设备端开发
### 开发环境
在进行下一步之前请确保ESP32开发环境已经搭建完毕。详情请参考[ESP32开发环境](../../../startup/ESP32_startup.md)的说明。
<br>
### 创建解决方案
如下图所示,打开VSCode之后在新建一个基于helloworld的python工程,设定好工程名称(“playing_with_cats”)及工作区路径之后,硬件类型选择NodeMCU32S,点击立即创建,创建一个Python轻应用的解决方案。
<div align="center">
<img src=./../../../images/classifying_rubbish/垃圾分类识别_创建工程.png width=80%/>
</div>
### 代码准备
[自动逗猫机](./code/)目录下的所有脚本进行复制到“playing_with_cats”工程根目录中,然后进行如下设定完成设备端代码的开发。
> Python脚本的详细说明请参考脚本内嵌的文字注释
### 运行结果
本案例会在地面上形成闪烁移动的光点。如果周围有宠物猫,它会一直试图捕捉光点,达到逗猫的效果。
<br>
到此为止,电度表远程抄表案例就已经完成了。如果想学习更多实验,请参考[HaaS案例实践详解](https://gitee.com/haasedu/haasedu/tree/release_2.0)
## 后记
后续可加入定时动作、云端控制、图像识别等功能,形成一套针对宠物店的解决方案。
{
"name": "nodemcu32s",
"version": "1.0.0",
"io": {
"uln2003_a": {
"type": "GPIO",
"port": 27,
"dir": "output",
"pull": "pushpull"
},
"uln2003_a_": {
"type": "GPIO",
"port": 26,
"dir": "output",
"pull": "pushpull"
},
"uln2003_b": {
"type": "GPIO",
"port": 25,
"dir": "output",
"pull": "pushpull"
},
"uln2003_b_": {
"type": "GPIO",
"port": 33,
"dir": "output",
"pull": "pushpull"
},
"relay": {
"type": "GPIO",
"port": 14,
"dir": "output",
"pull": "pushpull"
}
},
"debugLevel": "ERROR",
"repl": "disable"
}
# -*- encoding: utf-8 -*-
from driver import GPIO
from uln2003 import *
if __name__ == '__main__':
relay_dev = GPIO()
relay_dev.open('relay')
a = GPIO()
a.open('uln2003_a')
a_ = GPIO()
a_.open('uln2003_a_')
b = GPIO()
b.open('uln2003_b')
b_ = GPIO()
b_.open('uln2003_b_')
motor_dev= ULN2003(a, a_, b, b_)
while True:
relay_val = 0
# 正转
for i in range(0, 64):
relay_dev.write(relay_val)
if relay_val == 0:
relay_val = 1
else:
relay_val = 0
for j in range(0, 16):
motor_dev.motorCw(4)
# 反转
for i in range(0, 64):
relay_dev.write(relay_val)
if relay_val == 0:
relay_val = 1
else:
relay_val = 0
for j in range(0, 16):
motor_dev.motorCcw(4)
"""
Copyright (C) 2015-2021 Alibaba Group Holding Limited
MicroPython's driver for ULN2003
Author: HaaS
Date: 2022/03/15
"""
from driver import GPIO
from utime import sleep_ms
from micropython import const
import math
class ULN2003(object):
"""
This class implements uln2003 chip's defs.
"""
def __init__(self, a, a_, b, b_):
self._a = None
self._a_ = None
self._b = None
self._b_ = None
if not isinstance(a, GPIO):
raise ValueError("parameter is not an GPIO object")
if not isinstance(a_, GPIO):
raise ValueError("parameter is not an GPIO object")
if not isinstance(b, GPIO):
raise ValueError("parameter is not an GPIO object")
if not isinstance(b_, GPIO):
raise ValueError("parameter is not an GPIO object")
# make ULN2003's internal object points to gpio
self._a = a
self._a_ = a_
self._b = b
self._b_ = b_
def motorCw(self, speed=4):
self._a.write(1)
self._a_.write(0)
self._b.write(0)
self._b_.write(0)
sleep_ms(speed)
self._a.write(0)
self._a_.write(1)
self._b.write(0)
self._b_.write(0)
sleep_ms(speed)
self._a.write(0)
self._a_.write(0)
self._b.write(1)
self._b_.write(0)
sleep_ms(speed)
self._a.write(0)
self._a_.write(0)
self._b.write(0)
self._b_.write(1)
sleep_ms(speed)
def motorCcw(self, speed=4):
self._a.write(0)
self._a_.write(0)
self._b.write(0)
self._b_.write(1)
sleep_ms(speed)
self._a.write(0)
self._a_.write(0)
self._b.write(1)
self._b_.write(0)
sleep_ms(speed)
self._a.write(0)
self._a_.write(1)
self._b.write(0)
self._b_.write(0)
sleep_ms(speed)
self._a.write(1)
self._a_.write(0)
self._b.write(0)
self._b_.write(0)
sleep_ms(speed)
def motorStop(self):
self._a.write(0)
self._a_.write(0)
self._b.write(0)
self._b_.write(0)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册