====== Электронное приложение к набору «IO.KIT Базовый» ======
На этой странице ты найдёшь все нужные материалы для сборки мини-проектов из [[amp>product/io-kit-basic?utm_source=man&utm_campaign=io-kit-basic&utm_medium=wiki|базового набора IO.KIT]]:
* Схемы проектов в электронном виде.
* Исходный код программ (копируй его в редактор Arduino IDE).
* Дополнительные материалы: программные библиотеки, даташиты и т. п.
**Обрати внимание**
[[amp>product/io-kit-basic?utm_source=man&utm_campaign=io-kit-basic&utm_medium=wiki|IO.KIT Базовый]] понадобится для сборки всех [[kits:io-kit#дополнения_iokit|дополнений IO.KIT]].
===== Проекты =====
Прежде чем приступать к экспериментам, нужно подготовить свой компьютер:
* Установи среду программирования [[https://amperka.ru/page/arduino-ide?utm_source=announce&utm_campaign=io-kit-basic&utm_medium=wiki|Arduino IDE]] и копируй туда готовый код проектов.
* Установи [[#библиотеки|дополнительные библиотеки]] для Arduino IDE, пользуясь [[программирование:библиотеки|нашим руководством]].
**Драйвер чипа CH340**
Установи [[articles:driver-ch340|драйвер CH340 для Windows]] или [[projects:installing-the-ch340-on-linux|Linux]], чтобы твой компьютер мог корректно распознать и прошить плату Iskra Nano.
==== №1. Маячок ====
{{ :kits:io-kit:basic:010-drawing-wiring-cmyk.png?nolink&500 |}}
// Даём понятное имя светодиоду на пине 5
constexpr int LED_PIN = 5;
void setup() {
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Зажигаем светодиод
digitalWrite(LED_PIN, HIGH);
// Ждём 500 мс
delay(500);
// Гасим светодиод
digitalWrite(LED_PIN, LOW);
// Ждём 500 мс
delay(500);
}
==== №2. Дыхание света ====
{{ :kits:io-kit:basic:020-drawing-wiring-cmyk.png?nolink&500 |}}
// Даём понятное имя светодиоду на пине 5
constexpr int LED_PIN = 5;
void setup() {
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Создаём цикл для перебора всех значений от 0 до 255
for (int brightness = 0; brightness <= 255; brightness++) {
// Выдаём на светодиод ШИМ-сигнал
analogWrite(LED_PIN, brightness);
// Ждём 10 мс
delay(10);
}
}
==== №3. Детектор нажатий ====
{{ :kits:io-kit:basic:030-drawing-wiring-cmyk.png?nolink&500 |}}
// Подключаем библиотеку для работы с кнопкой
#include
// Создаём объект кнопки на пине 2
TroykaButton button(2);
void setup() {
// Открываем монитор Serial-порта
Serial.begin(9600);
// Инициализируем кнопку
button.begin();
}
void loop() {
// Считываем данные с кнопки
button.read();
// Определяем нажатие кнопки
if (button.justPressed()) {
// Печатаем фиксацию нажатия в консоль
Serial.println("Key was just pressed");
}
}
==== №4. Фонарик ====
{{ :kits:io-kit:basic:040-drawing-wiring-cmyk.png?nolink&500 |}}
// Подключаем библиотеку для работы с кнопкой
#include
// Даём понятное имя светодиоду на пине 5
constexpr int LED_PIN = 5;
// Создаём объект кнопки на пине 2
TroykaButton button(2);
// Создаём переменную для хранения состояния светодиода
bool state = false;
void setup() {
// Открываем монитор Serial-порта
Serial.begin(9600);
// Инициализируем кнопку
button.begin();
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Считываем данные с кнопки
button.read();
// Определяем нажатие кнопки
if (button.justPressed()) {
// Инвертируем состояние светодиода
state = !state;
digitalWrite(LED_PIN, state);
}
}
==== №5. Трекинг поворота ====
{{ :kits:io-kit:basic:050-drawing-wiring-cmyk.png?nolink&500 |}}
// Даём понятное имя потенциометру на пине A2
constexpr int POT_PIN = A2;
void setup() {
// Открываем монитор Serial-порта
Serial.begin(9600);
// Настраиваем пин с потенциометром в режим входа
pinMode(POT_PIN, INPUT);
}
void loop() {
// Считываем аналоговый сигнал с потенциометра
int rotation = analogRead(POT_PIN);
// Преобразуем диапазон значений с потенциометра [0;1023]
// в процентный диапазон значений [0;100]
int percent = map(rotation, 0, 1023, 0, 100);
// Выводим результат в консоль
Serial.print("Value = ");
Serial.println(percent);
}
==== №6. Диммер ====
{{ :kits:io-kit:basic:060-drawing-wiring-cmyk.png?nolink&700 |}}
// Даём понятное имя светодиоду на пине 5
constexpr int LED_PIN = 5;
// Даём понятное имя потенциометру на пине A2
constexpr int POT_PIN = A2;
void setup() {
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
// Настраиваем пин с потенциометром в режим входа
pinMode(POT_PIN, INPUT);
}
void loop() {
// Считываем аналоговый сигнал с потенциометра
int rotation = analogRead(POT_PIN);
// Преобразуем диапазон значений с потенциометра [0;1023]
// в диапазон значений для светодиода [0;255]
int brightness = map(rotation, 0, 1023, 0, 255);
// Выдаём результат на светодиод
analogWrite(LED_PIN, brightness);
}
==== №7. Синтезатор ====
{{ :kits:io-kit:basic:070-drawing-wiring-cmyk.png?nolink&500 |}}
// Даём понятное имя пищалке на пине 12
constexpr int BUZZER_PIN = 12;
// Даём понятное имя потенциометру на пине A2
constexpr int POT_PIN = A2;
void setup() {
// Настраиваем пин с пищалкой в режим выхода
pinMode(BUZZER_PIN, OUTPUT);
// Настраиваем пин с потенциометром в режим входа
pinMode(POT_PIN, INPUT);
}
void loop() {
// Считываем аналоговый сигнал с потенциометра
int rotation = analogRead(POT_PIN);
// Преобразуем диапазон значений с потенциометра [0;1023]
// в диапазон значений для зуммера [20;20000]
int freq = map(rotation, 0, 1023, 20, 20000);
// Заставляем пин с пищалкой звучать на высчитанной частоте
tone(BUZZER_PIN, freq);
}
==== №8. Плеер ====
{{ :kits:io-kit:basic:080-drawing-wiring-cmyk.png?nolink&700 |}}
// Подключаем библиотеку для работы с мелодиями в формате RTTTL
#include
// Подключаем библиотеку для работы с кнопкой
#include
// Даём понятное имя пищалке на пине 12
constexpr uint8_t BUZZER_PIN = 12;
// Создаём объект кнопки на пине 2
TroykaButton button(2);
// Мелодия «Имперский марш» в формате RTTTL
const char* imperMarch = "imperMarch:d=8,o=5,b=95:"
"4a4,4a4,4a4,f.4,16c,4a4,f.4,16c,"
"2a4,4e,4e,4e,f.,16c,4g#4,f.4,"
"16c,2a4,4a,a.4,16a4,4a,g#.,16g,"
"16f#,16e,f,p,a#4,4d#,d.,16c#,16c,"
"16b4,c,p,f4,4g#4,f.4,16a4,4c,"
"a.4,16c,2e,4a,a.4,16a4,4a,g#.,"
"16g,16f#,16e,f,p,a#4,4d#,d.,"
"16c#,16c,16b4,c,p,f4,4g#4,f.4,"
"16c,4a4,f.4,16c,2a4";
// Мелодия «Марио» в формате RTTTL
const char* marioBroth = "marioBroth:d=4,o=5,b=100:"
"16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,"
"8g,8p,8c6,16p,8g,16p,8e,16p,"
"8a,8b,16a#,8a,16g.,16e6,16g6,8a6,"
"16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,"
"16p,8g,16p,8e,16p,8a,8b,16a#,"
"8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,"
"16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,"
"16p,16e6,16p,16g#,16a,16c6,16p,16a,"
"16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,"
"16e6,16p,16c7,16p,16c7,16c7,p,16g6,"
"16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,"
"16c6,16p,16a,16c6,16d6,8p,16d#6,8p,"
"16d6,8p,16c6";
// Мелодия «Миссия невыполнима» в формате RTTTL
const char* missionImp = "missionImp:d=16,o=6,b=95:"
"32d,32d#,32d,32d#,32d,32d#,32d,32d#,"
"32d,32d,32d#,32e,32f,32f#,32g,g,8p,"
"g,8p,a#,p,c7,p,g,8p,"
"g,8p,f,p,f#,p,g,8p,"
"g,8p,a#,p,c7,p,g,8p,"
"g,8p,f,p,f#,p,a#,g,"
"2d,32p,a#,g,2c#,32p,a#,g,"
"2c,a#5,8c,2p,32p,a#5,g5,2f#,"
"32p,a#5,g5,2f,32p,a#5,g5,2e,"
"d#,8d";
void setup() {
// Инициализируем кнопку
button.begin();
// Настраиваем пин с пищалкой в режим выхода
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
// Считываем данные с кнопки
button.read();
// Определяем нажатие кнопки
if (button.justPressed()) {
// Запускаем мелодию
anyrtttl::blocking::play(BUZZER_PIN, imperMarch);
}
}
==== №9. Плеер со светомузыкой ====
{{ :kits:io-kit:basic:090-drawing-wiring-cmyk.png?nolink&700 |}}
// Подключаем библиотеку для работы с мелодиями в формате RTTTL
#include
// Подключаем библиотеку для работы с кнопкой
#include
// Даём понятное имя пищалке на пине 12
constexpr uint8_t BUZZER_PIN = 12;
// Даём понятное имя светодиоду на пине 5
constexpr uint8_t LED_PIN = 5;
// Создаём объект кнопки на пине 2
TroykaButton button(2);
// Мелодия «Имперский марш» в формате RTTTL
const char* imperM = "imperMarch:d=8,o=5,b=95:"
"4a4,4a4,4a4,f.4,16c,4a4,f.4,16c,"
"2a4,4e,4e,4e,f.,16c,4g#4,f.4,"
"16c,2a4,4a,a.4,16a4,4a,g#.,16g,"
"16f#,16e,f,p,a#4,4d#,d.,16c#,16c,"
"16b4,c,p,f4,4g#4,f.4,16a4,4c,"
"a.4,16c,2e,4a,a.4,16a4,4a,g#.,"
"16g,16f#,16e,f,p,a#4,4d#,d.,"
"16c#,16c,16b4,c,p,f4,4g#4,f.4,"
"16c,4a4,f.4,16c,2a4";
// Мелодия «Марио» в формате RTTTL
const char* marioB = "marioBroth:d=4,o=5,b=100:"
"16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,"
"8g,8p,8c6,16p,8g,16p,8e,16p,"
"8a,8b,16a#,8a,16g.,16e6,16g6,8a6,"
"16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,"
"16p,8g,16p,8e,16p,8a,8b,16a#,"
"8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,"
"16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,"
"16p,16e6,16p,16g#,16a,16c6,16p,16a,"
"16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,"
"16e6,16p,16c7,16p,16c7,16c7,p,16g6,"
"16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,"
"16c6,16p,16a,16c6,16d6,8p,16d#6,8p,"
"16d6,8p,16c6";
// Мелодия «Миссия невыполнима» в формате RTTTL
const char* misImp = "missionImpossible:d=16,o=6,b=95:"
"32d,32d#,32d,32d#,32d,32d#,32d,32d#,"
"32d,32d,32d#,32e,32f,32f#,32g,g,8p,"
"g,8p,a#,p,c7,p,g,8p,"
"g,8p,f,p,f#,p,g,8p,"
"g,8p,a#,p,c7,p,g,8p,"
"g,8p,f,p,f#,p,a#,g,"
"2d,32p,a#,g,2c#,32p,a#,g,"
"2c,a#5,8c,2p,32p,a#5,g5,2f#,"
"32p,a#5,g5,2f,32p,a#5,g5,2e,"
"d#,8d";
// Функция переопределения мелодии RTTTL в функцию tone
// В нашем проекте не используется
// void customTone(byte pin, uint16_t frequency, uint32_t duration) {
// tone(pin, frequency, duration);
// }
// Функция переопределения мелодии RTTTL в функцию noTone
// В нашем проекте не используется
// void customNoTone(byte pin) {
// noTone(pin);
// }
// Функция переопределения мелодии RTTTL в функцию delay
void customDelay(uint32_t duration) {
// Соотношения задержки свечения от общей длительности ноты
// Диапазон от 0.00 до 1.00
float ledDurationRatio = 0.25;
digitalWrite(LED_PIN, HIGH);
delay(duration * ledDurationRatio);
digitalWrite(LED_PIN, LOW);
delay(duration * (1 - ledDurationRatio));
}
void setup() {
// Инициализируем кнопку
button.begin();
// Настраиваем пин с пищалкой в режим выхода
pinMode(BUZZER_PIN, OUTPUT);
// Настраиваем пин со светодиодом в режим выхода
pinMode(LED_PIN, OUTPUT);
// Переопределяем мелодию RTTTL в кастомную функцию delay
anyrtttl::setDelayFunction(&customDelay);
// Если понадобится, можно передать также свои определения функций
// tone и noTone. Но для нашего проекта это не нужно.
//anyrtttl::setToneFunction(&customTone);
//anyrtttl::setNoToneFunction(&customNoTone);
}
void loop() {
// Считываем данные с кнопки
button.read();
// Определяем нажатие кнопки
if (button.justPressed()) {
// Запускаем мелодию
anyrtttl::blocking::play(BUZZER_PIN, imperM);
}
}
===== Ресурсы =====
* [[amp>collection/io-kits?utm_source=man&utm_campaign=io-kit-basic&utm_medium=wiki|Наборы IO.KIT]] в магазине
* [[kits:io-kit|Электронные материалы IO.KIT]]
==== Софт ====
* [[amp>page/arduino-ide?utm_source=announce&utm_campaign=io-kit-basic&utm_medium=wiki|Страница загрузки Arduino IDE]]
==== Библиотеки ====
* [[https://github.com/end2endzone/AnyRtttl|AnyRtttl]]
* [[https://github.com/amperka/TroykaButton|TroykaButton]]