O sistema operacional robótico ROS é uma plataforma bastante poderosa para a criação de sistemas robóticos, que inclui tudo o necessário para o desenvolvimento de seus projetos, desde os componentes de software mais simples chamados "nós" e o protocolo de troca de dados até o ambiente de simulação de uma plataforma robótica Gazebo real. Principalmente, o ROS é usado em conjunto com esses microcontroladores na plataforma Arduino. A Internet está cheia de todos os tipos de tutoriais sobre vários ROS e Arduino.
Atualmente, não há informações sobre o uso do sistema operacional robótico ROS em conjunto com o microcontrolador STM32. A Internet está cheia de perguntas.

Começar
Para trabalhar com o STM32, precisamos do STM32CubeMX e do SystemworkbenchforSTM32. Há muita informação sobre a instalação deles na rede, não vamos nos debruçar sobre isso.
Para configurar o controlador, vá para STM32CubeMXCrie um novo projeto.

Vamos selecionar um microcontrolador, tenho STM32f103c8t6.

Na periferia, indicamos que o ressonador de quartzo externo está conectado, temos 2 deles

Configure as conclusões pelas quais você pode habilitar a depuração do controlador (no futuro, se o projeto estiver em C ++, a depuração poderá não funcionar)

Vamos configurar a porta 13 de saída C, o LED embutido está conectado a ela.

Configure os pinos UART.

Vá para Lock_configuration e faça as configurações como na imagem.

Vamos para uma configuração mais detalhada da periferia
UARTDefinir a taxa de câmbio de dados.

Configuração de DMA.


Configurar interrupção, você precisa especificar uma interrupção global no UART

Configuração GPIO

Configuração de construção do projeto

Estamos esperando você se reunir

Abrimos o projeto,

Criando um projeto para o System Workbench For STM32
Ao abrir este projeto no SW4STM32, adicionando algum controle periférico, montando-o e piscando o controlador, não obtive nenhum resultado.
Portanto, criamos um novo projeto de acordo com as seguintes instruções e transferimos a configuração obtida pelo STM32CubeMX.
Criando um projeto para o System Workbench For STM32
1) Clique em Arquivo> Novo> Projeto C
2) Projeto C
1) Digite o nome do projeto
2) Selecione um tipo de projeto: Executável> Projeto Ac6 STM32 MCU
3) Selecionar cadeias de ferramentas: Ac6 STM32 MCU GCC
4) Clique em "Next"

3) Escolha um microcontrolador
1) Clique em "Criar um novo quadro personalizado"
1) Salvar nova definição da placa
2) Digite o nome da nova placa: STM32F103
3) Escolha uma placa de chip: STM32F1
4) Selecione MSU: STM32F103RCTx
5) Clique em OK.
2) Selecione o quadro que você acabou de criar!
1) Selecione uma série: STM32F1
2) Escolha uma placa: STM32F103
3) Clique em "Next"

4) Nós conectamos bibliotecas HAL

5) Clique em Concluir
Adicionando arquivos
Copie o conteúdo dos arquivos src e inc criados pelo cubo em nossos arquivos, copie também STM32F103C8Tx_FLASH.ld

Para testar a integridade do próprio STM32 e o código no loop while, escreva as seguintes linhas
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100);
Aqui apenas piscamos o LED.
Durante a montagem, podem ocorrer problemas no arquivo stm32f1xx_hal_msp.c
O erro associado à função void HAL_MspInit (void) é corrigido da seguinte maneira.
Abra a pasta com a biblioteca HAL_Driver, vá para / src, abra o arquivo stm32f1xx_hal_msp_template.c e comente a mesma função:

Remontar (deve montar sem erros)
Esqueci de mencionar o utilitário st-flash necessário para o firmware do controlador.
$ 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
Usando o link ST
Verificação de detecção de link ST:
$ st-info —probe
Em resposta, devemos ver algo como:
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
Para liberar o controlador, vá para a pasta do nosso projeto e atualize o controlador com o seguinte comando:
cd workspace/ros_stm32_2/ st-flash write Debug/ros_stm32_2.bin 0x8000000
Verificado. Tudo funciona. Nós seguimos em frente.
Como as bibliotecas ROS são gravadas em C ++, convertemos nosso projeto em um projeto C ++ e alteramos o formato do arquivo main.c, stm32f1xx_hal_msp.c, stm32f1xx_it.c em .cpp
Estamos clonando meu repositório com o crescimento de bibliotecas e os arquivos necessários para trabalhar de maneira rosserial no STM32.
git clone https:
Inserir a pasta clonada no projeto


Vamos às configurações do projeto (Propriedades), antes de tudo, conectar a biblioteca, ir ...



Alterando o layout


Realizamos otimização


Bem, agora faremos algumas alterações no main.cpp, já que está quase vazio, a primeira coisa que fazemos é conectar a biblioteca ROS e as bibliotecas para interagir com os tópicos do ROS, ou melhor, com os tipos de dados desses tópicos.
#include <ros.h> #include <std_msgs/String.h> #include <std_msgs/UInt16.h>
Crie um nó que publique este tópico e aceite
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);
Inicialize o nó e os tópicos em principal.
nh.initNode(); nh.advertise(chatter); nh.subscribe(sub);
Também adicionamos variáveis para trabalhar com o tempo e o que publicaremos.
const char * hello = "Hello World!!"; int chatter_interval = 1000.0 / 2; int chatter_last = HAL_GetTick();
No loop while, teremos o seguinte. Publicaremos nossa frase após um certo tempo.
if (nh.connected()) { if(HAL_GetTick() - chatter_last > chatter_interval) { str_msg.data = hello; chatter.publish(&str_msg); chatter_last = HAL_GetTick(); } } nh.spinOnce();
Montando um projeto.
Os seguintes erros podem aparecer:



Remontar e piscar.
Agora interagindo diretamente com o ROS.
Em um terminal, execute o ROS.
roscore
Na próxima execução, o nó.
rosrun rosserial_python serial_node.py /dev/ttyUSB0
Temos o seguinte
[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]
Em seguida, em uma nova janela do terminal, observe os tópicos
rostopic list
Temos os seguintes tópicos:
/chatter /diagnostics /led /rosout /rosout_agg
No tópico da conversa, o controlador publica a frase.
Podemos ouvi-lo através da equipe
rostopic echo /chatter

Agora envie os dados para o tópico liderado.
rostopic pub /led std_msgs/UInt16 "data: 0"
E nós temos que mudar o estado do LED.