あむちょです。
引き続き車いじり。
乗ってる車はホンダのシャトルで、FF車ゆえフロントノーズは短いのでフロントカメラが必要になる場面はあまりありません。
なんとなく付けてみたかったのでついでに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]