Turtlebot3 の自作 #3

Turtlebot3 の自作 #3
-- 製作 --

前回の、Turtlebot3 の自作 #2 で書いたように、必要なパーツを揃えて、実際のロボットカーを製作しました。

結局、オンちゃんは、STM32F407 Discovery Kit を止めて、STM32F411 Black Pill を使ってみました。
当初、中華製のSTM32F103 Black Pill で作って、動くようになった所で、 Board が壊れたので、
STM32F411 Black Pill に変更して作りました。

今回は、STM32F411 Black Pill にプログラムを書き込んで、PC(Ubuntu Mate) と USB-TTL-Serial で接続して、
実際の ロボットCAR(Turtlebot3) を動かすように、
teleop key でタイヤを駆動して、Rviz で動いている状態を観察するところ迄です。
もちろん、USB ケーブルでつながってはいますが、実際に動きます。

開発環境
Ubuntu Mate 18.04
Visual Studio Code/ Platformio IDE
Framework: arduino
ROS library: rosserial_arduino
Board: STM32F411 Black Pill  ( WeAct Black Pill V2.0(BlackPill F411CE) )

1. 回路図。
実際の回路図は、下記になります。

img003.jpg

注1) motor-amp の 12V(input) 端子と、バッテーリー DC 12V の SW 後へ、つなげて下さい。
注2) motor-amp の 5V(output) 端子を、 両モータの VCC へ繋げてください。
そうすれば、5V レギュレータは、今は、不要です。
注3) ENAA、ENAB の前に、過電流保護抵抗をいれるべきかも?

STM32F411 Black Pill の DFU bootloader の余談。
USB-Type C を、PC に繋いで、 Boot ボタンを押しながら、Reset ボタンを押して、少し間を置いて、
Boot ボタンを放すと、 DFU boot モードになるみたいですが、
おんちゃんは、何度やっても、 DFU デバイスが現れません。
通常は、 $ dfu-utl -l または、STM32CubeProgrammer で確認できます。
仕方がないので、 PA9,PA10 に、 USB-TTL-Serial を同時に繋いで同じ操作をしたら、やっと、 DFU デバイスが現れました。
もしかしたら、この場合は、 Serial Bootloader が動作しているのかも? 知れませんが、
Platformio IDE から、DFU で書き込みができました。
ネットで散々探したら、記載がありました
どうやら、室温が、25度以上でないと、この現象が現れるとのことです。
温度が低いと、外部水晶発振器が正確に動作しないとの事らしい。
この場合、IC を指で温めれば良いみたいな記載でした?
温めるのは、水晶発振器の方では? ともおもいますが。

2. Turtlebot3 として、遠隔操作を試す。
この状態で、実機のTurtlebot3 として、操作できます。
注) まだPCとケーブルで繋がっているので、ロボットCar のタイヤを浮かせてテストします。
1) $ roscore
2) $ roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen
注) turtlebot3_core.launch の記述のデバイスを変更します
/dev/ttyACM0 を /dev/ttyUSB0 に変更します。
3) キーボード操作のプログラムを起動。
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
4) Turtlebot3 の Rviz での表示。
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_bringup turtlebot3_model.launch
注) Rviz 上での変更点
Global Options -> Fixed Frame : odom
当初、この設定が判らず、苦労しました。
5) keyboard から、ロボットCar を操作すると、 Rviz 上の Turtlebbot3 が動くのが確認でくると思います。

3. Turtlebot3 として、SLAMを試す。
カメラも、ladir もついていませんが、SLAM の Rviz での確認ができます。
1) $ roscore
2) $ roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen
注) turtlebot3_core.launch の記述のデバイスを変更します
/dev/ttyACM0 を /dev/ttyUSB0 に変更します。
3) SLAMの実行。
$ export TURTLEBOT3_MODEL=waffle
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
4) Rviz の起動。
$ export TURTLEBOT3_MODEL=waffle
$ rosrun rviz rviz -d `rospack find turtlebot3_slam`/rviz/turtlebot3_slam.rviz
注) Rviz の設定
Robot Model と Odometry を有効にします。
5) キーボード操作のプログラムを起動。
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

