Introduction
Arduino is an "open-source electronics prototyping platform" based on AVR Atmega processors produced by Atmel (Acquired by Microchip Technology in 2016). The Arduino IDE can be run on FreeBSD either natively or via WINE.
Arduino Native (CLI)
This article demonstrates how to develop for Arduino boards using only basic command line utilities, without having to use the Arduino IDE.
Tested on FreeBSD 12.2 and above.
Preparation
Required ports:
devel/arduino-core |
devel/arduino-bsd-mk |
devel/avr-gcc |
devel/avr-libc |
devel/avrdude |
comms/uarduno |
With all the software installed, add the following line to /boot/loader.conf in case you want the Arduino kernel module to load automatically on boot. If you want to manually load the module whenever you need it, skip this step:
uarduno_load="YES"
Load the kernel module:
# kldload uarduno
Check your ~/.arduino/preferences.txt and see if the following lines exist (source):
serial.port=/dev/cuaU0 launcher=/usr/local/bin/firefox
Add your user to the dialer group:
# pw group mod dialer -m $USER
Connecting the board
Standard Arduino boards connect as /dev/cuaU0 and/or /dev/ttyU0 on FreeBSD. In case these serial ports don't show up in /dev, you might need to press your board's reset button. After you've plugged your board into a USB port, you should get the following output from dmesg. Although the output may vary, the important thing is that your board is connected and detected.
ugen1.5: <Arduino (www.arduino.cc) product 0x0043> at usbus1 uarduno0: <Arduino (www.arduino.cc) product 0x0043, class 2/0, rev 1.10/0.01, addr 5> on usbus1
If dmesg returned information about your board, you should also see cuaU0 and/or ttyU0 in /dev. In case your board is still not detected - considering it's not a fake one, try using a different USB cable or reset it again and make sure you've followed the setup steps correctly.
The Makefile
The only thing you're going to need in order to get started is just a Makefile that'll be used to compile and upload your Arduino programs. Make a new directory for your Arduino project and a Makefile with the following lines:
ARDUINO_DIR= /usr/local/arduino ARDUINO_MK_DIR= /usr/local/arduino-bsd-mk #ARDUINO_LIBS= AVRDUDE_PORT= your_board_port ARDUINO_BOARD= your_board_name SRCS= your_source_files TARGET= your_program_name include /usr/local/arduino-bsd-mk/bsd.arduino.mk
In my case my board is an Arduino Uno, so I'd have to set ARDUINO_BOARD to uno. You can see which board types are available in /usr/local/arduino/hardware/arduino/avr/boards.txt. If you want to install new libraries, copy them over to /usr/local/arduino/hardware/arduino/avr/libraries/.
Avoid having source files named main.
Building and uploading a program
Write some Arduino code, and when you’re ready to compile and upload, run the following command:
# make install flash clean cleandepend
If all went well you should see the board executing the new code, if it doesn't, try to see what errors the Makefile produced.
Monitoring
The Arduino IDE provides a serial monitor feature, but FreeBSD has a builtin monitoring utility which can be accessed directly from the terminal. Run this whenever you want to monitor your board and exit with ~! (use the appropriate port):
$ cu -l /dev/cuaU0
Using board types other than the Uno
As it's mentioned above, we're using the uarduno kernel module. Even though the module's description is "FreeBSD Kernel Driver for the Arduino Uno USB interface", you can, in fact, use different board types other than the Uno. According to uarduno's website, you can modify /usr/ports/comms/uarduno/files/ids.txt to include more board types; the two fields are Vendor ID and Product ID. Read the comments inside the file for more information.
{ 0x2341, 0x0001 }, // Arduino UNO, vendor 2341H, product 0001H { 0x2341, 0x0042 }, // Arduino MEGA (rev 3), vendor 2341H, product 0042H { 0x2341, 0x0043 }, // Arduino UNO (rev 3), vendor 2341H, product 0043H { 0x2341, 0x0010 }, // Arduino MEGA 2560 R3, vendor 2341H, product 0010H { 0x2341, 0x8037 }, // Arduino Micro
When you're done, clean and re-build the port.
Known issues and their fixes
Even though you might have plugged your board to your machine, you might notice that there is no device appearing in /dev. Although there is no definite answer as to why this is happening, make sure that the USB cable is connected properly; on some boards - certainly mine - you have to hear a click sound.
When trying to use a new library, you might notice that your code doesn't compile. Considering the library isn't broken, a common issue is that you haven't stored the library in the correct path. As already mentioned, libraries are stored in /usr/local/arduino/hardware/arduino/avr/libraries/, so you have to move it there.
Arduino IDE (Native)
Requires ports:
devel/arduino |
The native Arduino port for FreeBSD |
Install the port (as root):
cd /usr/ports/devel/arduino make install clean
To run:
/usr/local/bin/arduino
- or, if your paths are set as normal, just
arduino
Edit settings in ~/.arduino/preferences.txt:
serial.port=/dev/cuaU0 launcher=/usr/local/bin/firefox
Use /dev/cuaU0 for a USB/serial adapter, or /dev/cuau0 for a real serial port.
Also, make sure the user is in the dialer group or has rights to /var/spool/lock.
Arduino IDE (Wine)
Required ports:
emulators/wine |
Windows environment to run Windows apps on FreeBSD |
Download Windows file:
Unzip in ~/.wine/drive_c
Create a link so the FreeBSD serial device is available as the Windows COM port. COM4 is used to avoid conflicts with built-in hardware:
ln -sf /dev/cuaU0 ~/.wine/dosdevices/com4
Use /dev/cuaU0 for a USB/serial adapter, or /dev/cuau0 for a real serial port.
Add user to dialer group for access to serial port (as root):
pw usermod myuser -G dialer
To run:
wine ~/.wine/drive_c/arduino-0021/arduino.exe
Adruino on ESP32
Here you will find information on how to make Arduino tools work with ESP32 (keep in mind it's a kind of dirty hack).