Pull to refresh

Программирование Arduino из Linux, gentoo-way, быстрый старт

Reading time 6 min
Views 39K
К сожалению, информация, необходимая для подключения 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  ---> 
        <M>   USB Serial Converter support  --->
            <M>   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

Обратите внимание на права. Необходимо добавить вашего пользователя в группу uucp
# usermod -aG uucp <user>

Если вы используете другой конвертер, то добавьте в ядро его поддержку, в остальном все должно быть аналогично.

Установка или обновление пакета rxtx


emerge dev-java/rxtx

Актуально только для 64-битных систем:
В момент написания статьи стабильная версия пакета dev-java/rxtx-2.1.7.2-r3, но прошивка Arduino с ней работать не будет, необходимо поставить dev-java/rxtx-2.2_pre2. Вероятно когда появится новая стабильная версия проблема будет устранена.
# 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

Добавьте в файл /etc/make.conf строку, если ее еще нет, и создайте каталог:
# echo source /var/lib/layman/make.conf >> /etc/make.conf
# mkdir -pv /usr/local/portage

Компилируем toolchain, опции по умолчанию соответствуют stage4 и использованию стабильных пакетов:
# crossdev -t avr


Установка собственно самой IDE для программирования


Постольку нет ни одной стабилизированной версии, то скорее всего она появится не скоро. Поэтому просто устанавливаем последнюю версию. Необходимо разблокировать следующие пакеты, добавив в файл /etc/portage/package.keywords следующие строчки:
dev-embedded/arduino ~amd64
dev-embedded/uisp ~amd64

Можно добавить флаги для установки примеров и документации:
echo dev-embedded/arduino doc examples >> /etc/portage/package.use

Установка:
# emerge arduino


Запускаем 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() {
  digitalWrite(led, HIGH);
  delay(200);
  digitalWrite(led, LOW);
  delay(200);
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
}

Нажимаете галочку «Проверить» и стрелочку «Загрузить» и будет вам счастье. На самом деле может и не будет, потому что необходимо устранить еще некоторые проблемы и об этом ниже.

Проблемы:


Если пункт выбора последовательного порта деактивирован, то вам снова нужно вернуться к началу статьи и

  • проверить поддержку конвертера ядром:
    #zgrep FTDI /proc/config.gz
    CONFIG_USB_SERIAL_FTDI_SIO=m
    
  • наличие модуля в памяти:
    # lsmod | grep ftdi
    
  • можно попробовать его перезагрузить:
    # modprobe -r ftdi_sio
    # modprobe ftdi_sio
    
  • проверить версию rxtx:
    # 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/


UPDATE: 28.03.2013

Существует проблема с 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

Все написанное выше по поводу некорректных путей остается в силе.

UPDATE: 13.04.2013
Для систем с 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


Вместо заключения


Сама плата и способы ее использования меня заинтересовали в контексте построения системы «Умный дом». Сейчас у меня капитальный ремонт квартиры в самом разгаре, и я могу проложить любые кабели, разместить любые коммутационные коробки и т. д.

Содержание


  1. Программирование Arduino из Linux, gentoo-way, быстрый старт
  2. Программирование Arduino из консоли, gentoo-way, ничего лишнего


Использованные источники


  1. playground.arduino.cc/linux/gentoo
  2. forums.gentoo.org/viewtopic-t-907860.html
  3. arduino.cc/en/Tutorial/blink
  4. forums.gentoo.org/viewtopic-t-834097.html
  5. bugs.gentoo.org/show_bug.cgi?id=147155
  6. lpig.wordpress.com/2011/09/28/arduino-and-gentoo
  7. en.gentoo-wiki.com/wiki/Crossdev
  8. bugs.gentoo.org/show_bug.cgi?id=378387
Tags:
Hubs:
+26
Comments 11
Comments Comments 11

Articles