2022年9月13日火曜日

BlocklyDuino Editor

ブロック形式でプログラムを作ると・・・
コードを作ってくれる。

ご覧の通り、ブロックには「13番ピンにHIGH/LOW」「1000ミリ秒待つ」しか書いていないのに「pinMode(13, OUTPUT);」まで生成してくれる。

後はこのコードをArduinoIDEにコピペするだけ。

ブロックプログラミング と コードプログラミング の関係もわかり、これはいい勉強になります。

2022年9月11日日曜日

BlocklyDuino インストール

BlocklyDuino インストールしました。

BlocklyDuino Editor から試みます

https://chrome.google.com/webstore/detail/blocklyduino-editor/ohncgafccgdbigbbikgkfbkiebahihmb?hl=ja
ソース生成:可能
動作時のPCとの接続:不要
とのこと。

Arduinoをブロックでプログラミング

現在の私の課題
・Arduinoで自律ロボットを作りたい。
・初心者にその方法を伝えたい。
1.ブロックでプログラミングをしArduinoに書き込むという事を行い
2.それをソースでも表示し
3.段々とソースでプログラミングを行うようにしていきたい。

   によると
BlocklyDuino
   または
mBlock
が有望かな
と思っています。

s4a 使い始めてみたけれど ソース生成ができない

s4a を使い始めました。が…
・ここからArduinoにプログラムを書き込むという機能はない。
・動作時のPCとArduinoの接続:必要
・コード生成:不可
…という事で、私が作ろうとしている「自律ロボット」の開発には不向きなようです。
他をあたります。


2022年9月4日日曜日

Firmwareをダウンロード

から
Firmwareをダウンロードします

S4A 起動

ダウンロードをして起動しました。

次にファームウェアをArduinoに書き込みます。

S4A のダウンロード

scratch の仕組みで Arduino にプログラムを書き込むことができるようにするために
http://s4a.cat/
からソフトをダウンロードします。

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();
}

2022年8月14日日曜日

桔梗001にセンサをつけました

左モーター、右モーターのデューティー値をドライバーで簡単に調節できるように半固定抵抗器10kΩを付けます。
モーターの電源の電池の元気度と左右のパワーのズレをこれで調整します。

タクトスイッチを付けます。いままでArduinoの電源を入れるとすぐプログラムが走り始めてしまいましたが、これで「タクトスイッチが押されたらプログラムスタート」とします。

右・前・左のタッチセンサ(マイクロスイッチ)を使えるようにします。
「if 〇〇のセンサが押されたら then ~~~」というプログラムを組みます。

桔梗001

ロボットに名前をつけます。
「桔梗001」

2022年8月11日木曜日

pwm 220811 006

pwm 220811 004のスケッチで。
左右対称のプログラムなのですが、タイヤと床との摩擦抵抗、モーターやギアの個性により軌跡はかなり“不正確”です。
しかしこれで基本的な前後左右の動きが可能であることがわかりました。

pwm 220811 005

pwm 220811 004のスケッチで
ベンチの上で駆動

PWM(Pulse Width Modulation)004

#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

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は出力です
}

void analog1(){
  int i; i=170;               //0~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);                   //停止(惰性回転)貫通電流防止のため

  digitalWrite(IN1,LOW);     //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);    //逆転
  digitalWrite(IN3,LOW);     //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);    //逆転
  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);                   //停止(惰性回転)貫通電流防止のため

                              //前進・左旋回
  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  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);                   //停止(惰性回転)貫通電流防止のため

                              //後進・左旋回
  digitalWrite(IN1,LOW);      //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);     //逆転
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  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);                   //停止(惰性回転)貫通電流防止のため

                              //前進・右旋回
  digitalWrite(IN1,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN2,HIGH);     //停止(ブレーキ)
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転 
  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);                   //停止(惰性回転)貫通電流防止のため

                              //後進・右旋回
  digitalWrite(IN1,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN2,HIGH);     //停止(ブレーキ)
  digitalWrite(IN3,LOW);      //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);     //逆転
  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);                   //停止(惰性回転)貫通電流防止のため

                              //左超旋回
  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  digitalWrite(IN3,LOW);      //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);     //逆転
  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);                   //停止(惰性回転)貫通電流防止のため

                              //右超旋回
  digitalWrite(IN1,LOW);      //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);     //逆転
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
  delay(999);                 //delay 継続したい時間(ミリ秒)

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

}