現状で、上記2つの確認ができます。
オリジナルの foxbot_core は、odometry、 tf が正しく送信出来ていなかったので、
公開されている、turtlebot3_core.ino を参考に組み込んでみました。
後日、github に公開を予定しています。

4. また、STM32F411 Black Pill ボードが壊れたみたいです。
昨日、ちゃんと動いていたのが、今日、PCに繋いで、プログラムをアップロードしようとしたら、エラーになるので、
ボードの USB Type-C の近くの LEDを見たら点灯していません。また壊れたみたいです。
STM32F103 Black Pill の時もおなじ様でした。
前日動いていたものが、翌日、PCでプログラムをアップロードしようとしたら、壊れていました。
原因が判りません。
DC モータ AMP に原因があるのか?それだったら、使っている時に突然壊れると思うのだが?
前日動いていたものが、翌日になったら壊れている。のはなぜだろうか?
もしかして、ヘッダーPINのハンダ付の時、液体フラックスを無造作にに使って、洗浄せずにそのまま使っていたのが原因だろうか?

試しに、両方のボードをアセトンで洗浄してみましたが、復活はしませんでした。
壊れた後で、洗浄しても手遅れでしょうか?
原因が判らなければ、また再発するのかも知れません。どうしたものか?

STM32f411 の方で、USB TYPE-C で給電して電圧を測ったら、5V は、OK だが、3.3V が電圧が出ていません。
これならレギュレーターくさいが、
ST-LINK V2 をつなげると、PWR LED も点灯しません。その時の 3.3V PIN 電圧は、0.4 V 位 でした。
完全に CPU がショートして、壊れているのか?

モーターのパルスカウンター入力PIN 接続に、Pull UP 抵抗をつけるべきか?
内蔵の、Pull UP 抵抗が働いているのではないのか?

モーター AMP接続 出力PIN に、必要以上に電流がながれているのか?
CPU がショートしているのならこちらが原因か、過電流防止し用の、保護抵抗を入れるべきか?
そう言えば、昨日、テストで、ロボットカーを前進、後退で全速力で走らせたりしたか?
それまでは、ゆっくり走らせてテストをしていたのかも?
PWM の出力 PIN に直列に、抵抗(100 Ω)を入れてみるか?

どうやら、モーターのエンコーダパルスを取り込む、PINは、明示的に、PULL UP させないといけない、みたいです。
参考ページ
pinMode(2, INPUT_PULLUP);

注)
pinMode(2, INPUT);
だと、入力モードとして、ハイインピーダンスにはなるが、Pull Up には、ならないみたい。
オンちゃんの理解不足でした。

以前、今回のDCモータAMP を使って、モータを回転させるだけのスケッチを使って、何度も、前後方向に、
最高速で回転させたことがあります。その時、なんの問題もでなかったのを覚えています。
そのあと、作業が、foxbot_core.ino のテストになった時も、最初は、モーターのエンコーダーは接続しないで、
車輪を前後に動かしたときは、常にフル回転になっていましたが、その時も、何も問題は出ませんでした。

その後で、モーターのエンコーダパルスを結線したので、これが原因かもしれません。

今、STM32F103 Black Pill、STM32F411 Black Pill を注文しているので、それが、届いたら、確認してみます。

5. ESP32 Wi-FI に切り替え。
注文した、STM32F Black Pill がなかなか届かないので、ESP32 Wi-Fi で試してみました。
一応、なんとか出来上がったので、試してみました。
あいにく、こちらでは、モーターの回転制御がまるっきり拙くて、スピードが定まりません。
teleop key で、w,x,d,a 等を入れると、最初突進して、すぐに、本来の速度になりますが、その後、
両方のタイアが交互に動く動作を繰り返します。

ESP32 Arduino には、Analog系のコマンドがなくて、ESP32_AnalogWrite を使ってみましたが、
何も中身を確認しないまま使っている所為かもしれません。

