現在、ROSロボットオペレーティングシステムとSTM32マイクロコントローラーの使用に関する情報はありません。 インターネットには疑問がたくさんあります。
始めましょう
STM32を使用するには、STM32CubeMXとSystemworkbenchforSTM32が必要です。 それらをネットワークにインストールすることについては十分な情報がありますが、これについては詳しく説明しません。
コントローラーを構成するには、STM32CubeMXに移動します
新しいプロジェクトを作成します。
マイクロコントローラを選択します。STM32f103c8t6があります。
周辺では、外部水晶振動子が接続されていることを示します。
コントローラーのデバッグを有効にできる結論を構成します(プロジェクトがC ++の場合、デバッグが機能しない場合があります)
13出力ポートCを設定し、内蔵LEDに接続します。
UARTピンをセットアップします。
Lock_configurationに移動し、図のように設定を行います。
周辺のより詳細な構成に移りましょう
UART
データ交換レートの設定。
DMAセットアップ。
割り込みを設定します。UARTによるグローバル割り込みを指定する必要があります
GPIOセットアップ
プロジェクトビルドのセットアップ
あなたが集まるのを待っています
プロジェクトを開き、
STM32のSystem Workbenchのプロジェクトの作成
SW4STM32でこのプロジェクトを開き、周辺機器の制御を追加し、それを組み立て、コントローラーをフラッシュしても、結果は得られませんでした。
したがって、次の指示に従って新しいプロジェクトを作成し、STM32CubeMXによって取得された構成を転送します。
STM32のSystem Workbenchのプロジェクトの作成
1)ファイル>新規> Cプロジェクトをクリックします
2)Cプロジェクト
1)プロジェクトの名前を入力してください
2)プロジェクトの種類を選択します:実行可能> Ac6 STM32 MCUプロジェクト
3)ツールチェーンの選択:Ac6 STM32 MCU GCC
4)「次へ」をクリックします
3)マイクロコントローラーを選択する
1)[新しいカスタムボードの作成]をクリックします
1)新しいボードの定義を保存
2)新しいボードの名前を入力します:STM32F103
3)チップボードの選択:STM32F1
4)MSUの選択:STM32F103RCTx
5)[OK]をクリックします。
2)作成したばかりのボードを選択してください!
1)シリーズを選択:STM32F1
2)ボードを選択:STM32F103
3)「次へ」をクリックします
4)ライブラリHALを接続します
5)[完了]をクリックします
ファイルを追加する
キューブによって作成されたsrcおよびincファイルの内容をファイルにコピーし、STM32F103C8Tx_FLASH.ldもコピーします
STM32自体の状態とwhileループのコードをテストするには、次の行を記述します
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100);
ここでは、LEDを点滅させます。
アセンブリ中に、stm32f1xx_hal_msp.cファイルで問題が発生する場合があります
void関数HAL_MspInit(void)に関連するエラーは、次のように修正されました。
HAL_Driverライブラリでフォルダーを開き、/ srcに移動し、ファイルstm32f1xx_hal_msp_template.cを開いて、同じ関数をコメントアウトします。
再組み立て(エラーなしで組み立てる必要があります)
コントローラファームウェア用のst-flashユーティリティについて言及するのを忘れました。
$ sudo apt-get install cmake $ sudo apt-get install libusb-1.0.0 $ git clone github.com/texane/stlink.git $ cd stlink $ make release $ cd build/Release; sudo make install $ sudo ldconfig
STリンクを使用する
STリンク検出チェック:
$ st-info —probe
応答として、次のようなものが表示されるはずです。
Found 1 stlink programmers serial: 563f7206513f52504832153f openocd: "\x56\x3f\x72\x06\x51\x3f\x52\x50\x48\x32\x15\x3f" flash: 262144 (pagesize: 2048) sram: 65536 chipid: 0x0414 descr: F1 High-density device
コントローラーをフラッシュするには、プロジェクトのフォルダーに移動し、次のコマンドを使用してコントローラーをフラッシュします。
cd workspace/ros_stm32_2/ st-flash write Debug/ros_stm32_2.bin 0x8000000
確認済み。 すべてが機能します。 先に進みます。
ROSライブラリはC ++で記述されているため、プロジェクトをC ++プロジェクトに変換し、.cppのmain.c、stm32f1xx_hal_msp.c、stm32f1xx_it.cファイルの形式を変更します。
ライブラリを成長させ、STM32でrosserialを動作させるために必要なファイルを含むリポジトリを複製しています。
git clone https://gitlab.com/ivliev123/ros_lib
複製されたフォルダーをプロジェクトに挿入します
プロジェクト設定(プロパティ)に行きましょう。まず、ライブラリを接続して、行きます...
レイアウトを変更する
最適化を実施します
さて、main.cppはほとんど空であるため、ここでいくつかの変更を行います。最初に行うことは、ROSライブラリと、ROSトピックまたはこれらのトピックのデータ型とやり取りするためのライブラリを接続することです。
#include <ros.h> #include <std_msgs/String.h> #include <std_msgs/UInt16.h>
このトピックを公開して受け入れるノードを作成しましょう
void led_cb( const std_msgs::UInt16& cmd_msg){ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); ros::Subscriber<std_msgs::UInt16> sub("led", led_cb);
mainでノードとトピックを初期化します。
nh.initNode(); nh.advertise(chatter); nh.subscribe(sub);
また、変数を追加して、時間と公開する内容を処理します。
const char * hello = "Hello World!!"; int chatter_interval = 1000.0 / 2; int chatter_last = HAL_GetTick();
whileループでは、次のものがあります。 しばらくしてからフレーズを公開します。
if (nh.connected()) { if(HAL_GetTick() - chatter_last > chatter_interval) { str_msg.data = hello; chatter.publish(&str_msg); chatter_last = HAL_GetTick(); } } nh.spinOnce();
プロジェクトをまとめる。
次のエラーが表示される場合があります。
再組み立てしてフラッシュします。
ROSと直接対話するようになりました。
1つの端末でROSを実行します。
roscore
次にノードを実行します。
rosrun rosserial_python serial_node.py /dev/ttyUSB0
以下を取得します
[INFO] [1551788593.109252]: ROS Serial Python Node [INFO] [1551788593.124198]: Connecting to /dev/ttyUSB0 at 57600 baud [INFO] [1551788595.233498]: Requesting topics... [INFO] [1551788595.258554]: Note: publish buffer size is 2048 bytes [INFO] [1551788595.259532]: Setup publisher on chatter [std_msgs/String] [INFO] [1551788595.275572]: Note: subscribe buffer size is 2048 bytes [INFO] [1551788595.276682]: Setup subscriber on led [std_msgs/UInt16]
次に、新しいターミナルウィンドウでトピックを確認します
rostopic list
次のトピックがあります。
/chatter /diagnostics /led /rosout /rosout_agg
おしゃべりのトピックでは、コントローラーがフレーズを公開します。
チームで聞くことができます
rostopic echo /chatter
次に、データをトピックledに送信します。
rostopic pub /led std_msgs/UInt16 "data: 0"
そして、LEDの状態を変更する必要があります。