Часть 1. Методика.
Итак, начнем с того, что же такое интерактивность, почему она важна и как достигается в рамках данного курса.
Инетерактивный метод обучения предполагает взаимодействие учеников не только с учителем но и между собой. Подробнее можно почитать в Википедии
Важность использования интерактивного метода заключается в том, что он эффективнее пассивного метода обучения. Этот факт является общепризнанным, как и тот факт что увеличение интерактивности увеличивает и эффективность процесса образования. Более подробно об этом можно узнать
В этом видео приводится пример, когда преподаватель использует пассивный метод обучения, и этот метод настолько неэффективен, что преподавателя предлагают заменить на видеозапись его же лекции.
Обеспечение коммуникации между учителем и учеником а также между учениками в рамках данного курса реализовано за счет функционала двух соцсетей: Вконтакте и Youtube. В рамках обеих соцсетей возможно вести публичную беседу, отправлять личные сообщения и получать оповещения об ответе на интересующий вопрос.
Источник: TNS
Часть 2. Структура курса.
Данный курс рассчитан на один учебный год, состоит из 40 занятий (по одному занятию в неделю).
В первой половине курса (20 занятий) даются общие знания о платформе ардуино, ее функциях, возможностях, разбираются простые примеры и принципы ее работы. Также приводятся примеры работы с периферией (датчиками, системами ввода и вывода информации, исполнительными устройствами). Важно, что для прохождения первых 20 занятий достаточно одного стартового набора ардуино, который можно купить в любом китайском интернет-магазине, не переплачивая за бренд на упаковке.
Каждое занятие курса базируется на видеоуроке, содержит краткое текстовое описание занятия, все необходимые схемы и скетчи. При возникновение сложностей при выполнение задания предлагается обращаться с вопросом к автору видеоурока в комментариях к видео, либо найти там же нужный ответ, если вопрос поднимался ранее другими учениками. Всегда есть возможность спросить также у других учеников, оставивших комментарии к видео ранее. Лучше для этого подходит Youtube, но также можно использовать Vk, с поправкой на то, что обращение напрямую к автору видеоурока в Vk может быть ограничена.
Во второй половине курса (занятия с 21 по 40) делается акцент на проектной работе. Занятия также построены на основе видеоуроков. В начале занятия дается список материалов, деталей и оборудования, которое необходимо помимо стартового набора ардуино. Вводная часть закончилась, переходим непосредственно к курсу.
Интерактивный курс по ардуино
Цену можно узнать тут. В комплекте обычно нет батарейки, но вместо нее можно использовать блок питания (иногда подходят блоки питания от модемов, роутеров, тв-приставок)
Смотрим первый видеоурок:
Скачать среду разработки можно с официального сайта ардуино
Инструкция по установке драйвера для китайской ардуино тут
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
}
Также скетч можно найти здесь:
Результат должен получиться такой:
Результатами прохождения задания можно поделиться в группе Вконтакте. Там же можно оставить вопрос по заданию.
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);
}
}
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);
}
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);
}
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);
}
Должно получиться так:
О результатах и вопросах по прохождению занятия можно написать в соответствующей теме в группе вконтакте.
Попробуйте сделать самостоятельно так:
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.
}
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). Тема разработки и создания источников питания обычно не входит в курсы по ардуино, поэтому окончание второго видео носит больше ознакомительный характер.
Дополнительное задание: сделать как показано тут:
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);
}?
Схема подключения:
принцип работы фоторезистора:
Результат должен получиться примерно такой:
Задавайте свои вопросы и получайте на них ответы в комментариях к видео.
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);
}
Схема:
Результат такой:
Вопросы и ответы как обычно в комментариях к видео
#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); // небольшой перерыв чтобы он успел передвинуться
}
}
Схема:
Результат должен получиться примерно такой:
Вопросы и ответы по занятию как обычно к комментариях к видео
//вход ик приёмника к А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 будут показываться коды кнопок вашего пульта ДУ так:
Вопросы и ответы как обычно в комментариях к видео
Библиотека для датчика здесь
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()
Схема подключения:
Результат должен получиться таким:
Вопросы и ответы по заданию как обычно в комментариях к видео.
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);
}
Схема подключения
Результат должен получиться такой:
Вопросы и ответы как обычно в комментариях к видео
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
}
Схема подключения:
Принцип работы реле:
Демонстрация работы реле:
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();
}
}
Схема подключения:
Результат должен получиться такой:
Вопросы и ответы как обычно в комментариях к видео
И поместим туда значения от 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 контакта на ардуино:
Вопросы и ответы в комментариях к видео.
// 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
Результат такой:
Вопросы и ответы в комментариях к видео.
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
}
// 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
}
Схема подключения:
Результат получится примерно такой:
Вопросы и ответы в комментариях к видео.
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 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);
}
Схема хлопкового выключателя:
Должно получиться примерно так:
Вопросы и ответы в комментариях к видео.
Библиотеку можно скачать тут
// 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);
}
Схема подключения:
Результат должен получиться примерно такой:
Вопросы и ответы в комментариях к видео
имя продукта: датчик уровня воды
рабочее напряжение: dc3-5v
рабочий ток: менее 20 мА
тип датчика: аналоговый
Датчик очень простой. Принцип работы из видео понять не сложно и без знания англ. яз.
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
}
Схема подключения:
Результат должен получиться примерно такой:
#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);}
Схема подключения:
Результат должен получиться примерно такой:
Библиотеку можно скачать тут
* — * 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));
}
Схема подключения:
Результат должен быть примерно таким:
Вопросы и ответы по занятию в комментариях к видео.
Библиотеку LiquidCrystal_I2C можно скачать здесь
//
// 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. Проекты.
#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 подключается аналогично.
Должно получиться так:
Вопросы и ответы в комментариях к видео
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 );
}
}
}
Схема подключения:
Должно получиться так:
Вопросы и ответы в комментариях к видео
Управление роботом-пылесосом осуществляется при помощи Android смартфона, с установленным приложением RobotC, которое написано в AppInventor.
Для соединения с роботом надо нажать кнопку «Подключить» и выбрать из списка сопряженный со смартфоном, Bluetooth модуль робота-пылесоса.
В приложении есть кнопки управления: вперед, назад, влево, вправо, стоп, по квадратной спирали, хаотичное движение и одна зарезервирована. При нажатии на кнопку, смартфон посылает определенный символ Bluetooth модулю пылесоса, модуль передает этот символ Arduino и в зависимости от того, какой символ был получен, робот-пылесос выполняет те действия, которые запрограммированы в Arduino.
В режиме «Спираль» робот-пылесос двигается по квадратной спирали, пока не упрется в препятствие и тогда переключается в режим «Хаос».
В режиме «Хаос» пылесос двигается от препятствия к препятствию и поворачивает на рандомный угол.
В ручном режиме робот-пылесос полностью подчиняется вашим командам, которые вы отправляете ему со смартфона.
#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);
}
//--------------------------------
Схема подключения:
Должно получиться примерно так:
Вопросы и ответы в комментариях к видео или лично автору.
сервомоторы
шилд для сервомоторов
аккумуляторы и беспроводные интерфейсы управления-по вкусу
#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. Ссылки на русскоязычные видеоуроки с интересными проектами на ардуино можно оставлять в комментариях к статье.
Комментарии (25)
azsx
06.09.2016 12:42Скажите, пожалуйста, будет ли текстовая версия?
malyazin_2010
07.09.2016 09:31вряд ли она нужна. в большинстве тем видео можно и не смотреть. есть схема и есть скетч, в котором содержатся подробные комментарии
serafims
06.09.2016 13:02+2Интересно, будет ли хоть один такой курс, посвященный чему-то сложнее, чем сборке конструктора?
Весьма интересный материал для размышлений:
из детей создают потребителей конструкторовgeisha
06.09.2016 13:12+2«Измерительный прибор он сам собирает, блок питания под устройство он сам собирает. В процессе сборки всех этих устройств он изучает физику, электротехнику, электронику, металлообработку, обработку дерева, материаловедение.»
Да этому человеку, похоже, все равно: интересно ребенку или нет. Предлагаю ему пойти и вывести законы Ньютона из теории струн, заодно он выучит квантовую физику, ОТО, солидную часть космологии и чуток топологии.kanne
06.09.2016 15:23в статье всё очень правильно и понятно написано. передёргивания про выкопать руды и выплавить вилку для обеда — сюда вообще не подходят. если в кружке дети собирают машинки на ардуино, то его нужно просто называть кружком «умелые ручки», но никак не с замахами на обучение электронике. аналогично с 3д-ручками — когда выдавил из пластика объёмный цветочек, это не путь к конструктору, это кружок умелых ручек и «мама, смотри что я сегодня сделал».
а с уроками на ютубе — безмерно цитируемые «уроки» джереми, где он рассказывает, что у ардуино уно есть аналоговый выход + эпические переводы «подключим питание к положительной рельсе» — это совершенное уродство и неверная подача материала.geisha
06.09.2016 16:32Я сам с удовольствием научусь всей этой хардварной хрени если будет время. Но у ребенка должно быть детство а не советский лагерь. Если у вас лично появилось желание поднимать страну с колен за счет ваших детей — вперед. Это очень приветствовалось лет 30 назад.
С другой стороны, если ребенок хочет этим всем заниматься — пожалуйста, но гораздо интереснее ходить в авиакружок чтобы стать пилотом, чем в кружок мастера на все руки чтобы стать сантехником.
Касаемо названия — инженер, слесарь и плотник — это тоже не электронщик.
Относительно качества конкретно этих уроков я ничего не комментировал. Но по собственному опыту могу сказать, что Arduino Starter Kit я нашел вполне занятной штукой. И да, там нашли место для закона Ома и даже для законов Кирхгофа.
Наконец, я ничего не говорил о руде, вилках и 3Д ручках. Я построил вполне уместную аналогию пытаясь сделать акцент на частой ошибке учить «от фундаментального к частному» вместо «от простого к сложному». Для теоретических дисциплин эта ошибка приводит к полной апатии к предмету учебы, а в практических — к отсутствию пальцев и инвалидности. Спорить здесь не о чем.bigbrotherwatchingyou
07.09.2016 11:24А потом как в анекдоте "… ну и ты, конечно же, спела?..." Какая связь между авиакружком и пилотом? Авиакружок — это в нынешние времена тот же «конструктор». В авиакружке ребенок не получит фундаментальных знаний, у него по определению любой предмет сможет летать — просто потому что"… может и всё", максимум — "… потому что есть крылья или пропеллер..." Про аэродинамику, подъемную силу ему там никто ничего не будет разжевывать. Нынешние кружки — это просто способ делать деньги (на детях), просто «бЫзнИс». Пилотом такой ребенок не станет, максимум — «оператор дрона». Ребенка НУЖНО заставлять уметь делать что то руками, иначе кроме ковыряния в носу никаких иных способностей у него не появится
azsx
07.09.2016 05:03В детстве (в Советское время) я ходил в кружок микроэлектроники и там было обучение именно как описали в статье (по ссылке из комментария). Мне дали шариковую ручку и напильник, схемы не паяли, а скручивали https://geektimes.ru/post/258798/
Потом показали микросхемы ЛА3 и ЛА7, рассказали про логику, объяснили как можно заменить микросхемы транзисторами. Первоначально был сбор стандартных игрушек (светофор, тряпкобол и др.), которые надо было не только скрутить, но и собрать физически. Затем каждый собирал что захочет из множества устройств, часто без документации. Мой товарищ собирал осциллограф. Мне электроника не понятна совсем, последнее, что я сделал в кружке — это написал программу для управления двумя шаговыми двигателями. Прибор для накрутки трансформаторов, в котором стояли эти двигатели собирали другие дети. Не знаю насколько интересны кружки сейчас, тогда мне было очень интересно.
Именно поэтому мне интересно есть ли лекции текстом. В идеале мне бы машинку с вебкамерой и другими датчиками, которой можно управлять по wi-fi с ПК. То есть самому писать программу на нее. Пока я нахожу только варианты машинок, которые управляются виртуальным джойстиком с андройд смартфона.
Roman_Popov
07.09.2016 13:45+1Полностью согласен с автором материала. Сам веду кружок робототехники и вижу всю эту кухню изнутри. Особенно печалят соревнования… Та же беготня по линии решается проще и эффективней вообще без микроконтроллера, но по условиям только лего… В целом же создается впечатление, что стоит задача не научить проектировать роботов, а тупо обслуживать то, что сделал «большой белый босс».
Например в прошлом году принимали участие в масштабном конкурсе (не стану уж говорить название): многие участники не смогли объяснить как работает сервопривод (ответили — мы программисты и не должны все знать) и даже что они на этот сервопривод подают (ну вот есть библиотека, она все считает). Критерии оценки тоже были рассчитаны под конкретный подход и алгоритм, спасибо адекватному судье, предложившему модифицировать критерии, иначе быть нашей команде на последнем месте. Ну и так далее.
Я не сторонник выпиливания шестеренок напильником из консервной банки, но считаю что дети хотя бы в общих чертах должны понимать, что они делают и как взаимодействуют все части робота — программная, электронная и механическая. А для этого надо бы дать им возможность и ЛА3 попаять, и редуктор самостоятельно из деталек собрать.
webkumo
07.09.2016 14:58Так беда-то не с конструкторами, а с неумением вести иерархическую систему развития? Ну вот придёт к автору статьи ребёнок 5-8 лет и что? Думаете он будет сидеть и пыхтеть над каким-то чертежом? Да фиг вы среднего ребёнка заинтересуете такой фигнёй (не говоря уже о том, что навыка черчения у них нет и им это будет тяжело). Так что для 5-8 лет нужны конструкторы. И даже в 10-12 конструкторы для знакомства сойдут.
А автор статьи — кг/ам, ибо почему-то форсит «5 секунд и всё», но это же наглая ложь и передёргивание — хорошую модель на констукторе, даже на лего, ребёнок будет собирать и час и больше!
И при этом даже там есть простор для фантазии! И даже там есть место азам сопромата и механики… «этот узел хорошо держится, а этот разваливается, ибо такое соединение не устойчиво, а вот такое — вообще только на клей садить»…
Я уже молчу про прототипирование с помощью 3d принтеров!
Реально должна быть претензия — что дальше ничего нет. Вот в эту нишу он со своей школой может влезть. Другие школы с другими подходами тоже туда могут влезть. А вот базовые в эту нишу без смены подходов не пролезут. Т.к. их подход не рассчитан на долгое взаимодействие с ребёнком, на его глубокое погружение в тему. И проблема-то не констукторы, не эти базовые уроки (которыми можно заинтересовать и подогревать интерес при правильном подходе!), а отсутствие толковых преподавателей и курсов!
Ну и по конкурсам — я точно видел более сложные конкурсы (то же робосумо). Будет больше «школ», с глубоким погружением — будет больше продвинутых конкурсов. А пока они не нужны, а вот конкурсы с простой линией нужны. Чтобы поддерживать интерес детей, чтобы школам зарабатывать сертификаты. Обычный обыденный entertaiment. Обычный бизнес.
PS ну и не забывайте — сейчас заинтересованность в инженерных кадрах низкая. Точнее низкая заинтересованность в их выращивании. Готовые — нужны, а вот возиться и выращивать никто не готов. Организации-потребители кадров с ходу не потянут, а государство давно и прочно положило болт на качественное образование (зато уроки религии ввели!).Roman_Popov
13.09.2016 20:33Реально должна быть претензия — что дальше ничего нет. Вот в эту нишу он со своей школой может влезть. Другие школы с другими подходами тоже туда могут влезть. А вот базовые в эту нишу без смены подходов не пролезут. Т.к. их подход не рассчитан на долгое взаимодействие с ребёнком, на его глубокое погружение в тему. И проблема-то не констукторы, не эти базовые уроки (которыми можно заинтересовать и подогревать интерес при правильном подходе!), а отсутствие толковых преподавателей и курсов!
В принципе согласен. Но есть и еще момент — конструкторы (те, что наиболее распиарены для занятий робототехникой) приучают, что за 30-45 минут ребенок получает готовый результат, и как результат — fun с эндорфинами. В результате, если стоит задача сделать что-то сложное за 3-4 занятия, многие «сливаются». В принципе, как по мне, это нормально, если из 15 останется 2-3 ребенка готовых идти дальше прикольной фигни по инструкции. Но вот руководство со мной тут не согласно :) Но это уже совсем другая тема.
Точнее низкая заинтересованность в их выращивании.
Причем в первую очередь именно со стороны этих «кадров» и их родителей. Около половины родителей приводят своих чад со словами: «В спорте у нас не получилось, может у вас получится.» Еще половина со словами: «Он так любит лего!». Ну и только у тех самых 2-3 есть мотивация заниматься именно роботами, электроникой и физикой.black_semargl
14.09.2016 09:32Грамотный преподаватель вполне может разбить сложное на несколько коротких этапов, каждый из которых имеет видимый результат.
webkumo
14.09.2016 14:08«Он так любит лего» — вполне неплохая аргументация. Остаётся только вопрос — удастся ли заинтересовать областями «цепляется к лего», «аналоги, из которых тоже можно ого-го!».
Проблема в том, что тот же железный конструктор — вещь! НО! Он требует большего количества навыков, более требователен к фантазии и пространственным навыкам (фантазия, память, ...). А ещё он нифига не красочный и из него сложно делать «монолитные» конструкции (получаются-то, если не мастылить какие-нибудь плоскости вручную, каркасы!). Но ведь если заинтересовать, то возможностей у него никак не меньше, чем у Лего Техникс, при этом крепление деталей всё-таки надёжней. НО! металлические констукторы почти не содержат плоскостей (был очень удивлён, что их вообще начали класть!) и в лучшем случае раскрашен в 2-3 цвета. А где дидактические материалы (схемы) каких-нибудь красочных моделей? Где тот же «Сокол тысячелетия» или игровой набор (лего делает игровые наборы!) из металлического констуктора? Где «Металлический консктор Movie» на ютубе («Lego citi movie» — есть)? Получается нужно самостоятельно заинтересовать — а вот это мало кто умеет (если со своим ребёнком — ещё как-то можно попытаться, то чужие — гораздо тяжелее).
Вот и касательно робототехники та же петрушка получается — есть «Ну и только у тех самых 2-3 есть мотивация заниматься именно роботами, электроникой и физикой.» и есть остальные — которых надо заинтересовать. Которым! нужно! подавать материал частями, а разработку первых моделей разбивать на короткие период-модули (в пределах академического часа для средних школьников, и минут 20-30 для младших и дошкольников, старшие школьники могут и полный час и академическую пару просидеть за раз), которые будут самостоятельной подсистемой (которую можно потыкать в конце урока) разрабатываемого робота.
Например:
1. Делаем шасси (движок + управление кнопками + колёса — всё в одном корпусе)
2. УЗ-дальномер с выводом данных в отладчик + корпус
3. Собираем корпус с УЗ дальномером, шасси и подключаем простейшее управление на контроллер
4. Делаем продвинутое управление (например пультом ДУ)
5. Делаем «самоуправление»
При правильной подаче дети же будут пищать от восторга и не потеряют интерес!Roman_Popov
15.09.2016 21:13Железный конструктор это действительно тема. И дети нормально его воспринимают — конструкция выглядит брутально-железной, типа реально робот. Но у него есть главный недостаток — железо таки проводник… Только отвернешься к одним — другие уже подрубили питание и привет ардуинке.
Материал частями и модулями это понятно. Когда делаем что-то типовое, то это проходит. Но когда ставится задача сделать что-то новое, не по инструкции, не проработанную заранее лабу, то именно тут и сдуваются. Проработать конструкцию шасси, сделать упрощенную механическую модель, прикинуть какие двигатели и реле подойдут по току, какой аккумулятор поставить — все это требует больше, чем одно занятие и в конце в лучшем случае будет эскиз, модель, какая-то часть, а в худшем станет ясно, что идея была ошибочная и надо начинать все сначала.
Но, еще раз, я считаю, что 2-3 ребенка из 15, способных что-то создавать самостоятельно — это нормально. Как бы цинично не звучало, помимо инженеров в экономике востребованы и операторы и ремонтники, причем в гораздо больших количествах. Обидно именно за этих 2-3 которые не могут участвовать в соревнованиях из-за ограничений «только лего» и ходят под угрозой дисквалификации на других соревнованиях из-за нестандартного подхода к решению задачи.
geisha
06.09.2016 13:04Простой стартовый набор, да? Когда я покупал стартовый набор от ардуино там не было ИК приемника, реле, сегментных дисплеев и индикаторов, шаговых двигателей, датчиков звука (если только не имеется ввиду пьезоэлемент), светодиодных матриц и RFID считывателей.
webkumo
06.09.2016 16:57Хм… я вот не стал запариваться и купил у наших соседей:
http://www.aliexpress.com/item/Starter-Kit-for-Arduino-UNO-R3-kit-Upgraded-Version-Learning-Suite-Kit/32541409645.html
Имхо набор, в котором меньше всяких плюшек не стоит рассмотрения (если не берётся под определённую задачу, но о каком starter kit в таком случае может идти речь — я не знаю).geisha
06.09.2016 21:03Я знаю, там замечательные наборы бывают. Но они не очень подходят для обучения: куча уже готовых устройств которые можно подключить только к ардуине. Сценариев использования, скажем, RFID совсем немного. Starter kit, все-таки, фокусируется на азах: как правильно подключить светодиод, аналоговый датчик температуры, мотор или другую нагрузку. Как из дерьма и палок сделать тач сенсор. Как из всего этого соорудить умный вентилятор. Скажем так, больший акцент делается на аналоговой составляющей нежели на цифровой.
black_semargl
07.09.2016 11:24Ну подключить большинство можно к чему угодно, они управляются по SPI/I2C/…
А для обучения конечно нужно закупать целенаправленно то что надо.
mitgard
07.09.2016 11:26Вроде и все классно, но вызывает грусть и печаль.
Как-то общался с создателями квестов (я хотел себе подработку). Так вот, когда меня спросили как бы я определил наличие светового луча, то мое объяснение про получение нормированного сигнала с выставленным логическим уровнем не поняли, вместо это рассказали мне про фоторезистор и АЦП…
tursunbek
07.09.2016 13:48+125 долларов вполне адекватные деньги за набор, если учесть, что набор lego mindstorms стоит в 10 раз дороже
sumrakssk
07.09.2016 17:53У вас там в 12 пункте резистор взрывается, так и задумано ?( https://habrastorage.org/files/05a/6fe/2f5/05a6fe2f5b
6642a1a16f21750fceb0ce.gif )
sashabeep
Сам смотрел туториалы этого парня, все вроде хорошо и понятно расписано, как у вас с копирайтом?
HWman
Кто-то должен был собрать всё это воедино.