CPU スピードは、こちらが断然早くて、日本でも安く手に入るので、将来はこちらにしようか考えていましたが。

やはり、ESP32_AnalogWrite 用に少しコードを追加しないとだめでした。
特に問題だったのが、
//analogWrite(enMotor, pwm_ref); // これだと、第3 Param valueMax=255 でした。
analogWrite(enMotor, pwm_ref,PWM_MAX); // PWM_MAX = 4095 が必要でした。
これ以外にも、最初の手順が少し必要ですが。...
// start foxbot_core
analogWriteResolution(12); // original code
// add by nishi for ESP32 only
analogWriteChannel(enMotorRight);
analogWriteChannel(enMotorLeft);

これで、ESP32 Wi-Fi が使えるので、実際に走らせることができます。
さらに、 STM32F411 Black Pill より、少しタイヤの回転がスムーズです。
やはり、 CPU Speed = 240MHz が効いているのかも。

やりました。Wi-Fi を使って、PC のターミナルから、
$ roscore
$ rosrun rosserial_python serial_node.py tcp
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
を叩けば、PC から切り離した、自作 ロボットカー(Turtlebot3) が操作できます。
これで、机の上から、実際に部屋の中を自由に走らせます。

注) 上述の、turtlebot3_robot.launch は、
2) $ roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen
注) turtlebot3_core.launch の記述のデバイスを変更します
/dev/ttyACM0 を tcp に変更します。


それなりに、真直ぐ進みます。後は、Black Pill が壊れた現象が再発しなければ良いのですが?
今回は、 モーターのエンコーダパルス Pin は、INPUT_PULLUP を指定しているので、どうでしょうか?

新たな問題としては、
1) joint-state を publish すると、ros serial が
[ERROR]... : Lost sync with device, restartion.. を繰り返す事。
いまは、 joint-state の送信をやめています。
2) Slam の実行で、Rviz 上で、 両タイヤのリンクが切れていて、表示されないこと。

上記2つの問題は、joint_states のパブリッシュが正しく出来ていなかった事が原因でした。
オリジナルの、turtlebot3_core.ino の updateJointStates() で、
joint_states.effort = joint_states_eff; が抜けていました。
void initJointStates(void) で、
joint_states.effort_length = WHEEL_NUM; にしているので、値は正しくなくても、設定しないといけないみたいです。
又は、 joint_states.effort_length = 0; // でも、OK です。

どちらの現象も、STM32F Black Pill では、現れませんでした。
joint_states.effort = joint_states_eff; が抜けていると、多分 0x000000 Address から、 データを、
Publish しよとするのでしょうが、STM32F では、メモリー不正アクセスの管理が適当なのかも知れません。
ESP32 のほうが、メモリー管理がもう少し厳格なのかも知れません。

上記を修正したら、SLAM の RVIZ 画面で、タイヤが表示されるようになりました。
その後の修正で、SLAM の Rviz 上で、タイヤが回転するようになりました。ただし、 方向転換のときは、
まだタイヤが同じ方に回転しています。が、これは、もういいか?

SLAM で、部屋の中を動かしてみましたが、行って帰って来るだけで、RVIZ 上の同じ所に帰ってきません。
かなり、 odometory が狂っているみたいです。まだまだ、これからか?
ここは、実際のロボットカーのタイヤサイズ、タイヤの間隔にあわせた調整になるので、個別設定の世界か...

これで、次のステップへいけます。
この後は、 Jetson Nano 2GB を搭載して、その時は、ESP32 は、Serial 通信で、Jetson Nano と接続します。
Jetson Nano 2GB には、 Wi-Fi ドングルを使って、PC からリモート操作をします。

または、 IMU を付けるのが先か?

Turtlebot3自作 一連の記事
ROS2 Turtlebot3 自作 一連の記事

このブログ記事について

このページは、おんちゃんが2021年5月 1日 16:34に書いたブログ記事です。

ひとつ前のブログ記事は「Windows10 Visual Studio Code C/C++ ビルド」です。

次のブログ記事は「Turtlebot3 の自作 #4」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