工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

信頼性の高い自動猫給餌器を自作する – ストレスフリーな猫の世話のためのDIYプロジェクト

必要な部品と材料

部品数量
機械式コンセントタイマー1
ステッピングモーター1
ステッピングモータードライバー L9110S1
リニアシャフトサポート SHF81
USB壁面充電器1
SparkFun Arduino Pro Mini 328 - 5V/16MHz1
USBオス-DIP変換アダプター1
USB延長ケーブル1
ブラケット(コーナーブレース)1

プロジェクト概要

数日間家を空ける際、猫の餌やりは大きな課題でした。友人や親戚に世話を頼むか、市販の自動給餌器を検討しましたが、高価でドライフード専用、かつ大型でスペースを取るものばかり。そこで、コンパクトでウェットフード対応、低コストな自動給餌器を自作することにしました。

ウェットフードは開封後1日で傷むため、1回分の給餌のみを行う設計にしました。これで2日間の不在に対応できます(自由時間ゲット!)。

動作原理

  1. 空のヨーグルト容器にフードを詰め、蓋を閉める
  2. コンセントタイマーを設定し、指定時刻に通電するようセット
  3. 通電するとステッピングモーターが蓋を開け、猫が食事できる
  4. 帰宅後、容器を取り出して洗浄・補充し、再びセットしてサイクル繰り返し
信頼性の高い自動猫給餌器を自作する – ストレスフリーな猫の世話のためのDIYプロジェクト
完成した自動給餌器の外観

主要な製作手順はこの動画で確認できます。

Arduinoコード

Arduino Pro Miniに書き込むファームウェアです。Arduino IDEとFTDIアダプター、Mini-B USBケーブルで書き込みます。書き込み手順の動画も参考にしてください。

コードはシンプルです。セットアップでステッピングモーターを初期回転させ、メインループではボタン押下を検知すると再度回転します。

// Automatic cat feeder made by: J. Rundhall
// Original stepper code from: R. Jordan Kreindler, October 2016
float RPM;
boolean isButtonpressed = false;
unsigned long timee;

// Pin assignments
int buttonPIN = 6;
int aPin = 4;     // IN1
int bPin = 3;     // IN2
int aPrimePin = 5; // IN3
int bPrimePin = 2; // IN4

int one = aPin;
int two = bPin;
int three = aPrimePin;
int four = bPrimePin;

int degrees = 0;
int delay1 = 5;    // ステップ間遅延 (ms)
int delay2 = 200;  // 1回転後の遅延 (ms)
int count = 0;
int numberOfRotations = 1;

void setup() {
  Serial.begin(9600);
  pinMode(6, INPUT_PULLUP); // ボタン
  pinMode(aPin, OUTPUT);
  pinMode(bPin, OUTPUT);
  pinMode(aPrimePin, OUTPUT);
  pinMode(bPrimePin, OUTPUT);
  Serial.println(" Clockwise");
  digitalWrite(aPin, LOW);
  digitalWrite(bPin, LOW);
  digitalWrite(aPrimePin, LOW);
  digitalWrite(bPrimePin, LOW);
  for(int ii=0; ii<20; ii++) doTurn();
}

void loop() {
  int sensorVal = digitalRead(6);
  // プルアップのためロジック反転: 押下時LOW
  if (sensorVal == LOW) {
    isButtonpressed = true;
  } else {
    if(isButtonpressed) {
      isButtonpressed = false;
      doTurn();
      digitalWrite(aPin, LOW);
      digitalWrite(bPin, LOW);
      digitalWrite(aPrimePin, LOW);
      digitalWrite(bPrimePin, LOW);
    }
  }
}

void doTurn() {
  // ハーフステップ駆動シーケンス (8ステップ)
  // 1. aPin HIGH
  digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
  // 2. aPin & bPin HIGH
  digitalWrite(aPin, HIGH); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
  // 3. bPin HIGH
  digitalWrite(aPin, LOW); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW); delay(delay1);
  // 4. bPin & aPrimePin HIGH
  digitalWrite(aPin, LOW); digitalWrite(bPin, HIGH); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, LOW); delay(delay1);
  // 5. aPrimePin HIGH
  digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, LOW); delay(delay1);
  // 6. aPrimePin & bPrimePin HIGH
  digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, HIGH); digitalWrite(bPrimePin, HIGH); delay(delay1);
  // 7. bPrimePin HIGH
  digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, HIGH); delay(delay1);
  // 8. bPrimePin & aPin HIGH
  digitalWrite(aPin, HIGH); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, HIGH); delay(delay1);

  count += 8;
  degrees = (360.0 * (count / 400.0));

  if ((numberOfRotations % 2) == 1) {
    Serial.println(" Clockwise ");
    Serial.println(degrees);
  } else {
    Serial.println(" Anti-Clockwise ");
    degrees = 360 - degrees;
    Serial.print("-");
    Serial.println(degrees);
  }

  if (count == 160) { // 1回転完了 (400ステップの40%? 要確認)
    numberOfRotations++;
    timee = millis();
    RPM = timee / numberOfRotations;
    RPM = (60000.00 / RPM);
    if (numberOfRotations >= 10) {
      Serial.print("RPM:");
      Serial.println(round(RPM));
    }
    delay(delay2);
    count = 0;

    // 回転方向を交互に反転
    if ((numberOfRotations) % 2 == 0) {
      aPin = four; bPin = three; aPrimePin = two; bPrimePin = one;
    } else {
      aPin = one; bPin = two; aPrimePin = three; bPrimePin = four;
    }
    digitalWrite(aPin, LOW); digitalWrite(bPin, LOW); digitalWrite(aPrimePin, LOW); digitalWrite(bPrimePin, LOW);
  }
}

回路図・配線

まず電子部品の配線を行います。半田付けはUSBアダプター基板への電源ケーブル接続のみ2箇所です。230V商用電源に接続する前に、電流制限・測定機能付きのベンチ電源で動作確認することを強く推奨します。誤配線による部品破損を防げます。消費電流は5Vで1A未満であるべきです。

次にコーナーブレースを組み立て、ヨーグルト容器を加工して機構に固定します。

信頼性の高い自動猫給餌器を自作する – ストレスフリーな猫の世話のためのDIYプロジェクト

製造プロセス

  1. 全自動ドリップコーヒーメーカー:歴史、設計、将来動向
  2. DIYサーモカム:教室アイデアからグローバル製品へ
  3. 自動バーフィーダー完全ガイド:特徴・メリット・運用ベストプラクティス
  4. 自動プレス機の理解:機能、メリット、用途
  5. プレスフィーダーの理解:メカニズム、機能、産業用途
  6. 自動パワープレスの特長・メリット・用途:金属成形現場の自動化核心機器
  7. 空圧バーフィーダー:CNC旋盤自動化のコスト効率ソリューション
  8. 自動パイプベンダーの理解:機能、メリット、用途
  9. 自動ロータリーテーブルの理解:金属加工における精度と効率
  10. オートマチックトランスミッション(AT)完全ガイド:種類・構造・仕組み
  11. 自動給油システム(ALS)完全ガイド:仕組み・種類・導入メリット