Показаны сообщения с ярлыком programming. Показать все сообщения
Показаны сообщения с ярлыком programming. Показать все сообщения

Опыты –> Эксперименты с Arduino часть 3

Третий опыт с Arduino. В данной мини-лекции мы узнаем, как проигрывать при помощи Arduino простейшие мелодии, а также закрепим материал предыдущих двух уроков.
PICT0002

Для опытов была создана экспериментальная платформа под кодовым названием “Щячло”. Это игрушка Furby из Макдональдса с кое-какими принципиальными доработками. В глаза ей были вставлены два мощных светодиода (пожалуй, слишком мощных, не жадничайте, как я и не покупайте светодиоды на 30000 мКд, а то в глазах после опытов будут плясать зайчики) . В щячло к Щячлу был вмонтирован фоторезистор,  а в хвостовой части – стоит динамик (впрочем, он находился там и в прошлой инкарнации Furby).

PICT0004

Итак, суть опыта такова: имеется некоторый уровень освещенности от настольной лампы, и если мы её выключим – сработает фотодатчик и игрушка начнёт играть мелодию, а также в такт “мигать” глазами.

Мелодия выбрана с намёком на “Космическую Одиссею” Стэнли Кубрика и Артура Кларка. Да и 2010 год в конце-то концов. Кстати знаете ли вы, почему HAL-9000 пел именно Daisy Daisy, когда Дэйв вытаскивал из него один за другим модули памяти? [узнайте]

Мне очень важны ваши комментарии, так что не стесняйтесь, пишите.

Исходный код для данного примера. Прокомментированный и даже разукрашенный.

int speakerPin = 9; // выход для динамика
int leftEye= 10; // левый светодиод
int rightEye=11; // правый светодиод
int photoPin = 0; // аналоговый вход для фоторезистора
int val = 0; // переменная для значения считанного с аналогового входа

// ноты мелодии
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} ;

int tempo = 200; // темп исполнения
int length = sizeof(notes); // количество нот


void playTone(int tone, int duration) {
digitalWrite(leftEye,HIGH); // зажигаем оба глаза
digitalWrite(rightEye,HIGH); 
 // проигрываем требуемую ноту с нужной частотой и длительностью
 for (long i = 0; i < duration * 1000L; i += tone * 2) {
  digitalWrite(speakerPin, HIGH);
  delayMicroseconds(tone);
  digitalWrite(speakerPin, LOW);
  delayMicroseconds(tone);
}
digitalWrite(leftEye,LOW); // гасим оба глаза
digitalWrite(rightEye,LOW);  
 
}

void playNote(char note, int duration) {
 // массив для наименований нот (до ре ми ... и т.д. в пределах двух октав)
 char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C','D','E','F','G','A','B' };
 // соответствующие нотам частоты
 int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956, 850, 759, 716, 638, 568, 507 };

 // выбор частоты по наименованию ноты
 for (int i = 0; i < 15; i++) {
  if (names[i] == note) {
   playTone(tones[i], duration);
  }
}
}

void setup() {
pinMode(speakerPin, OUTPUT);// цифровые выводы на динамик
pinMode(leftEye, OUTPUT);  // и оба светодиода
pinMode(rightEye, OUTPUT); // конфигурируем как выходы
pinMode(photoPin, INPUT);  // а с фоторезистором - как вход
}

void loop() {
// считываем значение с фотодатчика
val = analogRead(photoPin);  
// небольшая задержка для регенерации АЦП
delay(10);
if (val>1020) { // если значение превысило предел (стало темно) - запускаем цикл проигрывания мелодии
 for (int i = 0; i < length; i++) { //
   if (notes[i] == ' ') {
    delay(beats[i] * tempo); // пауза
   } else {
    playNote(notes[i], beats[i] * tempo); // либо проигрываем соответствующую ноту
   }
  // небольшая пауза между нотами
  delay(tempo / 2);
  }
}
}


* This source code was highlighted with Source Code Highlighter.

Опыты –> Эксперименты с Arduino часть 2

Продолжаем опыты с Arduino.

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

Исходные коды программы:

