Site Language

Translate

Danish Dutch English French German

CashBack Реальный возврат при покупках в интернете

Основные версии плат Arduino

Due — плата на базе 32-битного ARM микропроцессора Cortex-M3 ARM SAM3U4E;

Leonardo — плата на микроконтроллере ATmega32U4;

Uno — самая популярная версия базовой платформы Arduino;

Duemilanove — плата на микроконтроллере ATmega168 или ATmega328;

Diecimila — версия базовой платформы Arduino USB;

Nano — компактная платформа, используемая как макет. Nano подключается к компьютеру при помощи кабеля USB Mini-B;

Mega ADK — версия платы Mega 2560 с поддержкой интерфейса USB-host для связи с телефонами на Android и другими устройствами с интерфейсом USB;

Mega2560 — плата на базе микроконтроллера ATmega2560 с использованием чипа ATMega8U2 для последовательного соединения по USB-порту;

Mega — версия серии Mega на базе микроконтроллера ATmega1280;

Arduino BT — платформа с модулем Bluetooth для беспроводной связи и программирования;

LilyPad — платформа, разработанная для переноски, может зашиваться в ткань;

Fio — платформа разработана для беспроводных применений. Fio содержит разъем для радио XBee, разъем для батареи LiPo и встроенную схему подзарядки;

Mini — самая маленькая платформа Arduino;

Pro — платформа, разработанная для опытных пользователей, может являться частью большего проекта;

Pro Mini — как и платформа Pro, разработана для опытных пользователей, которым требуется низкая цена, меньшие размеры и дополнительная функциональность.

CashBack Все честно и без обмана

Библиотека EEPROM

В микроконтроллере Ардуино есть EEPROM - память, в которой информация сохраняется даже после выключения устройства (подобно маленькому жесткому диску). Данная библиотека позволяет записывать и считывать информацию из этой памяти.

Объем памяти EEPROM различных микроконтроллеров, входящих в состав Ардуино, может отличаться: 1024 байта в ATmega328, 512 байт - в ATmega168 и ATmega8, 4 КБ (4096 байт) - в ATmega1280 и ATmega2560.

 

Микроконтроллеры ATmega имеют на борту энергонезависимую память EEPROM, не потеряющую записанные в нее данные даже после отключения питания. 512 байтов такой памяти несут ATmega8 и ATmega168, 1024 байта — ATmega328, 4096 байтов — Arduino Mega. Память типа EEPROM допускает несколько десятков тысяч циклов записи и стирания данных. Она может пригодиться для сохранения изменяющихся настроек при отключении питания от устройств Arduino. Для работы с этой памятью в составе Arduino IDE имеется удобная библиотека EEPROM.

 

Функции библиотек EEPROM

 

Библиотека EEPROM содержит две функции: чтения и записи в память данных.

 

Функция чтения EEPROM.read

 

Функция EEPROM.read считывает байт из энергонезависимой памяти EEPROM. Если байт до этого никогда не перезаписывался — вернет значение 255.

 

Синтаксис функции EEPROM.read: EEPROM.read(address)

Параметр: address — порядковый номер ячейки памяти для чтения от 0 до 512 (или 1024) (int);

Возвращаемое значение — байт, хранимый в ячейке памяти.

 

Пример считывания значения всех байтов энергонезависимой памяти EEPROM и вывода их в COM-порт представлен в примере.

 

#include <EEPROM.h>

// начальный адрес памяти EEPROM int address = 0;

 

byte value; void setup()

{

Serial.begin(9600);

}

void loop()

{

// считываем значение по текущему адресу EEPROM value = EEPROM.read(address);

Serial.print(address); Serial.print("\t"); Serial.print(value, DEC); Serial.println();

// устанавливаем следующую ячейку памяти address = address + 1;

// EEPROM содержит всего 512(1024) байт

// если адрес достиг 512(1024), то снова переходим на 0 if (address == 512)

address = 0; delay(500);

}

 

Функция записи EEPROM.write

 

Функция EEPROM.write записывает байт в энергонезависимую память.

 

Синтаксис функции EEPROM.write:

EEPROM.write(address, value)

Параметры:

 address — порядковый номер ячейки памяти для записи — от 0 до 511 (int);

 value — байт для записи — от 0 до 255 (byte). Возвращаемого значения нет.

 

