BeWithYou

胡搞的技术博客

  1. 首页
  2. 不知道算啥分类
  3. 树莓派DIY自动喂食机

树莓派DIY自动喂食机


养了一只柯基,4个月大,工作日中午没法喂饭。网上带远程喂食的机器¥399,虽然不贵但是不并想花这个钱。于是计划用万能的树莓派DIY一个可以远程控制和监控的喂食机。

先看效果:

列出原料List:

  • 树莓派一块,闲鱼收的3B 加上TF卡
  • 电源+microUSB线,用的ipad的头刚好5V2A
  • 步进电机28BYJ4+ULN2003驱动板
  • 杜邦线母对母若干
  • USB免驱渣像素摄像头一个
  • 热熔胶+胶枪,宽胶布,502胶
  • 鞋盒子上剪的硬纸板一块
  • 怡宝大水一桶,快乐水瓶子两个,听装快乐水一罐
  • 方形塑料盒子一个

设计原则构思:

  1. 尽量利用身边的材料,越便宜越好。图吧垃圾佬加点加满
  2. 模块化可拆卸
  3. 可定量投喂,可远程控制,可实时监控

主要难点和解决方法:

  1. 用什么方式来驱动投喂

    电磁铁 + 开关盖子 电压不足,不够灵敏,容易漏 ❌

    步进电机 + 挡板轮 ✔️

    步进电机可以精准控制转速和转角,更加精准控制投喂量

    六边形挡板轮(用易拉罐皮自制)可分为60°一个档,也能防止漏食。大概下面这样:

          _________         
         /\   狗  /\        
        /  \  粮 /  \       
       /____\ 。/____\       
       \    /   \    /      
        \  /     \  /       
         \/_______\/        
    // 6个格子,转到最下面漏出去                         
  2. 移动宽带没有公网IP,如何手机操控

    路由器绑定花生壳ddns,再端口映射给树莓派,花生壳要实名认证麻烦 ❌

    frp内网穿透到有公网IP的虚拟主机 ✔️ 但是速度慢,不稳定,凑合用

  3. 组装

    储量桶 = 怡宝大水桶 ✔️

    瓶盖嵌入到塑料盒子里 = 无缝连接储量桶 ✔️

    步进电机轴插入502硬化的纸板,热熔胶连接纸板和易拉罐做的挡板轮 ✔️

    挡板轮装入塑料盒,热熔胶固定步进电机在外壳上 ✔️

    塑料盒用宽胶布固定在狗笼上 ✔️

    塑料盒下部分挖空,连接可乐瓶当管子 ✔️

  4. 编码

    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拍照后上传到微信永久素材,并发到微信聊天窗口中。演示视频的时候还没有加上,实际已经可以用了。

回到顶部