void loop() {
  analog1();
}

PWM(Pulse Width Modulation)003

PWM(Pulse Width Modulation)002

#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

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は出力です
}

void analog1(){
  int i;

  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転

  for(i=0;i<256;i++){         //右モーターを段々加速
    analogWrite(ENA,i);
    delay(20);
  }

  for(i=255;i>=0;i--){        //右モーターを段々減速
    analogWrite(ENA,i);
    delay(20);
  }

  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転

  for(i=0;i<256;i++){         //左モーターを段々加速
    analogWrite(ENB,i);
    delay(20);
  }

  for(i=255;i>=0;i--){        //左モーターを段々減速
  analogWrite(ENB,i);
    delay(20);
  }

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

}

void loop() {
  analog1();
}

PWM(Pulse Width Modulation)001

PWM制御 PWM(Pulse Width Modulation)回路とは、パルス幅のデュ-ティ・サイクル(パルス幅のHとLの比)を変え、モーターを制御する回路です。9番ピン ENA の値を0~255に変えることによって、デューティ値を0%~100%に、出力を約0%~100%に変えます。

次の投稿にスケッチを載せます。
右モーターの出力を段々上げ、段々下げ
左モーターの出力を段々上げ、段々下げます。

モーターに保護抵抗を付ける案

FA-130 と L298N との組み合わせについて

大丈夫という説
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10238146550

他、いくつかのサイトが問題にもせずこの組み合わせ工作を紹介している

ヤバいという説
https://elefine.jp/SHOP/L298MODULE.html

https://takeshi-1222.com/entry/Arduino-Nano-DCmotor

奥深い説
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1377296838
----------------------------------------
諸説あり。

----------------------------------------
FA-130RAモーター
operating range 1.5~3.0
nomial 1.5V
突入電流 800mA つまり動き始めるときは800mA必要
駆動電流 500mA
使用電圧範囲 1.5~3.0V
適正電圧 1.5V

モーター両端の抵抗 約0.5Ω(テスターでの実測)
--------------------------------------

との事で「保護抵抗を直列に入れたらいいのではないだろうか」と考えました。(図参照)
電圧V1:L298Nの駆動用電源の入力  
モーター停止時 5.7V
モーター回転時 4.8V
(下記のいずれの抵抗器を使った時もほとんど変わりませんでした)

保護抵抗 :R 0Ω  5Ω  10Ω
と交換しV2を測定、目視観察をしました。

R=0Ω  V2=3.2V  回転は元気いっぱい。
R=5Ω  V2=3.2V  回転はややおとなしいか?あまり変わらず。
R=10Ω  V2=3.2V 回転はややおとなしいか?あまり変わらず。更に回転し始めるのが左モーター(何も抵抗を付けていない)より1秒ほど遅れる。

考察
V2がどれも3.2Vで変わりないことが意外であった。
R=10Ωで回転の始まりが遅れることは、右モーターの電流が"突入電流"に足りていないせいかと思われる。

結果
この問題は棚上げとする。
とりあえずは抵抗はつけなくてもつけてもモーターにかかる電圧はそんなに変わらない。そして大きな抵抗を付けると突入電流の不足から回転し始める時期が遅くなるという事がわかったので。

「保護抵抗」はつけずPWMの実験に入る。

   


2022年8月10日水曜日

Arduino L298N 2moters 220810

L298N でモーターを二つ回す

Arduino と L298N で二つのモーターを回します。
とりあえずセンサは使わず 順次処理にて。
先の投稿はコードのみ投稿しました。併せてご覧ください。