Возможное количество циклов перезаписи данных (Write/Erase Cycles) в памяти ограничено 100 тыс. раз — это следует учитывать при использовании данной памяти. Время, требуемое для завершения цикла записи, составляет 3,3 ms. Данная задержка уже учитывается библиотекой EEPROM.

Пример сохранения в энергонезависимой памяти EEPROM значений, считанных с аналогового входа analog input 0, представлен в листинге 8.2. Данные значения останутся в памяти и после отключения питания от платы и в будущем могут быть доступны для другого скетча.

 

#include <EEPROM.h>

// текущее значение адреса EEPROM int addr = 0;

void setup()

{;}

void loop()

{

if (addr < 512)

{

// EEPROM может хранить только значения от 0 до 255. int val = map(analogRead(0),0,1024,0,256);

// записываем значение в энергонезависимую память EEPROM.write(addr, val);

// устанавливаем следующую ячейку памяти. addr = addr + 1;

}

}

 

Примеры использования памяти EEPROM

 

Воспроизведение звука

Создадим проект, в котором устройство Arduino используется для генерации звука. Мелодии хранятся в памяти EEPROM и выводятся на динамик. Для этого на динамик следует подать сигнал соответствующей частоты. В качестве динамика используем динамическую головку 8 Ом, подключаемую к выводу D8. Схема подключения представлена на рисунке.

 
 Схема включения

 

Вместо сопротивления с номиналом 220 Ом можно использовать и большее, например, 510 Ом или 1 кОм. Недостатком такого подключения является то, что звук получается очень-очень тихий. Поэтому, чтобы получить громкость более приличного уровня, динамик можно подключить к выводу не напрямую, а через транзистор, как показано на рисунке.

Схема включения с транзистором

Громкость при этом получается весьма большой, поэтому в схему в качестве регулятора громкости добавлен потенциометр R2. Транзистор включен по схеме с общим эмиттером, и в данном случае выступает не в роли усилителя, а в качестве электронного ключа для согласования нагрузок. Дело в том, что у динамической головки сопротивление очень маленькое, и при подаче на нее напряжения +5 В через нее станет протекать ток около 625 мА. Однако максимальный ток, который могут обеспечить все выводы микроконтроллера, составляет всего 150 мА, т. е. в 4 раза меньше. И таким образом, подключая динамик к микроконтроллеру не напрямую, а через транзистор, способный пропускать через себя большее напряжение и ток большей силы, мы обеспечиваем электрическое согласование — в данном случае согласование по току.

Сначала составим скетч для воспроизведения одной мелодии. Мелодия состоит из двух массивов: массива с последовательным списком нот и массива со значениями длительности воспроизведения каждой ноты. Для воспроизведения одной ноты подаем на динамик сигнал определенной частоты и длительности. Затем воспроизводим следующую ноту. И так далее до окончания мелодии. Переменная tempo отвечает за скорость воспроизведения. Расчет тонов для нот одной октавы представлен в таблице.

 

Для подачи частотного сигнала на динамик воспользуемся функцией tone(). Скетч для воспроизведения мелодии представлен в примере сопровождающего книгу электронного архива.

Таблица расчета тонов для нот одной октавы

 

 

// ноты мелодии

char notes[]="GECgabCaCg DGECabCDED EFEDGEDC CECaCag gCEDgCEDEFGECDgC "; // пробел - это пауза

// длительность для каждой ноты и паузы

int beats[] = { 4, 4, 4, 4, 1, 1, 1, 2, 1, 4, 2, 4, 4, 4, 4, 1, 1, 1, 2,

1,4, 2, 1, 1, 1, 1, 2, 1, 1, 4, 2, 1, 2, 1, 2, 1, 1, 4, 2, 1,

2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 4, 4, 4} ;

// подключить динамик к pin 8 int speakerPin = 8;

int length = sizeof(beats); // число нот

// темп воспроизведения int tempo = 400;

// проиграть ноту

void playNote(char note, int duration)

{

// массив для наименований нот (до ре ми ... и т. д. в пределах двух

// октав)

char names[]={'c','d','e','f','g','a','b','C','D','E','F','G','A','B'}; int tones[]={3830,3400,3038,2864,2550,2272,2028,1912,1700,

1518,1432,1276,1136,1014 };

// проиграть тон, соответствующий ноте for (int i = 0; i < sizeof(tones); i++)

{

if (names[i] == note) tone(speakerPin,tones[i],duration * 1000L);

}

}

 

void setup()

{pinMode(speakerPin, OUTPUT);}

