Arduino

Материал из Artem Aleksashkin's Wiki
Перейти к навигации Перейти к поиску

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

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

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

  • 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

Проекты

Как проверить 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;
}