Arduino
Ардуино - это контроллер с программатором и возможностью подключить датчики/исполнительные элементы.
Ссылки
- Сайт https://www.arduino.cc/
- IDE https://www.arduino.cc/en/Main/Software
- Форум https://forum.arduino.cc/
- wokwi Наглядный сервис эмуляции ардуино - https://wokwi.com/
- photopea редактор изображений - https://www.photopea.com/
- Turbo pressure gauge with Arduino and OLED display --- tutorial for beginners, u8g, Arduino UNO
- AlexGyver https://www.youtube.com/channel/UCgtAOyEQdAyjvm9ATCi_Aig
- Электроника в объективе https://www.youtube.com/channel/UChButpZaL5kUUl_zTyIDFkQ
- DIY Perks https://www.youtube.com/channel/UCUQo7nzH1sXVpzL92VesANw
- TOP 10 Arduino Projects Of All Time | 2019 https://www.youtube.com/watch?v=9ItEPmwfBqg
- How to Make your own Arduino UNO https://www.youtube.com/watch?v=IUAFODI1Wg0
Что такое Arduino?
Ардуино - это открытая программно-аппаратная платформа для прототипирования.
Чтобы понять как это круто, пройдем по шагам как это было до ардуины:
- Вы выбираете микроконтроллер. Читаете к нему документацию.
- Вы берете текстолит покрытый медью. Проектируете плату. Вытравливаете по трафарету дорожки, чтобы соединить микроконтроллер и выводы.
- Вы лудите и паяете.
- Вы собираете программатор.
- Пишете код и выбираете нужный компилятор. Компилируете код.
- Прошиваете программатором контроллер. Если все ок - он работает. Если нет - отлаживаете.
- Начинаете как-то пользоваться им.
Теперь:
- Ардуина собрана и отлажена на заводе
- У Ардуины встроенный программатор. Подключается по USB.
- Eсть IDE с компилятором. Работает во всех ОС(в том числе Linux)
- Все что вам нужно это просто взять код и сразу ее прошить как вам нужно
- Соединяете датчики и моторчики - все работает сразу.
- Это интересно и без рутины.
Операционные системы реального времени
Базовые скрипты Ардуины очень примитивны и не позоволяют работать параллельно и поэтому нужна RTOS. Вот некоторые из них.
Название | Популярность | Поддержка платформ | Сайт | Исходный код | Документация |
---|---|---|---|---|---|
FreeRTOS | высокая | свыше 40 архитектур, включая AVR (Arduino Uno, Nano, Leonardo и Mega). Также поддерживаются платформы MCU, которых нет у Arduino | https://www.freertos.org/ | github | Quick start |
CoopThreads | низкая | широкий диапазон MCU, включая AVR, ESP32 и ESP8266. | arduino.cc | github | -- |
HeliOS | средняя | широкий диапазон платформ MCU | -- | github | github |
Simba | высокая | многие основные платы Arduino, плюс широкий диапазон других плат. | -- | github | Docs |
TaskManagerIO | высокая | объявлена совместимость с широким диапазоном плат и операционных систем. | -- | github | Docs |
- https://circuitdigest.com/microcontroller-projects/arduino-freertos-tutorial1-creating-freertos-task-to-blink-led-in-arduino-uno
- https://github.com/heliosproj/HeliOS/blob/master/examples/Blink/Blink.ino
Базовые компоненты
- MicroSD (4 pins)
- WiFi (2 pins)
- bluetooth (2 pins)
- Display (2 pins)
- Speaker (1 pin)
- Arrows(4) / OK / Cancel buttons (6 pins)
- Diode indicator (3 pins)
- Clock (2 pins)
- 22 pins
Проекты
- 8bitcade - Мини игровая консоль на ардуино https://8bitcade.com/
- Радио
- mp3 плеер
- gsm телефон
- водонагреватель
- ...
Как проверить Arduino
Я работаю в Ubuntu Linux. Скачать последнюю версию IDE можно тут [1]. Запустите ./install.sh чтобы установить ярлыки для быстрого запуска.
sudo usermod -a -G dialout <username>
Убедитесь, что группа есть командой
groups
Иначе перелогиньтесь.
Присоедините Ардуину
ls -l /dev/ttyACM*
Должна быть в списке.
командой arduino запустите IDE. В примерах есть Blink.
/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13; // the setup routine runs once when you press reset: void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
Прошейте примером, и встроенный диод замигает, или же присоедините диод через резистор 200 кОм на землю и 13 пин.
Реле
Примером Blink можно проверить и реле. Питание +5 вольт, земля и сигнал на 13 пин.
Remote Control
С Ардуино кит поставляется пульт дистанционного управления HX1838 и датчик 1838B. К пульту необходимо приобрести батарейку CR2025.
1 - на 11 пин 2 - земля 3 - +5 вольт
Далее качаем либу [2] в zip и ставим ее через IDE (Скетч - Подключить библиотеку - добавить ZIP библиотеку).
ВНИМАНИЕ удалите библиотеку <путь к IDE>/libraries/RobotIRremote т.к. они конфликтуют.
Прошиваем скетчем, открываем Инструменты и монитор порта - смотрим результат.
#include "IRremote.h" int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11 IRrecv irrecv(receiver); // create instance of 'irrecv' decode_results results; // create instance of 'decode_results' void setup() { Serial.begin(9600); Serial.println("IR Receiver Raw Data + Button Decode Test"); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); translateIR(); irrecv.resume(); } } void translateIR() // Car MP3 IR { switch(results.value) { case 0xFFA25D: Serial.println(" CH- "); break; case 0xFF629D: Serial.println(" CH "); break; case 0xFFE21D: Serial.println(" CH+ "); break; case 0xFF22DD: Serial.println(" PREV "); break; case 0xFF02FD: Serial.println(" NEXT "); break; case 0xFFC23D: Serial.println(" PLAY/PAUSE "); break; case 0xFFE01F: Serial.println(" VOL- "); break; case 0xFFA857: Serial.println(" VOL+ "); break; case 0xFF906F: Serial.println(" EQ "); break; case 0xFF6897: Serial.println(" 0 "); break; case 0xFF9867: Serial.println(" 100+ "); break; case 0xFFB04F: Serial.println(" 200+ "); break; case 0xFF30CF: Serial.println(" 1 "); break; case 0xFF18E7: Serial.println(" 2 "); break; case 0xFF7A85: Serial.println(" 3 "); break; case 0xFF10EF: Serial.println(" 4 "); break; case 0xFF38C7: Serial.println(" 5 "); break; case 0xFF5AA5: Serial.println(" 6 "); break; case 0xFF42BD: Serial.println(" 7 "); break; case 0xFF4AB5: Serial.println(" 8 "); break; case 0xFF52AD: Serial.println(" 9 "); break; default: Serial.println(" other button "); } delay(500); }
Ультразвуковой датчик hc sr04
const int Trig = 8; const int Echo = 9; const int ledPin = 11; // 13 – если будете использовать встроенный в Arduino светодиод void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } unsigned int time_us=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig, LOW); // Затем убираем time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=time_us/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<50) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin, 1); // Зажигаем светодиод } else { digitalWrite(ledPin, 0); // иначе тушим } delay(100); }
Сервопривод
#include <Servo.h> //используем библиотеку для работы с сервоприводом Servo servo; //объявляем переменную servo типа Servo int deg = 0; void setup() //процедура setup { servo.attach(10); //привязываем привод к порту 10 } void loop() //процедура loop { servo.write(deg); //ставим вал под 0 delay(2000); //ждем 2 секунды deg = deg + 10; if (deg > 360) { deg = 0; } }
Шаговый двигатель 28BYJ-48
Power: GND => -, +5V => + Control: IN1 => 8, IN2 => 9, IN3 => 10, IN4 => 11
#include <Stepper.h> // указываем количество шагов нашего мотора - в нашем случае 64 #define STEPS 64 // Создаем экземпляр класса Stepper, и указываем // количество шагов и пины подключния Stepper stepper(STEPS, 8, 9, 10, 11); // переменная для запоминания предыдущего значения int previous = 0; void setup() { // Устанавливаем скорость вращения в об/мин stepper.setSpeed(100); } void loop() { // новое значение полученное с датчика int val = analogRead(0); // При подключении датчика, 0 заменить на пин датчика // Прокрутить на разницу шагов между новым полученным значением и предыдущим stepper.step(val - previous); // Запоминаем новое полученное значение previous = val; }