撰寫: 2023/12/30

發佈: 2023/12/31

Arduino製作簡易自動餵魚器

 

又快到了春節放長假的日子,在以前沒有養熱帶魚時,放長假出外除了防盜,一點都不用掛心家中事務,但現在家裡進了水族缸養了熱帶魚,放長假出外多天不在家,就擔心魚兒會不會餓死,但魚兒又不像貓狗可以帶出門,難不成要連魚缸一齊帶出門嗎?所以就有準自動餵魚器的想法。

其實養魚的人都有這種需求,所以仿間就有很多這種自動餵魚器;因為平常就有在練習創作一些簡易的自動控制,所以就利用Arduino製作簡易自動餵魚器。

 

準備工作

自動餵魚器主要就是要能定時餵魚,所以在此控制的內容相當簡單,所以只需要像Arduino這樣的簡易微控制板再加上G9伺服馬達就就夠了;比較麻煩的反而是餵魚的機械加工及包裝;因此準備了以下材料:

  • Arduino Pro Micro:微控制板,主要採用Arduino Pro Micro是因為它體積較小也較便宜。
  • [pic]Arduino製作簡易自動餵魚器
  • USB cable:供電與連接電腦下載程式。
  • G9伺服馬達:用來轉動餵魚飼料小罐的伺服馬達
  • 杜邦接頭排線:約10cm長度的杜邦接頭排線,最好一邊母接頭,另一邊公接頭;若沒有可以選用兩邊都是母接頭的杜邦排線,在接上公對公排針。
  • 排針:在這主要是用來焊接Arduino的公排針,另外還需要用來固定的母排針。
  • 名片盒:用來裝載Arduino Pro Micro微控制板加上伺服馬達的外殼。
  • [pic]Arduino製作簡易自動餵魚器
  • 中型塑膠曬衣夾:用來製作能將自動餵魚器固定於魚缸邊的夾子。
  • 小型長條形容器(餵魚飼料罐):可以用旅行用的小瓶裝洗髮精、或小塑膠瓶來做為餵魚飼料小罐;在此我採用有蓋的塑膠小試管;記得清洗乾淨,不然魚兒還沒餓死就先被毒死。
  • [pic]Arduino製作簡易自動餵魚器
  • 螺絲與螺母:兩種大小螺絲與螺母用來固定伺服馬達、曬衣夾。
  • 為了機械加工及包裝,所以需準備以下工具:

  • 焊槍
  • 小型鑽孔工具
  • 美工刀
  • 螺絲起子
  • 油性筆:做用來開孔的記號

Arduino電路配置

Arduino可以照以下的電路配置圖直接連結伺服馬達,一般伺服馬達這類的瞬間耗電設備最好採用獨立電源的方式,不然會很容易搶走 Arduino過多的電源,造成Arduino運作不穩,但是我這採用Arduino Pro Micro耗電較少,並且直接採用外接5V DC電源供電,就不會造成供電及運作不穩現象。

[pic]Arduino製作簡易自動餵魚器

將公排針以焊槍焊上Arduino Pro Micro Vcc, GNDPin15腳位位置,一般G9伺服馬達都已經有三線杜邦母接頭的排線,因為Arduino Pro Micro所需pin腳位分布在不同的腳位,所以需要額外的杜邦接頭排線芬接上Arduino Pro Micro,但本身沒有一邊母另一邊公接頭的杜邦排線;所以準備兩邊都是母接頭的杜邦排線,在接上公對公排針連接G9伺服馬達如下圖:

[pic]Arduino製作簡易自動餵魚器

Arduino程式控制

利用Arduino控制餵魚飼料罐餵魚其實很簡單,只要設定固定時間控制G9伺服馬達轉動來回半圈就可以了;投食的時間可以自行修改FISHTIME參數,它採用ms單位,所以在此我是設定一天餵一次,所以設定FISHTIME參數為864000000ms(單位是毫秒,24 小時*60 分鐘/小時*60 秒/分鐘*1000毫秒/秒 = 864000000毫秒)

由於時間間隔相當長,所以我一開始啟動就先轉動投食器一次,並且每10秒閃LED一次。

程式中還有預留一小段可以用單鍵按鈕來測試的buttonPin = A0,只是在實作並沒有加上這個按鈕。

有關程式部分如下:

//--------------------------------------------------------------------

// Fish Feeder

//   by: Philip chang

//   date: 12/20, 2023

//--------------------------------------------------------------------

// NOTE: This Fish feeder base Arduino Pro Micro + G9 Servo.

//--------------------------------------------------------------------

 

 

#include <Servo.h>

 

Servo myservo;  // create servo object to control a servo

                // a maximum of eight servo objects can be created

 

int pos = 0;    // variable to store the servo position

 

int RXLED = 17;             // The RX LED has a defined Arduino pin

// macros (TXLED1, TXLED0) to control that.

// (We could use the same macros for the RX LED too -- RXLED1,

//  and RXLED0.)

const int buttonPin = A0;     // the number of the pushbutton pin

int buttonState = 0;         // variable for reading the pushbutton status

long FISHTIME = 86400000; // 24 hours between feeding

long SERVOPIN = 15;         // pin of the servo object

long endtime;

long now;

 

void setup()

{

  myservo.attach(SERVOPIN); // attaches the servo on pin x

  pinMode(RXLED, OUTPUT);   // Set RX LED as an output

  pinMode(buttonPin, INPUT);

 

}

 

void loop()

