システムの電源電圧

今まで安定化電源で高め(およそ9V)の電圧でデバッグしてますが、DCモーターはPWMで電圧制御できるからまだしも、ステッピングモーターは5V定格だから、Arduinoシステムの電源電圧の決定しないといけない。

① Arduino本体:Vinは6~12V

② DCモーター : 6V

③ ステッピングモーター:5V

④ 超音波距離センサー:3.3V(Arduino本体から供給)

ということで概ね6Vということで良いだろう。単三4本でアルカリもしくはNiH電池直列で作ろうと思ってますが、デバッグ用の安定化電源はmin 9Vしか出ないから、DC-DCで6V以下に落として、かつ可変電圧にしてデバッグするためにDC-DCコンバーター製作。おそらく今後も必要になるだろうからちゃんと作る。

推奨回路図

裏側(センス線だけが未配線、かつこのままだと可変範囲が反対になるから可変抵抗のGND側と電源側を入れ替えてます)

表側(大容量の電解Cap手持ちで470μF一個しかなかったから、出力側にだけ取り付け、発振防止用の0.1μFは両方に)

出力品質確認(無負荷です、本来は負荷変動時も確認必要)

以上で考えたけど、Arduino自体がVinで4.8Vぐらいまで低下するとまともに動かなくなるようだから、変則的だけけれども結局単三のNiHの5直ということになりそう。

 

admin

超音波レーダーを動かす

URM37の今売られてるのはV4.0、V3系から制御ICも変わっていて使い方も多少異なるようです。

URM37には機能は超音波センサー以外もあるらしいが今使うのは距離センサーでレーダー的に。V4のサンプルプログラムは見つからないのでV5参照、おそらく部品配置同じだから使い方も同じだろうから。

URM37の動作電圧は3.3~5.5VでArduino自身は内部3.3V動作だから、電源はArduinoの3.3V出力から供給して、制御ピンは

// # Pin 3 (Arduino) -> Pin 7 ECHO (URM V5.0)
// # Pin 5 (Arduino) -> Pin 6 COMP/TRIG (URM V5.0)

のように、トリガーはDIOの7、戻りのパルスはDIOの6で受けています。

工場出荷時のデフォルトはTTLになっているのでジャンパー設定は不要、というかジャンパー設定が存在しない。使い方含めて以下のメーカーサイトに記載あります。

https://wiki.dfrobot.com/URM37_V5.0_Ultrasonic_Sensor_SKU_SEN0001_

The factory default settings

  • Serial TTL level
  • Measure mode: PWM trigger
  • Comparison of distance : 0
  • Automatically measure interval time:25ms
  • Internal EEPROM Data are all 0x00
  • the EEPROM address are unavailable: 0x00~0x04, please do not try to modify the data.

一番手間の掛からなそうな、デフォルトのPWM trigger modeで使います。動作確認コードはDIOだけは変更設定して他はほぼそのまま使っています。


// # Editor : roker
// # Date : 05.03.2018

// # Product name: URM V5.0 ultrasonic sensor
// # Product SKU : SEN0001
// # Version : 1.0

// # Description:
// # The Sketch for scanning 180 degree area 2-800cm detecting range
// # The sketch for using the URM37 PWM trigger pin mode from DFRobot
// # and writes the values to the serialport
// # Connection:
// # Vcc (Arduino) -> Pin 1 VCC (URM V5.0)
// # GND (Arduino) -> Pin 2 GND (URM V5.0)
// # Pin 6 (Arduino) -> Pin 4 ECHO (URM V5.0)
// # Pin 7 (Arduino) -> Pin 6 COMP/TRIG (URM V5.0)

// # Working Mode: PWM trigger pin mode.

int URECHO = 6; // PWM Output 0-50000US,Every 50US represent 1cm
int URTRIG = 7; // trigger pin

unsigned int DistanceMeasured = 0;

void setup()
{
//Serial initialization
Serial.begin(9600); // Sets the baud rate to 9600
pinMode(URTRIG, OUTPUT); // A low pull on pin COMP/TRIG
digitalWrite(URTRIG, HIGH); // Set to HIGH
pinMode(URECHO, INPUT); // Sending Enable PWM mode command
delay(500);
Serial.println(“Init the sensor”);

}
void loop()
{
Serial.print(“Distance=”);
digitalWrite(URTRIG, LOW);
digitalWrite(URTRIG, HIGH);

unsigned long LowLevelTime = pulseIn(URECHO, LOW) ;
if (LowLevelTime >= 50000) // the reading is invalid.
{
Serial.println(“Invalid”);
}
else
{
DistanceMeasured = LowLevelTime / 50; // every 50us low level stands for 1cm
Serial.print(DistanceMeasured);
Serial.println(“cm”);
}

delay(100);
}

