====== Электронное приложение к набору «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]]