В этой статье я решал собрать полное пошаговое руководство для начинающих Arduino. Мы разберем что такое ардуино, что нужно для начала изучения, где скачать и как установить и настроить среду программирования, как устроен и как пользоваться языком программирования и многое другое, что необходимо для создания полноценных сложных устройств на базе семейства этих микроконтроллеров.
Тут я постараюсь дать сжатый минимум для того, что бы вы понимали принципы работы с Arduino. Для более полного погружения в мир программируемых микроконтроллеров обратите внимание на другие разделы и статьи этого сайта. Я буду оставлять ссылки на другие материалы этого сайта для более подробного изучения некоторых аспектов.
Что такое Arduino и для чего оно нужно?
Arduino — это электронный конструктор, который позволяет любому человеку создавать разнообразные электро-механические устройства. Ардуино состоит из программной и аппаратной части. Программная часть включает в себя среду разработки (программа для написания и отладки прошивок), множество готовых и удобных библиотек, упрощенный язык программирования. Аппаратная часть включает в себя большую линейку микроконтроллеров и готовых модулей для них. Благодаря этому, работать с Arduino очень просто!
С помощью ардуино можно обучаться программированию, электротехнике и механике. Но это не просто обучающий конструктор. На его основе вы сможете сделать действительно полезные устройства. Начиная с простых мигалок, метеостанций, систем автоматизации и заканчивая системой умного дома, ЧПУ станками и беспилотными летательными аппаратами. Возможности не ограничиваются даже вашей фантазией, потому что есть огромное количество инструкций и идей для реализации.
проекты на Arduino
Стартовый набор Arduino
Для того что бы начать изучать Arduino необходимо обзавестись самой платой микроконтроллера и дополнительными деталями. Лучше всего приобрести стартовый набор Ардуино, но можно и самостоятельно подобрать все необходимое. Я советую выбрать набор, потому что это проще и зачастую дешевле. Вот ссылки на лучшие наборы и на отдельные детали, которые обязательно пригодятся вам для изучения:
Базовый набор ардуино для начинающих:
Купить
Большой набор для обучения и первых проектов:
Купить
Набор дополнительных датчиков и модулей:
Купить
Ардуино Уно самая базовая и удобная модель из линейки:
Купить
Беспаечная макетная плата для удобного обучения и прототипирования:
Купить
Набор проводов с удобными коннекторами:
Купить
Комплект светодиодов:
Купить
Комплект резисторов:
Купить
Кнопки:
Купить
Потенциометры:
Купить
Среда разработки Arduino IDE
Для написания, отладки и загрузки прошивок необходимо скачать и установить Arduino IDE. Это очень простая и удобная программа. На моем сайте я уже описывал процесс загрузки, установки и настройки среды разработки. Поэтому здесь я просто оставлю ссылки на последнюю версию программы и на статью с подробной инструкцией.
Версия
Windows
Mac OS X
Linux
1.8.2
Язык программирования Ардуино
Когда у вас есть на руках плата микроконтроллера и на компьютере установлена среда разработки, вы можете приступать к написанию своих первых скетчей (прошивок). Для этого необходимо ознакомиться с языком программирования.
Для программирования Arduino используется упрощенная версия языка C++ с предопределенными функциями. Как и в других Cи-подобных языках программирования есть ряд правил написания кода. Вот самые базовые из них:
Подробнее о типах данных, функциях, переменных, операторах и языковых конструкциях вы можете узнать на странице по программированию Arduino. Вам не нужно заучивать и запоминать всю эту информацию. Вы всегда можете зайти в справочник и посмотреть синтаксис той или иной функции.
Все прошивки для Arduino должны содержать минимум 2 функции. Это setup() и loop().
Функция setup
Функция setup() выполняется в самом начале и только 1 раз сразу после включения или перезагрузки вашего устройства. Обычно в этой функции декларируют режимы пинов, открывают необходимые протоколы связи, устанавливают соединения с дополнительными модулями и настраивают подключенные библиотеки. Если для вашей прошивки ничего подобного делать не нужно, то функция все равно должна быть объявлена. Вот стандартный пример функции setup():
В этом примере просто открывается последовательный порт для связи с компьютером и пины 9 и 13 назначаются входом и выходом. Ничего сложного. Но если вам что-либо не понятно, вы всегда можете задать вопрос в комментариях ниже.
Функция loop
Функция loop() выполняется после функции setup(). Loop в переводе с английского значит «петля». Это говорит о том что функция зациклена, то есть будет выполняться снова и снова. Например микроконтроллер ATmega328, который установлен в большинстве плат Arduino, будет выполнять функцию loop около 10 000 раз в секунду (если не используются задержки и сложные вычисления). Благодаря этому у нас есть большие возможности.
Макетная плата Breadbord
Вы можете создавать простые и сложные устройства. Для удобства я советую приобрести макетную плату (Breadbord) и соединительные провода. С их помощью вам не придется паять и перепаивать провода, модули, кнопки и датчики для разных проектов и отладки. С беспаечной макетной платой разработка становится более простой, удобной и быстрой. Как работать с макетной платой я рассказывал в этом уроке. Вот список беспаечных макетных плат:
Макетная плата на 800 точек с 2 шинами питания, платой подачи питания и проводами:
Купить
Большая макетная плата на 1600 точек с 4 шинами питания:
Купить
Макетная плата на 800 точек с 2 шинами питания:
Купить
Макетная плата на 400 точек с 2 шинами питания:
Купить
Макетная плата на 170 точек:
Купить
Соединительные провода 120 штук:
Купить
Первый проект на Arduino
Давайте соберем первое устройство на базе Ардуино. Мы просто подключим тактовую кнопку и светодиод к ардуинке. Схема проекта выглядит так:
Управление яркостью светодиода
Обратите внимание на дополнительные резисторы в схеме. Один из них ограничивает ток для светодиода, а второй притягивает контакт кнопки к земле. Как это работает и зачем это нужно я объяснял в этом уроке.
Для того что бы все работало, нам надо написать скетч. Давайте сделаем так, что бы светодиод загорался после нажатия на кнопку, а после следующего нажатия гас. Вот наш первый скетч:
В этом скетче я создал дополнительную функцию debounse для подавления дребезга контактов. О дребезге контактов есть целый урок на моем сайте. Обязательно ознакомьтесь с этим материалом.
ШИМ Arduino
Широтно-импульсная модуляция (ШИМ) — это процесс управления напряжением за счет скважности сигнала. То есть используя ШИМ мы можем плавно управлять нагрузкой. Например можно плавно изменять яркость светодиода, но это изменение яркости получается не за счет уменьшения напряжения, а за счет увеличения интервалов низкого сигнала. Принцип действия ШИМ показан на этой схеме:
Когда мы подаем ШИМ на светодиод, то он начинает быстро зажигаться и гаснуть. Человеческий глаз не способен увидеть это, так как частота слишком высока. Но при съемке на видео вы скорее всего увидите моменты когда светодиод не горит. Это случится при условии что частота кадров камеры не будет кратна частоте ШИМ.
В Arduino есть встроенный широтно-импульсный модулятор. Использовать ШИМ можно только на тех пинах, которые поддерживаются микроконтроллером. Например Arduino Uno и Nano имеют по 6 ШИМ выводов: это пины D3, D5, D6, D9, D10 и D11. В других платах пины могут отличаться. Вы можете найти описание интересующей вас платы в этом разделе.
Для использования ШИМ в Arduino есть функция analogWrite(). Она принимает в качестве аргументов номер пина и значение ШИМ от 0 до 255. 0 — это 0% заполнения высоким сигналом, а 255 это 100%. Давайте для примера напишем простой скетч. Сделаем так, что бы светодиод плавно загорался, ждал одну секунду и так же плавно угасал и так до бесконечности. Вот пример использования этой функции:
Аналоговые входы Arduino
Как мы уже знаем, цифровые пины могут быть как входом так и выходом и принимать/отдавать только 2 значения: HIGH и LOW. Аналоговые пины могут только принимать сигнал. И в отличии от цифровых входов аналоговые измеряют напряжение поступающего сигнала. В большинстве плат ардуино стоит 10 битный аналогово-цифровой преобразователь. Это значит что 0 считывается как 0 а 5 В считываются как значение 1023. То есть аналоговые входы измеряют, подаваемое на них напряжение, с точностью до 0,005 вольт. Благодаря этому мы можем подключать разнообразные датчики и резисторы (терморезисторы, фоторезисторы) и считывать аналоговый сигнал с них.
Для этих целей в Ардуино есть функция analogRead(). Для примера подключим фоторезистор к ардуино и напишем простейший скетч, в котором мы будем считывать показания и отправлять их в монитор порта. Вот так выглядит наше устройство:
Подключение фоторезистора к Ардуино
В схеме присутствует стягивающий резистор на 10 КОм. Он нужен для того что бы избежать наводок и помех. Теперь посмотрим на скетч:
Вот так из двух простейших элементов и четырех строк кода мы сделали датчик освещенности. На базе этого устройства мы можем сделать умный светильник или ночник. Очень простое и полезное устройство.
Вот мы и рассмотрели основы работы с Arduino. Теперь вы можете сделать простейшие проекты. Что бы продолжить обучение и освоить все тонкости, я советую прочитать книги по ардуино и пройти бесплатный обучающий курс. После этого вы сможете делать самые сложные проекты, которые только сможете придумать.
19 комментариев
дело в том, что легче написать новую прошивку, чем разбираться в прошивке, а для этого надо понимать, как работает ваше устройство! т.е. надо работать вместе программист, и пользователь! иначе никак! илли 2 способ- изучите программирование, и пишите сами что вам надо! поверьте- это не так сложно!
Хороший сайт. Спасибо.
Благодарен автору за полезное дело. Помогать учиться, это самое лучшее занятие для человека.
Онлайн курс по ардуино на базе простого стартового набора
На данный момент существует большое количество онлайн и оффлайн образовательных программ, курсов, методических материалов по ардуино и на первый план выходит качество этих курсов, а оно не всегда оправдывает ожидания учеников и их родителей. Онлайн курсы обычно бывают малоэффективными в силу их низкой интерактивности. А эффективность оффлайн курсов сильно зависит от квалификации преподавателя, с которой иногда бывают проблемы в силу относительной новизны данного направления по сравнению с другими школьными дисциплинами. Данный курс призван частично решить обе этих проблемы. С одной стороны, он должен оказаться эффективнее существующих онлайн курсов за счет резкого увеличения интерактивности, о чем более подробно будет сказано далее. С другой стороны, увеличение эффективности самого курса немного снижает роль преподавателя, позволяя использовать данные интерактивные курсы в регионах с кадровым дефицитом в сфере преподавания ардуино.
Часть 1. Методика.
Итак, начнем с того, что же такое интерактивность, почему она важна и как достигается в рамках данного курса. Инетерактивный метод обучения предполагает взаимодействие учеников не только с учителем но и между собой. Подробнее можно почитать в Википедии Важность использования интерактивного метода заключается в том, что он эффективнее пассивного метода обучения. Этот факт является общепризнанным, как и тот факт что увеличение интерактивности увеличивает и эффективность процесса образования. Более подробно об этом можно узнать
В этом видео разбирается несколько случаев, когда увеличение интерактивности увеличивает качество образования, а ее уменьшение, соответственно, снижает качество образования.
В этом видео приводится пример, когда преподаватель использует пассивный метод обучения, и этот метод настолько неэффективен, что преподавателя предлагают заменить на видеозапись его же лекции.
Потому что Вк по посещаемости в России опережает всех, а Youtube опережает Одноклассники, Facebook, Instagram и другие. Это позволяет полноценно пользоваться данным курсом большой аудитории русскоязычных пользователей.
Источник: TNS
Часть 2. Структура курса.
Данный курс рассчитан на один учебный год, состоит из 40 занятий (по одному занятию в неделю). В первой половине курса (20 занятий) даются общие знания о платформе ардуино, ее функциях, возможностях, разбираются простые примеры и принципы ее работы. Также приводятся примеры работы с периферией (датчиками, системами ввода и вывода информации, исполнительными устройствами). Важно, что для прохождения первых 20 занятий достаточно одного стартового набора ардуино, который можно купить в любом китайском интернет-магазине, не переплачивая за бренд на упаковке.
Каждое занятие курса базируется на видеоуроке, содержит краткое текстовое описание занятия, все необходимые схемы и скетчи. При возникновение сложностей при выполнение задания предлагается обращаться с вопросом к автору видеоурока в комментариях к видео, либо найти там же нужный ответ, если вопрос поднимался ранее другими учениками. Всегда есть возможность спросить также у других учеников, оставивших комментарии к видео ранее. Лучше для этого подходит Youtube, но также можно использовать Vk, с поправкой на то, что обращение напрямую к автору видеоурока в Vk может быть ограничена.
Во второй половине курса (занятия с 21 по 40) делается акцент на проектной работе. Занятия также построены на основе видеоуроков. В начале занятия дается список материалов, деталей и оборудования, которое необходимо помимо стартового набора ардуино. Вводная часть закончилась, переходим непосредственно к курсу.
Интерактивный курс по ардуино
Смотрим первый видеоурок:
Скачать среду разработки можно с официального сайта ардуино Инструкция по установке драйвера для китайской ардуино тут
/* Jeremy’s First Program It’s awesome! */
void setup() < //initialize pins as outputs pinMode(ledPin, OUTPUT); >
/* 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 > Также скетч можно найти здесь:
/* Arduino Tutorials Episode 2 Switch1 Program Written by: Jeremy Blum */
if (ledLevel > 255) ledLevel = 0; analogWrite(ledPin, ledLevel);
//Reads the State of a Button and displays it on the screen
void setup() < //sets the button pin as an input pinMode(buttonPin, INPUT);
//Allows us to listen to serial communications from the arduino Serial.begin(9600); >
void loop() < // print the button state to a serial terminal Serial.println(digitalRead(buttonPin)); delay(1000); //wait one second, then print again. >
//Reads the State of a Pot and displays on screen
void setup() < //sets the button pin as an input pinMode(potPin, INPUT);
//Allows us to listen to serial communications from the arduino Serial.begin(9600); >
void loop() < // print the button state to a serial terminal Serial.println(analogRead(potPin)); delay(1000); //wait one second, then print again. >
int sensePin =0; int ledPin =3;
void setup() < pinMode(ledPin, OUTPUT); >
void loop() < int val = analogRead(sensePin);
val = constrain(val, 750, 900); int ledLevel = map(val, 750, 900, 255, 0);
const int RED_PIN = 9; const int GREEN_PIN = 10; const int BLUE_PIN = 11;
// библиотека с коммандами для сервоприводов #include //описание библиотеки по ссылке — arduino.cc/en/Reference/Servo
Servo servo1; // объект сервопривод №1
void setup() < servo1.attach(9); // Сервопривод подключен к цифровому выходу 9 //servo1.detach() для расслабления мотора сервопривода >
void loop() < int position; //зададим переменную позиция, понадобится потом
// Крутилка на полной скорости:
servo1.write(90); // повернись на 90 град. delay(1000); // пауза чтобы он успел повернуться servo1.write(180); // повернись на 180 град. delay(1000); // пауза servo1.write(0); // повернись до уровня 0 град. delay(1000); // пауза
// Крутилки на более низкой скорости: //от 0 до 180 с гагом в 2 градуса
void loop() < //в results будут помещаться принятые и //декодированные ик команды decode_results results; //Если ик команда принята и успешно декодирована — //выводим полученный код в сириал монитор if (irrecv.decode(&results)) < Serial.println(results.value); irrecv.resume(); > >
Serial.begin(9600); delay(500);//Delay to let system boot Serial.println(«DHT11 Humidity & temperature Sensor\n\n»); delay(1000);//Wait before accessing Sensor
/* Blink Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain. */
// Pin 4 has an LED connected on most Arduino boards. // give it a name: int led = 4;
// 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 >
//http://arduinoworks.com int e = 3; int d = 4; int c = 5; int b = 6; int a = 7; int f = 8; int g = 9; int p= 10; void setup() < pinMode(e, OUTPUT); pinMode(d, OUTPUT); pinMode(c, OUTPUT); pinMode(b, OUTPUT); pinMode(a, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(p, OUTPUT); digitalWrite(p,HIGH); > void displayDigit(int digit) < //Arduino Works Code for 7 segment Display if(digit ==0) < digitalWrite(e,HIGH); digitalWrite(d,HIGH); digitalWrite(c,HIGH); digitalWrite(b,HIGH); digitalWrite(a,HIGH); digitalWrite(f,HIGH);
/*Объявим переменные A, B, C, D, E, F, G и DP. И поместим туда значения от 5 до 12: это будут выходы Arduino Uno, с помощью которых мы будем управлять сегментами.*/ int A = 5; int B = 6; int C = 7; int D = 8; int E = 9; int F = 10; int G = 11; int DP = 12; int z,y,w,x; int K1 = 4; int K2 = 3; int K3 = 2; int K4 = 1; /*Объявляем массивы для каждого сегмента индикатора в которых будем хранить его состояние для каждой из цифр, начиная от 0 и заканчивая 9.*/ int a [10] = <1,0,1,1,0,1,1,1,1,1>; int b [10] = <1,1,1,1,1,0,0,1,1,1>; int c [10] = <1,1,0,1,1,1,1,1,1,1>; int d [10] = <1,0,1,1,0,1,1,0,1,1>; int e [10] = <1,0,1,0,0,0,1,0,1,0>; int f [10] = <1,0,0,0,1,1,1,0,1,1>; int g [10] = <0,0,1,1,1,1,1,0,1,1>; int dp [10] = <0,0,0,0,0,0,0,0,0,0>;
for( z = 9; z > 1; z-) < for( y = 9; y > 1; y-) < for( w = 9; w > 1; w-) < for( x = 9; x > 1; x-) < Myflesh(z,y,w,x); Myflesh(z,y,w,x); Myflesh(z,y,w,x); Myflesh(z,y,w,x); Myflesh(z,y,w,x); > > > > >
void Myflesh(int i,int j,int k,int m) < digitalWrite(A, a [i]); digitalWrite(B, b [i]); digitalWrite(C, c [i]); digitalWrite(D, d [i]); digitalWrite(E, e [i]); digitalWrite(F, f [i]); digitalWrite(G, g [i]); digitalWrite(DP, dp [i]); digitalWrite(K1, 0); delay(3); digitalWrite(K1, 1); digitalWrite(A, a [j]); digitalWrite(B, b [j]); digitalWrite(C, c [j]); digitalWrite(D, d [j]); digitalWrite(E, e [j]); digitalWrite(F, f [j]); digitalWrite(G, g [j]); digitalWrite(DP, dp [j]); digitalWrite(K2, 0); delay(3); digitalWrite(K2, 1); digitalWrite(A, a [k]); digitalWrite(B, b [k]); digitalWrite(C, c [k]); digitalWrite(D, d [k]); digitalWrite(E, e [k]); digitalWrite(F, f [k]); digitalWrite(G, g [k]); digitalWrite(DP, dp [k]); digitalWrite(K3, 0); delay(3); digitalWrite(K3, 1); digitalWrite(A, a [m]); digitalWrite(B, b [m]); digitalWrite(C, c [m]); digitalWrite(D, d [m]); digitalWrite(E, e [m]); digitalWrite(F, f [m]); digitalWrite(G, g [m]); digitalWrite(DP, dp [m]); digitalWrite(K4, 0); delay(3); digitalWrite(K4, 1); // delay(3); >
/* This Arduino code for “4-digit-7-segment-led-display» (KYX-5461AS). * This code can display one Number in all 4 digit! * This code can display 4 Numbers each on in specific digit * This code can also make a Number Countdown (Timers). author: Oussama Amri (@amriunix) website: ithepro.com */
//display pins int segA = 5; // >> 11 int segB = 13; // >> 7 int segC = 10; // >> 4 int segD = 8; // >> 2 int segE = 7; // >> 1 int segF = 4; // >> 10 int segG = 11; // >> 5 int segPt = 9; // >> 3 //————//
//display digit int d1 = 6; // >> 12 int d2 = 3; // >> 9 int d3 = 2; // >> 8 int d4 = 12; // >> 6 //————//
// This Arduino example demonstrates bidirectional operation of a // 28BYJ-48, using a ULN2003 interface board to drive the stepper. // The 28BYJ-48 motor is a 4-phase, 8-beat motor, geared down by // a factor of 68. One bipolar winding is on motor pins 1 & 3 and // the other on motor pins 2 & 4. The step angle is 5.625/64 and the // operating Frequency is 100pps. Current draw is 92mA. ////////////////////////////////////////////////
//declare variables for the motor pins int motorPin1 = 8; // Blue — 28BYJ48 pin 1 int motorPin2 = 9; // Pink — 28BYJ48 pin 2 int motorPin3 = 10; // Yellow — 28BYJ48 pin 3 int motorPin4 = 11; // Orange — 28BYJ48 pin 4 // Red — 28BYJ48 pin 5 (VCC)
int motorSpeed = 1200; //variable to set stepper speed int count = 0; // count of steps made int countsperrev = 512; // number of steps per full revolution int lookup[8] = ;
////////////////////////////////////////////////////////////////////////////// void setup() < //declare the motor pins as outputs pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); >
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the serial monitor. Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain. */
// the setup routine runs once when you press reset: void setup() < // initialize serial communication at 9600 bits per second: Serial.begin(9600); >
// the loop routine runs over and over again forever: void loop() < // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability >
// Controlling a servo position using a potentiometer (variable resistor) // by Michal Rinott
Servo myservo; // create servo object to control a servo
int potpin = 0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin
void setup() < myservo.attach(9); // attaches the servo on pin 9 to the servo object >
void loop() < val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180) myservo.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there >
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the serial monitor. Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain. */
// the setup routine runs once when you press reset: void setup() < // initialize serial communication at 9600 bits per second: Serial.begin(9600); >
// the loop routine runs over and over again forever: void loop() < // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability >
int Count=0; //Переменная для хранения значений с датчика звука int Relay=0; //Переменная для хранения состояния реле void setup() < pinMode(3, OUTPUT); //переводим пин 3 в режим выхода
void loop() < Count=analogRead(4); //читаем значения if(Count > 200 && Count 200 && Count 16. Модуль часов DS1302
// Init the DS1302 DS1302 rtc(2, 3, 4);
void setup() < // Set the clock to run-mode, and disable the write protection rtc.halt(false); rtc.writeProtect(false);
// Setup Serial connection Serial.begin(9600);
// The following lines can be commented out to use the values already stored in the DS1302 rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY rtc.setTime(12, 0, 0); // Set the time to 12:00:00 (24hr format) rtc.setDate(6, 8, 2010); // Set the date to August 6th, 2010 >
// Send date Serial.print(rtc.getDateStr()); Serial.print(» — «);
// Send time Serial.println(rtc.getTimeStr());
// Wait one second before repeating 🙂 delay (1000); >
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the serial monitor. Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain. */
// the setup routine runs once when you press reset: void setup() < // initialize serial communication at 9600 bits per second: Serial.begin(9600); >
// the loop routine runs over and over again forever: void loop() < // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability >
// Show messages scrolling from right to left. #include
byte col=0; byte leds[8][8];
const int numPatterns=10; byte patterns[numPatterns][8][8]=; int pattern=0;
void setup() < for (int i=1; i 19. RFID-считыватель RC522
/* * — * Example sketch/program showing how to read data from a PICC to serial. * — * This is a MFRC522 library example; for further details and other examples see: github.com/miguelbalboa/rfid * * Example sketch/program showing how to read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID * Reader on the Arduino SPI interface. * * When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE * then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When * you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output * will show the ID/UID, type and any data blocks it can read. Note: you may see «Timeout in communication» messages * when removing the PICC from reading distance too early. * * If your reader supports it, this sketch/program will read all the PICCs presented (that is: multiple tag reading). * So if you stack two or more PICCs on top of each other and present them to the reader, it will first output all * details of the first and then the next PICC. Note that this may take some time as all data blocks are dumped, so * keep the PICCs at reading distance until complete. * * @license Released into the public domain. * * Typical pin layout used: * — * MFRC522 Arduino Arduino Arduino Arduino Arduino * Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro * Signal Pin Pin Pin Pin Pin Pin * — * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST * SPI SS SDA(SS) 10 53 D10 10 10 * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 */
#define RST_PIN 9 // Configurable, see typical pin layout above #define SS_PIN 10 // Configurable, see typical pin layout above
void setup() < Serial.begin(9600); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD — MFRC522 Card Reader details Serial.println(F(«Scan PICC to see UID, SAK, type, and data blocks. »)); >
void loop() < // Look for new cards if (! mfrc522.PICC_IsNewCardPresent()) < return; >
// Select one of the cards if (! mfrc522.PICC_ReadCardSerial()) < return; >
// Dump debug info about the card; PICC_HaltA() is automatically called mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); >
// — // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0. 127 to 1. 119, // according to the i2c scanner by Nick Gammon // www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // Version 6, November 27, 2015. // Added waiting for the Leonardo serial communication. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. //
Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println(«\nI2C Scanner»); >
int ugol = 90; int smotrim_vlevo = 0; int smotrim_vpravo = 0; int smotrim_priamo = 0; int vremia;
const int in11 = 0; // L298N-1 pin 1 const int in12 = 1; // L298N-1 pin 2 const int in13 = 2; // L298N-1 pin 2 const int in14 = 3; // L298N-1 pin 3
const int in21 = 4; // L298N-2 pin 1 const int in22 = 5; // L298N-2 pin 2 const int in23 = 6; // L298N-2 pin 2 const int in24 = 7; // L298N-2 pin 3
void setup() < servo.attach(10); // серву подключаем к 10 пину
pinMode(Trig, OUTPUT); // выход pinMode(Echo, INPUT); // вход
pinMode(in11, OUTPUT); // выход на L298n pinMode(in12, OUTPUT); // выход на L298n pinMode(in13, OUTPUT); // выход на L298n pinMode(in14, OUTPUT); // выход на L298n
pinMode(in21, OUTPUT); // выход на L298n pinMode(in22, OUTPUT); // выход на L298n pinMode(in23, OUTPUT); // выход на L298n pinMode(in24, OUTPUT); // выход на L298n
void setup() < // Задаем максимальную скорость вращения моторов (аналог работы PWM) motor1.setSpeed(255); motor1.run(RELEASE); motor2.setSpeed(255); motor2.run(RELEASE); motor3.setSpeed(255); motor3.run(RELEASE); motor4.setSpeed(255); motor4.run(RELEASE);
void loop() < if (Serial.available()) < val = Serial.read();
if (val == ‘5’) // При нажатии клавиши «5» if (val == ‘6’) // При нажатии клавиши «6» if (val == ‘Y’) // При нажатии клавиши «7» if (val == ‘B’) // При нажатии клавиши «8»
// Задаём движение вперёд if (val == ‘W’) // При нажатии клавиши «W» < // Выводы конфигурируются согласно раьоте Motor Shield’а // Моторы крутятся вперед motor1.run(FORWARD); // Задаем движение вперед motor4.run(FORWARD); motor1.setSpeed(255); // Задаем скорость движения motor4.setSpeed(255); >
// Задаём движение назад if ( val == ‘S’) < // Двигаемся в обратном направлении motor1.run(BACKWARD); // Задаем движение назад motor4.run(BACKWARD); motor1.setSpeed(255); // Задаем скорость движения motor4.setSpeed(255); >
// Задаём движение вправо if ( val == ‘D’) < motor4.run(FORWARD); // Задаем движение вправо motor4.setSpeed(255); // Задаем скорость движения >
// Задаём движение влево if ( val == ‘A’) < motor1.run(FORWARD); // Задаем движение влево motor1.setSpeed(255); // Задаем скорость движения >
// Стоп режим // При отпускании клавиш в программе в порт шлется «T» if ( val == ‘T’) // При нажатии клавиши «T» < motor1.run(RELEASE); motor4.run(RELEASE);
> if ( val == ‘N’) // При нажатии клавиши «T» < // Выводы ENABLE притянуты к минусу, моторы не работают
#define mot_ena 9 //пин ШИМа левого мотора #define mot_in1 8 //пин левого мотора #define mot_in2 7 //пин левого мотора #define mot_in3 6 //пин правого мотора #define mot_in4 4 //пин правого мотора #define mot_enb 10 //пин ШИМа правого мотора
randomSeed(analogRead(A7)); // пины энкодеров на вход pinMode(3, INPUT); // пин левого энкодера на вход pinMode(2, INPUT); // пин правого энкодера на вход //————————- // пины для левого и правого моторов на выход pinMode(mot_ena, OUTPUT); pinMode(mot_in1, OUTPUT); pinMode(mot_in2, OUTPUT); pinMode(mot_in3, OUTPUT); pinMode(mot_in4, OUTPUT); pinMode(mot_enb, OUTPUT); //——————————————- // пины ИК-датчиков на вход pinMode(ir_1, INPUT); pinMode(ir_2, INPUT); pinMode(ir_3, INPUT); pinMode(ir_4, INPUT); pinMode(ir_5, INPUT); pinMode(ir_6, INPUT); //————————- // пины левого и правого выключателей на вход pinMode(lev_vik, INPUT); pinMode(pra_vik, INPUT); //————————— delay(3000);
// если срабатывает левый выключатель на бампере if (digitalRead(lev_vik) == LOW) < ROB_STOP(); delay(200); ROB_NAZAD(); delay(150); ROB_STOP(); delay(200); ROB_PRAV(); delay(random(400, 1500)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает правый выключатель на бампере if (digitalRead(pra_vik) == LOW) < ROB_STOP(); delay(200); ROB_NAZAD(); delay(150); ROB_STOP(); delay(200); ROB_LEV(); delay(random(400, 1500)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает 2 ИК-датчик if (digitalRead(ir_2) == LOW) < ROB_STOP(); delay(200); ROB_PRAV(); delay(random(200, 1100)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает 3 ИК-датчик if (digitalRead(ir_3) == LOW) < ROB_STOP(); delay(200); ROB_PRAV(); delay(random(200, 1100)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает 4 ИК-датчик if (digitalRead(ir_4) == LOW) < ROB_STOP(); delay(200); ROB_LEV(); delay(random(200, 1100)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает 5 ИК-датчик if (digitalRead(ir_5) == LOW) < ROB_STOP(); delay(200); ROB_LEV(); delay(random(200, 1100)); ROB_STOP(); delay(200); ROB_VPERED(); > //———————————————— // если срабатывает 1 ИК-датчик if (digitalRead(ir_1) == LOW) < ROB_PRAV(); delay(10); ROB_VPERED(); > //———————————————— // если срабатывает 6 ИК-датчик if (digitalRead(ir_6) == LOW) < ROB_LEV(); delay(10); ROB_VPERED(); > //————————————————
// поворот направо на месте void ROB_PRAV() < // левый мотор вперед digitalWrite(mot_in1, LOW); digitalWrite(mot_in2, HIGH); analogWrite(mot_ena, max_skor_lev); // правый мотор назад digitalWrite(mot_in3, LOW); digitalWrite(mot_in4, HIGH); analogWrite(mot_enb, max_skor_prav); > //—————— // поворот налево на месте void ROB_LEV() < // правый мотор вперед digitalWrite(mot_in3, HIGH); digitalWrite(mot_in4, LOW); analogWrite(mot_enb, max_skor_prav); // левый мотор назад digitalWrite(mot_in1, HIGH); digitalWrite(mot_in2, LOW); analogWrite(mot_ena, max_skor_lev); > //——————— // езда вперед void ROB_VPERED() < // левый мотор вперед digitalWrite(mot_in1, LOW); digitalWrite(mot_in2, HIGH); analogWrite(mot_ena, max_skor_lev); // правый мотор вперед digitalWrite(mot_in3, HIGH); digitalWrite(mot_in4, LOW); analogWrite(mot_enb, max_skor_prav); > //————————————- // езда назад void ROB_NAZAD() < // левый мотор назад digitalWrite(mot_in1, HIGH); digitalWrite(mot_in2, LOW); analogWrite(mot_ena, max_skor_lev); // правый мотор назад digitalWrite(mot_in3, LOW); digitalWrite(mot_in4, HIGH); analogWrite(mot_enb, max_skor_prav); > //———————————— // стоп void ROB_STOP() < // левый мотор стоп digitalWrite(mot_in1, LOW); digitalWrite(mot_in2, LOW); analogWrite(mot_ena, min_skor); // правый мотор стоп digitalWrite(mot_in3, LOW); digitalWrite(mot_in4, LOW); analogWrite(mot_enb, min_skor); > //———————————