距離センサーの精度としては、対象物が多少傾いていてもセンターから多少外れてもきちんと距離を出してくれるので使えるセンサーです。

 

admin

 

DCモーターを動かす(w/ PWM)

部品も揃ったので、機能ごとの動作確認を行なっていきます。

まずはDCモーターからですが、両輪の回転差を発生させないと直進しかできないので、ただしモーターの特性は不揃いなので曲がりますが、PWMを使って実質DCモーターへの供給電圧をコントロールすることで、直進性あるいは回転を実現します。

  • PWMに使えるピン 11(D0~D8、D10、A3、A4)
  • 1周期 732Hz

との情報から、D0とD5をPWM制御、D1~D4を回転方向制御に使います。

Arduinoのコードは以下の通り。元のソースではPWMのduty(0~255指定)を可変していますが、電源電圧9.2Vぐらい(デバッグ時は外部の低電圧電源使用)だとdutyが30%以下あたりでモーターは回らなくなるので固定値を使って確認しています。

pinModeのピン番号指定は0から始まります。

————————————————–

// デジタルピンの定義
// pin number start from 0(D0)
const int IN1 = 1;
const int IN2 = 2;
const int IN3 = 3;
const int IN4 = 4;
const int ENA = 0; // PWM制御で使うENAピンをD9に(モーター1のPWM制御ピン)
const int ENB = 5; // PWM制御で使うENBピンをD10に(モーター2のPWM制御ピン)

int i = 0;
int step = 5;

void setup(){

pinMode(IN1, OUTPUT); // デジタルピンを出力に設定
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);

}

void loop(){

digitalWrite(IN1, HIGH); // HIGH LOWの組み合わせでモーター回転
digitalWrite(IN2, LOW); // 2つのモーターを正回転
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);

for(i=0; i<=255; i=i+step){ // PWM制御のデューティー比を指定してモーター回転速度を変える
analogWrite(ENA, 160);
analogWrite(ENB, 160);
delay(50);
}

delay(1000);

digitalWrite(IN1, LOW); // HIGH LOWの組み合わせでモーター回転
digitalWrite(IN2, HIGH); // 2つのモーターを逆回転(上記とは反対に回転)
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);

for(i=0; i<=255; i=i+step){ // PWM制御のデューティー比を指定してモーター回転速度を変える
analogWrite(ENA, 80);
analogWrite(ENB, 220);
delay(50);
}

delay(1000);

}

————————————————–

参考情報及びソースは以下のサイトから。

https://burariweb.info/electronic-work/arduino-learning/arduino-motor-driver-l298n.html#L298N-2`

 

動作の状況は以下の動画から、分かりづらいですが(途中でモーターの回転音が一瞬途切れた時)順方向から逆方向に回転しています。

 

admin

Arduino内蔵のEEPROM

何らかの状態保存しておきたい時に使える不揮発記憶としての使い方。

http://7ujm.net/micro/arduino_eeprom.html

何に使いたいかというと、手元にあったステッピングモーターをサーボモーターの代替えに使いますが、移動量しか知ることができないので次の電源オン時に絶対位置がわからなくなるから電源オフ時に位置情報を保存したかったから。

ステッピングモーター使えばそんなことは考慮不要なのですが。

と思ったらArduino MKR WiFi 1010にはEEPROMないんだ。ということは電源オフ時の処理として、ステッピングモーターの初期化処理(最初の位置に戻す)しないといけない。

admin

Arduino(MKR WiFi 1010)のステッピングモーター制御ライブラリ

ステッピングモーターの制御をどうやってやるのかなと思っていたら、Arduino IDEにはStepper.hというライブラリがあって簡単に制御できるようです。

注意すべき点は、関数の引数の記述でしょうか。

以下のリンクからの引用です。

——————————————————

注意点はStepper(steps,pin1,pin2,pin3,pin4)で使用するピンを選びますすが、

ステッピングの磁励順番ではないので注意です。

記載の順番はSteper(Steps,A,A,B,B)

以下の回路図ならば、