前進 ブレーキ 後進 ブレーキ
右モーターのみ正回転 逆回転
左モーターのみ逆回転 正回転
超旋回左 超旋回右
…と動きます。

写真:
機体はコードを整理してだいぶスッキリしました。
実験を行うため ジャッキアップするための"ベンチ"をアルミ針金で作りました。

これから…
・モーターが元気いっぱいで暴れ馬です。PWMを使うか電気抵抗を入れてもう少しおとなしくさせたいです。
・左右のモーターに個性があるようです。床に置いて両方正回転させても真っ直ぐ進んでくれません。いよいよ左右のモーターの制御をする必要がありそうです。
・センサで制御に進みたいです。

今回の動画を続けて投稿します。

L298N でモーターを二つ回す Arduinoコード

#define IN1 8     //8番ピンをIN1と定義
#define IN2 7     //7番ピンをIN2と定義
#define IN3 5     //5番ピンをIN3と定義
#define IN4 4     //4番ピンをIN4と定義

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

void digital(){

  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
  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);                   //停止(惰性回転)貫通電流防止のため

  digitalWrite(IN1,LOW);     //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);    //逆転
  digitalWrite(IN3,LOW);     //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);    //逆転
  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);                   //停止(惰性回転)貫通電流防止のため

                              //前進・左旋回
  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  delay(999);                 //delay 継続したい時間(ミリ秒)

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

                              //後進・左旋回
  digitalWrite(IN1,LOW);      //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);     //逆転
  digitalWrite(IN3,HIGH);     //停止(ブレーキ)両方HIGH
  digitalWrite(IN4,HIGH);     //停止(ブレーキ)
  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);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
  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,LOW);      //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);     //逆転
  delay(999);                 //delay 継続したい時間(ミリ秒)

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

                              //左超旋回
  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  digitalWrite(IN3,LOW);      //逆転IN3をLOW、IN4をHIGH
  digitalWrite(IN4,HIGH);     //逆転
  delay(999);                 //delay 継続したい時間(ミリ秒)

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

                              //右超旋回
  digitalWrite(IN1,LOW);      //逆転IN1をLOW、IN2をHIGH
  digitalWrite(IN2,HIGH);     //逆転
  digitalWrite(IN3,HIGH);     //正転IN3をHIGH、IN4をLOW
  digitalWrite(IN4,LOW);      //正転
  delay(999);                 //delay 継続したい時間(ミリ秒)

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

}

void loop() {
  digital();
}

Arduino スケッチをコピペで使う その方法


公開されているコード・・・
から
コードをコピペして使う方法です。

N2022 に向けて

このブログの読者の皆さんの何人かはN2022大会に出場予定かと思います。
コートのイメージとその自律ロボットに求められるであろう最低限のフローチャート(案)を載せます。

ミッション:G地点からA地点に向かい、A地点でアイテムをコンテナに入れる。その後G地点に帰還する。

G地点からA地点の距離は約1500㎜です。
この距離はG地点でのスタート時にて矢を射るように"正確に"方向を定め出発させれば何とかなる距離かと思います。
ロボットの姿は
「左右の駆動タイヤを直結してモーター一つで動かす。できる移動は前進と後進のみ。センサは前方に一つ。A地点への到着を感知するのみ。」
です。

しかし、私は折角ですので「ロボットがセンサで方向を定め、進む仕組み」を目指したいと思います。
惑星探査機が大砲のように最初に照準を合わせて飛ばしたのではなく、恒星の位置を観測し自らの進路を定めて進んだように。

とりあえず「壁伝いネズミロボット」をArduinoで再現することを目指します。

2022年8月9日火曜日

ロボット機械部分工作220809_006

機械部分工作 一段落

これから行う事
・配線の整理
・二つのモーターをArduinoで制御する。(順次処理)
・マイクロスイッチも使って制御する(条件分岐処理)

ロボット機械部分工作220809_005

