Joystick wireless com esp8266 e Arduino

 

Concept para joystick wireless rudimentar para robots com ROS e esp8266 e Arduino.

O objectivo é publicar mensagens do tipo geometry_msgs/Twist no topico cmd_vel.

Neste projecto são usados os seguintes componentes:

  • Wemos D1 Mini (ESP8266)
  • Arduino Mini Pro (3.3V)
  • Joystick de 2 Eixos
  • USB to serial (FTDI)

Wemos D1 Mini

Tem como função publicar a mensagem cmd_vel com os dados que recolhe do Joystick por i2c do Arduino.

A comunicação por i2c entre o Arduino e o ESP com biblioteca Wire tem uma particularidade que demorou algum tempo a descobrir.

No ESP8266 quando o valor do primeiro byte excede 127 todos os outros bytes tem valores errados.

Como os dados do wifi e o ip do ros master estão hardcoded, para facilitar a sua alteração e eventuais reporgramações, o upload do programa pode ser realizado por wireless com o Arduino OTA.

Arduino

O arduino é usado para ler os dois eixos do Joystick pois o ESP só tem um porta analógica.

Sempre que lhe é pedido devolve um valor entre 0 e 1024 para cada eixo , com um valor de reposo (central) proximo dos 512.

pré prototipo funcional

Ligações

Toda a alimentação (microcontroladores e joystick) é efectuada a 3.3V.

Nota: este joystick necessita de alimentação por sinal, alguns joysticks apenas têm uma alimentação.

Arduino > Joystick

  • D12 > S-K (sinal do botão)
  • A0 > S-X (sinal do eixo dos x)
  • A1 > S-Y (sinal do eixo dos y)

Arduino > ESP8266

  • A4 > D2 (SDA)
  • A5 > D1 (SCL)

Arduino > FTDI

  • TX > RX (branco)
  • RX > TX (verde)
  • GND > GND

 

Software para ROS Joystick Wireless

O software usado para implementar o pré-prótotipo está disponivel em:

https://github.com/inaciose/roswifijoy

Tipos de mensagens ROS

geometry_msgs/Twist
https://docs.ros.org/api/geometry_msgs/html/msg/Twist.html

linear: 
x: 0.0
y: 0.0
z: 0.0
angular: 
x: 0.0
y: 0.0
z: 0.0

sensor_msgs/Joy
http://docs.ros.org/melodic/api/sensor_msgs/html/msg/Joy.html

Problemas

Após algum tempo a ligação com o node remoto (rosserial) falha com as seguintes mensagens:

[INFO] [1570283587.480279]: Packet Failed : Failed to read msg data
[INFO] [1570283587.482739]: expected msg length is 48
[WARN] [1570283587.484643]: Last read step: data
[WARN] [1570283587.486616]: Run loop error: Serial Port read failure: RosSerialServer.read() socket connection broken
[INFO] [1570283587.488385]: Shutting down
[INFO] [1570283587.490169]: All done
Traceback (most recent call last):
File "/opt/ros/melodic/lib/rosserial_python/serial_node.py", line 73, in <module>
server.listen()
File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 253, in listen
self.startSerialClient()
File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 259, in startSerialClient
client.run()
File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 556, in run
self.port.flushOutput()
AttributeError: RosSerialServer instance has no attribute 'flushOutput'

end