Онлайн курс по ардуино на базе простого стартового набора

  • Tutorial
На данный момент существует большое количество онлайн и оффлайн образовательных программ, курсов, методических материалов по ардуино и на первый план выходит качество этих курсов, а оно не всегда оправдывает ожидания учеников и их родителей. Онлайн курсы обычно бывают малоэффективными в силу их низкой интерактивности. А эффективность оффлайн курсов сильно зависит от квалификации преподавателя, с которой иногда бывают проблемы в силу относительной новизны данного направления по сравнению с другими школьными дисциплинами. Данный курс призван частично решить обе этих проблемы. С одной стороны, он должен оказаться эффективнее существующих онлайн курсов за счет резкого увеличения интерактивности, о чем более подробно будет сказано далее. С другой стороны, увеличение эффективности самого курса немного снижает роль преподавателя, позволяя использовать данные интерактивные курсы в регионах с кадровым дефицитом в сфере преподавания ардуино.



Часть 1. Методика.

Итак, начнем с того, что же такое интерактивность, почему она важна и как достигается в рамках данного курса.
Инетерактивный метод обучения предполагает взаимодействие учеников не только с учителем но и между собой. Подробнее можно почитать в Википедии
Важность использования интерактивного метода заключается в том, что он эффективнее пассивного метода обучения. Этот факт является общепризнанным, как и тот факт что увеличение интерактивности увеличивает и эффективность процесса образования. Более подробно об этом можно узнать
тут.
В этом видео разбирается несколько случаев, когда увеличение интерактивности увеличивает качество образования, а ее уменьшение, соответственно, снижает качество образования.



В этом видео приводится пример, когда преподаватель использует пассивный метод обучения, и этот метод настолько неэффективен, что преподавателя предлагают заменить на видеозапись его же лекции.



Обеспечение коммуникации между учителем и учеником а также между учениками в рамках данного курса реализовано за счет функционала двух соцсетей: Вконтакте и Youtube. В рамках обеих соцсетей возможно вести публичную беседу, отправлять личные сообщения и получать оповещения об ответе на интересующий вопрос.
Почему именно эти две соцсети
Потому что Вк по посещаемости в России опережает всех, а Youtube опережает Одноклассники, Facebook, Instagram и другие. Это позволяет полноценно пользоваться данным курсом большой аудитории русскоязычных пользователей.


Источник: TNS

Часть 2. Структура курса.

Данный курс рассчитан на один учебный год, состоит из 40 занятий (по одному занятию в неделю).
В первой половине курса (20 занятий) даются общие знания о платформе ардуино, ее функциях, возможностях, разбираются простые примеры и принципы ее работы. Также приводятся примеры работы с периферией (датчиками, системами ввода и вывода информации, исполнительными устройствами). Важно, что для прохождения первых 20 занятий достаточно одного стартового набора ардуино, который можно купить в любом китайском интернет-магазине, не переплачивая за бренд на упаковке.

Каждое занятие курса базируется на видеоуроке, содержит краткое текстовое описание занятия, все необходимые схемы и скетчи. При возникновение сложностей при выполнение задания предлагается обращаться с вопросом к автору видеоурока в комментариях к видео, либо найти там же нужный ответ, если вопрос поднимался ранее другими учениками. Всегда есть возможность спросить также у других учеников, оставивших комментарии к видео ранее. Лучше для этого подходит Youtube, но также можно использовать Vk, с поправкой на то, что обращение напрямую к автору видеоурока в Vk может быть ограничена.



Во второй половине курса (занятия с 21 по 40) делается акцент на проектной работе. Занятия также построены на основе видеоуроков. В начале занятия дается список материалов, деталей и оборудования, которое необходимо помимо стартового набора ардуино. Вводная часть закончилась, переходим непосредственно к курсу.

Интерактивный курс по ардуино

1.Знакомство с ардуино (кликните, чтобы развернуть)
Что такое ардуино? Возможности и цели платформы



Состав стартового набора ардуино
Внимательно изучите набор. Какие элементы вам уже знакомы? Попробуйте узнать функции незнакомых деталей у учителя или в поисковике.
Цену можно узнать тут. В комплекте обычно нет батарейки, но вместо нее можно использовать блок питания (иногда подходят блоки питания от модемов, роутеров, тв-приставок)


Смотрим первый видеоурок:



Скачать среду разработки можно с официального сайта ардуино
Инструкция по установке драйвера для китайской ардуино тут
Скетч из видеоурока
/*
Jeremy's First Program
It's awesome!
*/

int ledPin = 13;

void setup()
{
//initialize pins as outputs
pinMode(ledPin, OUTPUT);
}

void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

Стандартный скетч
/*
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
}
Также скетч можно найти здесь:


Результат должен получиться такой:

Результатами прохождения задания можно поделиться в группе Вконтакте. Там же можно оставить вопрос по заданию.

2. Кнопка и PWM (ШИМ)
В занятии рассказывается, как устроена макетная плата, как подключать кнопки и светодиоды. Как определить сопротивление резисторов можно узнать тут. Также рассматривается эффект дребезжания кнопок и метод его устранения. Какие выходы ардуино поддерживают PWM (ШИМ).


Скетч 1
/*
Arduino Tutorials
Episode 2
Switch1 Program
Written by: Jeremy Blum
*/

int switchPin = 8;
int ledPin = 13;

void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}

void loop()
{
if (digitalRead(switchPin) == HIGH)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
}

Скетч 2
/*
Arduino Tutorials
Episode 2
Switch Program
Written by: Jeremy Blum
*/

int switchPin = 8;
int ledPin = 13;
boolean lastButton = LOW;
boolean ledOn = false;

void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}

void loop()
{
if (digitalRead(switchPin) == HIGH && lastButton == LOW)
{
ledOn = !ledOn;
lastButton = HIGH;
}
else
{
//lastButton = LOW;
lastButton = digitalRead(switchPin);
}

digitalWrite(ledPin, ledOn);

}

Скетч 3
/*
Arduino Tutorials
Episode 2
Switch3 Program (debounced)
Written by: Jeremy Blum
*/

int switchPin = 8;
int ledPin = 13;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}

boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}

