Программируем Arduino с помощью Raspberry Pi

  • Автор
Статья о том,как при помощи GPIO прошить Arduino или совместимый с Arduino AVR.

Внимание!Все действия вы производите на свой страх и риск.Автор ответственности не несет.


Это руководство ориентировано на людях знакомых с ISP программированием или имеющим опыт работы с Arduino .Если вы не уверены в своих силах,то лучше использовать Arduino IDE.

Вам понадобится:


  • Raspberry Pi ,но учтите , что вам нужно 4 свободных GPIO порта для каждого AVR

  • AVR чип или платы Arduino , который с гребенкой ICSP (например Arduino Uno).

  • Макетная плата и провода для соединения выводов ICSP на AVR / Arduino и GPIO контактов на Raspberry Pi


Шаг 0.Добавим репозиторий из которого будем загружать ПО.

sudo nano /etc/apt/sources.list

И добавим в открывшийся файл строку
deb http://apt.adafruit.com/raspbian/ jessie main

Теперь в файле должно быть прописано два репозитория
1)Репозиторий Raspbian
2)Репозиторий Adafruit который мы сейчас добавили
Сохраняем файл и ставим avrdude
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install avrdude

Для того,чтобы удостовериться,что все установилось
avrdude -v

Шаг 1.Подключаемся.

Соединим контакты GPIO и ICSP контакты AVR/Arduino по схеме

  • Arduino ICSP VCC к Raspberry Pi 5V pin.

  • Arduino ICSP GND к Raspberry Pi GND pin.

  • Arduino ICSP RESET к Raspberry Pi GPIO #12.

  • Arduino ICSP SCK к Raspberry Pi GPIO #24.

  • Arduino ICSP MOSI к Raspberry Pi GPIO #23.

  • Arduino ICSP MISO к Raspberry Pi GPIO #18.


Шаг 2.Настроим AVRDUDE
Откроем файл
sudo nano /etc/avrdude.conf

И в конец файла добавим
# Linux GPIO configuration for avrdude.
# Change the lines below to the GPIO pins connected to the AVR.
programmer
id = "pi_1";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 12;
sck = 24;
mosi = 23;
miso = 18;
;

Сохраняем файл.
Шаг 3.Программирование

Для начала нам нужно получить .hex файл скетча
Одним из способов его получения это скомпилировать скетч через ARDUINO IDE и посмотреть на наличие строки,которая укажет путь к .hex файлу
Удобнее всего это делать с ПК.
Пример строки:
/home/Сanabalt/Programs/arduino-1.6.4/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/build6154610255332504576.tmp/Blink.cpp.elf /tmp/build6154610255332504576.tmp/Blink.cpp.hex 

Также .hex файл можно получить через AVR GCC
Проверим доступность Arduino/AVR
sudo avrdude -p atmega328p -C /etc/avrdude_gpio.conf -c pi_1 -v

Вывод должен быть примерно таким
avrdude: Version 6.1, compiled on May 28 2015 at 18:41:48
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "/home/pi/avrdude_gpio.conf"
User configuration file is "/root/.avrduderc"
User configuration file does not exist or is not a regular file, skipping

Using Port : unknown
Using Programmer : pi_1
AVR Part : ATmega328P // Модель контроллера
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

Programmer Type : linuxgpio
Description : Use the Linux sysfs interface to bitbang GPIO lines
Pin assignment : /sys/class/gpio/gpio{n}
RESET = 12
SCK = 24
MOSI = 23
MISO = 18

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK (E:05, H:D6, L:FF)

avrdude done. Thank you.

Если все удачно,то мы готовы к прошивке
sudo avrdude -p atmega328p -C /etc/avrdude_gpio.conf -c pi_1 -v -U flash:w:Blink.cpp.hex:i

Где atmega328p модель контроллера,который прошиваем
Где Blink.cpp.hex необходимо указать путь и название .hex файла для прошивки

В моем случае вывод был таким
avrdude: Version 6.1, compiled on May 28 2015 at 18:41:48
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "/home/pi/avrdude_gpio.conf"
User configuration file is "/root/.avrduderc"
User configuration file does not exist or is not a regular file, skipping

Using Port : unknown
Using Programmer : pi_1
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

Programmer Type : linuxgpio
Description : Use the Linux sysfs interface to bitbang GPIO lines
Pin assignment : /sys/class/gpio/gpio{n}
RESET = 12
SCK = 24
MOSI = 23
MISO = 18

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "Blink.cpp.hex"
avrdude: writing flash (1030 bytes):

Writing | ################################################## | 100% 0.89s

avrdude: 1030 bytes of flash written
avrdude: verifying flash memory against Blink.cpp.hex:
avrdude: load data flash data from input file Blink.cpp.hex:
avrdude: input file Blink.cpp.hex contains 1030 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.87s

avrdude: verifying ...
avrdude: 1030 bytes of flash verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK (E:05, H:D6, L:FF)

avrdude done. Thank you.

Такой вывод обозначает,что все прошито удачно.
Теперь удалим репозиторий
sudo nano /etc/apt/sources.list

И уберем оттуда репозиторий ,который добавили в начале статьи.
Удачи вам во всех ваших начинаниях!

Все вопросы в комментарии под постом.

Комментарии:

admin
А зачем убирать репозиторий?
admin
Для Raspberry Pi есть адаптированная версия Arduino IDE

Вы пробовали через неё прошивать ардуину?
alfo
а как вы будете прошивать с помощью IDE когда прошивка изначально идет в HEX?
alfacom
Сначала прошивка в виде текстового файла хранится, а уже потом компилируется в hex.
alfo
очень часто бывают ситуации когда прошивка идет сразу в hex
расскажите как с ide быть?)
alfo
я все это к томучто автор просто показал как прошить hex файлналичие ide конечно круто и да когда есть код можно и прошитьно когда у вас будет сразу в hex формате ide вам не поможет
по этому и я не понимаю к чему этот комментарий про Arduino IDE
alfacom
Да все так же с этим IDE. Все те же самые утилиты использует IDE, чтобы превратить код в хекс, а затем залить в ардуину. И лежат они в hardware\tools\avr\bin\ 
А с комментарием так тем более все правильно, т.к. у автора статьи был скетч, а не хекс. Посмотрите начало третьего шага.
alfo
Ржу не могу
Расскажите как открыть hex  в ардуино идеАвтор статье рассматривает все возможности
мне как раз нужно было прошить чип прошивкой которая была в hex
Был бы это скетч мне бы и raspberry не понадобился, я бы в винде все сделал
Не нужно думать на столько узко и рассматривать частный случай когда у вас есть скетч. Или вы предлагаете написать еще отдельную статью про прошивку когда у вас есть только hex?)))

Для написания комментариев необходимо зарегистрироваться