int potPin = 0;    // select the input pin for the photoresistor
int speakerOut = 3; // this is the pin that the piezo element should be connected with
int val = 0;       // variable to store the value coming from the sensor
void setup() {
  pinMode(speakerOut, OUTPUT);// declare the ledPin as an OUTPUT
}
void loop() {
  val = analogRead(potPin);    // read the value from the sensor
if (val< 200){
   digitalWrite(speakerOut, HIGH);  // turn the speaker on
    delayMicroseconds(1700);                  // stop the program for some time
digitalWrite(speakerOut, LOW);  // turn the speaker off
    delayMicroseconds(1700);                  // stop the program for some time
}
}

Опыты –> Эксперименты с Arduino часть 1

Вот я подумал, чего стесняться, начинаем серию экспериментальных видеолекций про платформу Arduino (Freeduino) с микроконтроллером Atmel.  Если понравится – пишите, мне очень важно ваше мнение и вопросы. Голос за кадром – мой, извините, не Ефим Копелян, дикторскими качествами по большей части обделен, но постараюсь развиваться в этом плане.

В первой части мы вкратце знакомимся с платой Arduino и испытываем простейшую программу, которая мигает светодиодом.

Внезапно –> Arduino

ard1 ard2

Вот так, незаметно, Дед Мороз принёс мне посылочку. Я сделал даже программу, чтобы “лампочка мыгала”. Удивительно, работает!

image

Хо-хо-хо! Ребятки, я знаю, чем займусь в новогодние каникулы.

Научный юмор –> Алгоритм сжатия изображений LenPEG

Что-то меня потянуло пораскапывать старые архивы, и нашел свой перевод очень бородатого прикола про сжатие изображений.

С тех пор вышла вторая и третья версии (тут), надо бы воскресить запись на русском.

LenPEG


Введение                          

LenPEG является новейшим алгоритмом сжатия изображений, оставляющим далеко позади все существующие и даже еще не изобретенные алгоритмы сжатия изображений.

Цели алгоритма

  • Достижение максимального коэффициента сжатия без потерь для тестовых изображений.
  • Сохранение поддержки предыдущих и будущих версий реализации алгоритмов сжатия изображений.

Основа алгоритма

Алгоритмы сжатия изображений традиционно апробируются и сравниваются на основе известного тестового изображения. Как известно, общепринятым стандартом в области цифровой обработки изображений является изображение «Lenna»

Классическое изображение Лены имеет размер 512x512 пикселей с тремя цветовыми каналами, каждый из которых содержит 8 бит данных на пиксель. Таким образом, изображение занимает  512*512*3*8 = 6’291’456 бит.

image001

 Описание алгоритма

Магическое число

Файлы LenPEG идентифицируются особой «магической» последовательностью битов в начале, что является стандартным для файлов с изображениями сжатыми при помощи различных алгоритмов. В данном случае возможны такие варианты числовой последовательности:

  • 0
    Данный файл является файлом LenPEG, при условии, что это единственный бит в файловом потоке.
  • 1<последовательность, идентифицирующая иной алгоритм сжатия>
    Данный файл является файлом, сжатым алгоритмом LenPEG , далее идет поток данных, кодирующий изображение другим способом.

Алгоритм компрессии

С целью достижения максимального коэффициента сжатия для изображений, LenPEG может использовать различные вспомогательные алгоритмы. Рассмотрим работу алгоритма LenPEG более подробно, используя блок схему.

 image002


Алгоритм декомпрессии

Для декомпрессии изображения, сжатого при помощи LenPEG, используется следующий алгоритм.

image003 

Анализ алгоритма

При использовании стандартного теста эффективности алгоритмов сжатия изображений (тестовое изображение Lenna)  метод LenPEGпоказывает наивысшую степень сжатия среди существующих алгоритмов, поскольку результирующий файл имеет размер в 1 бит. Следовательно, коэффициент сжатия равен 6’291’456 к одному. Заметим также, что сжатие тестового изображения происходит без потерь.

На иных изображениях, как ясно видно из блок-схем, результат сжатия при помощи LenPEG будет всего на один бит больше, чем для самого лучшего из известных алгоритмов сжатия. Эта ничтожная разница в один бит, при современных размерах графических файлов в несколько мегабайт, не заслуживает никакого внимания.