{

  int butRead;

  //--- FISHTIME up

  feedfish();

  now = millis();

  endtime = now + FISHTIME;

  //--- FISHTIME not yet (check every 10 sec)

  while(now < endtime) {

    delay(9500);                    // 9.5sec

    TXLED1; //TX LED macro to turn LED ON

    delay(500);                     // 0.5sec

    TXLED0; //TX LED is not tied to a normally controlled pin so a macro is needed, turn LED OFF

    // read the state of the pushbutton value:

    buttonState = digitalRead(buttonPin);

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:

    if (buttonState == HIGH) feedfish();

    now = millis();  

  }

}

 

void feedfish()

{

  //digitalWrite(RXLED, LOW);           // set the RX LED ON

  TXLED0; //TX LED is not tied to a normally controlled pin so a macro is needed, turn LED OFF

  for(pos = 0; pos < 180; pos += 1)   // goes from 0 degrees to 180 degrees

  {                                   // in steps of 1 degree

    myservo.write(pos);               // tell servo to go to position in variable 'pos'

    delay(15);                        // waits 15ms for the servo to reach the position

  }

  //digitalWrite(RXLED, HIGH);          // set the RX LED OFF

  TXLED1; //TX LED macro to turn LED ON

  for(pos = 180; pos>=1; pos-=1)      // goes from 180 degrees to 0 degrees

  {                               

    myservo.write(pos);               // tell servo to go to position in variable 'pos'

    delay(15);                        // waits 15ms for the servo to reach the position

  }

}

機構施工與安裝

機構上最重要的是如何固定G9伺服馬達,至於外部的餵魚飼料罐就是固定在伺服馬達軸上;所以重點是要將伺服馬達固定並將轉動軸露出準備接上餵魚飼料罐;在此選用名片盒作為自動餵魚器的外殼的好處就非常明顯了,因為名片盒透明並且下方已經有一個開孔圓洞了,所以只要略為加工就可以將轉動軸露出並將伺服馬達固定。加工步驟如下:

  • 先將伺服馬達部分穿透過圓洞,馬達長方形框卡住的部分就可以用油性筆繪出需要裁掉的部分,以美工刀就可以加工裁掉多餘的部分,就可以讓伺服馬達長方形框穿過洞口,如下圖:
  • Arduino製作簡易自動餵魚器

  • 鑽出伺服馬達螺絲孔位:伺服馬達長方形框穿過洞口後,就可以清楚看出伺服馬達需要開孔螺絲孔位的位置並以油性筆點出,加以開孔,如下圖:
  • Arduino製作簡易自動餵魚器

  • 螺絲與螺母用來固定伺服馬達,如下圖:
  • 內面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • 外面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • 固定餵魚飼料罐:將飼料罐蓋正中鑽出螺絲孔位,將其固定在伺服馬達軸上,如下圖:
  • 內面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • 側面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • 鑽出塑膠曬衣夾螺絲孔位:將曬衣夾貼近名片盒最邊框,從內部透明部分就可以清楚看出需要開孔螺絲孔位的位置並以油性筆點出,加以開孔,如下圖:
  • Arduino製作簡易自動餵魚器

  • 螺絲與螺母用來固定塑膠曬衣夾,如下圖:
  • Arduino製作簡易自動餵魚器

  • 連結Arduino公排針與伺服馬達:接上10cm長度杜邦接頭排線。
  • 開孔Arduino USB接頭位置:將Arduino Pro Micro置於上角,用油性筆確認Arduino USB接頭開孔位置,以鑽孔工具開孔並以美工刀就可以加工裁掉多餘的部分,同樣名片盒上蓋也可加工裁掉多餘的部分,如下圖:
  • Arduino製作簡易自動餵魚器

  • 固定Arduino板:Arduino Pro Micro板並沒有預留螺絲孔位難以固定,在此利用Arduino其他未使用的腳位針孔,可以開孔並穿過公排針,如下圖在上與下個別選取兩個腳位針孔穿過公排針並將排針內壓使所有排針推入盒中,使底面無突出排針:
  • 底面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • Arduino內面相對螺絲孔位可以看到突出公排針,在此以母排針夾緊以固定Arduino板,如下圖:
  • 內面 Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器
  • 上蓋
  • Arduino製作簡易自動餵魚器

  • 加上餵魚飼料罐,成品如下圖:
  • Arduino製作簡易自動餵魚器

 

測試投食份量

只要在飼料罐上開孔,當伺服馬達轉動來回半圈就會投入魚飼料,一開始未考慮清楚開了四個孔(如白色塞住的部分),結果測試的時候發現投入的量太多,而且開孔過高在飼料分布不均的時候,有些開孔就沒有意義。

經過測試後,發現必須讓飼料罐以傾斜角的方式深入魚缸,只要在底部開一個孔就夠了;傾斜的方式也可以幫助魚飼料在很多天的操作可以慢慢滑到底部,不會魚飼料卡在飼料罐中間沒有作用。

[pic]- Arduino製作簡易自動餵魚器Arduino製作簡易自動餵魚器

 

後記

本文為個人學習的經驗,後續有所改進將再發文分享;本人因工作因素發文後並不會經常檢視讀者問題,對於沒法及時回覆問題敬請見諒!

若覺本文對讀者有所幫助,可回覆感想及你的分享!謝謝!

 

 

arrow
arrow
    文章標籤
    Hardwar arduino
    全站熱搜
    創作者介紹
    創作者 Philip4G 的頭像
    Philip4G

    Philip4G四眼仙機的部落格

    Philip4G 發表在 痞客邦 留言(0) 人氣()