void loop()

{

for (int i = 0; i < length; i++)

{

if (notes[i] == ' ')

tone(speakerPin,0, beats[i]*tempo* 1000L); // пауза else

playNote(notes[i], beats[i] * tempo);

}

// пауза между нотами delay(tempo / 2);

}

delay(3000);

}

 

Звонок с мелодиями

 

Проигрывать мелодию через динамик мы уже умеем. Теперь напишем скетч загрузки мелодий в память EEPROM. Зарезервируем там место для 10 мелодий, которые сможем проигрывать в нужный момент. Карта адресов памяти будет иметь следующий вид:

 0-9 — указатель на адрес мелодии;

 10-511 — место для мелодий.

Каждая мелодия будет представлять следующую последовательность данных: tempo(2 байта), нота1, длит.1, нота2, длит.2 ,..., нотаN, длит.N, end где:

 tempo — темп проигрываемой мелодии;

 нота1, нота2 ,..., нотаN — ноты;

 длит1, длит2 ,..., длитN — длительности проигрывания нот;

 end — байт конца мелодии (значение 0).

Запись последовательности нот и длительности их воспроизведения для каждой мелодии хранятся в массивах. В нашем скетче мы после записи мелодий в память EEPROM выведем содержимое памяти EEPROM. Фрагмент содержимого скетча представлен в примере.

 

// Использование библиотеки EEPROM

// запись мелодий в EEPROM

// подключение библиотеки EEPROM

#include <EEPROM.h>

// ноты мелодии

String notes[] ={ "ccggaagffeeddc ",

"GECgabCaCg DGECabCDED EFEDGEDC CECaCag gCEDgCEDEFGECDgC "};

// пробел - это пауза

// длительность для каждой ноты и паузы

String beats[]={"1,1,1,1,1,1,2,1,1,1,1,1,1,2,4", "4,4,4,4,1,1,1,2,1,4,2,4,4,4,4,1,1,1,2,1,4,2,1,1,1,1,2,1,1,4,2,1,

2,1,2,1,1,4,2,1,2,1,2,1,2,1,2,1,1,1,1,1,2,1,4,4,4"} ;

int tempo[]= {300,400};

.........

int addr1=0; int addr2=10;

void write_melody(int num)

{

EEPROM.write(addr1,addr2); // указатель на мелодию EEPROM.write(addr2,tempo[num]>>8); // для tempo – 2 байта addr2++;

EEPROM.write(addr2,tempo[num]); addr2++;

for(int j=0;j<notes[num].length();j++)

{

EEPROM.write(addr2,notes[num][j]); // нота addr2++;

EEPROM.write(addr2,beats[num][j*2]); // длительность addr2++;

Serial.print(notes[num][j]);Serial.print(" "); Serial.print(beats[num][j*2]-48);Serial.println(" ");

}

// записать 0 - end EEPROM.write(addr2,0); addr2++;

addr1++;

}

void setup()

{

.........

for(int i=0;i<sizeof(tempo)/2;i++)

{write_melody(i);}

Serial.println("end..."); Serial.println("control..."); for(int i=0;i<511;i++)

{

Serial.print(i);Serial.print(" - ");

 

Serial.println(EEPROM.read(i),DEC);

}

}

void loop()

{;}

В примере мы загружаем в память 2 мелодии. Я думаю, у вас не возникнет трудностей для изменения скетча для загрузки большего количества мелодий.

А теперь напишем скетч, проигрывающий случайную мелодию из памяти EEPROM при нажатии кнопки. Схема при этом изменяется незначительно. Один контакт кнопки подсоединяем к D9. К нему же подключаем подтягивающий резистор 10 кОм, который в свою очередь соединяем с землей. Другой выход кнопки соединяем с питанием 5 В. При включении в программе setup() подсчитаем количество записанных мелодий. Затем в цикле на динамик выдается мелодия. Данные мелодии (темп, список нот и их продолжительность) берутся из памяти EEPROM. Для контроля данные выводятся в монитор последовательного порта.

 

// ***** Воспроизведение мелодии, записанной в EEPROM

// подключение библиотеки EEPROM

#include <EEPROM.h>

// подключить динамик к pin 8 int speakerPin = 8;

// подключить кнопку к pin 9 int buttonPin = 9;

// темп воспроизведения, ноты, длительности int tempo,notes,beats;

// адрес указателя мелодии, случайная мелодия, количество мелодий int addr1;

int rand1; int count=0;

// проиграть ноту

void playNote(char note, int duration)

{

// массив для наименований нот (до ре ми ... и т. д. в пределах двух октав) char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b',

'C','D','E','F','G','A','B' };

int tones[] = { 3830, 3400, 3038, 2864, 2550, 2272, 2028, 1912, 1700, 1518,

1432, 1276, 1136, 1014 };

// проиграть тон, соответствующий ноте for (int i = 0; i < sizeof(tones); i++)

{

if (names[i] == note)

 

{

tone(speakerPin,tones[i],duration * 1000L);

}

}

}