マジックテープで電源とブレッドボードを取り付けました。
https://amzn.to/3Pe3qvA
2階の電源の上に更にブレッドボードを取り付けます。

ロボット機械部分工作220809_004

電子回路を乗せるために、2階建てにします。
2階部分は前方から モータードライバー、Arduino、Arduino駆動のための電源 です。

ロボット機械部分工作220809_003

前方の"バンパー"の動きが少々重いため、マイクロスイッチを裏返しに付け替え、支点~作用点の距離を短くしました。

ロボット機械部分工作220809_002

アルミニウムの針金、#12 直径約2.5㎜ (ホームセンター、百均 で購入) を使い、左側面に加え、前方、右側面に"バンパー"を付けます。
これによって「If 前方の物体と接したら then ~」ということができるようになります。

ロボット機械部分工作220809_001

タッチセンサーとしてマイクロスイッチを使用します。
今まで左側面だけだったところに、右側面、前方、を加えます。

2022年8月8日月曜日

L298Nモータードライバー

L298N モータードライバー の働き

Arduinoは出力する電流値の総和が限られています。
Arduinoに直接大電流を必要等するモーターをつなげると、Arduinoが壊れてしまいます。
そこでその間の仲立ちをするのが「モータードライバー」です。
L298N はそのモータードライバーの一つです。

12V と GND にモーターを動かすための電源をつなぎます。どうやら5V以上必要な様子です。

IN1 と IN2 に入った信号で OUT1 と OUT2 の電圧をコントロールして一号モーターを駆動します。
IN3 と IN4 に入った信号で OUT3 と OUT4 の電圧をコントロールして二号モーターを駆動します。
このドライバー一つで二つのモーターの制御が可能です。

IN1~IN4 はArduinoに
OUT1~OUT4はモーターにつなぎます。

IN1  IN2 片方に High を、もう片方に Low を送ると
OUT1 OUT2 の片方がプラス もう片方がマイナスとなり
モーターは 正転 または 逆転します。

IN1 IN2 両方に High を送ると、どうやらOUT1とOUT2は導通になるようです。モーターは停止(ブレーキ)となります。

N1 IN2 両方に Low を送ると、どうやらOUT1とOUT2は不通になるようです。モーターは停止(惰性回転)となります。

他のドライバーの使用上の注意ですが
「正転、逆転、ブレーキ 間で即切り替えてはいけない。貫通電流が流れてしまうから。よって、必ずその間に 1μ秒でいいから 停止(惰性回転)を入れる事」
だそうです。

このL298Nでも同様の注意が必要なのか不必要なのかはわかりません。
とりあえず、この注意点を守っていきたいと思います。

L298N Arduino でFA-130モーターを回す

回路図です。
Arduino
電源は"スマートフォン用乾電池式充電器"を使用。
単三乾電池4本で5.0V±0.25Vの出力電圧が得られるとの事。
ArduinoのGND とモーター動力用電源(乾電池)のマイナスを接続。

Arduino出力8番ピン→L298N入力1番ピン
Arduino出力9番ピン→L298N入力2番ピン

L298Nモータードライバー
電源は単三乾電池4本を使いました。※詳細は後述します。
OUT1 と OUT2 にFA-130型モーターを接続。

※モーター用の電源について
最初、モーター用電源は乾電池2本=3ボルトにしました。しかし動きません。
おそるおそる、乾電池4本=約6ボルトにしたところ、モータードライバーの赤いLEDが点灯し(こんなところにあったのかぁ)思い通りに動きました。
乾電池3本=約4.5ボルトではLEDは点灯しますがモーターは動きません。
どうやら動力側の電源は(多分)5V以上必要の様です。
しかし、気のせいか、動かしているうちにモーターが焼けるような特有な臭いが漂ってきました。
モーター側に抵抗等入れる事を検討します。
短時間の実験ならば大丈夫な様子です。

2022年8月7日日曜日

Arduinoスケッチ「約5秒正転、約2秒停止、約3秒逆転、約2秒慣性」

