воскресенье, 14 сентября 2014 г.

Байты для 4хразрядного семисегментника

Для анодного дисплея:

первая цифра: 11000111 (читаем справа налево) = 0xE3;
вторая цифра: 10100111 = 0xE5;
третья цифра: 10010111 = 0xE9;
четвертая цифра: 10001111 = 0xF1.
static uint8_t pos[4]= {0xE3,0xE5,0xE9,0xF1};
static uint8_t digit[11] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; 


Для катодного дисплея:

первая цифра: 00111000 (читаем справа налево) = 0x1C;
вторая цифра: 01011000 = 0x1A;
третья цифра: 01101000 = 0x16;
четвертая цифра: 01110000 = 0x0E.
static uint8_t digit[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; 
static uint8_t pos[4]= {0x1C,0x1A,0x16,0x0E};    

Arduino - скетч обратного отсчета

Скетч таймера от 0 до 9 со сдвиговым регистром и семисегментником

#include <SPI.h> //подключаем библиотеку SPI
enum { digitPin = 9 }; //выбираем линию SS регистра на 9-м пине Arduino
unsigned long timer=0, digitTimerPrev=0;
int i=0, j=0;

void setup(){
  SPI.begin(); //инициализируем SPI
    //переводим выбранный для передачи пин в режим вывода
  pinMode(digitPin, OUTPUT);
}


void loop(){
  //Заполняем массив байтами, которые будем передавать
  static uint8_t digit[16] = 
    {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
    //передаем по два байта из массива и защелкиваем регистры 
    timer=millis();
    
   if (timer-digitTimerPrev>1000){
      digitalWrite(digitPin, LOW);
      SPI.transfer(digit[i]);
      
      digitalWrite(digitPin, HIGH);
      i<9 ? i++ : i=0;
      digitTimerPrev=timer;
      }
}

суббота, 13 сентября 2014 г.

Arduino + 7-мисегментные индикатор с общим катодом + сдвиговый регистр

Схема подключения как здесь: http://greenoakst.blogspot.com/2011/11/arduino-7-spi.html.
Единственное, но COM семисегментника подаем землю а не плюс.
Скетч будет для 7-мисегментные индикатор с общим катодом такой:

#include <SPI.h> // подключаем библиотеку SPI
enum { reg = 8 }; // провод CS подсоединяем к 8-му пину Arduino

void setup()
{
  SPI.begin();  // инициализируем SPI
  pinMode(reg, OUTPUT); // настраиваем 8-й пин как выход
}

void loop()
{
  // храним в массиве все цифры
  static uint8_t digit[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  
  // выводим цифры по одной
  for (int i=0;i<16;i++){
    digitalWrite(reg, LOW); // притягиваем CS к земле - начало передачи
    SPI.transfer(digit[i]); // передаем байт
    digitalWrite(reg, HIGH); // отпускаем  CS - конец передачи
    delay(1000); // ждем секунду
  }
  //очистим дисплей на секунду
  digitalWrite(reg, LOW);
  SPI.transfer(0xFF);
  digitalWrite(reg, HIGH);
  delay(1000);
}

SPI и Ардуино

Схема:
MOSI (Master Out Slave In) или просто SI – передача данных от ведущего к ведомому.
MISO (Master In Slave Out) или просто SO – передача данных от ведомого к ведущему.
CS (Chip Select) или SS (Slave Select) – выбор ведомого устройства.
SCLK (Serial CLocK) или просто SCK – передача тактового сигнала от ведущего к ведомому.

пятница, 12 сентября 2014 г.

Ардуино + сдвиговый регистр

   Отличное пособие для начинания тут: http://arduino.ru/Tutorial/registr_74HC595

VCC – питание;
GND – земля;
DS – последовательный ввод. Должен подключаться к проводу MOSI шины SPI;
Q0-Q7 – параллельные выходы;
SHCP – тактовый вход. Должен подключаться к проводу SCK шины SPI;
STCP – защелкивание выводов. Должен подключаться к проводу CS шины SPI;
OE – разрешение работы выходов. При низком уровне выходы работают;
Q7S – последовательный вывод;
MR – общий сброс. Если притянуть его к земле – входы обнулятся.

Скетч для двух регистров 74HC595 и семисегментным 4хразрядным дисплеем с общим катодом:
// подключаем библиотеку SPI
#include <SPI.h>
// провод CS подсоединяем к 8-му пину Arduino
enum { reg = 8 };

void setup()
{
  
  Serial.begin(9600);
  Serial.println("Started");
// инициализируем SPI
  SPI.begin();
  Serial.println("SPI");
// настраиваем 8-й пин как выход 
  pinMode(reg, OUTPUT);
}

// храним в массиве все цифры 
static uint8_t digit[11] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};

void loop()
{
  for (int i=0;i<11;i++){
    // притягиваем CS к земле - начало передачи
    Serial.println(digit[i]);
    digitalWrite(reg, LOW);
    // передаем катодный байт
    SPI.transfer(digit[i]);
    // передаем анодный байт
    SPI.transfer(0xFF);
    // отпускаем  CS - конец передачи
    digitalWrite(reg, HIGH);
    // ждем секунду
    delay(1000);
  }
}