void setup()

{

pinMode(speakerPin, OUTPUT); pinMode(buttonPin, INPUT); Serial.begin(9600);

for(int i=0;i<200;i++)

{

Serial.print(i);Serial.print(" - "); Serial.println(EEPROM.read(i),DEC);

}

int i=0; while(EEPROM.read(i)<255)

{count++;i++;} Serial.print("count=");Serial.println(count);

}

void loop()

{

if(digitalRead(buttonPin)==HIGH)

{

Serial.println("click");

// получить случайное rand1=random(0,count+1); addr1=EEPROM.read(rand1); Serial.println(addr1);

// tempo=EEPROM.read(addr1); addr1++;

Serial.print(tempo,DEC);Serial.println(""); tempo=tempo*256+EEPROM.read(addr1); addr1++; Serial.print(tempo,DEC);Serial.println(""); while(EEPROM.read(addr1)>0)

{

notes=EEPROM.read(addr1); addr1++; beats=EEPROM.read(addr1); addr1++;

Serial.print(notes);Serial.print(" "); Serial.print(beats,DEC);Serial.println(" ");

 

if (notes == ' ')

tone(speakerPin,0, beats*tempo*1000L); // пауза else

playNote(notes, beats*tempo);

// пауза между нотами delay(tempo / 2);

}

Serial.println("end");

}

}

Рекомендуем:

int

Побитовый свдиг влево (<<), побитовый сдвиг вправо (>>)

Константы

digitalRead()

setBitOrder()

transfer()

setDataMode()

SPI на Arduino Due

setClockDivider()

SoftwareSerial

analogReference(type)

Wire

SPI

attachInterrupt()

pinMode()

EEPROM

 

Плата расширения L293D, ИК-датчик VS1838B, TFT LCD, Модем M590E GSM GPRS, "монитор TFT LCD, датчик движения HC-SR501, ИК-пульт дистанционного управления, Радиомодуль NRF24L01, SD Card Module, Звуковой модуль, 5-axis stepper motor driver, Шаговый двигатель, Модем M590E GSM GPRS, 5-axis stepper motor driver, Часы реального времени DS 3231/DS 1307, терморегулятор W1209 DC, Релейный модуль, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, датчик движения HC-SR501, Передатчик и приемник в диапазоне RF 433 Mhz, Блок питания, L293D, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, Датчики контроля температуры, Радиомодуль NRF24L01, OKI 120A2, Rotary Encoder, SD Card Module, Беспроводной пульт дистанционного управления, Микросхема контроллера коллекторного электродвигателя, Модуль Bluetooth HC-06,, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Mini 360 на схеме LM2596, MP3-TF-16P, L293D, Модуль LCD монитора, Инфракрасные датчики расстояния, Часы реального времени, USB Host Shield, HC-SR501, Cветочувствительный датчик сопротивления, блок питания Mini 360 на схеме LM2596, ЖК-дисплей TFT дисплей, Контроллер L298N, HC-SR501, Модуль MP3 Player WTV020, GSM GPRS, Сервоприводы, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Модуль Wi-Fi ESP8266-12E, Инфракрасные датчики расстояния, Card Module, Ультразвуковые дальномеры HC-SR04, Блок питания, Карта памяти SD, Mini 360, Ethernet shield, L293D, блок питания Mini 360 на схеме LM2596, Радиомодуль, датчик температуры DS18B20, ИК-пульт дистанционного управления, USB конвертер UART, ИК-пульт, Антена для модуля WiFi, Ethernet shield, Модуль блока питания XL6009, Микросхема контроллера коллекторного электродвигателя, Модуль качества воздуха MQ-135, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, SD Card Module, Радиомодуль NRF24L01, двигатель OKI, 5-axis stepper motor driver, L293D, TB6560, Драйвер шагового двигателя TB6600, Шаговый двигатель, Модуль камеры, Блок питания, L293D, блок питания Mini 360 на схеме LM2596, 5axis mach3 interface, Карта памяти SD, Ethernet shield, Контроллер L298N, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, Модуль LCD монитора LCD1602, Шаговый двигатель OKI 120A2, Шаговый двигатель, Шаговый двигатель.