#define IN1 9     //9番ピンをIN1と定義
#define IN2 8     //8番ピンをIN2と定義

void setup() {
  pinMode(IN1,OUTPUT);     //IN1は出力です
  pinMode(IN2,OUTPUT);     //IN2は出力です
}

void digital(){
  digitalWrite(IN1,HIGH);     //正転IN1をHIGH、IN2をLOW
  digitalWrite(IN2,LOW);      //正転
  delay(4999);                //delay 継続したい時間(ミリ秒)

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

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

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

  digitalWrite(IN1,LOW);      //逆転
  digitalWrite(IN2,HIGH);     //逆転
  delay(2999);

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

  digitalWrite(IN1,LOW);      //停止(惰性回転)
  digitalWrite(IN2,LOW);
  delay(2000);
}

void loop() {
  digital();
}

モータードライバーのプログラミングの注意

2020年8月13日 ノートより
モータードライバー TA7291 では次の事が禁止されている。
*******************
正転⇔逆転
逆転⇔ブレーキ
ブレーキ⇔正転
*******************
IC内部に貫通電流が流れてしまうためである。
これらの操作をするときにはその間に100μ秒程度のストップモードを入れる事。
https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/ta7291.pdf
9頁参照


よってプログラムとしては次のようになる。
(Arduinoの時間設定はミリ秒なので 100μ秒≒1000μ秒=1ミリ秒 として)

----------------------------------------------------------
希望の動き        プログラム    IN1 IN2 ミリ秒
----------------------------------------------------------
正転5秒   5000ミリ秒  正転4999ミリ秒  1  0 4999
             ストップ1ミリ秒  0  0  1
----------------------------------------------------------
正転3秒   3000ミリ秒  正転2999ミリ秒  1  0 2999
             ストップ1ミリ秒  0  0  1
----------------------------------------------------------
ブレーキ2秒 2000ミリ秒  正転1999ミリ秒  1  1 1999
             ストップ1ミリ秒  0  0  1
----------------------------------------------------------

モータードライバー L298N ではこの注意点が必要なのか不要なのかきっちりとした記述は見つかっていない。2022/08/07 09:46:01
…が 同じ「H型」の回路構成らしい。注意しておくに越したことはないであろう。

以上のことも注意して製作を進めていく。

2022年8月5日金曜日

Arduino 参考図書

 「これ1冊でできる! Arduinoではじめる電子工作 超入門 改訂第4版」

この本には今回使いたいモータードライバーの扱いは載っていませんが、基本的な扱いを学習することができます。

私はこの第3版を読んでいます。



ギアボックス

 「タミヤ 楽しい工作シリーズ No.93 3速クランクギヤーボックス (70093)」



モータードライバー

 Arduinoで少数のLEDを光らせる程度ならいいのですが、モーターを制御しようとすると大電流でArduinoが傷んでしまいます。

そこでモータードライバーという回路(機械)を通し、

Arduinoがモータードライバーに指示を出す。

モータードライバーはそれを受け、大電流のON・OFFを行うという行動をする。

という仕組みをします。

「VKLSVAN 2個セット L298N DCステッパ モータドライバ コントローラボード モジュール デュアルHブリッジ Arduinoと互換」



Arduino

 小さいながらコンピュータを搭載した回路

比較的多くの人が使っていて、困ったときは助けを求めることができる(かもしれない)UNOを使います。

「Arduino Uno Rev3 ATmega328 マイコンボード A000066 白」



Arduinoで模型用モーターを制御できるようにします

LEDピカピカ→「えるぴか」
ならぬ
モーターぐるぐる→「もーぐる」(?)
から始めます。

壁伝いネズミ・ロボットのシャーシーを左右対称にしました

現在、センサの棒は車体の左側についています。
「右側面の壁に沿っての走行」もできるように棒を右側につけることもできるようにしました。
ラグ版を中央に移動しました。
しかし、配線コードのつけなおし、他の部品と干渉する…等々、結構手間のかかる作業でした。