void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledOn = !ledOn;
}
lastButton = currentButton;

digitalWrite(ledPin, ledOn);

}

Скетч 4
/*
Arduino Tutorials
Episode 3
Switch4 Program (pwm)
Written by: Jeremy Blum
*/

int switchPin = 8;
int ledPin = 11;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledLevel = 0;

void setup()
{
pinMode(switchPin, INPUT);
pinMode(ledPin, OUTPUT);
}

boolean debounce(boolean last)
{
boolean current = digitalRead(switchPin);
if (last != current)
{
delay(5);
current = digitalRead(switchPin);
}
return current;
}

void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
ledLevel = ledLevel + 51;
}
lastButton = currentButton;

if (ledLevel > 255) ledLevel = 0;
analogWrite(ledPin, ledLevel);

}

Должно получиться так:

Дополнительные видеоматериалы по теме



О результатах и вопросах по прохождению занятия можно написать в соответствующей теме в группе вконтакте.
Попробуйте сделать самостоятельно так:


3. Потенциометр. Основы схемотехники
Джереми рассказывает о базовых понятиях в схемотехнике: о токе, напряжении, делителях напряжения, потенциометре, законе Ома и о том, как это применяется на практике вместе с Arduino


Скетч 1
//Reads the State of a Button and displays it on the screen

int buttonPin = 8;

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

Скетч 2
//Reads the State of a Pot and displays on screen

int potPin = 0;

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

В конце второго видео говорится о стабилизаторе напряжения и конденсаторах. Отдельно этих деталей в наборах обычно нет, но эти детали смонтированы на самой плате ардуино уно. Найдете ли вы там эти детали? Фактически Джереми рассказывает как устроено питание самой ардуино уно: сколько бы ни выдавала батарейка или блок питания (7-14 вольт), на выходах ардуино всегда будет 5 вольт (в положении HIGH). Тема разработки и создания источников питания обычно не входит в курсы по ардуино, поэтому окончание второго видео носит больше ознакомительный характер.
Дополнительное задание: сделать как показано тут:


4. Датчик освещенности
Джереми рассказывает об аналоговых входах Arduino, о том как собрать и подключить к ним сенсоры. Вы узнаете как применять фоторезистор.

Скетч тут
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);

analogWrite(ledPin, ledLevel);
}

Схема подключения:

принцип работы фоторезистора:

Результат должен получиться примерно такой:

Задавайте свои вопросы и получайте на них ответы в комментариях к видео.

5. RGB светодиод

Скетч
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;

void setup()
{
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}

void loop()
{
mainColors();
showSpectrum();
}

void mainColors()
{
digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);

delay(1000);

digitalWrite(RED_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);

digitalWrite(RED_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);

delay(1000);
}

void showSpectrum()
{
int x;
for (x = 0; x < 768; x++)
{
showRGB(x);
delay(10);
}
}

void showRGB(int color)
{
int redIntensity;
int greenIntensity;
int blueIntensity;

if (color <= 255)
{
redIntensity = 255 — color;
greenIntensity = color;
blueIntensity = 0;
}
else if (color <= 511)
{
redIntensity = 0;
greenIntensity = 255 — (color — 256);
blueIntensity = (color — 256);
}
else // color >= 512
{
redIntensity = (color — 512);
greenIntensity = 0;
blueIntensity = 255 — (color — 512);
}
analogWrite(RED_PIN, redIntensity);
analogWrite(BLUE_PIN, blueIntensity);
analogWrite(GREEN_PIN, greenIntensity);
}

Схема:

Результат такой:

Вопросы и ответы как обычно в комментариях к видео

6. Сервопривод, библиотеки

Скетч
// библиотека с коммандами для сервоприводов
#include <Servo.h>
//описание библиотеки по ссылке — 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 градуса

for(position = 0; position < 180; position += 2)
{
servo1.write(position); // передвинься на следующую позицию
delay(20); // небольшой перерыв чтобы он успел передвинуться
}

// от 180 до 0 с шагом 1 градус

for(position = 180; position >= 0; position -= 1)
{
servo1.write(position); // передвинься на следующую позицию
delay(20); // небольшой перерыв чтобы он успел передвинуться
}
}

Схема:

Результат должен получиться примерно такой:

Вопросы и ответы по занятию как обычно к комментариях к видео

7. Ик приемник

Скетч
#include «IRremote.h»

//вход ик приёмника к А0
const int IR_PIN = A0;

//создаём объект ик приёмника
IRrecv irrecv(IR_PIN);
void setup (){
Serial.begin(9600);
Serial.println(«ready»);
//начинаем прослушивание ик сигналов
irrecv.enableIRIn();
}

void loop() {
//в results будут помещаться принятые и
//декодированные ик команды
decode_results results;
//Если ик команда принята и успешно декодирована —
//выводим полученный код в сириал монитор
if (irrecv.decode(&results)) {
Serial.println(results.value);
irrecv.resume();
}
}

Библиотека IRremote
Схема подключения:

В serial monitor будут показываться коды кнопок вашего пульта ДУ так:

Вопросы и ответы как обычно в комментариях к видео

8. Датчик температуры DHT11

Библиотека для датчика здесь
Скетч можно взять из библиотеки или здесь
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <DHT.h>
#define dht_apin A0 // Analog Pin sensor is connected to

dht DHT;

void setup(){

Serial.begin(9600);
delay(500);//Delay to let system boot
Serial.println(«DHT11 Humidity & temperature Sensor\n\n»);
delay(1000);//Wait before accessing Sensor

}//end «setup()»

void loop(){
//Start of Program

DHT.read11(dht_apin);

Serial.print(«Current humidity = „);
Serial.print(DHT.humidity);
Serial.print(“% „);
Serial.print(“temperature = „);
Serial.print(DHT.temperature);
Serial.println(“C „);

delay(5000);//Wait 5 seconds before accessing sensor again.

//Fastest should be once every two seconds.

}// end loop()

Схема подключения:

Результат должен получиться таким:

Вопросы и ответы по заданию как обычно в комментариях к видео.

9. Датчик температуры LM35

Скетч
float tempC;
int reading;
int tempPin = 0;

