Arduino制御
LM393コンパレータ制御
同ブログ:【アンテナローテーター製作(方向検知・方向制御)2】
動画
※野鳥の鳴き声がします。
アルパイン製中空軸ボリューム値をArduinoで読取り、アンテナ方向を制御するローテーター・コントローラを製作しました。
●同ブログ関連記事:【アンテナローテーター製作(方向検知・方向制御)2】【自作アンテナローテーター ベランダ設置】
●アンテナ回転方向検出ボリュームにアルパイン製中空軸ボリュームRK39A1A00028全回転角度270度5kΩを使用しました。データシート:【https://tech.alpsalpine.com/j/products/detail/RK39A1A00028/#ancFig1】
コントローラー製作
エンコーダーよりアンテナ方向を指定してモータを回転させ中空軸ボリューム値がアンテナ方向値と一致したらモータを停止させる。
モータドライバ DRV8833
VCC(モータ電圧) 3V-10V
モータ回転時:約9V(0.02A)
IN1 IN2 OUT1 OUT2
L L OFF OFF ストップ
H L H L 正転
L H L H 逆転
ローテーター製作
12V DC 2RPMギアモーター |
ギアモータに電源ケーブルをはんだ。
直径約37㎜x64㎜
購入先:アマゾン【eDealMax 12V DC 2RPMギアモーター高トルク電気マイクロ減速ギアードモーター中心出力シャフト】
継手30x25 |
塩ビパイプ継手(30x25)に突き当たる所まで挿入、ビスでギアモータを固定。
継手30x20 |
塩ビパイプ継手(30x20)に中空軸ボリュームストッパー穴を開けて両面テープを貼り中空軸ボリュームを固定、ボリュームにケーブルをはんだ、緑・黄はボリュームの両端、白は中心。
中空軸ボリュームに塩ビパイプ(13)を通す。
モータシャフトに塩ビパイプ(13)をイモネジ4か所で固定、塩ビパイプ継手(30x20)をモータに挿入しビスで固定。
ペットボトルキャップねじ山に縦方向スリットがあるタイプを使用する(スリットがないタイプのキャップは中空軸ボリュームにカップリング出来ない)写真のように穴を開けてカッターナイフで切込みを入れる。
※紫外線によるキャップ等の劣化対策として自己融着テープ等を巻く。
(キャップに18㎜の穴開けて挿入)
ローテーター接続
ローテーターと中継ケーブル接続は防水ペットボトル内スペースが狭いのでデュポンコネクタ接続(中継ケーブル外被が太いので外被を削って端子圧着)、防水用ペットボトルキャップと塩ビパイプ固定部分に防水Oリングを入れています。
ローテーター塩ビパイプ継手(30x25)と塩ビパイプ(25)x30cmをジョイントしベランダBS・CSアンテナ取付マスト(38Φ)に入れます。
15M接続ケーブル:【富士電線工業 VCTF 0.5sq×5芯 ビニルキャブタイヤコード 】
アンテナ取付
ベランダBS・CSアンテナ取付マスト(38Φ) |
自宅ベランダの[BS・CSアンテナマスト]にローテーターと自作144/430MHz CheapYagiアンテナを取付た様子です。
マスト:アマゾン【マスプロ電工 サイドベース BS・CSアンテナ50cm以下用 溶融亜鉛メッキ SBM45E】
コントローラー操作
OLED上段ポインタはアンテナ方向、下段ポインタはアンテナ方向指定、エンコーダを回すと下段ポインタが移動してアンテナ方向を指定出来ます。
エンコーダSWを押すと 【S】表示
モータが回転して上段ポインタが下段ポインタに向かって移動します。(途中でSWを押すとモータを停止することも出来ます)
上段・下段ポインタが一致すると【S】表示が消えてモータ回転が停止し指定位置にアンテナが向いています。
プログラム(回転270度)
#include <Rotary.h> // https://github.com/brianlow/Rotary
#include <Arduino.h>
#include "OLED_SSD1306.h" // https://github.com/askn37/OLED_SSD1306#start-of-content
OLED_M091P oled;
#define ENC_A 2 //エンコーダ
#define ENC_B 3
Rotary r = Rotary(ENC_A,ENC_B);
#define ENC_SW 4 //エンコーダSW
#define IN1 5 //モータドライバー
#define IN2 6
#define VolPin A0 //ボリュームピン
int Volume;
int start=0;
char disp_bufA[16];
char* TextA[15] = {
"| ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" |",
};
char disp_bufB[16];
char* TextB[15] = {
"| ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" |",
};
int PointerA = 0;
String dispA = TextA[PointerA];
int PointerB = 0;
String dispB = TextB[PointerB];
void setup()
{
Serial.begin( 9600 );
r.begin();
attachInterrupt(digitalPinToInterrupt(ENC_A),rotary_encoder,CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B),rotary_encoder,CHANGE);
//pinMode(ENC_A, INPUT_PULLUP); r.begin()で行われる
//pinMode(ENC_B, INPUT_PULLUP);
pinMode(ENC_SW, INPUT_PULLUP);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
oled.begin();
oled.mirror(); //左右表示反転
oled.flip(); //上下表示反転
oled.setCursor(0, 2);
oled.print(" ");
oled.setCursor(0, 3);
oled.print(" ");
PointerB = 7;
Stop();
start=0;
}
void loop() {
updateDisplayB();
Volume = analogRead(VolPin); //モーター回転位置検知
Serial.println( Volume );
PointerA = Volume/70;
updateDisplayA();
if (digitalRead(ENC_SW) == LOW ){ //モータ on/off
if(start == 0){
start=1;
oled.setCursor(0, 2);
oled.print("S");
}else{
Stop();
start=0;
oled.setCursor(0, 2);
oled.print(" ");
}
delay(500);
}
if(start == 1){
if(PointerA < PointerB){
Left();
}else if(PointerA > PointerB){
Right();
}else{
Stop();
start=0;
oled.setCursor(0, 2);
oled.print(" ");
}
}
delay(100);
}
void updateDisplayA() { //ローテータ位置表示
dispA = TextA[PointerA];
oled.setCursor(1, 2);
oled.print(dispA);
delay(50);
}
void updateDisplayB() { //ローテータ指示位置表示
dispB = TextB[PointerB];
oled.setCursor(1, 3);
oled.print(dispB);
delay(50);
}
void rotary_encoder(){
unsigned char result = r.process();
if (result) {
if (result == DIR_CW) { //エンコーダ回転方向
//if (PointerB < 12){ PointerB++; //回転角度180度の場合
if (PointerB < 14){ PointerB++; //回転角度270度の場合
}
}
if (result == DIR_CCW) {
//if (PointerB > 1){ PointerB--; //回転角度180度の場合
if (PointerB > 0){ PointerB--; //回転角度270度の場合
}
}
}
}
void Stop() { //モータストップ
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
void Right() { //モータ右回転
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
void Left(){ //モータ左回転
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
0 件のコメント:
コメントを投稿