Логотип платы BlockDuino Слоган: Ты сможешь это запаять!!! Твой электронный мультитул.
Главная Блог Каталог Статьи Wiki Скачать

BlockDuino - 7 первых программных экспериментов

Введение

Приобрел BlockDuino и не решил с чего начать? Надеюсь ты уже прочел статью "Как загрузить (залить) программу на микроконтроллер"? Отлично, тогда давай пока начнем с простейшего - поюзаем бортовой светодиод D13:

1. Помигаем светодиодом D13

Загрузим самую простую демо программку - 'Blink'.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Так выглядит программа в оригинале, но для лучшей понятности я переведу комментарии на русский:

/*
  Blink
  Включает светодиод на одну секунду, затем выключает так же на одну секунду.
    Повторяет в цикле.
 */

void setup() {//                                       |  Этот блок 
  // Обьявляет цифровой вывод No13, к которому         |  выполняется
  // подключен светодиод, как выход                    |  только один раз
  pinMode(13, OUTPUT);//                               |  в начале
}

void loop() {//                                        |  Этот блок
  digitalWrite(13, HIGH);   // включает светодиод      |  выполняется
  delay(1000);              // задержка 1 секунда      |  циклически
  digitalWrite(13, LOW);    // выключает светодиод     |  с начала до конца
  delay(1000);              // задержка 1 секунда      |  и заново
}//                                                    |

Загрузили... посмотрели... побалдели... заскучали. Потому как не реализована жажда творчества, мы ведь ничего своего не внесли )))
Ну тогда давай для начала...

Шаг 2 - Изменим период вспышек

Давай сделаем так, чтоб светодиод светил пол-секунды и затухал на пол-секунды. Тогда светодиод будет мигать с периодом в одну секунду. Для этого в функции задержки времени delay() зададим параметр в 500 миллисекунд (что равно 0.5 секунды):

void setup() { 
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);   // включает светодиод
  delay(500);               // задержка 0.5 секунды
  digitalWrite(13, LOW);    // выключает светодиод
  delay(500);               // задержка 0.5 секунды
}

Загружаем... смотрим... Неплохо, но однотонно как-то.

Шаг 3 - Три вспышки

Давай сделаем так, чтоб светодиод выдавал три коротких световых импульса. Для этого скопируем повторим еще два раза содержимое блока loop(), а в конце добавим задержку в три секунды:

void setup() { 
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);   // включает светодиод
  delay(500);               // задержка 0.5 секунды
  digitalWrite(13, LOW);    // выключает светодиод
  delay(500);               // задержка 0.5 секунды

  digitalWrite(13, HIGH);   // включает светодиод
  delay(500);               // задержка 0.5 секунды
  digitalWrite(13, LOW);    // выключает светодиод
  delay(500);               // задержка 0.5 секунды

  digitalWrite(13, HIGH);   // включает светодиод
  delay(500);               // задержка 0.5 секунды
  digitalWrite(13, LOW);    // выключает светодиод
  delay(500);               // задержка 0.5 секунды

  delay(3000);               // задержка 3 секунды
}

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

Шаг 4 - Создадим цикл

Возьмем программу из второго шага и поместим команды управления светодиодом в цикл for

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  for(int i=1; i<=3; i++){    // цикл на 3 повторения
    digitalWrite(13, HIGH);       // включает светодиод
    delay(500);                   // задержка 0.5 секунды
    digitalWrite(13, LOW);        // выключает светодиод
    delay(500);                   // задержка 0.5 секунды
  }                           // конец цикла
  delay(3000);                // задержка 3 секунды
}

Загружаем... смотрим... Красиво мигает... И код программы получился более правильным, что ли?

Шаг 5 - Посигналим SOS

Ну, с тремя проблесками можно заделать сигнал SOS, он, как известно, состоит из трех коротких, трех длинных и еще раз трех коротких сигналов (вспышек). Для этого скопируем цикл три раза, и во втором цикле изменим задержку времени на одну секунду. Так же добавим задержку после трех циклов - это пауза между сигналами.

/*
  Blink
  Сигнал SOS
 */

void setup() {
  pinMode(13, OUTPUT);     
}