void setup()
{
analogReference(INTERNAL);
Serial.begin(9600);
}

void loop()
{
reading = analogRead(tempPin);
tempC = reading / 9.31;
Serial.println(tempC);
delay(1000);
}


Схема подключения

Результат должен получиться такой:

Вопросы и ответы как обычно в комментариях к видео

10. Реле

Скетч
/*
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
}

Схема подключения:

Принцип работы реле:

Демонстрация работы реле:


11. Семисегментный дисплей

Скетч тут
//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);

}
else if(digit==1)
{
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}

else if(digit ==2)
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
}

else if(digit ==3)
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}


else if(digit == 4)
{
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
else if(digit == 5)
{
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}



else if(digit ==6)
{
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
digitalWrite(c,HIGH);
digitalWrite(g,HIGH);
}
else if(digit ==7)
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
else if(digit ==8)
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);

}
else if(digit ==9)
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}


}
void turnOff()
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}

void loop()
{
//7 Segment Display with Arduino
for(int i=0;i<10;i++)
{
displayDigit(i);
delay(1000);
turnOff();
}
}

Схема подключения:

Результат должен получиться такой:

Вопросы и ответы как обычно в комментариях к видео

12. Четрырёхразрядный семисегментный индикатор

Скетч тут
/*Объявим переменные 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};

void setup() {
//Назначаем нужные нам пины Arduino выходами
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(K1, OUTPUT);
pinMode(K2, OUTPUT);
pinMode(K3, OUTPUT);
pinMode(K4, OUTPUT);
}

void loop() {

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
//------------//

int delayTime = 5000; //delayTime <Don't change it, if you don't know where is it!>

int i=0;

//=============================================//
//init all pin used
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}

//=============================================//
void loop() {
//down(0,0,2,4);
all(5);
//writeN(1,9,9,4);
}

//=============================================//
//Write a Number — writeN(1,9,9,0) -> 1990
void writeN(int a,int b,int c,int d){
selectDwriteL(1,a);
selectDwriteL(2,b);
selectDwriteL(3,c);
selectDwriteL(4,d);
}

//=============================================//
//Make a Number Number Countdown (Timers).
void down(int a,int b,int c,int d){
while (a != -1) {
while(b != -1){
while(c != -1){
while (d != -1) {
while (i<10) { // i here is like a timer! because we can't use delay function
selectDwriteL(1,a);
selectDwriteL(2,b);
selectDwriteL(3,c);
selectDwriteL(4,d);
i++;
}
i=0;
d--;
}
d=9;
c--;
}
c=9;
b--;
}
b=9;
a--;
}
}

//=============================================//
//Select Wich Digit (selectD) is going to Display (writeL)
void selectDwriteL(int d,int l){
switch (d) { // choose a digit
case 0: digitalWrite(d1, LOW); //case 0 — All ON
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
digitalWrite(d4, LOW);
break;
case 1: digitalWrite(d1, LOW);//case 1 — Digit Number 1
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
break;
case 2: digitalWrite(d1, HIGH);//case 1 — Digit Number 2
digitalWrite(d2, LOW);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
break;
case 3: digitalWrite(d1, HIGH);//case 1 — Digit Number 3
digitalWrite(d2, HIGH);
digitalWrite(d3, LOW);
digitalWrite(d4, HIGH);
break;
case 4: digitalWrite(d1, HIGH);//case 1 — Digit Number 4
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, LOW);
break;
}

switch (l) { // choose a Number
case 0: zero();
break;
case 1: one();
break;
case 2: two();
break;
case 3: three();
break;
case 4: four();
break;
case 5: five();
break;
case 6: six();
break;
case 7: seven();
break;
case 8: eight();
break;
case 9: nine();
break;
case 10: point(); // print a Point
break;
case 11: none(); // make all them off!
break;
}

delayMicroseconds(delayTime); // delayTime for nice display of the Number!

}

//=============================================//
//shown one Number in the 4 Digit
void all(int n){
selectDwriteL(0,n);
}

//=============================================//
void zero(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
digitalWrite(segPt, LOW);
}
//=============================================//
void one(){
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
digitalWrite(segPt, LOW);
}
//=============================================//
void two(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void three(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void four(){
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void five(){
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void six(){
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void seven(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
digitalWrite(segPt, LOW);
}
//=============================================//
void eight(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void nine(){
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
digitalWrite(segPt, LOW);
}
//=============================================//
void point(){
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
digitalWrite(segPt, HIGH);
}
//=============================================//
void none(){
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
digitalWrite(segPt, LOW);
}

Схема подключения:

Обозначения сегментов на дисплеее

Результат будет похож на такой:

На практике этот дисплей применяется очень редко, поскольку занимает почти все выходы ардуино. Удобнее использовать аналогичный дисплей, занимающий только 4 контакта на ардуино:

Вопросы и ответы в комментариях к видео.

13. Шаговый двигатель 28BYJ-48

Скетч тут
// 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] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

//////////////////////////////////////////////////////////////////////////////
void setup() {
//declare the motor pins as outputs
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////////////
void loop(){
if(count < countsperrev )
clockwise();
else if (count == countsperrev * 2)
count = 0;
else
anticlockwise();
count++;
}

//////////////////////////////////////////////////////////////////////////////
//set pins to ULN2003 high in sequence from 1 to 4
//delay «motorSpeed» between each pin setting (to determine speed)
void anticlockwise()
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}

void clockwise()
{
for(int i = 7; i >= 0; i--)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}

void setOutput(int out)
{
digitalWrite(motorPin1, bitRead(lookup[out], 0));
digitalWrite(motorPin2, bitRead(lookup[out], 1));
digitalWrite(motorPin3, bitRead(lookup[out], 2));
digitalWrite(motorPin4, bitRead(lookup[out], 3));
}


Схема подключения:
5V+ connect to +5V
5V- connect to 0V (Ground)
IN1: to Arduino digital input pin 8
IN2: to Arduino digital input pin 9
IN3: to Arduino digital input pin 10
IN4: to Arduino digital input pin 11
Результат такой:

Вопросы и ответы в комментариях к видео.

14. Джойстик

Скетч для джойстика
/*
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 <people.interaction-ivrea.it/m.rinott>

#include <Servo.h>

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
}

Схема подключения:

Результат получится примерно такой:

Вопросы и ответы в комментариях к видео.

15. Датчик звука

Скетч тут
/*
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 < 600)
{
delay(250); //ожидаем 250 милисекунд для повторного хлопка
for(int t=0; t<=500; t++)
{
delay(1);
Count=analogRead(4); //считываем значение
if(Count > 200 && Count < 600)
{
Relay=!Relay; //меняем состояние реле
break; //Выходим из цикла после второго хопка
delay(200); //Пауза
}
}
}
digitalWrite(3,Relay);
}

Схема хлопкового выключателя:

Должно получиться примерно так:

Вопросы и ответы в комментариях к видео.

16. Модуль часов DS1302

Библиотеку можно скачать тут
Скетч из библиотеки
// DS1302_Serial_Easy ©2010 Henning Karlsen
// web: www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1302-library to
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302: CE pin -> Arduino Digital 2
// I/O pin -> Arduino Digital 3
// SCLK pin -> Arduino Digital 4

#include <DS1302.h>

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

void loop()
{
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");

// Send date
Serial.print(rtc.getDateStr());
Serial.print(" — ");

// Send time
Serial.println(rtc.getTimeStr());

// Wait one second before repeating :)
delay (1000);
}

Схема подключения:

Результат должен получиться примерно такой:

Вопросы и ответы в комментариях к видео

17. Датчик уровня жидкости
Спецификации:
имя продукта: датчик уровня воды
рабочее напряжение: dc3-5v
рабочий ток: менее 20 мА
тип датчика: аналоговый
Датчик очень простой. Принцип работы из видео понять не сложно и без знания англ. яз.

Скетч стандартный AnalogRead
/*
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
}

Схема подключения:

Результат должен получиться примерно такой:


18. Матрица 8x8
Видео по подключению на итальянском языке. Данную матрицу очень редко используют в проектах на ардуино поскольку она занимает 16 выходов ардуино. Вместо нее часто используют аналогичную матрицу MAX7219, занимающую только 5 контактов ардуино.


Скетч тут
// Show messages scrolling from right to left.
#include <FrequencyTimer2.h>

#define SPACE { \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}

#define E { \
{0, 1, 1, 1, 1, 1, 1, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 1, 1, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 1, 1, 0} \
}

#define G { \
{0, 1, 1, 1, 1, 1, 1, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 1, 1}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 1, 1, 1, 1, 1, 0} \
}

#define H { \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 1, 1, 1, 1, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0} \
}

#define K { \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 1, 0, 0, 0}, \
{0, 1, 1, 1, 0, 0, 0, 0}, \
{0, 1, 0, 1, 0, 0, 0, 0}, \
{0, 1, 0, 0, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0} \
}

#define L { \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 1, 1, 0} \
}

#define O { \
{0, 0, 0, 1, 1, 0, 0, 0}, \
{0, 0, 1, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 1, 0, 0, 0, 0, 1, 0}, \
{0, 0, 1, 0, 0, 1, 0, 0}, \
{0, 0, 0, 1, 1, 0, 0, 0} \
}

byte col=0;
byte leds[8][8];

int pins[17]={-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
int cols[8] ={pins[13], pins[3], pins[4], pins[10], pins[06], pins[11], pins[15], pins[16]};
int rows[8] ={pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};

const int numPatterns=10;
byte patterns[numPatterns][8][8]={H,E,L,L,O,SPACE,G,K,L,SPACE};
int pattern=0;

void setup()
{
for (int i=1; i<=16; i++) {pinMode(pins[i], OUTPUT);}
for (int i=1; i<=8; i++) {digitalWrite(cols[i-1], LOW);}
for (int i=1; i<=8; i++) {digitalWrite(rows[i-1], LOW);}

clearLeds();

FrequencyTimer2::disable();
FrequencyTimer2::setPeriod(2000); // sets refresh rate
FrequencyTimer2::setOnOverflow(display);
setPattern(pattern);
}

void loop()
{
pattern=++pattern%numPatterns;
slidePattern(pattern, 60);
}

void clearLeds() {
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) {leds[i][j]=0;}
}
}

void setPattern(int pattern) {
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) {leds[i][j] = patterns[pattern][i][j];}
}
}

void slidePattern(int pattern, int del) {
for (int l=0; l<8; l++) {
for (int i=0; i<7; i++) {
for (int j=0; j<8; j++) {leds[j][i] = leds[j][i+1];}
}
for (int j=0; j<8; j++) {leds[j][7] = patterns[pattern][j][0 + l];}
delay(del);
}
}

void display() {
digitalWrite(cols[col], LOW);
col++;
if (col==8) {col=0;}
for (int row=0; row<8; row++) {
if (leds[col][7-row]==1) {digitalWrite(rows[row], LOW);}
else {digitalWrite(rows[row], HIGH);}
}
digitalWrite(cols[col], HIGH);}


Схема подключения:

Результат должен получиться примерно такой:


19. RFID-считыватель RC522

Библиотеку можно скачать тут
Скетч Dumpinfo из библиотеки
/*
* — * 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
*/

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

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

