ソロでたのしむ

DIY、電子工作、キャンプ用品などの趣味を紹介します

リバース連動オートフリップダウン式モニターの自作~1号機~Arduinoとサーボモータ

 

Arduinoで電動フリップダウンモニターを自作し、車の天井に装着してみました。

現在の完成状態画像↓

JB23ジムニー フリップダウンバックモニター 自作 3
JB23ジムニー フリップダウンバックモニター 自作 4

 

 

ナビ画面でのバックモニターは使いづらい

車でバックする時に後方画像を映し出すバックモニター、ほとんどの車がナビ画面を併用しているのではないでしょうか。


私のJB23ジムニーも、ナビ画面で映すようにしていました。しかし、後退する時に、ナビ画面で確認している間は、目から入ってくる情報が偏ってしまいます。

 以前乗っていた車は、室内ミラーの一部がモニターになっており、後方確認時は視界が前のガラスエリアに向いており、車両前方も視界の中で確認できて安心感がありました。

モニター付きの室内ミラーについて検討

JB23ジムニーの室内ミラーが、前方ガラスにステーがついている最近の構造だったら、室内ミラーごとモニター付きのものに替えていました。

しかしステーが天井についているタイプのため、汎用のモニター付きミラーが使えません。

室内ミラーに被せるタイプのミラー&モニターは使えますが、ミラーが重くなると自重での垂れ下がりや振動がでてしまう可能性があるので、導入を見送りました。

バック専用モニターの設置位置

前方視界の範囲内に設置したいバックモニターですが、室内ミラーとの一体化はあきらめたので、天井付近から吊り下げることになります。

サンバイザーに取付けることを検討しましたが、バイザーとしての機能が無くなるのは困ります。

 残った候補位置は室内ミラーのすぐ前しかありません。

ちょうどArduinoが少しわかってきた頃だったこともあり、モニターを電動で格納して、普段はミラー確認の視界を妨げないようにする事に挑戦します。

モーターの選択

  • DCモーター
  • サーボモーター
  • ステップモーター

の3種類から選択します。

 このうちDCモーターは、モーター自体には位置情報がなく制御が難しいので最初に候補から外しました。

同じ理由で、トルク不足になると脱調をおこすステップモーターも、位置制御に不安要素があるため、一旦は候補から外しました。

こうして一号機は、位置管理しやすいサーボモーターで作成することになりました。

電動フリップダウンモニター試作1号機

最終的に不採用になったので、簡単に紹介します。

サーボーモーターを使用することにした1号機は、ラジコン用のトルク重視のものを選択しています。

 スピード重視のものに比べ、回転速度は落ちますが、モニターを昇降するのに速度は必要ないどころか、それでも早すぎるくらいです。

 

JB23ジムニー フリップダウンバックモニター自作 サーボモーター

写真はサーボモーターを使った機構部ですが、黒いステーが固定部、アルミのステーが可動部でモニターを取り付ける側になります。

 スケッチ(プログラム)は、速度制御が簡単にできるGitHubのVarSpeedServoというライブラリを使います。

 スケッチ全体は、記事の最後にのせておきます。

 しっかり作動していたのですが、サーボモーターを使った一号機にはデメリットがありました。

一号機のデメリット


・電源ON時に、細かく動いてしまう

ラジコンやロボットを制作されている方はご存知のとおり、電源ON時、車でいうとアクセサリー電源ON時とエンジンスタート直後に、雑音(パルス)が入るので、シャカシャカと小さく動いてしまいます。


・作動音が大きい

トルクが太いのはありがたいのですが、内部ギヤの音が大きく、気になります。速度制御している事も、音の発生を助長しています。

 

ステップモーターに変更することを決意

デメリットの2点を改善するために、一度は採用を見送ったステップモーターに変更して2号機をつくることにします。

JB23ジムニー フリップダウンバックモニター ステップモーターに変更

 

solocamptouring.hatenablog.com

参考;サーボモーターを使うスケッチ

#include <VarSpeedServo.h>
VarSpeedServo myservo1; 

void setup() {
  pinMode(10,INPUT) ;  // 車のリバース信号を5Vに落として入力
  pinMode(9,OUTPUT) ;  // サーボと接続中と9番につないだLEDで表示できるようにする
        digitalWrite(9, HIGH);  // サーボと接続中とLEDで表示
        myservo1.attach(8);  // サーボのピンを8番に接続して初期化作動を始める
        myservo1.write(5); 
        myservo1.write(39, 30, true); 
        delay(300);
           myservo1.write(0, 20, true);  
           delay(500);
        myservo1.detach();// サーボと遮断
        digitalWrite(9, LOW); // サーボと遮断したのでLEDを消灯
} 

void loop() {
      if (digitalRead(10) == HIGH) {   //リバースの時
        myservo1.attach(8);  // サーボのピンを8番に接続して作動開始
            digitalWrite(9, HIGH);  // サーボと接続中とLEDで表示
            myservo1.write(77, 50, true); 
            delay(1000);
     } else {                        //リバースではない時
           digitalWrite(9, HIGH);  // サーボと接続中とLEDで表示
           myservo1.write(20, 30, true); 
           myservo1.write(10, 25, true);
           myservo1.write(0, 20, true); 
           while((digitalRead(10) == LOW)){
            delay(500);     
           myservo1.detach();  // モニターが閉じきったらサーボのピンを8番から遮断
           digitalWrite(9, LOW);  // サーボと遮断したのでLEDを消灯
            }
         }
     }