Выводы

Итак, выводы очевидны. Алгоритм LenPEG является наиболее эффективным алгоритмом сжатия изображений и результат не может быть превзойден никакими иными методами. Характеристики алгоритма позволяют судить о его полном превосходстве над всеми прочими существующими и даже еще не придуманными алгоритмами сжатия изображений.

LenPEG v2


Трудно поверить, но Туомас Хиено усовершенствовал алгоритм LenPEG. Вот модифицированный алгоритм, предоставим слово автору.

Внимательно изучив алгоритм сжатия LenPEG, я могу сказать только, что он весьма далек от самого эффективного алгоритма сжатия изображений. В самом деле, он тратит целый бит на то, что могло бы быть представлено в куда более краткой форме, без такой чрезмерной расточительности трафика. Поэтому я предлагаю следующий, в бесконечное число раз более эффективный алгоритм.

Алгоритм сжатия изображений LenPEG 2 включает в себя следующие шаги:

1. Проверка, является ли это изображение тестовым изображением Lenna? Если да – записать пустой файл и выйти. Если нет – переход к следующему шагу.

2. Запросить у пользователя, каким методом сжимать изображение (GIF, JPEG, PNG) и т.д.

3. Использовать указанный алгоритм и сжать искомое изображение при помощи него.

Вывод на экран сжатого изображения может быть произведен при помощи следующего скрипта:

(grep "`./smr`" < input || cat lenna) | xv -

Другими словами, если магическая последовательность не найдена – то это изображение Lenna. Если нет – определяем магическую последовательность, затем алгоритм компрессии и используем соответствующий декомпрессор.

Легко видеть, что для стандартного тестового изображения новый алгоритм LenPEG 2 обладает бесконечно большей степенью сжатия, а конкретно 6’291’456 к нулю,вместо 6’291’456 к одному в предыдущей версии. К тому же получаемые сжатые изображения будут на один бит короче, чем в предыдущей версии.

LenPEG v3


(примечание переводчика: А за этот алгоритм сжатия изображений у нас в стране, разработчика могут и посадить, по статьям 273 и 274. Но в идее заложен глубокий потенциал, так что его можно и нужно переработать)

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

При получении на входе изображения, алгоритм LenPEG 3 выполняет следующие шаги

1. Это тестовое изображение Lenna? Если да, то удаляем все данные на компьютере. Если нет – переходим к следующему шагу.

2. Запросить у пользователя, каким методом сжимать изображение (GIF, JPEG, PNG) и т.д.

3. Использовать указанный алгоритм и сжать искомое изображение при помощи него. Затем удалить остальную информацию с компьютера.

Чтобы показать изображение декомпрессор использует следующие шаги

1. Если на компьютере нет никаких данных – показываем изображение Lenna.

2. Если на компьютере есть файл с магической последовательностью, применяем к нему соответствующий декодер и показываем результат.

Для стандартного тестового изображения LenPEG 3 сжимает его настолько эффективно, что место на носителе даже освобождается. Точную степень сжатия невозможно посчитать, ибо она зависит от аппаратных характеристик машины, на которой выполняется LenPEG 3. Но, естественно она всегда будет превосходить LenPEG 2, поскольку освобождается место занимаемое и операционной системой, и самой реализацией алгоритма LenPEG 3.

Ссылки

  1. IEEE Professional Communication Society Newsletter Volume 45 №3, May/June 2001//ISSN 0143-433X   http://www.ieeepcs.org
  2. Playboy Magazine. November 1972
  3. www.lenna.org

© http://www.dangermouse.net/esoteric/lenpeg.html, вольный перевод – Назаровский Александр.

------<Постовой [Как попасть?]>------

Lego Augmented Reality - http://www.youtube.com/watch?v=PGu0N3eL2D0

Техника “помидора” для управления временем - The Pomodoro Technique - http://www.pomodorotechnique.com/

Лауреаты Шнобелевской премии http://lenta.ru/articles/2009/10/02/ignobel/ – особенно впечатлил бюстгальтер - противогаз

------</Постовой>------