- Управление arduino через linux
- Communication with Arduino from Linux-Terminal
- Программирование Arduino из Linux, gentoo-way, быстрый старт
- Установить в ядро поддержку USB конвертера
- Установка или обновление пакета rxtx
- Установка java виртуальной машины sun
- Установка окружения toolchain для компиляции
- Установка собственно самой IDE для программирования
- Запускаем arduino
- Проблемы:
- Вместо заключения
- Использованные источники
- Install the Arduino Software (IDE) on Linux
- Download the Arduino Software (IDE)
- Extract the package
- Run the install script
- Proceed with board-specific instructions
- Please Read.
Управление arduino через linux
В системах мониторинга бывает не лишним получить на компьютер (запросить из консоли Linux) параметры с датчиков, подключаемых к МК Ардуино. Несмотря на кажущуюся простоту, задача имеет подводный камень в виде перезагрузки микроконтроллера каждый раз при попытке отправить на него данные.
Первое и очевидное: чтобы из консоли Linux отправить команду для начала нужно убедиться в наличии необходимых драйверов в ядре и самого устройства (/dev/ttyUSB0)
Затем, необходимо сконфигурировать интерфейс при помощи команды:
# stty -F /dev/ttyUSB0 ispeed 9600 ospeed 9600 -ignpar cs8 -cstopb -echo -hupcl nl
Делается каждый раз при подключении Arduino к компьютеру.
Обрабатывать команды отправляемые из консоли можно примерно так (будем плавно зажигать и гасить светодиод на 3-ем пине):
int angle = 0; void setup() < // initialize serial: Serial.begin(9600); pinMode(3, OUTPUT); >void lights(int action) < int multiplier; if (action == 0) < angle = 90; multiplier = -1; >else < angle = 0; multiplier = 1; >for(;;) < angle += multiplier; analogWrite(3, 255*sin(angle*(PI/180))); if (angle == 0 || angle == 90) < break; >delay(10); > > void loop() < // if there's any serial available, read it: while (Serial.available() >0) < // look for the next valid integer in the incoming serial stream: int state = Serial.parseInt(); //Serial.println(Serial.read()); // look for the newline. That's the end of your sentence: if (Serial.read() == '\n') < if (state == 1) < lights(1); >else < lights(0); >Serial.println("OK"); > > delay(10); >
# echo «1» > /dev/ttyUSB0 | head -1 /dev/ttyUSB0
# OK
#
Communication with Arduino from Linux-Terminal
I already wrote how to send the message from/to Arduino with help Python. Now I want tell you, how to send/receive the messages from/to Arduino in Linux-Terminal.
As you know, all devices of serial ports are represented by device files in the /dev directory. It is through these files that Linux OS communicates with an external device on the serial port. To transfer something to an external device, you need to write data to this file, and to read information from the device, read data from the file. This can be done with the cat and echo commands, as for «usual» disk files.
How to work with a COM port from the command line? Three commands are used for this: stty, cat and echo.
The stty command sets the parameters and speed of the COM port. Its format is:
stty [-F DEVICE | —file=DEVICE] [SETTING].
$ stty 9600 -F /dev/ttyUSB0 raw -echo
The raw parameter establishes that the data is transferred to the computer byte-by-byte the same way, as they arrive at the port without changes (more see man stty).
Enter the command in the console:
To see the hex data codes coming from the device, use the hexdump command.
To transfer data to Arduino need use the echo command and redirect output to the device file.
String inData; int ledPin = 13; void setup() < pinMode(ledPin, OUTPUT); Serial.begin(9600); Serial.println("Serial conection started, waiting for instructions. "); >void loop() < while (Serial.available() >0) < char recieved = Serial.read(); inData += recieved; // Process message when new line character is recieved if (recieved == '\n') < Serial.print("Arduino Received: "); Serial.print(inData); digitalWrite(ledPin, HIGH); // You can put some if and else here to process the message juste like that: if(inData == "OFF\n")< // DON'T forget to add "\n" at the end of the string. Serial.println("LED OFF"); digitalWrite(ledPin, LOW); >inData = ""; // Clear recieved buffer > > >
$ stty 9600 -F /dev/ttyUSB0 raw -echo $ cat /dev/ttyUSB0
To remove the ending of the line in the transmitted data, need to use echo -n
To output data from the device to the screen and to a text file, need to use tee:
$ cat /dev/ttyACM0|tee output.txt
Программирование Arduino из Linux, gentoo-way, быстрый старт
К сожалению, информация, необходимая для подключения Arduino к компьютеру, оказалась разрозненна по разным источникам на разных языках. Как известно, gentoo — это дистрибутив linux с непрерывной разработкой, фактически в нем и понятия такого быть не может, как «дистрибутив». Из-за этого решение проблемы, найденное в интернете, может оказаться неработоспособным просто потому, что на целевой системе другой набор пакетов и настроек.
Кроме того, авторы, как правило, приводят команды и решения специфичные для конкретной системы в конкретный момент времени. Проходит некоторое время, версии продуктов изменяются, меняются некоторые пути и файлы. Данная статься попытка не только консолидировать информацию, но и изложить так, чтобы информация устаревала как можно в меньшей степени, и было легко модифицировать команды под вашу систему. Возможно это будет полезно и в других дистрибутивах.
Архитектура amd64, ядро x86_64 3.7.10-gentoo
Установлены стабильные пакеты последних версий.
На аукционе ebay куплена плата Arduino Pro Mini 328p 16МГц 5V и USB конвертер к ней на чипе FTDI.
Установить в ядро поддержку USB конвертера
После подключения конвертера к USB порту видим следующее:
# tail /var/log/messages my-pc kernel: usb 6-1: new full-speed USB device number 2 using uhci_hcd my-pc kernel: usb 6-1: New USB device found, idVendor=0403, idProduct=6001 my-pc kernel: usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 my-pc kernel: usb 6-1: Product: FT232R USB UART my-pc kernel: usb 6-1: Manufacturer: FTDI my-pc kernel: usb 6-1: SerialNumber: A900eYdz
Для этого конвертера нужен драйвер ftdi_sio, предпочитаю не добавлять в ядро то, что не нужно при загрузке системы, а компилировать в виде модуля. Genkernel я не использую, а вы можете компилировать ядро удобным для вас способом.
Device Drivers ---> [*] USB support ---> USB Serial Converter support ---> USB FTDI Single Port Serial Driver
Компилируем модуль и загружаем:
# make && make modules_install # modprobe ftdi_sio
#tail -f /var/log/messages my-pc kernel: usbcore: registered new interface driver usbserial my-pc kernel: usbcore: registered new interface driver usbserial_generic my-pc kernel: usbserial: USB Serial support registered for generic my-pc kernel: usbcore: registered new interface driver ftdi_sio my-pc kernel: usbserial: USB Serial support registered for FTDI USB Serial Device my-pc kernel: ftdi_sio 6-1:1.0: FTDI USB Serial Device converter detected my-pc kernel: usb 6-1: Detected FT232RL my-pc kernel: usb 6-1: Number of endpoints 2 my-pc kernel: usb 6-1: Endpoint 1 MaxPacketSize 64 my-pc kernel: usb 6-1: Endpoint 2 MaxPacketSize 64 my-pc kernel: usb 6-1: Setting MaxPacketSize 64 my-pc kernel: usb 6-1: FTDI USB Serial Device converter now attached to ttyUSB0
# ls -l /dev/ttyUSB0 crw-rw---- 1 root uucp, 0 марта 9 13:04 /dev/ttyUSB0
Если вы используете другой конвертер, то добавьте в ядро его поддержку, в остальном все должно быть аналогично.
Установка или обновление пакета rxtx
Актуально только для 64-битных систем:
В момент написания статьи стабильная версия пакета , но прошивка Arduino с ней работать не будет, необходимо поставить . Вероятно когда появится новая стабильная версия проблема будет устранена.
# echo =dev-java/rxtx-2.2_pre2 ~amd64 >> /etc/portage/package.keywords
emerge =dev-java/rxtx-2.2_pre2
Установка java виртуальной машины sun
Можно использовать SDK или JRE, если не знаете, нужен ли вам SDK, то он вам не нужен, и выбирайте sun-jre-bin:
# emerge dev-java/sun-jdk или # emerge dev-java/sun-jre-bin
Из-за лицензионных ограничений вам придется вручную скачать соответствующий исходный файл и скопировать его в /usr/portage/distfiles. Кроме того, VM распространяется под отдельной лицензией, поэтому ее небходимо добавить в файл make.conf:
ACCEPT_LICENSE="Oracle-BCLA-JavaSE"
Убедитесь, что нужная VM выбрана:
# eselect java-vm list Available Java Virtual Machines: [1] sun-jre-bin-1.6 system-vm
Установка окружения toolchain для компиляции
# emerge sys-devel/crossdev app-portage/layman
# echo source /var/lib/layman/make.conf >> /etc/make.conf # mkdir -pv /usr/local/portage
Установка собственно самой IDE для программирования
Постольку нет ни одной стабилизированной версии, то скорее всего она появится не скоро. Поэтому просто устанавливаем последнюю версию. Необходимо разблокировать следующие пакеты, добавив в файл /etc/portage/package.keywords следующие строчки:
dev-embedded/arduino ~amd64 dev-embedded/uisp ~amd64
echo dev-embedded/arduino doc examples >> /etc/portage/package.use
Запускаем arduino
Выбираем в меню Сервис -> Плата ваш вариант Arduino и Сервис -> Последовательный порт – порт, который появился после подключения конвертера, обычно это /dev/ttyUSB0. Самый простой скетч Blink уже был загружен в мою плату производителем, поэтому чтобы проверить, как все работает, я его модифицировал: теперь светодиод моргает попеременно короткой и длинной вспышкой:
/* Blink A Morse code Turns on an LED on adruino 'Dot - Dash - Pause' */ // Pin 13 has an LED connected on most Arduino boards. int led = 13; // the setup routine runs once when you press reset: void setup() < // initialize the digital pin as an output. pinMode(led, OUTPUT); >void loop()
Нажимаете галочку «Проверить» и стрелочку «Загрузить» и будет вам счастье. На самом деле может и не будет, потому что необходимо устранить еще некоторые проблемы и об этом ниже.
Проблемы:
Если пункт выбора последовательного порта деактивирован, то вам снова нужно вернуться к началу статьи и
#zgrep FTDI /proc/config.gz CONFIG_USB_SERIAL_FTDI_SIO=m
# modprobe -r ftdi_sio # modprobe ftdi_sio
# qlist -ICv rxtx dev-java/rxtx-2.2_pre2
При компиляции выводится ошибка:
/usr/libexec/gcc/avr/ld: cannot open linker script file ldscripts/avr5.x: Нет такого файла или каталога collect2: ошибка: выполнение ld завершилось с кодом возврата 1
причина в том, что пути по которым установлен toolchain не соответствуют путям где его ищет arduino. Находим сначала где нужный файл:
# find /usr/ -name avr5.x /usr/lib64/binutils/avr/2.23.1/ldscripts/avr5.x
# ln -s /usr/lib64/binutils/avr/2.23.1/ldscripts /usr/avr/lib/ldscripts
При компиляции выводится ошибка:
/usr/libexec/gcc/avr/ld: cannot find crtm328p.o: Нет такого файла или каталога collect2: ошибка: выполнение ld завершилось с кодом возврата 1
Для вашей платы имя файла может быть другим, а решение то-же, необходимо создать соответствующую символическую ссылку. Ищем файл:
# find /usr/ -name crtm328p.o /usr/avr/lib/avr5/crtm328p.o
# ln -s /usr/avr/lib/avr5/crtm328p.o /usr/avr/lib/
Существует проблема с binutils версии выше 2.19
Проблема выражается в том, что все вышеописанное работает, все компилируется, собирается и загружается в плату без малейшей ошибки. Но прошивка не работает. В моем случае плата просто моргает светодиодом, секунда горит, на секунду гаснет, то есть классический Blink.
Решение описано здесь, баг зарегистрирован на Gentoo’s Bugzilla.
Чтобы решить проблему следует переустановить toolchain следующим образом:
crossdev -C avr
USE=«multilib -cxx» crossdev —b 2.19.1-r1 -S -s1 —target avr
USE=«multilib cxx» crossdev —b 2.19.1-r1 -S -s4 —target avr
Все написанное выше по поводу некорректных путей остается в силе.
Для систем с hardened ядром:
USE=«multilib -cxx nopie nossp -hardened -pic -openmp» crossdev —b 2.19.1-r1 -S -s1 —target avr
USE=«multilib cxx nopie nossp -hardened -pic -openmp» crossdev —b 2.19.1-r1 -S -s4 —target avr
Вместо заключения
Сама плата и способы ее использования меня заинтересовали в контексте построения системы «Умный дом». Сейчас у меня капитальный ремонт квартиры в самом разгаре, и я могу проложить любые кабели, разместить любые коммутационные коробки и т. д.
Использованные источники
Install the Arduino Software (IDE) on Linux
The Linux build of the Arduino Software (IDE) comes in different packages depending on your system architecture. There are no specific instructions needed for the different distributions of Linux (e.g. Ubuntu).
Download the Arduino Software (IDE)
Get the latest version from the download page. You can choose between the 32, 64 and ARM versions. It is very important that you choose the right version for your Linux distro. Clicking on the chosen version brings you to the donation page and then you can either open or save the file. Please save it on your computer.
Extract the package
The file is compressed and you have to extract it in a suitable folder, remembering that it will be executed from there.
Run the install script
Open the arduino-1.6.x folder just created by the extraction process and spot the install.sh file. Right click on it and choose Run in Terminal from the contextual menu. The installation process will quickly end and you should find a new icon on your desktop.
If you don’t find the option to run the script from the contextual menu, you have to open a Terminal window and move into the arduino-1.6.x folder. Type the command ./install.sh and wait for the process to finish. You should find a new icon on your desktop.
Proceed with board-specific instructions
When the Arduino Software (IDE) is properly installed you can go back to the Getting Started Home and choose your board from the list on the right of the page.
Please Read.
It might happen that when you upload a sketch — after you have selected your board and the serial port -, you get an error Error opening serial port . If you get this error, you need to set serial port permission.
you will get something like:
crw-rw—- 1 root dialout 188, 0 5 apr 23.01 ttyACM0
The «0» at the end of ACM might be a different number, or multiple entries might be returned. The data we need is «dialout» (is the group owner of the file).
Now we just need to add our user to the group:
where is your Linux user name. You will need to log out and log in again for this change to take effect.
This is the procedure to access the serial port from the Arduino Software (IDE) if you get an error
After this procedure, you should be able to proceed normally and upload the sketch to your board or use the Serial Monitor.
The text of the Arduino getting started guide is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the guide are released into the public domain.