3D打印件-充电宝支架
由于充电宝准备给树莓派做移动供电电源,但是充电宝光滑的外表不好固定;因此设计了一个支架,用于充电宝的固定。
由于充电宝准备给树莓派做移动供电电源,但是充电宝光滑的外表不好固定;因此设计了一个支架,用于充电宝的固定。
#实验目的:在局域网内,通过在一个树莓派上安装mongo载体,然后设置其他树莓派可远程访问,从而实现多个树莓派之间消息传递,命令传递以及通信对话功能。
如图可见有两个树莓派,分别是120和118;数字的含义其实是他们各自的静态ip,因为涉及到彼此访问,因此需要首先设置静态ip。120的IP地址为192.168.0.120;118的IP地址为192.168.0.118。
#安装mongo 1、由于树莓派的软件源自带mongodb-server的安装包(此处用的是清华的软件源http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian),因此只需要执行2、不过安装的是32bit 的mongodb,数据库的大小会被限制在2GB;因此需要对旧数据添加一个合理的清理机制; 3、安装完成执行命令:sudo apt-get install mongodb-server4、如下图所示则表示安装成功,120和118都需要安装;mongo
#设置通信 1、由于默认ip是127.0.0.1,无法远程连接,因此需要执行编辑配置文件,如果非root需要sudo vim /etc/mongodb.conf 2、寻找bind_ip = 127.0.0.1这一行,注释掉;注释后可见 #bind_ip = 127.0.0.1 3、由于默认登录权限设置是关闭的 对于通信非常的不安全,因此我们需要打开 auth=true这行; 4、由于增加了权限 因此需要增加用户 见下图 5、保存文件,然后重启系统 sudo reboot
#通信实验 1、分别登录118和120机器,然后执行 mongo 192.168.0.120 -u "pi" -p "shumeijiang" --authenticationDatabase admin (其中-u为用户名 -p为密码) 2、然后在120执行 (1)use command (2)db.master.command.insert({_id:1, data:'data', 'status':1}) 3、然后在118机器执行 db.master.command.find({}) 4、可见118读取到消息 { "_id" : 1, "data" : "data", "status" : 1 } 5、同理118在mongo写入一条信息,120执行查询也可见消息; 6、如此实现一个双向的消息同步机制,后续增加消息的读取状态,以及消息的清理机制等。
#更多实验可见 https://www.shumeijiang.com/2021/07/21/树莓派语音识别-物联网实验/
#实验目的:上两次实验试验了基本的前进和转弯动作;这次我们实验两个目标,一个是通过充电宝供电驱动小车转动;另一个目标是组合红外避障传感器,当遇到障碍物时,小车自动停止并后退,以免撞击到障碍物。
#接线效果如图:
#实验代码:
#注:其中驱动类使用解释可参考文章: (1)http://www.shumeijiang.com/2020/05/24/四驱小车驱动实验(一) (2)http://www.shumeijiang.com/2020/05/27/四驱小车驱动实验(二)
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''
import RPi.GPIO as GPIO ##引入GPIO模块
import time ##引入time库
#引入驱动类
from baseAct import baseAct
#实例化驱动类并赋值四个电机所占引脚值
act = baseAct(17, 16, 13, 12, 19, 18, 21, 20)
sensePin = 27 ##红外避障传感器
GPIO.setup(sensePin, GPIO.IN) ##设置为接收模式
##实验开始
try:
while True:
run_time = 0.05 ##执行前端时间 也是障碍物检测间隔时间
status = GPIO.input(sensePin)
if status == 0:
print '发现障碍物'
act.act_backward(0.5, 50, 50) ##检测到障碍物则立即后退
break; ##后退后停止动作
else:
act.act_forward(run_time, 50, 50, True) ##没有障碍物则继续前进
except KeyboardInterrupt:
pass
GPIO.cleanup()
#视频效果如下:
#实验效果: 1、执行代码 Python jiujiang.py; 2、当前方没有障碍物或者离障碍物较远时,小车继续前进; 3、当接近障碍物时,可见小车红外避障传感器探测警告灯亮起,小车则立刻后退,然后停止动作。
#下期预告:下期我们将在此次实验的基础上增加更多的动作,比如遇到障碍物后,停止前进,然后左右转弯寻找没有障碍物的方向,然后继续前进;敬请期待。
#实验目的:在实验(一)的基础上继续探索新的动作;此次实验主要展示左转和右转以及和直行和后退的组合动作。
#接线图以及直行和后退参考文章:http://www.shumeijiang.com/2020/05/24/四驱小车驱动实验(一)/
#左转代码:原理是左前和左后电机后退,右前和右后电机前进。
#右转代码:原理是左前和左后电机前进,右前和右后电机后退。
#方法封装:
#组合动作调用:
#实验效果: 1、执行代码 Python jiujiang.py; 2、可见四个电机直行前进1秒,然后停顿0.5秒(自定义停顿); 3、然后可见左转执行0.2秒,并停顿0.5秒; 4、然后继续直行1秒,停顿0.5秒; 5、紧接着执行右转0.2秒,停顿0.5秒; 6、最后四个电机执行后退1秒; 7、其中方法第一个参数为执行秒数,第二个参数为占空比,第三个为频率。
#视频效果如下:
#实验目的:通过组合四个直流电机和两个电机驱动板以及编写控制代码,实现不同的直流电机集体协作,从而实现预期动作的效果;本篇文章主要实现四个电机的协同前进和后退动作。
#接线效果如图:
#注解:实验通过一个可显示电压的降压模块,以及两个直流电机驱动板,驱动四个直流电机进行动作的执行。 其中驱动原理可参考文章:http://www.shumeijiang.com/2020/05/04/直流电机驱动变速实验/
#关键代码:
#如上图代码可见: 1、每个电机都需要单独实例化PWM,使用PWM的原因是我们希望通过改变占空比从而实现调节电机的转速效果。 2、其中每个电机的高低电平设置引脚都为可变变量,我们只需要通过不同的赋值,即可实现电机的前转和后转效果。 3、前进和后退赋值见下图;
#执行时间设置和动作停止:
#如上图可见: 1、用户可指定前进或后退的执行时间,见代码time.sleep(duration) 2、其中执行时间内,可执行缓冲时间,即在执行时间的最后一段时间,降低占空比,从而实现缓慢停止的效果;当然也可以不加,执行也没有问题。
#封装前进和后退动作以及调用示例:
#驱动类可发送邮件至lee.chuke@foxmai.com获取;
#视频效果如下:
#实验目的:测试PCA9685驱动板同时驱动多个不同类型舵机,实现组合动作或者其他自定义动作的效果。
#接线效果如图:
#注:S90舵机褐色接GND,红色接VCC,黄色接PWM;MG995舵机黑色接GND。
#关键代码
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''
from PCA9685 import PCA9685 ##引入驱动类
import time ##引入time库
pwm = PCA9685() ##实例化
pwm.setsq(50) ##设置输出频率50HZ
pwm.init() ##初始化
pwm.setallangle(0) ##驱动所有舵机归0
#执行动作
serv = [0, 1, 2, 4 ,5] #已连接的舵机
for i in serv:
pwm.setangle(i, 90) #首先到90度
time.sleep(0.4) #停顿
pwm.setangle(i, 0) #执行到0度
time.sleep(0.4)
#执行第二套动作
for i in serv:
pwm.setangle(i, 45) #逐一到45度
time.sleep(0.4)
for i in serv:
pwm.setangle(i, 0) #逐一归0
time.sleep(0.4)
#最后动作
pwm.setallangle(90) #所有舵机执行到90度
time.sleep(0.4)
pwm.setallangle(0) #所有舵机归0
time.sleep(0.4)
#实验效果: 1、执行代码 Python jiujiang.py; 2、可见舵机由左向右,依次完成从0度到90度再到0度的动作; 3、完成动作2后,可见舵机依次先从0度执行到45度;当最后一个舵机执行完成后,从左边向右再依次从45度执行到0度; 4、完成动作3后,所有舵机一起从0度执行到90度,然后再一起执行到0度。
#视频效果如下:
#实验目的:实验采用树莓派+PCA9685驱动板+MG995舵机组合而成;同时封装一个驱动类,通过命令行接收输入的度数从而让舵机转到到指定位置。
#接线效果如图:
#其中驱动板接线示例:
#注:舵机型号不限,只要可外接PCA9685驱动板即可。
#实验代码:
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''
from PCA9685 import PCA9685 ##引入驱动类
import time ##引入time库
pwm = PCA9685() ##实例化
pwm.setsq(50) ##设置输出频率50HZ
pwm.init() ##初始化
pwm.setpwm(0, 0, 4000)
angle = input("angle is:") ##接收用户指令
pwm.setangle(4, angle) ##驱动第四个口的舵机执行命令
#pwm.setallangle(50) ##驱动所有舵机执行命令
#实验效果: 1、执行代码 Python jiujiang.py; 2、可见屏幕输入需要指定度数,输入指定的度数然后回车执行; 3、可见舵机快速转动到指定的位置。
#视频效果如下:
#实验目的:通过树莓派、ULN2003驱动板以及步进电机,实现转动指定步数,以及反向转动等效果。
#接线效果如图:
#关键代码:
#!/usr/bin/env python
#coding:utf-8
'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''
import RPi.GPIO as GPIO ##引入GPIO模块
import time ##引入time库
#定义四个引脚
IN1Pin = 18
IN2Pin = 19
IN3Pin = 20
IN4Pin = 21
#设置为BCM编码 同时四个引脚为输出模式
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1Pin, GPIO.OUT)
GPIO.setup(IN2Pin, GPIO.OUT)
GPIO.setup(IN3Pin, GPIO.OUT)
GPIO.setup(IN4Pin, GPIO.OUT)
#定义初始化
def setVal(val1, val2, val3, val4):
GPIO.output(IN1Pin, val1)
GPIO.output(IN2Pin, val2)
GPIO.output(IN3Pin, val3)
GPIO.output(IN4Pin, val4)
#初始化四个引脚
setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.LOW)
#定义一步需要的操作
def oneStep(dely):
if not dely:
dely = 0.005
setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
time.sleep(dely)
setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
time.sleep(dely)
setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
time.sleep(dely)
setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
time.sleep(dely)
#定义一步(反向)需要的操作
def oneStepBack(dely):
if not dely:
dely = 0.005
setVal(GPIO.LOW, GPIO.LOW, GPIO.LOW, GPIO.HIGH)
time.sleep(dely)
setVal(GPIO.LOW, GPIO.LOW, GPIO.HIGH, GPIO.LOW)
time.sleep(dely)
setVal(GPIO.LOW, GPIO.HIGH, GPIO.LOW, GPIO.LOW)
time.sleep(dely)
setVal(GPIO.HIGH, GPIO.LOW, GPIO.LOW, GPIO.LOW)
time.sleep(dely)
#定义多步操作
def walk(steps, direction):
if not steps:
return ;
if not direction:
direction = 'forward'
for i in range(0, steps):
if direction == 'backward':
oneStepBack(0.005)
else:
oneStep(0.005)
time.sleep(0.01) ##每步间的间隔
#执行步进
try:
steps = input('前进多少步?')
walk(steps, 'forward') ##正向走对应步数
walk(steps, 'backward') ##反向走对应的步数
except KeyboardInterrupt:
pass
GPIO.cleanup()
#实验效果: 1、执行代码 Python jiujiang.py; 2、可见提示需要输入要走的步数; 3、输入100步后,可见步进电机持续转动; 4、正向转动结束后,会立即反向再转动100步,到达期初的位置; 5、具体转动规则可自定义。
#视频效果如下: