树莓派DIY自动喂食机
养了一只柯基,4个月大,工作日中午没法喂饭。网上带远程喂食的机器¥399,虽然不贵但是不并想花这个钱。于是计划用万能的树莓派DIY一个可以远程控制和监控的喂食机。
先看效果:
列出原料List:
- 树莓派一块,闲鱼收的3B 加上TF卡
- 电源+microUSB线,用的ipad的头刚好5V2A
- 步进电机28BYJ4+ULN2003驱动板
- 杜邦线母对母若干
- USB免驱渣像素摄像头一个
- 热熔胶+胶枪,宽胶布,502胶
- 鞋盒子上剪的硬纸板一块
- 怡宝大水一桶,快乐水瓶子两个,听装快乐水一罐
- 方形塑料盒子一个
设计原则构思:
- 尽量利用身边的材料,越便宜越好。图吧垃圾佬加点加满
- 模块化可拆卸
- 可定量投喂,可远程控制,可实时监控
主要难点和解决方法:
-
用什么方式来驱动投喂
电磁铁 + 开关盖子 电压不足,不够灵敏,容易漏 ❌
步进电机 + 挡板轮 ✔️
步进电机可以精准控制转速和转角,更加精准控制投喂量
六边形挡板轮(用易拉罐皮自制)可分为60°一个档,也能防止漏食。大概下面这样:
_________ /\ 狗 /\ / \ 粮 / \ /____\ 。/____\ \ / \ / \ / \ / \/_______\/ // 6个格子,转到最下面漏出去
-
移动宽带没有公网IP,如何手机操控
路由器绑定花生壳ddns,再端口映射给树莓派,花生壳要实名认证麻烦 ❌
frp内网穿透到有公网IP的虚拟主机 ✔️ 但是速度慢,不稳定,凑合用
-
组装
储量桶 = 怡宝大水桶 ✔️
瓶盖嵌入到塑料盒子里 = 无缝连接储量桶 ✔️
步进电机轴插入502硬化的纸板,热熔胶连接纸板和易拉罐做的挡板轮 ✔️
挡板轮装入塑料盒,热熔胶固定步进电机在外壳上 ✔️
塑料盒用宽胶布固定在狗笼上 ✔️
塑料盒下部分挖空,连接可乐瓶当管子 ✔️
-
编码
PHP有GPIO库
ronanguilloux/php-gpio
。照着网上python代码翻译过来即可。PHP微信公众号库,选用的
overtrue/wechat
。个人订阅号无法认证,功能受限,只能被动接受消息并回复,也无法使用临时素材。凑合用。GPIO驱动步进电机例程:
<?php require_once __DIR__ .'/vendor/autoload.php'; use PhpGpio\Gpio; // 使用脚本逆时针转360° php motor.php -1 360 class Motor { private $gpio = null; // 选用的pin脚号 private $pins = [4, 17, 23 ,24]; // 8步时序更精准 private $seq = [ [ 1, 0, 0, 0 ], [ 1, 1, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 1, 1, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 1, 1 ], [ 0, 0, 0, 1 ], [ 1, 0, 0, 1 ] ]; public function __construct() { $this->gpio = new Gpio(); } private function init() { $gpio = $this->gpio; foreach ($this->pins as $pin) { $gpio->setup($pin, 'out'); $gpio->output($pin, 0); } } private function run($delay, $direction, $angle) { $step = $seqN = 0; $pins = $this->pins; $gpio = $this->gpio; $seqs = $this->seq; $total = $angle * 4 * 1024 / 360; if ($direction == -1) { $seqN = 7; } while ($step < $total) { $step ++; foreach ($pins as $k => $pin) { $seq = $seqs[$seqN]; if ($seq[$k] != 0) { $gpio->output($pin, 1); } else { $gpio->output($pin, 0); } } $seqN += $direction; if ($seqN == -1) { $seqN = 7; } elseif ($seqN == 8) { $seqN = 0; } usleep($delay * 1000 * 1000); } } public function start($direction, $angle) { $this->init(); // 0.002秒已经够短了,再小容易卡住不动 $this->run(0.002, $direction, $angle); $this->gpio->unexportAll(); } } $motor = new Motor(); $file = fopen('/tmp/motor.lock', 'w+'); if (flock($file, LOCK_EX|LOCK_NB)) { fwrite($file, "hello world!"); $motor->start($argv[1], $argv[2]); flock($file, LOCK_UN); }
微信公众号要求5秒内响应,否则会判为异常并重发请求。我们用的frp已经饶了一大圈,再加上电机旋转速度,如果同步调用GPIO程序必定超时。这里使用
pclose(popen())
老方法来实现异步调用motor.php
即可。微信还免费提供语音转文字服务,个人订阅号也有权限用,不错。
加上USB摄像头以后可以使用
fswebcam
拍照后上传到微信永久素材,并发到微信聊天窗口中。演示视频的时候还没有加上,实际已经可以用了。