Схема подключения:

Результат должен быть примерно таким:

Вопросы и ответы по занятию в комментариях к видео.

20. Дисплей 16x2

Библиотеку LiquidCrystal_I2C можно скачать здесь
Скетч I2C Scanner
// — // 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.
//

#include <Wire.h>


void setup()
{
Wire.begin();

Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}


void loop()
{
byte error, address;
int nDevices;

Serial.println(«Scanning...»);

nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print(«I2C device found at address 0x»);
if (address<16)
Serial.print(«0»);
Serial.print(address,HEX);
Serial.println(" !");

nDevices++;
}
else if (error==4)
{
Serial.print(«Unknow error at address 0x»);
if (address<16)
Serial.print(«0»);
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println(«No I2C devices found\n»);
else
Serial.println(«done\n»);

delay(5000); // wait 5 seconds for next scan
}

Схема подключения:

Должно получиться примерно так:

Вопросы и ответы по занятию в комментариях к видео

Комбинируя эти 20 занятий между собой можно получить еще 190 (20*19/2) различных занятий. Например совместив занятие про реле с занятием по ИК приемнику можно собрать устройство, которое управляет нагрузкой с пульта ДУ от телевизора. Ученику в этом случае придется не только подключить два элемента к ардуино и написать скетч, чтобы они совместно работали, но и самому придумать возможное назначение таких устройств. Поэтому эти 190 заданий можно считать творческими.

