可動式フロントカメラを自作する

あむちょです。

引き続き車いじり。

PR アプリ作ってます

乗ってる車はホンダのシャトルで、FF車ゆえフロントノーズは短いのでフロントカメラが必要になる場面はあまりありません。

長いfit

なんとなく付けてみたかったのでついでにArduinoで動かしてやります。

完成品はこんな感じ。

目次

フロントカメラの取り付け

使ったのはアルパイン製のサイドカメラです。

フロントカメラ用だと魚眼レンズが多く、距離感がわかりにくいので普通のサイドカメラを使ってます。

そのかわり写る範囲が狭くなるので動かしてカバーしてやります。

汎用のカメラステーにsg90サーボモーターで取り付けてあるだけです。

フロントカメラステー

sg90サーボーモーターは防水ではないので接着剤でもりもり。

この状態で2年ぐらい乗ってるけど、今のところ不具合はないです。

カメラの配線は写真のとこから車内に引き込んでます。

配線ひきこみ

映像はナビに写したかったので、バックモニターの入力線とリバース信号線を取り出してやります。

ナビをとりはずす必要があります。ナビにたどりつくまで少し面倒。

内装はずし

リバース信号に12vかけてバックモニターの入力線にフロントカメラの映像信号を流してやればナビに好きな時に表示できます。

ペダル

フットスイッチをつけて、一回踏むとフロントカメラ、もう一回でバックカメラ、もう一回でナビに戻る動作にしてあります。

Arduinoで制御

やってることは単純で

フットスイッチが押される。

リレーを制御してリバース信号に12vをあたえ、バックカメラ入力線をフロントカメラの信号にリレーで切り替える。

もう一度フットスイッチが押される。

バックカメラ入力線にバックカメラの信号にリレーで切り替える。

もう一度フットスイッチが押される。

リバース信号に12vを加えるのをやめる。

それと可変抵抗の電圧をAD変換してサーボモーターをまわし、カメラの向きを変えてやります。

回路

回路図は例によってありません。

気をつけるところはリバース信号に逆流防止用にダイオードをつけておかないとバックランプがついてしまうかも。

ソースコード

フットスイッチは、割り込みで制御してあります。

#include <Servo.h>
#include <math.h>

#define RVS 12
#define VIDEO 11

volatile int videoCnt = 0;

#define SRVNUM 5
Servo srv;
int oldVal[SRVNUM];
int oldServoVal = 0;

int servoValue = 0;
boolean servoFlag = false;

void setup() {

  //reverse
  pinMode(RVS,OUTPUT);
  digitalWrite(RVS,LOW);

  //video selector
  pinMode(VIDEO,OUTPUT);
  digitalWrite(VIDEO,LOW);
  
  //pin 2 pull up
  pinMode(2,INPUT_PULLUP);
  attachInterrupt(0, fall, FALLING);

  srv.attach(3);

  Serial.begin(115200);
  
  int n = 0;
  for(n=0;n<SRVNUM;n++){
    oldVal[n] = 0;
  }
  
}

void loop(){
  
  servo();
  
  if(Serial.available()){  // if recived serial signal
    checkSerial();
  }
  
  delay(10);
  
}

void servo(){
  
  int val = analogRead(0);
  val = (float)val/1024.0*180;
  
  int n= 0;
  int sum = 0;
  for(n=0;n<SRVNUM-1;n++){ oldVal[n] = oldVal[n+1]; sum += oldVal[n+1]; } oldVal[SRVNUM-1] = val; sum += oldVal[SRVNUM-1]; //analogWrite(9,val); val = sum/SRVNUM; if(val > 165)val = 165;
  else if(val < 0)val = 0; oldServoVal = val; if(abs(oldServoVal-val) > 10)servoFlag = false;
  
  if(servoFlag)srv.write(servoValue);
  else{
    srv.write(val);
  }
  
}

void fall() {
  
  videoSelector();
  
}

void videoSelector(){
  
  videoCnt++;
  if(videoCnt > 2)videoCnt = 0;
  
  switch(videoCnt){
    case 0:
      digitalWrite(RVS,LOW);
      digitalWrite(VIDEO,LOW);
      break;
    case 1:
      digitalWrite(RVS,HIGH);
      digitalWrite(VIDEO,HIGH);
      break;
    case 2:
      digitalWrite(RVS,HIGH);
      digitalWrite(VIDEO,LOW);
      break;
    default:
      digitalWrite(RVS,LOW);
      digitalWrite(VIDEO,LOW);
      break;
  }
  
  /*char buf[2];
  sprintf(buf,"%d",videoCnt);
  Serial.println(buf);*/
  
}

void checkSerial(){
  
  char str[255];
  recvStr(str);
    
  if(strstr(str,"servo")){
    char *tok,*e;
    char buf[50];
    
    tok = strtok(str,",");
    tok = strtok(NULL,",");
    
    servoValue = atoi(tok);
    servoFlag = true;
  }
  
}

void recvStr(char *buf){
  
  int i = 0;
  char c;
  while (1) {
    if (Serial.available()) {
      c = Serial.read();
      buf[i] = c;
      if (c == '\n') break; 
      i++;
    }
  }
  buf[i] = '\0';  // \0: end of string
}

サーボによる移動が終わったらスリープさせておくこともできるけど、他のことにもつかってるのでスリープさせてないです。

見通しの悪い交差点なんかでナビの大きな画面に表示できるのは便利だけど、カメラは基本右向きにしてあるので

動かす必要性はあまりない

[ad][ad]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です