Хэллоуин — ночь перед Днём всех святых. По легенде именно в Хэллоуин духи выходят на землю, чтобы побезобразничать. В этот день принято выставлять в окно фонарь из тыквы со свечой внутри, чтобы отпугнуть злых духов. Мы расскажем как, используя новые технологии, сделать тыкву настолько страшной, что вся нечисть ещё долго будет обходить ваш район стороной.
Wireless SD Shield в данном проекте используется для подключения карты памяти microSD и считывания с неё wave-файлов, а не для подключения модулей беспроводной связи форм-фактора XBee.
Для начала модернизируем Wireless SD Shield для подключения различных модулей.
Внимание!
В отличии от большинства плат Arduino, родным напряжением Arduino M0 является 3,3 В, а не 5 В. Соответственно, выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Подача большего напряжения может повредить микроконтроллер!
В связи с тем что в проекте используются 2 уровня напряжения, сделаем 3-пиновые разъёмы для подключения датчиков как с 3,3-вольтовой логикой, так и с 5-вольтовой логикой.
8
, 9
и 11
. Далее подключите к ним питание 5V
и землю GND
.Для эстетичности платы все провода и пайку проводите с обратной стороны Wireless SD Shield’a.
12
, а также питание 3V3
и землю GND
.A0
, а 3 пин контактной колодки соедините с землёй GND
. Конденсатор используется для отфильтровки постоянной составляющей сигнала.8
и 9
Wireless SD Shield.12
, рабочее напряжение которого 3,3 вольта.11
Wireless SD Shield.Vin
GND
Wireless SD Shield’a.A0
Wireless SD Shield;Теперь можно поздней Хеллоуинской ночью взять тыкву на улицу, оставить её в тёмном месте и смотреть на реакцию вскрикивающих от ужаса мимо проходящих людей.
// подключаем библиотеку для работы SPI #include <SPI.h> // подключаем библиотеку для работы c картой microSD #include <SD.h> // подключаем библиотеку для воспроизведения музыки с помощью Arduino M0 #include <AudioZero.h> // даём разумное имя пинам к которым подключены светодиоды #define LED1_PIN 8 #define LED2_PIN 9 // даём разумное имя пина к которому подключен силовой ключ #define MOSFET_PIN 11 // даём разумное имя для пина к которому подключен // инфракрасный датчик препятствий (infrared sensor barriers) #define ISB_PIN 12 void setup() { // начало работы с SD-картой памяти // передаём номер пина подключенного к линии CS SD-карты while (!SD.begin(4)) { // если связи нет, ждём 1 секунду // процесс повторяется в цикле // пока не появится положительный ответ от SD-карты delay(1000); } // настраиваем пины светодиодов в режим выхода pinMode(LED1_PIN, OUTPUT); pinMode(LED2_PIN, OUTPUT); // гасим светодиоды digitalWrite(LED1_PIN, LOW); digitalWrite(LED2_PIN, LOW); // настраиваем пин силового ключа в режим выхода pinMode(MOSFET_PIN, OUTPUT); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } void loop() { // если на выходе датчика логический 0 if (!digitalRead(ISB_PIN)) { // зажжём светодиоды digitalWrite(LED1_PIN, HIGH); digitalWrite(LED2_PIN, HIGH); // подаём высокий уровень на силовой ключ digitalWrite(MOSFET_PIN, HIGH); // вызываем дважды функцию воспроизведения трека playMusic(); playMusic(); // гасим светодиоды digitalWrite(LED1_PIN, LOW); digitalWrite(LED2_PIN, LOW); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } } void playMusic() { // начинаем работу с библиотекой AudioZero // выставляем частоту воспроизведения AudioZero.begin(2*44100); // открываем wave-файл с карточки microSD File myFile = SD.open("scream.wav"); // если файл открывается, проигрываем его if (myFile) { AudioZero.play(myFile); } // прекращаем работу с библиотекой AudioZero AudioZero.end(); }
В нашем проекте есть изъян, когда идёт воспроизведение музыки, программа стоит на месте и ожидает завершения трека. Если вы в этот момент хотите выполнять различные действия необходимо воспользоваться прерыванием по таймеру. Ниже представлен пример скетча, в котором во время воспроизведения музыки глаза у тыквы мигают. В скетче используются уже не только стандартные функции и методы языка Arduino (C++), а и общение с регистрами микроконтроллера на чистом «C».
// подключаем библиотеку для работы SPI #include <SPI.h> // подключаем библиотеку для работы c картой microSD #include <SD.h> // подключаем библиотеку для воспроизведения музыки с помощью Arduino M0 #include <AudioZero.h> // даём разумное имя пинам к которым подключены светодиоды #define LED1_PIN 8 #define LED2_PIN 9 // даём разумное имя пина к которому подключен силовой ключ #define MOSFET_PIN 11 // даём разумное имя для пина к которому подключен // инфракрасный датчик препятствий (infrared sensor barriers) #define ISB_PIN 12 void setup() { // начало работы с SD-картой памяти // передаём номер пина подключенного к линии CS SD-карты while (!SD.begin(4)) { // если связи нет, ждём 1 секунду // процесс повторяется в цикле // пока не появится положительный ответ от SD-карты delay(1000); } // инициализация и настройка таймера timerInit(); // настраиваем пины светодиодов в режим выхода // PORT_PA06 8 пин Arduino M0 // PORT_PA07 9 пин Arduino M0 PORT->Group[0].OUTTGL.reg = PORT_PA06; PORT->Group[0].DIRSET.reg = PORT_PA07; // гасим светодиоды PORT->Group[0].OUTCLR.reg = PORT_PA06; PORT->Group[0].OUTCLR.reg = PORT_PA07; // настраиваем пин силового ключа в режим выхода pinMode(MOSFET_PIN, OUTPUT); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } void loop() { // если на выходе датчика логический 0 if (!digitalRead(ISB_PIN)) { // разрешаем прерывание по таймеру TC3 NVIC_EnableIRQ(TC3_IRQn); // подаём высокий уровень на силовой ключ digitalWrite(MOSFET_PIN, HIGH); // вызываем дважды функцию воспроизведения трека playMusic(); playMusic(); // запрещаем прерывание по таймеру TC3 NVIC_DisableIRQ(TC3_IRQn); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } } void playMusic() { // начинаем работу с библиотекой AudioZero // выставляем частоту воспроизведения AudioZero.begin(2*44100); // открываем wave-файл с карточки microSD File myFile = SD.open("scream.wav"); // если файл открывается, проигрываем его if (myFile) { AudioZero.play(myFile); } // прекращаем работу с библиотекой AudioZero AudioZero.end(); } void timerInit() { // тактирование таймера TC3 GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN|GCLK_CLKCTRL_GEN_GCLK0|GCM_TCC2_TC3; // 16 битный счётчик и предделитель 64 TC3->COUNT16.CTRLA.reg |= TC_CTRLA_MODE_COUNT16|TC_CTRLA_PRESCALER_DIV64; // прерывание по переполнению TC3->COUNT16.INTENSET.reg |= TC_INTENSET_OVF; // запуск счётчика TC3->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE; // настройка прерывания на таймер 3 NVIC_DisableIRQ(TC3_IRQn); NVIC_ClearPendingIRQ(TC3_IRQn); NVIC_SetPriority(TC3_IRQn, 40); NVIC_EnableIRQ(TC3_IRQn); } // обработчик прерывания void TC3_Handler(void) { // инвертируем состояние светодиодов PORT->Group[0].OUTTGL.reg = PORT_PA06; PORT->Group[0].OUTTGL.reg = PORT_PA07; // сбрасываем флаг прерывания TC3->COUNT16.INTFLAG.reg |= TC_INTFLAG_OVF; }
Добавив в проект один из сервоприводов можно заставить тыкву вращаться и ещё сильнее пугать прохожих.
Если у вас вдруг не оказалось платформы Arduino M0, вы можете использовать, к примеру, Arduino Uno, добавить к ней Music Shield и, немного изменив скетч, воспроизводить музыку с плеера.