void loop() {
  for (int i=1; i<=3; i++){// Сигнал 'S'
    digitalWrite(13, HIGH);
    delay(500);   
    digitalWrite(13, LOW);    
    delay(500);
  }
  for (int i=1; i<=3; i++){// Сигнал 'O'
    digitalWrite(13, HIGH);
    delay(1000);   
    digitalWrite(13, LOW);    
    delay(1000);
  }
  for (int i=1; i<=3; i++){// Сигнал 'S'
    digitalWrite(13, HIGH);
    delay(500);   
    digitalWrite(13, LOW);    
    delay(500);
  }
  delay(1500);            // Пауза между сигналами - 1.5 сек
}

Загружаем... Смотрим... Вне всяких сомнений - сигнал SOS!!! Только вот одно замечание - если мне захочется изменить скорость подачи сигнала, например для отладки, то мне нужно будет изменить значение задержки во всех командах delay(), а их в коде 7 позиций!!! Поэтому для отладки введем переменную для задержки.

Шаг 6 - Переменная

Переменная объявляется еще до функции setup():

/*
  Blink
  Сигнал SOS
 */
 
int t_blink = 500;  // Длительность короткого сигнала

void setup() {
  pinMode(13, OUTPUT);     
}

void loop() {
  for (int i=1; i<=3; i++){// Сигнал 'S'
    digitalWrite(13, HIGH);
    delay(t_blink);        // t_blink = 500
    digitalWrite(13, LOW);    
    delay(t_blink);
  }
  for (int i=1; i<=3; i++){// Сигнал 'O'
    digitalWrite(13, HIGH);
    delay(t_blink * 2);    // t_blink * 2 = 500 *2 = 1000
    digitalWrite(13, LOW);    
    delay(t_blink * 2);
  }
  for (int i=1; i<=3; i++){// Сигнал 'S'
    digitalWrite(13, HIGH);
    delay(t_blink);   
    digitalWrite(13, LOW);    
    delay(t_blink);            
  }
  delay(t_blink * 3);      // t_blink * 3 = 500 * 3 = 1500
}

Загружаем... Смотрим... Все тот же SOS... Изменяем 'int t_blink = 500;' на 'int t_blink = 250;' загружаем и видим все тот же SOS, но только в два раза быстрее.

Что дальше, а давайте снова упростим код и применим пользовательскую функцию для формирования вспышки:

Шаг 7 - Подпрограмма

Для этого вынесем код с циклом, который в программе повторяется три раза с небольшими изменениями, в отдельную функцию:

/*
  Blink
  Сигнал SOS
 */
 
int t_blink = 500;  //
  
void setup() {
  pinMode(13, OUTPUT);     
}

void loop() {
  tri_blink(t_blink);        // Сигнал 'S'
  tri_blink(t_blink * 2);    // Сигнал 'O'
  tri_blink(t_blink);        // Сигнал 'S'
  
  delay(t_blink * 3);     // пауза между сигналами
}

void tri_blink(int x){  // Пользовательская функция (подпрограмма)
  for (int i=1; i<=3; i++){
    digitalWrite(13, HIGH);
    delay(x);
    digitalWrite(13, LOW);    
    delay(x);
  }
}

Загружаем... Смотрим...

Заключение

Ну чтож, с помощью этих экспериментов мы убедились, что программировать наш BlockDuino не так уж и сложно, зная и понимая основные принципы.

Что дальше? Можно добавить что-то от себя, например ввести переменную содержащую номер порта и заменить ее в команде инициализации порта pinMode и в командах вывода digitalWrite, так мы легко сможем управлять любым другим портом. Или, к примеру, создать две подпрограммы на вывод отдельно точки, отдельно тире для передачи кодом Морзе, создать массив данных содержащий код для каждой буквы и передавать любые сообщения. Это, конечно, гораздо сложнее, но и настолько же интереснее!

Ссылки

Скачать:

  • Blink_ru
  • Blink2
  • Blink3
  • Blink_SOS
  • Blink_SOS2
  • Blink_SOS3
  • Blink_SOS4

 


©2012 Vasyl Yudin; Ukraine
Написать письмо