Arduino: различия между версиями

Материал из Artem Aleksashkin's Wiki
Перейти к навигации Перейти к поиску
 
(не показано 40 промежуточных версий этого же участника)
Строка 1: Строка 1:
Ардуино - это контроллер с программатором и возможностью подключить датчики/исполнительные элементы.
[[Файл:IMG_20170129_124526.jpg|400px]]
= Ссылки =
* Сайт 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/
* [https://www.youtube.com/watch?v=JXmw1xOlBdk 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. Вот некоторые из них.
{| class="wikitable"
|-
! Название !! Популярность !! Поддержка платформ !! Сайт !! Исходный код !! Документация
|-
| FreeRTOS || высокая || свыше 40 архитектур, включая AVR (Arduino Uno, Nano, Leonardo и Mega). Также поддерживаются платформы MCU, которых нет у Arduino || https://www.freertos.org/ || [https://github.com/feilipu/Arduino_FreeRTOS_Library github] || [https://www.freertos.org/FreeRTOS-quick-start-guide.html Quick start]
|-
| CoopThreads || низкая || широкий диапазон MCU, включая AVR, ESP32 и ESP8266. || [https://www.arduino.cc/reference/en/libraries/coopthreads/ arduino.cc] || [https://github.com/pstolarz/CoopThreads github] || --
|-
| HeliOS || средняя || широкий диапазон платформ MCU || -- || [https://github.com/MannyPeterson/HeliOS github] || [https://github.com/MannyPeterson/HeliOS/blob/master/extras/HeliOS_Programmers_Guide.md github]
|-
| Simba || высокая || многие основные платы Arduino, плюс широкий диапазон других плат. || -- || [https://github.com/eerimoq/simba github] || [https://simba-os.readthedocs.io/en/latest/ Docs]
|-
| TaskManagerIO || высокая || объявлена совместимость с широким диапазоном плат и операционных систем. || -- || [https://github.com/davetcc/TaskManagerIO github] || [https://www.thecoderscorner.com/products/arduino-libraries/taskmanager-io/ Docs]
|-
|}
* https://www.arduino.cc/reference/en/libraries/freertos/
* 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
= LVGL =
* https://docs.lvgl.io/8.1/get-started/arduino.html
= ISCP =
= ISCP2 =
= I2C =
= Базовые компоненты =
* 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 ==
== Как проверить Arduino ==


Строка 67: Строка 163:
3 - +5 вольт
3 - +5 вольт


Далее качаем либу [https://github.com/z3t0/Arduino-IRremote] в zip и ставим ее через IDE (Скетч - Импортировать библиотеку - Add library).
Далее качаем либу [https://github.com/z3t0/Arduino-IRremote] в zip и ставим ее через IDE (Скетч - Подключить библиотеку - добавить ZIP библиотеку).
 
'''ВНИМАНИЕ''' удалите библиотеку <путь к IDE>/libraries/RobotIRremote т.к. они конфликтуют.
 
Прошиваем скетчем, открываем Инструменты и монитор порта - смотрим результат.
 
<pre>
#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;


Или заливаем ее вручную /usr/share/arduino/libraries
  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);
}
</pre>
 
== Ультразвуковой датчик hc sr04 ==
 
<pre>
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);
}
</pre>
 
== Сервопривод ==
 
<pre>
#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;
  }
}
 
</pre>
 
== Шаговый двигатель 28BYJ-48 ==
 
Power: GND => -, +5V => +
Control: IN1 => 8, IN2 => 9, IN3 => 10, IN4 => 11
 
<pre>
#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;
}
 
</pre>

Текущая версия от 18:58, 26 мая 2024

Ардуино - это контроллер с программатором и возможностью подключить датчики/исполнительные элементы.

IMG 20170129 124526.jpg

Ссылки

Что такое Arduino?

Ардуино - это открытая программно-аппаратная платформа для прототипирования.

Чтобы понять как это круто, пройдем по шагам как это было до ардуины:

  1. Вы выбираете микроконтроллер. Читаете к нему документацию.
  2. Вы берете текстолит покрытый медью. Проектируете плату. Вытравливаете по трафарету дорожки, чтобы соединить микроконтроллер и выводы.
  3. Вы лудите и паяете.
  4. Вы собираете программатор.
  5. Пишете код и выбираете нужный компилятор. Компилируете код.
  6. Прошиваете программатором контроллер. Если все ок - он работает. Если нет - отлаживаете.
  7. Начинаете как-то пользоваться им.

Теперь:

  1. Ардуина собрана и отлажена на заводе
  2. У Ардуины встроенный программатор. Подключается по USB.
  3. Eсть IDE с компилятором. Работает во всех ОС(в том числе Linux)
  4. Все что вам нужно это просто взять код и сразу ее прошить как вам нужно
  5. Соединяете датчики и моторчики - все работает сразу.
  6. Это интересно и без рутины.

Операционные системы реального времени

Базовые скрипты Ардуины очень примитивны и не позоволяют работать параллельно и поэтому нужна 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

LVGL

ISCP

ISCP2

I2C

Базовые компоненты

  • 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.

IR-pinout.jpg

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;
}