andino_firmware
Firmware code to be run in the Arduino microcontroller for proper control of the motors of the robot.
Connection
Check encoder_driver.h and motor_driver.h files to check the expected pins for the connection.
Installation
Arduino
In Arduino IDE, go to tools->Manage Libraries ... and install:
- “Adafruit BNO055”
Verify and upload andino_firmware.ino to your Arduino board.
PlatformIO
Install dependencies:
sudo apt-get install python3.10-venv
Install PlatformIO:
curl -fsSL -o /tmp/get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py python3 /tmp/get-platformio.py
Add PlatformIO to your $PATH:
echo "PATH=\"\$PATH:\$HOME/.platformio/penv/bin\"" >> $HOME/.bashrc source $HOME/.bashrc
Build and upload the firmware:
If you’re using an Arduino Uno:
pio run --target upload -e uno
If you’re using an Arduino Nano:
pio run --target upload -e nanoatmega328
Description
Via serial connection (57600 baud) it is possible to interact with the microcontroller. The interface is described in the commands.h file. Here are the most used commands:
Get encoder values:
'e'Set open-loop speed for the motors [pwm]:
'o <left> <right>'- Example to move forward full speed:'o 255 255'- Range[-255 -> 255]Set closed-loop speed for the motors [ticks/sec]:
'm <left> <right>'- Important!: See theTest it!section.Set PID values:
'u <kp> <kd> <ki> <offset>'
Note: Remember the carriage return character at the end of the message.
Test it!
A serial port connection must be created at 57600 bauds. You can use the serial monitor from Arduino IDE for example.
Open loop verification: - Send
o 255 255to go full speed - Sendo 0 0to stop it.Read the encoders: - Send
eto get the encoders values.Get the ticks per revolution of your motor: - First set the encoders to zero, (rebooting with
r). - Then rotate your motors as many revs you want (say 10 for example) and then divide the encoder ticks per the number of revs. -> Then you get the ticks per revolution. Save this value, it is calibration for the control loop.Closed loop verification: - Send
m <tps> <tps>wheretpsstands for ticks per second. For example if your motor-encoder system gets 700 ticks per revolution then sendingm 700 700will rotate both motors at 1 rev per sec. (~3.14 rad/sec)