Atari Punk или генерация ступенчатого тона

В этой статье мы познакомимся с одним из видов ЭМИ, названным генератором ступенчатого тона или Atari Punk.

Знаете, в некоторых проектах на микроконтроллерах нужно звуковое сопровождение, будь то игра или что-то похожее. Какая самая простая генерация звука? — Меандр, состоящий из простых единиц и нулей с задержкой между ними. Что ж, звук типа «Пуу», «Пии» — слишком скучновато. Можно усложнить конструкцию добавив ШИМ, несколько форм сигнала (меандр, синус, пила, шум), если приправить все это многоканальным звуком, то будет оркестр. Но что делать, если ресурсов контроллера почти не осталось? Нужно что-то по проще, как насчет этого ЭМИ, названного Atari Punk

Генератор ступенчатого тона — самодельное устройство, разработанное креационистом-радиолюбителем Форрестом М. Мимсом в  1980 году. Свое второе название генератор получил из-за схожести звука с консолью Atari 2600. Там применялся чип atari pokey состоящий из четырех таких генераторов.

Как же он работает?

Работает он гораздо проще, чем кажется. Он состоит из генератора ПИ и одновибратора. Генератор генерирует П.Импульсы, а одновибратор, фактически, искажает их делает длиннее или короче, тем самым нарушая несущую частоту. Получается некий эффект пилы. Пример звука: *Ссылка* Еще одно представление этого генератора может быть таким:

Здесь похожий эффект. Два прямоугольных сигнала — прерывают друг друга, благодаря элементу И. Один выступает в роли формирователя импульсов, другой в роли одновибратора. Как раз такой вид ЭМИ можно хорошо реализовать на микроконтроллере.

Чтобы совсем не затрачивать ресурсы контроллера, можно использовать 2 таймера в режимах CTC и при переполнении выдавать единицу на на порт контроллера. Я использовал 16-бит таймер и 8-бит таймер для генерации. Реализовал все на Arduino Mega (Atmega 2560/1280) вот код для нее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define firstpin 10 //10 пин (не менять)
#define secondpin 12 //12 пин (менять можно)
 
void setup() {
  pinMode(firstpin, OUTPUT);
  pinMode(secondpin, OUTPUT);
noInterrupts();
  TCCR2A = (0b01 << 6) | (0b010 & 0b011);
  TCCR2B = ((0b010 & 0b100) << 1) | 0b111;
  OCR2A = 70; 
 
  TCCR5A = 0;
  TCCR5B = 0;
  TCNT5  = 0;
 
  OCR5A = 2222;            
  TCCR5B |= (1 << WGM52);   
  TCCR5B |= (1 << CS52);   
  TIMSK5 |= (1 << OCIE5A); 
interrupts();
 
}
 
void sound(byte i1, int i2) {
    digitalWrite(secondpin, HIGH);
	OCR2A = i1; //8-bit таймер
	OCR5A = i2; //16-bit таймер
}
 
ISR(TIMER5_COMPA_vect)          
{
  digitalWrite(secondpin, !digitalRead(secondpin)); //PORTB = PORTB ^ (1<<6);  //Эмуляция прерывания на пине 16-бит таймера, так как мне не удалось настроить аппаратное прерывание
}
 
void loop() {
	sound(random(10, 200), random(60, 700)); //Генерация звука
	delay(60);
}

Отдельно код для Arduino Duemil/Free/UNO (Atmega168/328) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define firstpin 9 //9 пин (не менять)
#define secondpin 12 //12 пин (менять можно)
 
void setup() {
  pinMode(firstpin, OUTPUT);
  pinMode(secondpin, OUTPUT);
noInterrupts();
  TCCR2A = (0b01 << 6) | (0b010 & 0b011);
  TCCR2B = ((0b010 & 0b100) << 1) | 0b111;
  OCR2A = 70; 
 
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
 
  OCR1A = 2222;            
  TCCR1B |= (1 << WGM12);   
  TCCR1B |= (1 << CS12);   
  TIMSK1 |= (1 << OCIE1A); 
interrupts();
 
}
 
void sound(byte i1, int i2) {
    digitalWrite(secondpin, HIGH);
	OCR2A = i1; //8-bit таймер
	OCR1A = i2; //16-bit таймер
}
 
ISR(TIMER1_COMPA_vect)          
{
  digitalWrite(secondpin, !digitalRead(secondpin));  //Эмуляция прерывания на пине 16-бит таймера
}
 
void loop() {
	sound(random(10, 200), random(60, 700)); //Генерация звука
	delay(60);
}

Процедура sound — устроена так: void sound(255, 65536)/ Первое число для 8-bit таймера (от 0 до 255), второе для 16-bit таймера (от 0 до 65536). В скетче я использовал таймеры 5 и 2, но вы можете использовать и другие или вообще оба 8-битные. Главное — чтобы было две независимые частоты.

Если у вас уже есть два меандра, теперь нужно преобразовать их с помощью элемента И. Также (возможно лучше) это реализовать программно, условием И, но я использовал внешнюю микросхему, для разных экспериментов с сигналом. Можно взять любой элемент И ТТЛ логики, к примеру отечественную к155ли1. Но я применил к155ла3 — это ИНЕ: для подключения pnp транзистора. (сигнала не хватало для динамика) По такой схеме:

Вот пример получившегося звука:

Отдельно ссылка http://www.polesite.ru/wp-content/uploads/2013/02/sound.mp3

Думаю, это лучше простого меандра, но можно не останавливаться на этом, можно добавить еще одну частоту — звук станет еще интереснее. Что ж — на этом все 🙂

 

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bug Report
Локализовано: шаблоны Wordpress