Stepper myStepper(100, 8, 10, 9, 11);

と記述します。

https://electronic.tousekice.com/arduinoでステッピングモーターを回す%E3%80%82/

https://omoroya.com/arduino-lesson28/

<P.S>

動きが変(予定移動量のほぼ半分しか動かないし、脱調しているように正確に刻まない)だなと思っていたら、出力をLowにしてもD11はHighのままであることにドライバ基板上のledでわかった。設定方法が他のビットとは違うのかもしれないけど、D12も同じでD13は制御可能だったから11 -> 13に変更したら思った通りに動作するようになりました。D11/12はI2C用のピンであることと関連があるのかも知れない。

 

admin

 

仕様変更

誰かがレーダー(超音波センサ)の首を振らせていたので、急遽ステッピングモーターを追加して首振り仕様に変更します。

超音波センサーはakizukiにオーダーしたけど、納期は遅いように思う。

 

admin

Arduino電源をどうする

Arduino MKR WiFi 1010に使われているBQ24195は入力電圧範囲が仕様によると、

・3.9-V to 17-V Input Operating Voltage Range 

となっているから単三アルカリ4本でモーターを駆動して、モータードライバから出力される公称5V(実測はフレッシュ電池使って4.6Vぐらい)を入力にできそうだから、ロジック用電源としてLi-Po電池は当面不使用。電池電圧落ちてくるとギリギリの感じだから、場合にはよっては電池は4直から6直で電圧を確保することになるかも知れません。

 

これがコネクタ部分の回路図でVIN(pin12)が外部電源入力です。

スクリーンショット 2021-12-14 11.42.08.png

こちらがLi-PO充電制御兼DC-DCコンバーター、内部ロジックは全て3.3Vで動作です。制御チップのVBUSに外部供給電源が接続されますが、USBからの+5Vと付き合わせになっていて、VIN供給時にはUSB側の5Vはカット(Q2A)されます。

スクリーンショット 2021-12-14 11.42.49.png

 

admin

Arduino car用のシャシー(その一)

シャーシーは元々3Dプリンタで制作と考えていましたが取り掛かり。シャーシー無いとモーター駆動のトライアルも不便だし。

FlashPrint5(FlashForgeの制御アプリ)はだいぶインターフェースが変わってるけど初使用。

 

admin

Arduino secret変数処理

Arduino IDEでssid, pwの含まれたヘッダファイルの組み込みの代わりと言っては何ですが、同様の機能の実現手段は以下で対応できるようです。

① Secretタブを追加する

画面では既に作成済みです。

スクリーンショット 2021-12-04 16.15.17.png

② ソースに該当情報を記述する

シークレット対象情報、ここではSECRET_SSIDとSECRET_PASSは全て大文字にしないとダメだと。ソースに27行目と28行目を記述すると自動的にSecretファイルに反映されます。

スクリーンショット 2021-12-04 16.11.02.png

③ Secret情報をSecretタブに入力する

文字列として””で囲んで入力します。

これでコンパイルが無事に終了しました。ソースにこれらの情報を直接盛り込んでももちろんコンパイルは正常終了しますが、クラウド上の管理でソースはオープン(共有)にされることを考慮してSecretタブの内容は別管理扱いされるということです。GitHubのアラームと似たようなものかも。

—————————————————

/usr/local/bin/arduino-cli compile –fqbn arduino:samd:mkrwifi1010 –libraries /home/builder/opt/libraries/latest –build-cache-path 

/tmp –output-dir /tmp/579479944/build –build-path /tmp/arduino-build-E38EFE0B45CCB8581EC071210802C6FF /tmp/579479944/SimpleWebServerWiFi

Sketch uses 21160 bytes (8%) of program storage space. Maximum is 262144 bytes.

Global variables use 3340 bytes (10%) of dynamic memory, leaving 29428 bytes for local variables. Maximum is 32768 bytes.

 

admin

Arduino Web Editorを使う

ほぼデスクトップ版と同じUIに見えますが、ボードの接続状態も見えるのはアドバンテージ。

コードはクラウド上からもインポートは出来ますが、最初のステップのLチカコードをmacからインポートして書き込めば動作しました。

 

スクリーンショット 2021-12-04 10.02.03.png

しかしヘッダファイルを組み込むSimpleWebServerWiFiはヘッダファイルをタブ追加して置いても、組み込めない(コンパイルできない)からこれは継続調査必要。

 

admin