понедельник, 27 октября 2014 г.

Генератор случайных ответов на ATtiny13 и Arduino(перезалито)

UPD по совету одного человека, я добавил в функцию system_sleep() отключение аналогового компаратора для ещё большей экономии заряда батарейки. Файлы в низу статьи перезалито.



Код, фьюзы, схема и исходники ищите внизу записи.

По сути этот брелок для ключей - железный генератор случайных чисел который основан на ATtiny13 - 8 bit'ый микроконтроллер который основан на архитектуре AVR от компании Atmel.
Данное устройство генерирует случайным образом число 0 или 1.
Таким образом мы можем получить ответ на любой вопрос в формате да/нет, индикация осуществляется при помощи красного и зелёного светодиодов.

Вот схема:



Как Вы видите, схема очень простая, несколько деталей всего, это достигнуто потому что в качестве основного элемента используется микроконтроллер.

Почему именно ATtiny13?

Да потому что это один из самых дешёвых микроконтроллеров компании Atmel из доступных на рынке. Лично у меня ATtiny13A стоит примерно 1 доллар. Как по мне так не сильно то и много как за брелок для ключей.

Код написан на языке ардуино и на C++.

Вот он:

// vk.com/razniepodelkiblogspot
// как прошить тини: 
// razniepodelki.blogspot.com/2014/05/attiny13-arduino.html

#define F_CPU 1200000UL  // Частота МК в герцах

#include <avr/io.h>
#include <avr/sleep.h> // здесь описаны режимы сна
#include <util/delay.h>

#define led_Yes 0 // grn
#define led_No 1 // red 
#define rand_gen 3 
#define wait 5000 // тайм аут перехода в спящий режим

void setup() {
  //pinMode(led_Yes, OUTPUT); 
  DDRB |= (1<<led_Yes);
  //pinMode(led_No, OUTPUT); 
  DDRB |= (1<<led_No);
}

void loop() {
  randomSeed(analogRead(rand_gen)); // не псевдо радном
  byte randomValue;
  randomValue = random(0,2);    // диапазон генератора случайных чисел от 0 до 1
  if(randomValue > 0){   
    //digitalWrite(led_Yes, HIGH);
    PORTB |= (1<<led_Yes);  
  }
  else{
    //digitalWrite(led_No, HIGH); 
    PORTB |= (1<<led_No);  
  }

  _delay_ms(wait); 
  system_sleep();
}

void system_sleep(){ 
  //digitalWrite(led_No, LOW); 
  PORTB &= ~(1<<led_No);
  //digitalWrite(led_Yes, LOW); 
  PORTB &= ~(1<<led_Yes);

  ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП
  ACSR |= (1 << ACD); // и компаратор
  // для уменьшения энергопотребления во сне
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
  while(1) {
    sleep_enable(); // разрешаем сон
    sleep_cpu(); // спать!
  }
}

//Размер скетча в двоичном коде: 912 байт (из 1 024 байт максимум)


Как видите у меня генерируется не псевдо случайное число(одна и та же последовательность чисел) а реальный генератор случайных чисел, этого добиться удалось при помощи функции randomSeed() в Arduino IDE.

Если данное устройство будет говорить часто ответ которого не очень то ожидаете, то можете или переназначить порты в коде (led_Yes 0 и led_No 1 ) или же перепаять светодиоды местами, кому как удобно. Так же можно изменить тайм аут по котором светодиод перестанет гореть и микроконтроллер уснёт, задаётся в миллисекундах(одна тысячная секунды) при помощи директивы #define wait 5000 // тайм аут 5 сек, после 5 секунд светодиод гаснет и устройство в режим низкого потребления, так званый режим сна, ток потребления которого будет... Смотрим даташит на ATtiny13A:


0.2 мкА(микро Ампера), для сравнения - красный светодиод потребляет примерно 1.5 мА(1500 мкА).

Давайте подсчитаем на сколько нажатий хватит нашей батарейки CR2025, емкость которой к стати примерно 150 мА/ч.

При нажатии светодиод горит 5 сек, то есть 60 сек. / 5 = 12 нажатий на минуту * 60 минут =  720 непрерывных нажатий в час, за час схема будет потреблять ток 1.5 мА, при емкости в 150 мА/ч 150/1.5 мА/ч = схема проработает 100 часов, так как мы пришли к выводу что за час можно совершить максимум 720 нажатий то 720 * 100 = 72 000 нажатий до полного истощения литиевой батарейки CR2025.


Строчку #define rand_gen 3 и пин PB3 не трогаем иначе устройство будет выдавать одно и то же значение.

Запрограммировал микроконтроллер ATtiny13 при помощи Arduino IDE, как это делается смотрите ниже.

Ссылки:

Прошивка ATtiny13 при помощи Arduino.

Файлы Proteus 7, hex-файл, исходник, всё тут(download):

https://vk.com/doc256435878_337812446 (перезалито)

Фьюзы по умолчанию, как всегда:



Вот фотографии устройства:

(Можете оценить размеры устройства на фоне моей ладони)

(Зелёным указаны перемычки)



Пару слов для буржуев:
The random answers to ATtiny13 and Arduino.
In fact, this hardware random number generator which is based on the ATtiny13 - 8 bit microcontroller based on the AVR architecture from company Atmel.
This equipment generates random 0 or 1. Thus, we can get an answer to any question in the form of yes / no indication made ​​using red and green LEDs.
The code is written in Arduino and C++.


Вступайте в мою группу ВКонтакте:

http://vk.com/razniepodelkiblogspot

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

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