Занятия 21-40. Проекты.

21. Беспилотная машинка

Скетч
#define Trig 8
#define Echo 9
#include <Servo.h>

Servo servo;

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 ehat_priamo(){

digitalWrite(in11, LOW);
digitalWrite(in12, HIGH);

digitalWrite(in13, LOW);
digitalWrite(in14, HIGH);

digitalWrite(in21, LOW);
digitalWrite(in22, HIGH);

digitalWrite(in23, HIGH);
digitalWrite(in24, LOW);
}

void ehat_vpravo()
{

digitalWrite(in21, LOW);
digitalWrite(in22, HIGH);

digitalWrite(in23, HIGH);
digitalWrite(in24, LOW);
}

void ehat_vlevo(){

digitalWrite(in21, HIGH);
digitalWrite(in22, LOW);

digitalWrite(in23, LOW);
digitalWrite(in24, HIGH);

}

void stoiat(){ // стоять
digitalWrite(in11, LOW);
digitalWrite(in12, LOW);

digitalWrite(in13, LOW);
digitalWrite(in14, LOW);

digitalWrite(in21, LOW);
digitalWrite(in22, LOW);

digitalWrite(in23, LOW);
digitalWrite(in24, LOW);
}

void kak_meriat_sleva(){
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
vremia = pulseIn(Echo, HIGH);
smotrim_vlevo = vremia/58;
}

void kak_meriat_priamo(){
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
vremia = pulseIn(Echo, HIGH);
smotrim_priamo = vremia/58;
}

void kak_meriat_sprava(){
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
vremia = pulseIn(Echo, HIGH);
smotrim_vpravo = vremia/58;
}

void loop(){
kak_meriat_priamo();
if(smotrim_priamo<30){
stoiat();
delay(100);
for(ugol=90;ugol>=10;ugol--){
servo.write(ugol);
delay(5);
}

kak_meriat_sprava();
delay(100);
for(ugol=10;ugol<=170;ugol++){
servo.write(ugol);
delay(5);
}

kak_meriat_sleva();
delay(100);
for(ugol=170;ugol>=90;ugol--){
servo.write(ugol);
delay(5);
}

if(smotrim_vpravo < smotrim_vlevo){


ehat_vpravo();
delay(400);
stoiat();
}

else{

ehat_vlevo();
delay(400);
stoiat();
}

}

else{
ehat_priamo();
}
}

Список деталей, необходимых помимо стартового набора ардуино

Схема для 2WD шасси. 4WD подключается аналогично.

Должно получиться так:

Вопросы и ответы в комментариях к видео

22. Машинка, управляемая со смартфона

Скетч тут
int val;
int LED = 13;
int LED2 = 11;
int LED3 = 12;

#include <AFMotor.h> // Подключаем библиотеку для работы с шилдом
#include <Servo.h> // Подключаем библиотеку для работы с сервоприводами, можно не подключать

// Подключаем моторы к клеммникам M1, M2, M3, M4
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

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

Serial.begin(9600);

}
int i;

void loop()
{
if (Serial.available())
{
val = Serial.read();

if (val == '5') // При нажатии клавиши «5»
{digitalWrite(LED, HIGH);}
if (val == '6') // При нажатии клавиши «6»
{digitalWrite(LED,LOW );}
if (val == 'Y') // При нажатии клавиши «7»
{digitalWrite(LED2,HIGH );}
if (val == 'B') // При нажатии клавиши «8»
{digitalWrite(LED3,HIGH );}

// Задаём движение вперёд
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 притянуты к минусу, моторы не работают

digitalWrite(LED2,LOW );
digitalWrite(LED3,LOW );
}
}
}

Детали, необходимые помимо стартового набора ардуино

Схема подключения:

Должно получиться так:

Вопросы и ответы в комментариях к видео

23. Робот-пылесос

Управление роботом-пылесосом осуществляется при помощи Android смартфона, с установленным приложением RobotC, которое написано в AppInventor.
Для соединения с роботом надо нажать кнопку «Подключить» и выбрать из списка сопряженный со смартфоном, Bluetooth модуль робота-пылесоса.
В приложении есть кнопки управления: вперед, назад, влево, вправо, стоп, по квадратной спирали, хаотичное движение и одна зарезервирована. При нажатии на кнопку, смартфон посылает определенный символ Bluetooth модулю пылесоса, модуль передает этот символ Arduino и в зависимости от того, какой символ был получен, робот-пылесос выполняет те действия, которые запрограммированы в Arduino.
В режиме «Спираль» робот-пылесос двигается по квадратной спирали, пока не упрется в препятствие и тогда переключается в режим «Хаос».
В режиме «Хаос» пылесос двигается от препятствия к препятствию и поворачивает на рандомный угол.
В ручном режиме робот-пылесос полностью подчиняется вашим командам, которые вы отправляете ему со смартфона.
Скетч тут
#define mot_ena 9 //пин ШИМа левого мотора
#define mot_in1 8 //пин левого мотора
#define mot_in2 7 //пин левого мотора
#define mot_in3 6 //пин правого мотора
#define mot_in4 4 //пин правого мотора
#define mot_enb 10 //пин ШИМа правого мотора

#define ir_1 A0 //пин 1 ИК-датчика
#define ir_2 A1 //пин 2 ИК-датчика
#define ir_3 A2 //пин 3 ИК-датчика
#define ir_4 A3 //пин 4 ИК-датчика
#define ir_5 A4 //пин 5 ИК-датчика
#define ir_6 A5 //пин 6 ИК-датчика

#define lev_vik 11 //пин левого выключателя
#define pra_vik 12 //пин правого выключателя

//для выравнивания скорости колес
byte max_skor_lev = 254;
byte max_skor_prav = 244;
//---------------------------------

byte min_skor = 0;