All Vintage Vinyl Records VinylSU.xyz

1.png2.png3.png4.png5.png

РУБИКОН Группа «Мозаика», ИЕРОГЛИФ ГРУППА «ПИКНИК», В ПОЛЁТ ГРУППА «ТЯЖЕЛЫЙ ДЕНЬ», Группа «Алиса», Бенни Гудмен, Равноденствие ГРУППА «АКВАРИУМ», Элтон Джон Твоя песня, Демон Группа «Август», Deep Purple – The House Of Blue Light, «Лед Зеппелин» Led Zeppelin, «Акцепт», Doors, «Металлика», АНСАМБЛЬ „UB 40", группа «Зоопарк», рок-группа «ЗОДИАК», «Браво», «Кино», Rolling Stones «Роллинг стоунз», РОК-ГРУППА «МАШИНА ВРЕМЕНИ»,«Кокто твинз», Группа «ДИАЛОГ», Bill Evans, Джимми Лансфорд, Флетчера Хендерсона, Дюк Эллингтон, Каунт Бейси, АНСАМБЛЬ "THE MOODY BLUES", Элвис Пресли, "Юнона" и "Авось" , Дж. Верди Реквием G.Verdi Requiem Mass, Элтон Джон, Реджинальд Кеннет Дуайт, АББА, ABBA, “Deep Purple”, «ЧЕЛОВЕК С БУЛЬВАРА КАПУЦИНОВ», “Rolling Stone”, Instrumrutal rock group Zodiac,‘‘Long Tall Ernie and The Shakers”, “The Beatles”, "Tom Fcgerty and The Blue Velvets", "Creedruce Clearwater Revival","Greru River" "Bayou Country", "Willy and The Poorboys", Varnishing Day Songs on Ilya Reznik's lirics , Leo Sayer ЛЕО СЕЙЕР, Boney M,"Waiting For The Sun", Doors «ДОРЗ», "Piper At The Gates Of Dawn", Led Zeppelin ? «ЛЕД ЗЕППЕЛИН», Rolling Stones , "Юнона" и "Авось" Опера Либретто, «РОЛЛИНГ СТОУНЗ», Modern talking,"Aftermath", «ДОМ ГОЛУБОГО СВЕТА», "Out Of Our Heads", Ricchi E Poveri, PINK FLOYD «Пинк Флойд», Vladimir Kuzmin, ПОЛ МАККАРТНИ Paul McCartney, «TWruTY FLIGHT ROCK», Creedruce Clearvater revival Traveling band,«LAWDY. MISS CLAWDY», «BRING IT ON HOME TO ME», Light My Fire,«DON'T GET AROUND MUCH ANY MORE», МУЗЫКАЛЬНЫЙ ТЕЛЕТАЙП-3,«I'М GONNA BE A WHEEL SOME DAY», МОДЕРН ТОКИНГ,«AINT THAT A SHAME», «THAT'S ALL RIGHT (МАМА)», АНСАМБЛЬ UB 40, «JUST BECAUSE», МИГЕЛЬ РАМОС, «SUMMERTIME», "АНСАМБЛЬ "THE MOODY BLUES", «CRACKIN UP», ТНЕ СОММОDORES, «MIDNIGHT SPECIAL», АННА ГEРМАН, Deep Purple «ДИП ПЁРПЛ», „Deep Purple in Rock", Андрей Миронов, Олег Табаков, Михаил Боярский, Николай Караченцов, Альберт Филозов, Олег Анофриев, Игорь Кваша, Леонид Ярмольник, ИЛЬЯ РЕЗНИК , Резанов Николай Петрович, ВЛАДИМИР ВЫСОЦКИЙ, Роджер Уотерс, АЛЕКСАНДР РОЗЕНБАУМ, Ричард Райт и Ник Мэйсон, ВЛАДИМИР КУЗЬМИН, Элвис Аарон Пресли, Leo Sayer, АДРИАНО ЧЕЛЕНТАНО, Билл Эванс, Клаудия Мори....

и это еще не конец.

С уваженим Dron!