====== Прошивка микроконтроллера через 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? |}} Так вы можете сгрузить некоторые обязанности в вашем большом проекте на отдельные микроконтроллеры, комбинировать их, заменять и делать много интересных, компактных вещей.