====== Прошивка микроконтроллера через Arduino ======
В этой статье мы покажем, как перейти от программирования платы Arduino к программированию «сырого» микроконтроллера ATtiny84 с использованием привычных скетчей.
===== Нам понадобится =====
{{ :программирование:hardcore1-avr-list.jpg? |}}
* [[amp>product/arduino-uno|Arduino Uno]]
* [[amp>product/potentiometer|Потенциометры]]
* [[amp>product/led-5mm|Светодиоды]]
* [[amp>product/resistor|Резисторы]]
* [[amp>product/wire-mm|Провода «папа-папа»]]
* [[amp>product/avr-attiny84|Микроконтроллер ATtiny84]]
===== Начинаем с простого скетча =====
Собирать мы будем устройство с потенциометром и светодиодом. В зависимости от угла поворота потенциометра будет изменяться яркость светодиода.
Подключаем к Arduino ледующим образом: светодиод подключаем к цифровому пину №6 (поскольку на нем есть возможность генерации ШИМ-сигнала, за счет которого будет регулироваться яркость светодиода), а потенциометр --- к аналоговому пину №0.
Скетч содержит следующий код:
// Номер пина для светодиода
int ledPin = 6;
// Номер аналогового пина
int analogPin = A0;
// В эту переменную считываем значение с аналогового входа
int val = 0;
void setup()
{
// Настраиваем пин светодиода на выход
pinMode(ledPin, OUTPUT);
}
void loop()
{
// Считываем значение
val = analogRead(analogPin);
// val содержит значение из диапазона 0..1023, а диапазон значений для analogWrite
// 0..255. Для этого делим значение на 4
analogWrite(ledPin, val / 4);
}
===== Скетчи на ATtiny84 =====
Итак, у нас Arduino Uno. Как же нам запрограммировать нашу «тиньку»? Для этого используется такое устройство, как программатор. Он необходим, чтобы залить прошивку в контроллер. Мы можем превратить нашу Arduino в программатор. Это элементарно делается путём заливки скетча ArduinoISP.
==== Делаем программатор и собираем схему ====
Открываем соответствующий скетч «Файл -> Примеры -> ArduinoISP» и заливаем его. Все, превращение завершено. Теперь необходимо правильно собрать схему, чтобы прошить «тиньку». Обратимся к коду скетча, который был только что залит. Даже не к коду, а к комментарию перед ним.
// This sketch turns the Arduino into a AVRISP
// using the following arduino pins:
//
// pin name: not-mega: mega(1280 and 2560)
// slave reset: 10: 53
// MOSI: 11: 51
// MISO: 12: 50
// SCK: 13: 52
//
// Put an LED (with resistor) on the following pins:
// 9: Heartbeat - shows the programmer is running
// 8: Error - Lights up if something goes wrong (use red if that makes sense)
// 7: Programming - In communication with the slave
Сначала подключим светодиоды таким образом, как описано в комментарии, не забывая резисторы. После сборки схемы и подачи питания, светодиод, подключенный к пину 9 «Heartbeat» будет моргать, обозначая нормальное функционирование. Если этого не произошло, то ищите ошибки в подключении.
Теперь надо подключить пины 10-13 к ATtiny. Чтобы узнать распиновку последней, обратимся к даташиту, который можно скачать с [[http://www.atmel.com/Images/doc8006.pdf|сайта Atmel]], производителя этих контроллеров. На второй странице расположена картинка, описывающая распиновку.
{{ :программирование:hardcore1-avr-pinout.png?700 |}}
Основываясь на даташите и комментарии из скетча, можем составить следующую таблицу подключения:
| ^ Arduino UNO ^ ATtiny84 ^
^ Reset | 10 | 4 |
^ MOSI | 11 | 7 |
^ MISO | 12 | 8 |
^ SCK | 13 | 9 |
Теперь подключим светодиод и переменный резистор.
Резистор необходимо подключить в пину №6 (PA7), поскольку этот пин может быть входом для аналого-цифрового преобразователя, а светодиод --- к любому другому, например, к 10 (PA3).
=== О нумерации пинов ===
Стоит немного рассказать о различии нумерации пинов в Arduino и при использовании «чистого» кода C. В Ардуино пины нумеруются последовательно и исключаются системные (питание, земля и т. д.), а в реальности всё немного иначе. Все выводы контроллера можно охарактеризовать двумя парметрами: номер порта (порт А, порт В и т.д.) и номер вывода (1..8).
На [[http://arduino.cc/en/Hacking/PinMapping168|сайте Arduino]] можно найти карту пинов. Она выглядит следующим образом:
{{ :программирование:hardcore2-avr-pin-map.png? |}}
Для используемой нами ATtiny84 нумерация будет аналогична. В библиотеке Arduino-tiny, о которой речь пойдёт далее, можно найти следующую таблицу соответствия:
// ATMEL ATTINY84 / ARDUINO
//
// +-\/-+
// VCC 1| |14 GND
// (D 0) PB0 2| |13 AREF (D 10)
// (D 1) PB1 3| |12 PA1 (D 9)
// PB3 4| |11 PA2 (D 8)
// PWM INT0 (D 2) PB2 5| |10 PA3 (D 7)
// PWM (D 3) PA7 6| |9 PA4 (D 6)
// PWM (D 4) PA6 7| |8 PA5 (D 5) PWM
// +----+
В соответсвии с назначением каждой ножки контроллера, аналоговые пины (те, у которых есть вход АЦП) нумеруются в скетче по каналу АЦП.
Напримем, пин сфизическим номером 11 может быть входом для второго канала АЦП (ADC2), поэтому в скетче он будет называться A2.
Теперь необходимо научить среду программирования Arduino понимать тот факт, что мы используем другой контроллер.
==== Учим среду разработки ====
Первым делом необходимо скачать [[http://code.google.com/p/arduino-tiny/|библиотеку arduino-tiny]], содержащую в себе все необходимое.
Далее заходим в настройки Arduino и смотрим расположение папки со скетчами.
{{ :программирование:hardcore1-avr-path.png?700 |}}
Переходим в эту папку и создаем там новую с названием «hardware». А в ней еще одну, «tiny». Копируем содержимое скачанного ранее архива в эту папку.
И последнее действие --- переименовываем файл «Prospective Boards.txt» в «boards.txt». Теперь перезагружем среду разработки и идем в меню «Сервис -> Плата».
{{ :программирование:hardcore1-avr-devices.png?700 |}}
Можно видеть, то добавилось много новых пунктов.
==== Программируем ATtiny84 ====
Выбираем в качестве нужного устройства «Сервис -> Плата -> ATtiny84 @ 8 MHz (internal oscillator; BOD disabled)» поскольку у нас нету внешнего кварца, который задает частоту работы контроллера. В качестве программатора выберем --- «Сервис -> Программатор -> Arduino as ISP».
В качестве кода берем уже написанный нами код для светодиода и подстроечного резистора и изменяем там номера пинов.
// Номер пина для светодиода
int ledPin = 2;
// Номер аналогового пина
int analogPin = A2;
// В эту переменную считываем значение с аналогового входа
int val = 0;
void setup()
{
// Настраиваем пин светодиода на выход
pinMode(ledPin, OUTPUT);
}
void loop()
{
// Считываем значение
val = analogRead(analogPin);
// val содержит значение из диапазона 0..1023, а диапазон значений для analogWrite
// 0..255. Для этого делим val на 4
analogWrite(ledPin, val/4);
}
===== Результат =====
Мы получили устройство, аналогичное тому, что могло бы быть сделано на Arduino, но использовали для него дешёвый и компактный микроконтроллер.
{{ :программирование:hardcore1-avr-finish.jpg? |}}
Так вы можете сгрузить некоторые обязанности в вашем большом проекте на отдельные микроконтроллеры, комбинировать их, заменять и делать много интересных, компактных вещей.