なごるふ

UnityとかArduinoとか気になったことを

MOSFETを使って乾電池1本でモーターを制御してみる

前回の記事で乾電池駆動の回路ができたので基板実装を試したのですが、配線が複雑で時間がかかってしまい、はんだごての酸化もあってAE-TYBLE16とATTiny85を破損させてしまいました。

メンテナンスを試したもののはんだのノリがあまり良くならなかったため、急遽新しいはんだごてを注文しています。

先に乾電池1本化に挑戦するために購入したMOSFETが届いたので、回路の簡略化のためにも乗り換えをしてみようと思います。

開発環境

  • Mac Book (10.13.6)
  • Arduino IDE (1.8.13)

機材一覧

その他 ブレッドボード、ジャンパワイヤ、電池ボックスなど

MOSFET

今回使うMOSFETは、大きな電流を小さな電流で制御できるトランジスタの一種です。

MOSFET1つではモータードライバのような正転と逆転の制御はできませんが、今回実現したいプラレールの制御では逆走までは必要ないので、配線が少なくて済むMOSFETに変更します。

このMOSFETには、電圧をかけると電気が流れるNchタイプと、電圧をかけると電気が止まるPchタイプの2種類があります。

今回は直感的に制御がしやすいNchタイプのものを使用します。

回路作成

これまでモータードライバを接続していたところをMOSFETに置き換え、逆起電力からMOSFETを保護するためのダイオードをモーターに対して並列に配置します。 f:id:nagomi0132:20220203094752p:plain f:id:nagomi0132:20220202144434j:plain

コード

/*
 * ATtiny85 PIN
 * 5/A0  U  VCC
 * 3/A3  |  2/A1
 * 4/A2  |  1/PWM
 * GND   |  0/PWM
 */

#include <SoftwareSerial.h>
SoftwareSerial bleSerial(3, 4); // RX, TX

#define MOTOR_PWM 1

void setup()
{
  bleSerial.begin(9600);
  
  pinMode(MOTOR_PWM, OUTPUT);
  analogWrite(MOTOR_PWM, 0);

  // 周波数調整(個体差あるので要調整)
  OSCCAL = 155; // Default 159
}

String str = "";

// 数値判定
bool isNumber(const char* ascii)
{
  int i;
  for (i=0; i<strlen(ascii); i++)
  {
    if(!isdigit(ascii[i]))
    {
      return false;
    }
  }

  return true;
}

void loop()
{
  while(bleSerial.available())
  {
      char inChar = bleSerial.read();
      if (inChar == '\n' || inChar == '\r')
      {
        if(0 < str.length())
        {
          if(isNumber(str.c_str()))
          {
            // 数値 0-255の範囲に丸め込み.
            int power = atoi(str.c_str());
            analogWrite(MOTOR_PWM, power);
          }
          else
          {
             analogWrite(MOTOR_PWM, 0);
          }
          
          str = "";
        }
        break;
      }

      str += inChar;
  }
}

動作テスト

今回も太陽誘電のアプリを使って255と128と0を送信して動作テストします。

youtu.be

乾電池1本でも無事に動きました。

今回使用したMOSFETは抵抗がかなり小さいものですが、乾電池に直接モーターをつなぐよりも回転が落ちるようです。

さいごに

モーターの回転が弱く動くか心配なので、次はブレッドボードごとプラレールに乗せて動くか確認してみようと思います。