21.12.2008

Семисегментный индикатор для Arduino (2)

Часть II

(продолжение, см. начало в Части I)

Первым делом, нарисуем схему. TWI работает на аналоговых пинах A4, A5 - именно там разместили аппаратную поддержку авторы ATMEGA8 (это 27 и 28 выводы микроконтроллера в корпусе PDIP).

Что внутри? Три семисегментных LED-знакоместа, у которых pin-ы светодиодов соединены между собой в шину на 8 проводов (не забудем про десятичную точку).

Надо иметь ввиду, что семисегментные индикаторы бывают двух типов - там, где у LED-ов один общий анод и, наоборот, где один общий катод. Я для своих экспериментов выбрал индикаторы Agilent HDSP-5501 и HDSP-5521 с общим катодом, оставляю желающим возможность доработать микропрограмму для общего анода - ничего сложного, а в качестве тренировки очень даже полезно.

Так вот, общие катоды (аноды) сегментов надо повесить отдельно, поскольку в процессе отображения потребуется поочередно гасить все индикаторы кроме одного, выставляя при этом на общую шину код символа.

Микроконтроллеру нужно питание, сброс, тактирование, микропрограмма.

Кварц стоит недорого, но зачем? Экономим место и деньги - используем внутренний
неточный откалиброванный, для частоты 8МГц. Точность его не скажется на работе TWI, поскольку тактовые импульсы генерирует master, а мы будем работать в режиме slave.

Питание - стандартно, не забываем про конденсатор 0,1 мкФ между Vcc и GND. Схема сброса - тоже стандартная, притянуть к Vcc через R=10К. Получается элементарная схема (прошу прощения за качество, это мой первый опыт с Eagle, кликабельно для увеличения):


Микропрограмму напишем при помощи Arduino, так быстрее, хоть и менее эффективно с точки зрения энергопотребления и объема программы. Главное - чтобы заработало, а потом при желании энтузиасты улучшат, не правда ли?

Вернемся к схеме. Надо прикинуть, как бы не сжечь оконечные каскады pin-ов ATMEGA прожорливыми светодиодами. Поскольку знакоместа зажигаются по-очереди, то в один момент времени больше 1-го светодиода на шине не будет: это нормально. Но вот общие катоды (или аноды) могут за один раз собрать ток от 8 светодиодов, и это уже становится опасным.

Токоограничительные резисторы надо либо рассчитать по закону Ома (зная сопротивление источника питания, LED-ов, схему каскадов на I/O pin-ах ATMEGA и максимальный ток - 40mA), либо практическим путем - амперметром, последовательно в цепь. Например, у меня при подключении нагрузочного R=1К последовательно в цепь каждого из 8-ми выводов, ток на одном светодиоде составлял 2 mA, следовательно максимально - 16mA. В итоге, я остановился на 330 Ом, но видел схемы и со 100 Ом. Можно подстраховаться: подавать групповой уровень через транзистор. Но зачем нам лишние элементы на плате? Стоит заморачиваться только если предельное значение нагрузочного резистора не соответствует желаемой яркости свечения (например, надо рассматривать индикатор в солнечную погоду с пяти метров).

Теперь надо написать программу. Конечно, удобнее всего иметь под рукой два Arduino (часто один из них заменяет набор ArduinoMinimum, например такой). Соединяем их a4, a5, GND и снабжаем программами:

Приемник (slave):

#include <Wire.h>
#define ADDR 0x69

void receive_handler(int numbytes) {
  for (int i=0;i<numbytes;i++) {
    Serial.print(Wire.receive());
  }
}

void setup() {
  Serial.begin(38400);
  Wire.begin(ADDR);
  Wire.onReceive(receive_handler);
}

void loop() {}

Передатчик (master):

#include <Wire.h>
#define ADDR  0x69

void setup() {
  Wire.begin();
}

void loop() {
  Wire.beginTransmission(ADDR);
  Wire.send("Hello, world!");
  Wire.endTransmission();
  delayMicroseconds(1000);
}

После запуска обоих sketch-ей, подключитесь к serial-соединению на приемнике. Если все правильно, то раз в секунду будет приезжать "Hello, world!". 

Если нет - проверьте, выставили ли вы порт на скорость 38400, правильно ли соединены провода. Адрес 0x69 я выбрал произвольно, не исключено, что он пересекается скаким-либо существующим устройством. В любом случае, его всегда можно поменять. 

Заработало? Можно переходить на следующий уровень - сборка на макетной плате и написанию полноценной микропрограммы отображения для приемника.

(см. продолжение в Части III)

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

Отправить комментарий