void setup() {

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

ROB_VPERED();
}

void loop() {

// если срабатывает левый выключатель на бампере
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);
}
//--------------------------------

Список деталей, необходимых помимо стартового набора ардуино

Схема подключения:

Должно получиться примерно так:

Вопросы и ответы в комментариях к видео или лично автору.

24. Робот-паук (гексапод)

Детали, необходимые помимо стартового набора ардуино
Корпус гексапода
сервомоторы
шилд для сервомоторов
аккумуляторы и беспроводные интерфейсы управления-по вкусу

Тестовый скетч на 1 сервомотор
#include <Wire.h>
#include <Multiservo.h>

Multiservo myservo;

int pos = 0;

void setup(void)
{
Wire.begin();
myservo.attach(17);
}

void loop(void)
{
for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}

Схема подключения в данном проекте вполне свободная, поскольку финального скетча проекта автор не опубликовал.



Результат такой:


Более подробное описание проекта тут.
Вопросы и ответы по проекту в комментариях к видео

На данный момент идет поиск и отбор материалов к занятиям 25-40. Ссылки на русскоязычные видеоуроки с интересными проектами на ардуино можно оставлять в комментариях к статье.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 28

    0
    Сам смотрел туториалы этого парня, все вроде хорошо и понятно расписано, как у вас с копирайтом?
      0
      Кто-то должен был собрать всё это воедино.
      0
      Скажите, пожалуйста, будет ли текстовая версия?
        0
        вряд ли она нужна. в большинстве тем видео можно и не смотреть. есть схема и есть скетч, в котором содержатся подробные комментарии
        +2
        Интересно, будет ли хоть один такой курс, посвященный чему-то сложнее, чем сборке конструктора?
        Весьма интересный материал для размышлений:
        из детей создают потребителей конструкторов
          +2
          «Измерительный прибор он сам собирает, блок питания под устройство он сам собирает. В процессе сборки всех этих устройств он изучает физику, электротехнику, электронику, металлообработку, обработку дерева, материаловедение.»

          Да этому человеку, похоже, все равно: интересно ребенку или нет. Предлагаю ему пойти и вывести законы Ньютона из теории струн, заодно он выучит квантовую физику, ОТО, солидную часть космологии и чуток топологии.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Я сам с удовольствием научусь всей этой хардварной хрени если будет время. Но у ребенка должно быть детство а не советский лагерь. Если у вас лично появилось желание поднимать страну с колен за счет ваших детей — вперед. Это очень приветствовалось лет 30 назад.
              С другой стороны, если ребенок хочет этим всем заниматься — пожалуйста, но гораздо интереснее ходить в авиакружок чтобы стать пилотом, чем в кружок мастера на все руки чтобы стать сантехником.

              Касаемо названия — инженер, слесарь и плотник — это тоже не электронщик.

              Относительно качества конкретно этих уроков я ничего не комментировал. Но по собственному опыту могу сказать, что Arduino Starter Kit я нашел вполне занятной штукой. И да, там нашли место для закона Ома и даже для законов Кирхгофа.

              Наконец, я ничего не говорил о руде, вилках и 3Д ручках. Я построил вполне уместную аналогию пытаясь сделать акцент на частой ошибке учить «от фундаментального к частному» вместо «от простого к сложному». Для теоретических дисциплин эта ошибка приводит к полной апатии к предмету учебы, а в практических — к отсутствию пальцев и инвалидности. Спорить здесь не о чем.
                0
                А потом как в анекдоте "… ну и ты, конечно же, спела?..." Какая связь между авиакружком и пилотом? Авиакружок — это в нынешние времена тот же «конструктор». В авиакружке ребенок не получит фундаментальных знаний, у него по определению любой предмет сможет летать — просто потому что"… может и всё", максимум — "… потому что есть крылья или пропеллер..." Про аэродинамику, подъемную силу ему там никто ничего не будет разжевывать. Нынешние кружки — это просто способ делать деньги (на детях), просто «бЫзнИс». Пилотом такой ребенок не станет, максимум — «оператор дрона». Ребенка НУЖНО заставлять уметь делать что то руками, иначе кроме ковыряния в носу никаких иных способностей у него не появится
              0
              МНЕ все, что вы перечислили, напоминает «скачки по верхушкам». Что не хорошо! А факт того, что ребенок «собрал» эл термометр, так медведь тоже катается на велосипнде и что, обгонит человека?

              И вообще, ардуино, это путь в поиски по инету написанных кем то библиотек, без которых мишка ну НИКАК никуда не поедет. Чем был плох классический путь программирования? Ничего кроме даташитов от производителя не надо, все остальное зависит от задачи. Так нет, давайте введем загрузчик в контроллер и «облегчим» «деткам» путь в… «благими намерениями вымощена дорога в ....»
              0
              В детстве (в Советское время) я ходил в кружок микроэлектроники и там было обучение именно как описали в статье (по ссылке из комментария). Мне дали шариковую ручку и напильник, схемы не паяли, а скручивали https://geektimes.ru/post/258798/
              Потом показали микросхемы ЛА3 и ЛА7, рассказали про логику, объяснили как можно заменить микросхемы транзисторами. Первоначально был сбор стандартных игрушек (светофор, тряпкобол и др.), которые надо было не только скрутить, но и собрать физически. Затем каждый собирал что захочет из множества устройств, часто без документации. Мой товарищ собирал осциллограф. Мне электроника не понятна совсем, последнее, что я сделал в кружке — это написал программу для управления двумя шаговыми двигателями. Прибор для накрутки трансформаторов, в котором стояли эти двигатели собирали другие дети. Не знаю насколько интересны кружки сейчас, тогда мне было очень интересно.
              Именно поэтому мне интересно есть ли лекции текстом. В идеале мне бы машинку с вебкамерой и другими датчиками, которой можно управлять по wi-fi с ПК. То есть самому писать программу на нее. Пока я нахожу только варианты машинок, которые управляются виртуальным джойстиком с андройд смартфона.
                0
                Все ведь есть, надо только соединить ) ведь управление с андройда по WiFi или Bluetooth. Берете вариант с WiFi и допиливаете )
                +1
                Полностью согласен с автором материала. Сам веду кружок робототехники и вижу всю эту кухню изнутри. Особенно печалят соревнования… Та же беготня по линии решается проще и эффективней вообще без микроконтроллера, но по условиям только лего… В целом же создается впечатление, что стоит задача не научить проектировать роботов, а тупо обслуживать то, что сделал «большой белый босс».
                Например в прошлом году принимали участие в масштабном конкурсе (не стану уж говорить название): многие участники не смогли объяснить как работает сервопривод (ответили — мы программисты и не должны все знать) и даже что они на этот сервопривод подают (ну вот есть библиотека, она все считает). Критерии оценки тоже были рассчитаны под конкретный подход и алгоритм, спасибо адекватному судье, предложившему модифицировать критерии, иначе быть нашей команде на последнем месте. Ну и так далее.
                Я не сторонник выпиливания шестеренок напильником из консервной банки, но считаю что дети хотя бы в общих чертах должны понимать, что они делают и как взаимодействуют все части робота — программная, электронная и механическая. А для этого надо бы дать им возможность и ЛА3 попаять, и редуктор самостоятельно из деталек собрать.
                  0
                  Так беда-то не с конструкторами, а с неумением вести иерархическую систему развития? Ну вот придёт к автору статьи ребёнок 5-8 лет и что? Думаете он будет сидеть и пыхтеть над каким-то чертежом? Да фиг вы среднего ребёнка заинтересуете такой фигнёй (не говоря уже о том, что навыка черчения у них нет и им это будет тяжело). Так что для 5-8 лет нужны конструкторы. И даже в 10-12 конструкторы для знакомства сойдут.

                  А автор статьи — кг/ам, ибо почему-то форсит «5 секунд и всё», но это же наглая ложь и передёргивание — хорошую модель на констукторе, даже на лего, ребёнок будет собирать и час и больше!
                  И при этом даже там есть простор для фантазии! И даже там есть место азам сопромата и механики… «этот узел хорошо держится, а этот разваливается, ибо такое соединение не устойчиво, а вот такое — вообще только на клей садить»…
                  Я уже молчу про прототипирование с помощью 3d принтеров!

                  Реально должна быть претензия — что дальше ничего нет. Вот в эту нишу он со своей школой может влезть. Другие школы с другими подходами тоже туда могут влезть. А вот базовые в эту нишу без смены подходов не пролезут. Т.к. их подход не рассчитан на долгое взаимодействие с ребёнком, на его глубокое погружение в тему. И проблема-то не констукторы, не эти базовые уроки (которыми можно заинтересовать и подогревать интерес при правильном подходе!), а отсутствие толковых преподавателей и курсов!

                  Ну и по конкурсам — я точно видел более сложные конкурсы (то же робосумо). Будет больше «школ», с глубоким погружением — будет больше продвинутых конкурсов. А пока они не нужны, а вот конкурсы с простой линией нужны. Чтобы поддерживать интерес детей, чтобы школам зарабатывать сертификаты. Обычный обыденный entertaiment. Обычный бизнес.

                  PS ну и не забывайте — сейчас заинтересованность в инженерных кадрах низкая. Точнее низкая заинтересованность в их выращивании. Готовые — нужны, а вот возиться и выращивать никто не готов. Организации-потребители кадров с ходу не потянут, а государство давно и прочно положило болт на качественное образование (зато уроки религии ввели!).
                    0
                    Реально должна быть претензия — что дальше ничего нет. Вот в эту нишу он со своей школой может влезть. Другие школы с другими подходами тоже туда могут влезть. А вот базовые в эту нишу без смены подходов не пролезут. Т.к. их подход не рассчитан на долгое взаимодействие с ребёнком, на его глубокое погружение в тему. И проблема-то не констукторы, не эти базовые уроки (которыми можно заинтересовать и подогревать интерес при правильном подходе!), а отсутствие толковых преподавателей и курсов!


                    В принципе согласен. Но есть и еще момент — конструкторы (те, что наиболее распиарены для занятий робототехникой) приучают, что за 30-45 минут ребенок получает готовый результат, и как результат — fun с эндорфинами. В результате, если стоит задача сделать что-то сложное за 3-4 занятия, многие «сливаются». В принципе, как по мне, это нормально, если из 15 останется 2-3 ребенка готовых идти дальше прикольной фигни по инструкции. Но вот руководство со мной тут не согласно :) Но это уже совсем другая тема.

                    Точнее низкая заинтересованность в их выращивании.

                    Причем в первую очередь именно со стороны этих «кадров» и их родителей. Около половины родителей приводят своих чад со словами: «В спорте у нас не получилось, может у вас получится.» Еще половина со словами: «Он так любит лего!». Ну и только у тех самых 2-3 есть мотивация заниматься именно роботами, электроникой и физикой.
                      0
                      Грамотный преподаватель вполне может разбить сложное на несколько коротких этапов, каждый из которых имеет видимый результат.
                        0
                        «Он так любит лего» — вполне неплохая аргументация. Остаётся только вопрос — удастся ли заинтересовать областями «цепляется к лего», «аналоги, из которых тоже можно ого-го!».

                        Проблема в том, что тот же железный конструктор — вещь! НО! Он требует большего количества навыков, более требователен к фантазии и пространственным навыкам (фантазия, память, ...). А ещё он нифига не красочный и из него сложно делать «монолитные» конструкции (получаются-то, если не мастылить какие-нибудь плоскости вручную, каркасы!). Но ведь если заинтересовать, то возможностей у него никак не меньше, чем у Лего Техникс, при этом крепление деталей всё-таки надёжней. НО! металлические констукторы почти не содержат плоскостей (был очень удивлён, что их вообще начали класть!) и в лучшем случае раскрашен в 2-3 цвета. А где дидактические материалы (схемы) каких-нибудь красочных моделей? Где тот же «Сокол тысячелетия» или игровой набор (лего делает игровые наборы!) из металлического констуктора? Где «Металлический консктор Movie» на ютубе («Lego citi movie» — есть)? Получается нужно самостоятельно заинтересовать — а вот это мало кто умеет (если со своим ребёнком — ещё как-то можно попытаться, то чужие — гораздо тяжелее).

                        Вот и касательно робототехники та же петрушка получается — есть «Ну и только у тех самых 2-3 есть мотивация заниматься именно роботами, электроникой и физикой.» и есть остальные — которых надо заинтересовать. Которым! нужно! подавать материал частями, а разработку первых моделей разбивать на короткие период-модули (в пределах академического часа для средних школьников, и минут 20-30 для младших и дошкольников, старшие школьники могут и полный час и академическую пару просидеть за раз), которые будут самостоятельной подсистемой (которую можно потыкать в конце урока) разрабатываемого робота.
                        Например:
                        1. Делаем шасси (движок + управление кнопками + колёса — всё в одном корпусе)
                        2. УЗ-дальномер с выводом данных в отладчик + корпус
                        3. Собираем корпус с УЗ дальномером, шасси и подключаем простейшее управление на контроллер
                        4. Делаем продвинутое управление (например пультом ДУ)
                        5. Делаем «самоуправление»
                        При правильной подаче дети же будут пищать от восторга и не потеряют интерес!
                          0
                          Железный конструктор это действительно тема. И дети нормально его воспринимают — конструкция выглядит брутально-железной, типа реально робот. Но у него есть главный недостаток — железо таки проводник… Только отвернешься к одним — другие уже подрубили питание и привет ардуинке.

                          Материал частями и модулями это понятно. Когда делаем что-то типовое, то это проходит. Но когда ставится задача сделать что-то новое, не по инструкции, не проработанную заранее лабу, то именно тут и сдуваются. Проработать конструкцию шасси, сделать упрощенную механическую модель, прикинуть какие двигатели и реле подойдут по току, какой аккумулятор поставить — все это требует больше, чем одно занятие и в конце в лучшем случае будет эскиз, модель, какая-то часть, а в худшем станет ясно, что идея была ошибочная и надо начинать все сначала.

                          Но, еще раз, я считаю, что 2-3 ребенка из 15, способных что-то создавать самостоятельно — это нормально. Как бы цинично не звучало, помимо инженеров в экономике востребованы и операторы и ремонтники, причем в гораздо больших количествах. Обидно именно за этих 2-3 которые не могут участвовать в соревнованиях из-за ограничений «только лего» и ходят под угрозой дисквалификации на других соревнованиях из-за нестандартного подхода к решению задачи.
                            0
                            > Только отвернешься к одним — другие уже подрубили питание и привет ардуинке.

                            Так можно же провода в каком-нибудь канале пускать, который будет сложно подрубить…

                            > Но когда ставится задача сделать что-то новое, не по инструкции, не проработанную заранее лабу, то именно тут и сдуваются.

                            Потому что у детей квалификации не хватает… Имхо им просто помочь надо и дальше они уже сами будут разбираться

                            > Но, еще раз, я считаю, что 2-3 ребенка из 15, способных что-то создавать самостоятельно — это нормально.

                            Нормально, но можно добиться и 6-8. И такой рейт никакую экономику не сломает — просто будет больше грамотных специалистов в смежных областях

                            > Обидно именно за этих 2-3 которые не могут участвовать в соревнованиях из-за ограничений «только лего» и ходят под угрозой дисквалификации на других соревнованиях из-за нестандартного подхода к решению задачи.

                            Во-первых есть «взрослые» соревнования, где они могут поучаствовать.
                            Во-вторых нужно, чтобы они стали более массовым продуком (тогда и под них появятся соревнования).
                            В-третьих можно организовать соревнования самостоятельно. Посмотрите на JUG в СПб — смогли же организовать конференцию, на которую собираются спикеры с мировыми именами! (а потом и в Москве повторили результат)… И это не всё JUG делало, а всего лишь некоторое количество заинтересованных в результате участников. И они теперь на этом зарабатывают.
                    0
                    Простой стартовый набор, да? Когда я покупал стартовый набор от ардуино там не было ИК приемника, реле, сегментных дисплеев и индикаторов, шаговых двигателей, датчиков звука (если только не имеется ввиду пьезоэлемент), светодиодных матриц и RFID считывателей.
                      +1
                      В россии что ли покупали? У дешевых китайских наборов это все есть.
                        0
                        Я купил оригинальный Arduino Starter Kit, в общем-то, из-за книжки. Если интересно — доставляли из Венгрии. Нет, не в Россию.
                        0
                        Хм… я вот не стал запариваться и купил у наших соседей:
                        http://www.aliexpress.com/item/Starter-Kit-for-Arduino-UNO-R3-kit-Upgraded-Version-Learning-Suite-Kit/32541409645.html

                        Имхо набор, в котором меньше всяких плюшек не стоит рассмотрения (если не берётся под определённую задачу, но о каком starter kit в таком случае может идти речь — я не знаю).
                          0
                          Я знаю, там замечательные наборы бывают. Но они не очень подходят для обучения: куча уже готовых устройств которые можно подключить только к ардуине. Сценариев использования, скажем, RFID совсем немного. Starter kit, все-таки, фокусируется на азах: как правильно подключить светодиод, аналоговый датчик температуры, мотор или другую нагрузку. Как из дерьма и палок сделать тач сенсор. Как из всего этого соорудить умный вентилятор. Скажем так, больший акцент делается на аналоговой составляющей нежели на цифровой.
                            0
                            Ну подключить большинство можно к чему угодно, они управляются по SPI/I2C/…
                            А для обучения конечно нужно закупать целенаправленно то что надо.
                        0
                        Вроде и все классно, но вызывает грусть и печаль.
                        Как-то общался с создателями квестов (я хотел себе подработку). Так вот, когда меня спросили как бы я определил наличие светового луча, то мое объяснение про получение нормированного сигнала с выставленным логическим уровнем не поняли, вместо это рассказали мне про фоторезистор и АЦП…
                          +1
                          25 долларов вполне адекватные деньги за набор, если учесть, что набор lego mindstorms стоит в 10 раз дороже
                            0
                            У вас там в 12 пункте резистор взрывается, так и задумано ?( https://habrastorage.org/files/05a/6fe/2f5/05a6fe2f5b
                            6642a1a16f21750fceb0ce.gif )

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое