2022年8月19日金曜日

ギアボックスのギア比を変えます

桔梗001をロボコンコートに持って行ってそこで試運転してみました。
「狭い私の部屋ではなく広いコートならば桔梗001もおとなしく見えるかな」と思ったのですがそうはなりませんでした。
スピードが速すぎます。
場合によっては上の電子回路等の構造物を外し、ギアボックスをシャーシーから外しギア比を変える予定です。
現在中速設定ですがこれを低速設定に変えます。
「メンテナンスが楽な形」も目指さなくてはと今更ながらの反省です。

2022年8月17日水曜日

桔梗001 半固定抵抗器Aで両輪の出力を 同Bで左右のバランスを 220817_002

桔梗001 半固定抵抗器Aで両輪の出力を 同Bで左右のバランスを 220817_001の解説です。

220816では 半固定抵抗器Aで右モータの出力を、半固定抵抗器Bで左モーターの出力を調整していました。

それを変えます。

半固定抵抗器Aで全体の出力を、半固定抵抗器Bで左右のバランスを調整します。
4段落目の i j の式を変えました。

桔梗001 半固定抵抗器Aで両輪の出力を 同Bで左右のバランスを 220817_001

#define ENA 9     //9番ピンをENAと定義 右PWM
#define IN1 8     //8番ピンをIN1と定義 右
#define IN2 7     //7番ピンをIN2と定義 右
#define IN3 5     //5番ピンをIN3と定義 左
#define IN4 4     //4番ピンをIN4と定義 左
#define ENB 3     //3番ピンをENBと定義 左PWM
#define DTYA 0    //0番ピンをDTYAと定義 デューティー値A
#define DTYB 1    //1番ピンをDTYBと定義 デューティー値B

void setup() {
  pinMode(ENA,OUTPUT);     //ENAは出力です
  pinMode(IN1,OUTPUT);     //IN1は出力です
  pinMode(IN2,OUTPUT);     //IN2は出力です
  pinMode(IN3,OUTPUT);     //IN3は出力です
  pinMode(IN4,OUTPUT);     //IN4は出力です
  pinMode(ENB,OUTPUT);     //ENBは出力です
  pinMode(DTYA,INPUT);     //DTYAは入力です
  pinMode(DTYB,INPUT);     //DTYBは入力です
}

void analog1(){


 
  int i=256*analogRead(DTYA)/1024*analogRead(DTYB)/512;         //DTYAの電位を読みとり1024で割る(全出力比率)×DTYBの電位を読み取りそれを512で割る(左右バランの中の右比率);
  int j=256*analogRead(DTYA)/1024*(1024-analogRead(DTYB))/512;  //DTYAの電位を読みとり1024で割る(全出力比率)×(1024-DTYBの電位を読み取り)それを512で割る(左右バランの中の左比率) ;

  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
    analogWrite(ENA,i);       //Aモーターの出力指定
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
    analogWrite(ENB,j);       //Bモーターの出力指定
  delay(9999);                //delay 継続したい時間(ミリ秒)

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

  digitalWrite(IN1,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN2,HIGH);     //停止(ブレーキ)
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  delay(1999);

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

}

void loop() {
  analog1();
}

2022年8月16日火曜日

桔梗001のモーターの出力を半固定抵抗器で調整 220816_004

220816_003 の解説です。

220816_001 では半固定抵抗器0の値を使って左右両方のモーターのデューティー値を決めていましたが、
220816_003 では
半固定抵抗器0の値は右モーターのデューティー値 iに
半固定抵抗器1の値は右モーターのデューティー値 jに
反映するようにしました。

これにより、左右モーターの出力を別々の半固定抵抗器で定めることができるようになりました。

桔梗001のモーターの出力を半固定抵抗器で調整 220816_003

#define ENA 9     //9番ピンをENAと定義 右PWM
#define IN1 8     //8番ピンをIN1と定義 右
#define IN2 7     //7番ピンをIN2と定義 右
#define IN3 5     //5番ピンをIN3と定義 左
#define IN4 4     //4番ピンをIN4と定義 左
#define ENB 3     //3番ピンをENBと定義 左PWM
#define DTYA 0    //0番ピンをDTYAと定義 デューティー値A
#define DTYB 1    //1番ピンをDTYBと定義 デューティー値B

void setup() {
  pinMode(ENA,OUTPUT);     //ENAは出力です
  pinMode(IN1,OUTPUT);     //IN1は出力です
  pinMode(IN2,OUTPUT);     //IN2は出力です
  pinMode(IN3,OUTPUT);     //IN3は出力です
  pinMode(IN4,OUTPUT);     //IN4は出力です
  pinMode(ENB,OUTPUT);     //ENBは出力です
  pinMode(DTYA,INPUT);     //DTYAは入力です
  pinMode(DTYB,INPUT);     //DTYBは入力です
}

void analog1(){
  int i=analogRead(DTYA)/4;  // DTYAの電位を読みとり4で割ってiに代入する(DTYAは1~1023で来る。 iは1~255で入力する。);
  int j=analogRead(DTYB)/4;  // DTYBの電位を読みとり4で割ってjに代入する(DTYBは1~1023で来る。 jは1~255で入力する。);

  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
    analogWrite(ENA,i);       //Aモーターの出力指定
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
    analogWrite(ENB,j);       //Bモーターの出力指定
  delay(999);                //delay 継続したい時間(ミリ秒)

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

  digitalWrite(IN1,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN2,HIGH);     //停止(ブレーキ)
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  delay(1999);

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

}

void loop() {
  analog1();
}

桔梗001のモーターの出力を半固定抵抗器で調整 220816_002

先のスケッチ 220816_001の解説です。

1 元気な乾電池4本では6Vもの電圧が出てしまい、それは130型モーターにとっては大きすぎます。
せめてPWM(Pulse Width Modulation)の仕組みで入力される電力を落としてやりたいと思います。

2 乾電池の元気さは刻一刻とかわりますので、PWMのデューティー値はプログラムを書き換えるよりむしろ半固定抵抗器で簡単に変えられるようにしたいと思います。

3 左右のモーターには個性があり、同じ電圧をかけても回転数が異なり真っ直ぐ進みません。次の段階(220816_003)では上記1と2の仕組みを左右別々のモーターにつけたいと思います。

------------------
#define DTYA 0    //0番ピンをDTYAと定義 デューティー値A
Arduinoの0番ピンに前回10kΩの半固定抵抗器を付けました。その可動部分の電極の電位をDTYAと定義します。
デューティー値A の意味を込めました。


  pinMode(DTYA,INPUT);     //DTYAは入力です
「このDTYAピンは入力ピンです」とArduinoに向けて宣言します。


  int i=analogRead(DTYA)/4;  // DTYAの電位を読みとり4で割ってiに代入する(DTYAは1~1023で来る。 iは1~255で入力する。);

「DTYAをアナログで読み込みなさい。それを4で割りなさい。」…ですが、
DTYAの電位は1024段階で得られます。
しかし後ほど使う i の値は256段階で欲しいです。
よってここで 4で割る という事をします。

桔梗001のモーターの出力を半固定抵抗器で調整 220816_001

#define ENA 9     //9番ピンをENAと定義 右PWM
#define IN1 8     //8番ピンをIN1と定義 右
#define IN2 7     //7番ピンをIN2と定義 右
#define IN3 5     //5番ピンをIN3と定義 左
#define IN4 4     //4番ピンをIN4と定義 左
#define ENB 3     //3番ピンをENBと定義 左PWM
#define DTYA 0    //0番ピンをdtyaと定義 デューティー値A

void setup() {
  pinMode(ENA,OUTPUT);     //ENAは出力です
  pinMode(IN1,OUTPUT);     //IN1は出力です
  pinMode(IN2,OUTPUT);     //IN2は出力です
  pinMode(IN3,OUTPUT);     //IN3は出力です
  pinMode(IN4,OUTPUT);     //IN4は出力です
  pinMode(ENB,OUTPUT);     //ENBは出力です
  pinMode(DTYA,INPUT);     //DTYAは入力です
}

void analog1(){
  int i=analogRead(DTYA)/4;  // DTYAの電位を読みとり4で割ってiに代入する(DTYAは1~1023で来る。 iは1~255で入力する。);

  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
    analogWrite(ENA,i);       //Aモーターの出力指定
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
    analogWrite(ENB,i);       //Bモーターの出力指定
  delay(999);                //delay 継続したい時間(ミリ秒)

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

  digitalWrite(IN1,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN2,HIGH);     //停止(ブレーキ)
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  delay(1999);

  digitalWrite(IN1,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN2,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN3,LOW);      //停止(惰性回転)貫通電流防止のため
  digitalWrite(IN4,LOW);      //停止(惰性回転)貫通電流防止のため
  delay(1);                   //停止(惰性回転)貫通電流防止のため

}

void loop() {
  analog1();
}