вторник, 20 августа 2013 г.

Maihe, electrics

Задача сделать светосигнальное оборудование для follow me с управлением от обычного любого радиоуправления. Поехали.

Для основы выбрал attiny2313. Сначала думал на atmega8 сделать, но размер великоват.
Задумка такая - реализую входных три канала - один от направления, другой от газа, ну а третьим будем включать / выключать оборудование. От направления мы будем включать поворотники если руль отклоняется сильно, по газу мы будем определять торможение и зажигать стопсигналы. Ну а на светосигнальном будут висеть всякие мигалки и стробы.
По сути нужно контроллер подключить к ключам на которых все и будет висеть. Микросхема uln2803 имеет 8 ключей, три ключа уйдут на торможение и лево / право, остаются пять ключей:
  1. Левый основной
  2. Правый основной
  3. Левый вспомогательный
  4. Правый вспомогательный
  5. Общий вспомогательный
Схема в isis вышла вот такая - четыре разъема (питание, вход, выход, программирование), светодиод + резистор для индикации, две микросхемки (ATtiny2313A, ULN2803). Куча дополнительных элементов исключена из pcb layout - это все для отладки.



Вид микросхемки примерно такой. J1 для программирования, J2 питание, J3 входные сигналы, J4 выводные линии.









Теперь пора программы. На входе будет стандартный сигнал для сервопривода как на картинке.
Это сигнал с периодом в 50 Гц, с информацией об уровне в длительности импульса - от 0.5 до 2.4 мс. По картинке примерно понятно что и как. Для более менее точного понимания входного сигнала будем его измерять с точностью 0.1 мс, или 10 кГц. Можно и точнее, но есть одно но.

Мой подход следующий - раз в 0.0001 секунду останавливаем программу и измеряем уровень сигнала на входе. Процессор attiny2313 идет с завода с установкой внутреннего осциллятора на 8 мГц, т.е. на 8000000 тактов. Игрушки от Atmel примерно делают одну операцию за такт. Каждую 0.0001 секунды процессор должен остановится, отработать вход и пойти дальше исполнять программу, отсюда вывод что между остановками будет около 800 тактов.
Я сначала пробовал на 1 мГц все реализовать, но программа не успевала отработать весь цикл за 1000000/100000 = 100 тактов, так что мой выбор 8 мГц. Можно и больше, но тогда нужен будет внешний осциллятор, а это гемор а я не хочу возиться.

Ок, теперь программа примерно такого вида получается.

#include <avr/io.h>
#include <avr/interrupt.h>
#немножко переменных
...
#и вот такие переменные как ниже - по ним сценарии отрабатываются
const unsigned char scenario_light[20] = {
    //PB7 PB6 PB5 PB2 PB1, исходный файл http://goo.gl/BKERl
    0b01000010...0b01000110
};

void initialization(void){ //инициализация

  asm("cli");
...
  // Опорный таймер для фреймов, TIMER_COUNTER_1
  TCCR1A |= (0 << COM1A1)|(1 << COM1A0)|(0 << COM1B1)|(1 << COM1B0);
  TCCR1B |= (0 << CS12)|(1 << CS11)|(0 << CS10); // предделитель 8
  OCR1A = 99; // число сравнения
  TCCR1A |= (0 << WGM11)|(0 << WGM10); // режим 4, стр. 106
  TCCR1B |= (0 << WGM13)|(1 << WGM12); // режим 4, стр. 106
  TIMSK |= (1 << OCIE1A); // регистр прерывания сравнения
...
  asm("sei");
}

ISR(TIMER1_COMPA_vect){ 

    //обработчик прерывания
    ...
    frame = 1;
    inputValue = PIND; // берем значение из порта
}

void showStatus(void){ //отображение режима работы устройства }


void showTurns(void){ //отображение поворота }


void showStops(void){ //отображение стопсигнала }


void showLights(void){ //светосигнальное оборудование }


int main(void){

  initialization();
    while(1)
{
        if(frame){ // здесь вся логика обработка входов
                   frame = 0;
...
  showStatus();
                   showLights();
                   showTurns();
                   showStops();
}
    }
}

Примерно так, раз в 800 тиков срабатывает прерывание, взводим переменную frame и присваиваем переменной inputValue значение с ножек D. Затем уже в основном цикле производим обработку и сбрасываем переменную frame. И по кругу.
Далее - заливаем прошивку в микросхему. Для этого у меня припасен такой девайс.
USB программатор AVR типа AVRISP STK500 V.3. Брал отсюда.


Подключается к  Atmel Studio 6 на раз два, шьется тоже легко. Далее на коленке все проверил - контроллер мне помигал лампочкой. Честно говоря радости не было предела - все получилось с первого раза.
Дальше пошла трата денег. Гуглим "изготовление печатных плат". Как обычно - вариантов много, но откликнулись только двое - chipselect.ru и rezonit.ru
Заказал у первых, так как там монтаж компонентов стоил в моем случае дешевле. Обошлось в общем в 53 USD на плату.
Но сервис вторых не могу не отметить - даже рендер заказанной платы можно рассмотреть и все это в автомате. Молодцы, резонит!








Ну пока я поработал с новой игрушкой - usb осциллограф. На нем попробовал выход с управления на сервопривод на реальном устройстве - реально все как на третьей картинке. Думаю, вещь мне очень пригодится.