Arduino и ЧПУ на Portal-PK.ru http://portal-pk.ru/ Arduino проекты, уроки, а также самоделки и самодельные ЧПУ станки на Portal-PK.ru ru Урок 3. TTP223 сенсорная кнопка схема подключения к Arduino http://portal-pk.ru/news/165-ttp223-sensornaya-knopka-shema-podklyucheniya-k-arduino.html Константин Portal-PK 2018-12-12T18:13:52+03:00 Сенсорные кнопки устроенны так, что они реагируют на изменение емкости. Изначально кнопка имеет определенную емкость, которая разная у каждой модели данных датчиков.

Сенсорные кнопки устроенны так

Так как тело человека обладает некоторой емкостью и небольшим реактивным сопротивлением. Если прикоснуться пальцем какого-нибудь проводника, то по нему потечет ток утечки. В сенсорных кнопка установлен чип (в нашем случае TTP223), который определяет данную утечку. При достижении определенного значения происходит срабатывания.

TTP223 сенсорная кнопка

сенсорная кнопка

Технические характеристики TTP223

  • Напряжение питания постоянного тока, В: 2 – 5.5
  • Потребляемый ток (в покое, при VCC= 3 В), мкА: 70
  • Максимальное время срабатывания (при VCC= 3 В), мС: 220
  • Габаритный размер платы, мм: 11x15

Подключим сенсорную кнопку TTP223 в Arduino

Подключим сенсорную кнопку TTP223 в Arduino

Как подключить кнопку к Arduino я рассказывал в Урок1 - Подключение кнопки и светодиода кплате Arduino

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

Проверим будет или нет работать код из урока подключения кнопки к Arduino.

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
   if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
 }
  else { //Иначе
      digitalWrite(led_pin, LOW);// выключаем светодиод
  }
}

Как видим у нас все работает аналогично обычной кнопке.

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

Также данную сенсорную кнопку можно сконфигурирован для работы в одном из 4 режимов для этого нужно спаять перемычки А и В на плате:

A

B

Режимы

0

0

На время касания на выходе “1”

1

0

На время касания на выходе “0”

0

1

режим триггера, состояние выхода после касания – “0”

1

1

режим триггера, состояние выхода после касания – “1”

 спаять перемычки А и В
Как мы видим если спаять перемычки А и В. Мы сконфигурирован сенсорную кнопку как логический ключ. И не меняя программу мы можем включать светодиод и выключать при нажатии на сенсорную кнопку TTP223 .

Давайте подключим реле, вместо светодиода, не меняя программу.

подключим реле, вместо светодиода

Как видим, реле также отлично работает включается и выключается.

Если мы можем сконфигурировать кнопку так, что она будет работать как триггер. При нажатии подать положительный сигнал на выход. Для управления простыми устройствами такими как светодиод и реле. Из схемы можно убрать Arduino.

Для подачи напряжения буду использовать MICRO USB адаптер 5pinMICRO USB адаптер 5pin

Подключим светодиод к сенсорной кнопку . Как видим все работает.

Подключим светодиод к сенсорной кнопку

Если же подключить реле к сенсорной кнопке TTP223 .

подключить реле к сенсорной кнопке TTP223

Оно не работает, потому, что кнопку можно подключить как логический ключ. Электродвигателя, реле и пр. (даже на 3-5 В) работать не будут. Сенсорная кнопка просто сгорит. Для примера я подключал параллельно 3 светодиода. И как видно из эксперимента начинаются ложные срабатывания. По техническим характеристикам даже 4 светодиода для данной кнопки много.

Но не обязательно ограничиваться реле. Можно подключать MOSSFET или твердотельное реле.

Проверку на работоспособность с разными материалами: пластик, картон, фанерой. Если на сенсорную кнопку положить материал не толще 2 мм. Кнопка работает отлично. Более 2 мм. Работает только с пластиком. Но это у меня. Возможно у вас будут другие результаты. Как у вас работают сенсорные кнопки пишите в комментарии.

Вывод: Сенсорная кнопка TTP223 имеет ряд преимуществ при использовании в проектах на Arduino , по сравнению с тактовой кнопкой. Но она не может быть использована в силовых цепях.


Подписывайтесь на мой канал на Youtube и вступайте в группы в

Вконтакте и Facebook.

]]>
Управляем реле по wi-fi с телефона. NodeMCU и Arduino IDE http://portal-pk.ru/news/164-upravlyaem-rele-po-wi-fi-s-telefona-nodemcu-i-arduino-ide.html Константин Portal-PK 2018-12-05T11:23:14+03:00 В уроке: Урок8 — Подключаем реле к Arduino. Пример работыи скетч я рассказывал, что реле можно управлять без микроконтроллера. Но если надо управлять реле на расстоянии и без проводов. Например управлять светом по wi-fi. При решении поставленной задаче без микроконтроллера не обойтись. Я планирую использовать распространенную отладочную плату NodeMCU на базе ESP8266.

Упровление светом с помошью Wi-Fi приносит большое уудовольствие, но ни такое как новогодние туры в шри-ланку.

Подключим реле к NodeMCU по схеме.

Подключим реле к NodeMCU по схеме

В связи с достаточно большим объемом памяти, NodeMCU можно использовать как точку доступа и загрузить HTML станицы и управлять реле. Очень хороший пример реализации управления рассказывает в своих уроках Третьяков Сергей. По его урокам реализовать управления с помощью HTML интерфейс будет достаточно легко. Если вам интересна данная тема пишите в комментарии. Обязательно помогу и сниму пару видео по созданию и загрузки HTML в NodeMCU. Но для нашей задаче достаточно: ШАГ №2 * WEBSERVER WEB СЕРВЕР. Из чикла уроков Третьяков Сергя.

NodeMCU + relay

подключении NodeMCU к вашему Wi-Fi роутеру

Описание и код можно найти на странице урока и объяснять. что и как написать не буду. Нам останется дописать одну функцию которая будет посылать Get запрос на включение (http://192.168.0.101/rele?status=1) и выключения (http://192.168.0.101/rele?status=0) реле. «192.168.0.101» это ваш IP при подключении NodeMCU к вашему Wi-Fi роутеру. Можно посмотреть в мониторе порта.

void handle_Rele() {
  String restart = HTTP.arg("status");
  if (restart == "1") 
  {
    digitalWrite(RELE, HIGH);
    HTTP.send(200, "text/plain", "Ok");
  }
  
  if (restart == "0") 
  {
    digitalWrite(RELE, LOW);
    HTTP.send(200, "text/plain", "OFF");
  }  
}

Для проверки работы можно пройти по одной из получившихся ссылок (http://ваш_IP/rele?status=1 или http://ваш_IP/rele?status=0) и вы увидите, что реле включается и выключается. И в браузере выводит соответствующие надписи: On — Wi-Fi реле включен, Off — Wi-Fi реле выключено.

Теперь перейдем к управлению Wi-Fi реле с телефона . Для этого можно написать приложение для Android, но можно обойтись и без программирования. В этом нам поможет бесплатного приложения HTTP Edit Widget (условно бесплатного).

 приложения HTTP Edit Widget

В итоге у нас должны получиться две кнопки. Название и цветовое оформление выберете под себя. У меня получилась вот так:

должны получиться две кнопки

Для создания таких кнопок в списке виджетов выбираем HTTPEditWidge t. В отрывшемся меню настроек заполняем поля.

виджетов выбираем HTTPEditWidget

В поле « http://» указываем нужный адрес Если для выключения реле то http://192.168.0.101/rele?status=0. Пишем текст который будет выводиться на кнопке. В нашем случае «off». Ниже выбираем цвет кнопки и цвет текста. Кнопка Off готова. Аналогично делаем кнопку On, не забывая то включается реле вот по такому запросу: http://192.168.0.101/rele?status=1.

Если у вас кнопка включения выключает а выключение включает. Ни чего страшного. Вы просто подключили не на тот контакт реле. Поправить можно и в не переключая провода. Прост поменяйте местам значения status.

Если у вас кнопка включения выключает а выключение включает. Ни чего страшного. Вы просто подключили не на тот контакт реле.

Вот и готово наше Wi-FI реле на ESP8266. С повторением данного проекта я думаю у вас не будет проблем. По всем вопросам пишите на форум Управляем реле по wi-fi с телефона . По данномй проету открое топик: Если вы не знаете как пользоваться Arduino IDE. Читайте Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino Так же смотрите уроки по основам программирования Arduino.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 8 — Подключаем реле к Arduino. Пример работы и скетч http://portal-pk.ru/news/163-podklyuchaem-rele-k-arduino-primer-raboty-i-sketch.html Константин Portal-PK 2018-11-28T18:00:02+03:00 Подключить реле к Arduino достаточно просто. Для примера мы будем использовать Скетч и подключения из урока: Урок2. Нажатие кнопки без ложных срабатываний.Устраняем дребезг кнопки

В схеме вместо светодиода с резистором подключим реле. Вот так выглядит схема подключения реле к Arduino UNO . К другим версиям например Arduino NANO схема не будет иметь отличий.

т схема подключения реле к Arduino UNO

Как видим, схема не многим отключается от исходного примера.

Реле может управлять различными бытовыми приборами.

Пара фоток сделанных при снятии видео по данному уроку: Подключение реле к Arduino.

 Подключение реле к Arduino

 Подключение реле к Arduino фото

реле и Arduino

Скетч можно взять из Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки без изменений.

Для более красивого и читабельного кода заменим переменную ledPin на relayPin . Так же заменим вспомогательную переменную ledOn на relayOn. У нас получиться вот такой скетч управления реле.


const int buttonPin = 2;      // номер входа, подключенный к кнопке
const int relayPin =  3;        // номер выхода светодиода
/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
boolean relayOn = false;        // текущее состояние свтодиода
void setup() // Функция setup()
{
  // инициализируем пин, подключенный к реле, как выход
  pinMode(relayPin, OUTPUT);     
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);   
}
boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (buttonPin); // считываем данные с кнопки
  if (last != current) // Если текущее состояние отличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
    return current; 
  }
}
void loop() // Функция loop
{
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    relayOn = !relayOn; // инвертируем значение 
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  digitalWrite(relayPin, relayOn);   // Включаем или выключаем реле (смотря что пришло после инверсии) 
  delay (2);   // Ждем 2 милисек.
}

Вы должны понимать, что управлять реле можно и буз Arduino . Данный пример приведен для ознакомления.

Если подключить реле через кнопку с фиксацией . Вот по такой схеме.

 подключить реле через кнопку с фиксацией

То у нас все будет работать отлично. В качестве источника питания 5В можно использовать MICRO USB адаптер 5pin, при подключении от компьютера или адаптера. Так же можно подключить через понижающий трансформатор, например вот такой.


Вывод: Урок показывает как можно с помощью Arduino упровлять реле. Но в простых схемах управления реле использовать платформу Arduino или другой микроконтроллер не целесообразно.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 7 — Подключаем HC-SR04 к Arduino. Библиотека NewPing http://portal-pk.ru/news/162-podklyuchaem-hc-sr04-k-arduino-biblioteka-newping.html Константин Portal-PK 2018-11-19T08:24:00+03:00 Ультразвуковой датчик HC-SR04 определения расстояния до предметов. Принцип роботы как у сонара, посылается пучок импульсов и получает отражения, и на основании задержки определяется расстояние до предмете. Так как датчик для определения расстояния основан на ультразвуки, он плохо работает для определения расстояния до звукопоглощающих предметов. Идеальными являются предметы с ровной и гладкой поверхностью например ПАНЕЛИ, ВАГОНКА ПВХ.

Ультразвуковой датчик HC-SR04

Описание ультразвукового дальномера HC-SR04

Датчик HC-SR04 является бесконтактным. Точность измерения обеспечивается от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия.

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры:

  • Рабочее напряжение
  • Сила тока в пассивном состоянии < 2 мА
  • Рабочий параметр силы тока – 15 мА
  • Измерительный угол — 30°
  • Обзорный угол — 15°

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры

Контакты подключения:

  • Контакт питания +5В
  • Trig – выход сигнала входа
  • Echo – вывод сигнала выхода
  • GND – «Земля»


Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO

Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO
Самой распространенной библиотекой для работы с датчиком HC-SR04 является NewPing. Описание и подледную версию можно найти на страничке проекта

подключения ультразвукового датчика HC-SR04 к Arduino UNO


Пример скетча который предложен на странице библиотеки NewPing


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
  Serial.begin(115200);
}
void loop() {
  delay(200);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}


Откроем монитор Serial порта.

Откроем монитор Serial порта
Как видим датчик HC-SR04 работает но есть шум. Выводит через определенное время нулевые значения. Данный код можно улучшить.


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float dist_3[3] = {0.0, 0.0, 0.0};   // массив для хранения трёх последних измерений
float middle, dist, dist_filtered;
float k;
byte i, delta;
unsigned long dispIsrTimer, sensTimer;
void setup() {
  Serial.begin(115200);
}
void loop() {
  if (millis() - sensTimer > 200) {                          // измерение и вывод каждые 50 мс
    // счётчик от 0 до 2
    // каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по кругу
    if (i > 1) i = 0;
    else i++;
    dist_3[i] = (float)sonar.ping() / 57.5;                 // получить расстояние в текущую ячейку массива
    dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]);    // фильтровать медианным фильтром из 3ёх последних измерений
    delta = abs(dist_filtered - dist);                      // расчёт изменения с предыдущим
    if (delta > 1) k = 0.7;                                 // если большое - резкий коэффициент
    else k = 0.1;                                           // если маленькое - плавный коэффициент
    dist_filtered = dist * k + dist_filtered * (1 - k);     // фильтр "бегущее среднее"
   Serial.print("Ping: ");
  Serial.print(dist_filtered);
  Serial.println("cm");                // вывести
    sensTimer = millis();                                   // сбросить таймер
  }
}
// медианный фильтр из 3ёх значений
float middle_of_3(float a, float b, float c) {
  if ((a <= b) && (a <= c)) {
    middle = (b <= c) ? b : c;
  }
  else {
    if ((b <= a) && (b <= c)) {
      middle = (a <= c) ? a : c;
    }
    else {
      middle = (a <= b) ? a : b;
    }
  }
  return middle;
}

Как видим датчик HC-SR04 работает но есть шум


Данные стали более стабильные и немного точнее. Но идеальных значений не получить. Потому что значения зависит от расстояния измерения. Чем ближе предмет и более гладкая поверхность тем точнее будут измерения.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельная рама для 3D принтера. Какую модель выбрать? Чертежи http://portal-pk.ru/news/161-samodelnaya-rama-dlya-3d-printera-kakuyu-model-vybrat.html Константин Portal-PK 2018-11-02T12:53:37+03:00 При разработке своих проектов на Arduino и ЧПУ. Я часто упираюсь в то, что на своем самодельном фрезерном станк е я могу сделать только плоские заготовки. А так часто необходимо сделать изогнутую стенку или сложную объемную деталь. Меня регулярно посещает мысль, что нужен 3D-пинтер. Стоят они не очень дорого. Это вам не Перевезти оргтехнику 20т фурой

В Китае можно купить недорогие 3D принтеры:

Анет 3d принтер Delta 3d Принтер CTC 3d принтер

Подробнее

Подробнее

Подробнее

3D принтер с доставкой из России: Анет A6 3D-принтер

Но как вы знаете я не ищу легких путей и люблю собирать самодельные станки с ЧПУ. Поэтому я решил собрать 3D принтер.

И так цель ясна. Теперь нужно поэтапно реализовывать задуманное. Первое что нужно будет сделать это рама (корпус) 3D принтера, на который будет крепиться вся механика и электроника.

Можно купить готовые варианты рамы , цена относительно небольшая:

3d принтеры Reprap Ultimaker рамки фанеры 6 мм/4 мм Prusa i3 рамка 6 мм фанера Анет A8/hesine M505/tronxy 3D-принтер STEK/stek металлический каркас 3d принтера

Подробнее

Подробнее

Подробнее

Подробнее

Но раз я решил самодельны, значит самодельный. Сперва я планировал собрать самый простой 3D-принтер и выпилить основные части корпуса из фанеры вручную. Что то примерно вот такое:

самый простой 3D-принтер

Но посмотрев размеры раскроя, понял что основные заготовки можно будет вырезать на моем самодельном фрезерном станке с ЧПУ. Чертить с нуля достаточно долго и я загуглил вот что нашел.

1. Первая развертка предназначена для вырезки из стали 3 мм.

3d принтер. Чертеж рамы

Есть несколько версий данного принтера. Выбрать есть из чего. Можно сходить на завод и заказать раскрой из стали или алюминия. Но это выходит в круглую копеечку. На экспрессия можно купить горазда дешевле из альтернативного материала. Конечно из стали получиться достаточно жестко и на века.

Скачать чертежи 3D-принтера P3Steel

2. Вторая версия имеет те же минусы и недостатки. Но макет сделан из МДФ. Поэтому я решил сделать так же из МДФ. Для примера. А потом на основании данного макета модернизировать чертежи под свои материалы. И почестям пересобрать. И тут я нашел третий вариант.

Самодельная рама из МДФ 3D принтера

раскрой фанеры рамы 3D принтера

Скачать чертежи 3D-принтера I3 CORDOBESA Full Steel

3.Данная версия рамы 3D принтера уже предназначена для раскроя из фанеры 6 мм.

версия рамы 3D принтера уже предназначена для раскроя из фанеры 6 мм

Это то что я искал. Для первой пробной рамы для 3D-принтера, я думаю будет достаточно. Тем более зная себя точно, что нибудь буду переделывать и модернизировать. А как основная база на первый взгляд неплохой вариант. А как вы считаете?

Скачать чертежи 3D-принтера WoodMAX i3

Если у вас есть варианты рам для 3D принтера пишите в комментарии. Буду благодарен!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Часы-будильник на Arduino. Корпус сделан из конструктора LEGO. LEGO Arduino http://portal-pk.ru/news/160-chasy-budilnik-na-arduino-korpus-sdelan-iz-konstruktora.html Константин Portal-PK 2018-10-18T09:25:33+03:00 Пришел у меня 5 летний ребенок из садика и сказал, что ему задали сделать проект умные устройства в доме. Корпус можно сделать из любого подручного конструктора. Можно сделать из LEGO конструктора. Немного поразмыслив решили мы с сыном сделать часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 .

Подключение электроники осуществляется вот по токай схеме.

часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231

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

Корпус из LEGO для чесов

Прошивка для часов на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 в среде Arduino IDE:


#include <TinyWireM.h>
#include "TM1637.h"
#define CLK 4
#define DIO 3 
int soundPin = 1;             // объявляем переменную с номером пина спикера
const int buttonPin = 5;      // номер входа, подключенный к кнопке
int sensorValue = 0;
boolean status = false;
TM1637 tm1637(CLK,DIO);
///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   TinyWireM.beginTransmission(0x68);
   TinyWireM.send(0);
   TinyWireM.send(decToBcd(second));    
   TinyWireM.send(decToBcd(minute));
   TinyWireM.send(decToBcd(hour));     
   TinyWireM.send(decToBcd(dayOfWeek));
   TinyWireM.send(decToBcd(dayOfMonth));
   TinyWireM.send(decToBcd(month));
   TinyWireM.send(decToBcd(year));
   TinyWireM.endTransmission();
}
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 7);
  *second     = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute     = bcdToDec(TinyWireM.receive());
  *hour       = bcdToDec(TinyWireM.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month      = bcdToDec(TinyWireM.receive());
  *year       = bcdToDec(TinyWireM.receive());
}
float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0x11);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 2);
  if(TinyWireM.available()) {
    tMSB = TinyWireM.receive(); //2's complement int portion
    tLSB = TinyWireM.receive(); //fraction portion
    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }
  return temp3231;
}
/////////////////
void setup() {
  TinyWireM.begin();
  tm1637.init();
  tm1637.set(7); // яркость, от 0 до 7
  pinMode(soundPin, OUTPUT); //объявляем пин как выход. 
  pinMode(buttonPin, INPUT_PULLUP);
 pinMode(5, INPUT);
    // установка часов 
        //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  second = 30;  minute = 50;  hour = 06;  dayOfWeek = 3; 
     // день недели 
     //dayOfMonth = 1; // день 
      ///month = 4; 
      //year = 14;  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
}
void loop(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  byte temp = get3231Temp(); 
  int8_t TimeDisp[4]; 
    TimeDisp[0] = hour / 10;
    TimeDisp[1] = hour % 10;
    TimeDisp[2] = minute / 10;
    TimeDisp[3] = minute % 10;  
    if (second%2)
      tm1637.point(POINT_ON); // включаем точки
    else
      tm1637.point(POINT_OFF); // выключаем точки       
//  }
  buttonValue = digitalRead(buttonPin); // считываем данные с кнопки
   if(hour==7)
   {    
     if (minute==00)
     {
       if (second < 30)
         status = true;
       else
         status = false;
     }     
   }
   if (buttonValue)
      status = false;
   if (status)
    {
      tone(soundPin, 1500); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 1000); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 500); // включаем звук частотой 100 Гц
      delay(200);
    }
   else
    noTone(soundPin); // выключаем звук
  tm1637.display(TimeDisp); // отправляем массив на экран
}

Звуковой сигнал будет генерировать функция tone(). Как видно из программы настраивать время срабатывания будильника мы не сможем. Это связанна с тем что у Digispark мало пинов. И все уже заняты.

Если данный проект реализовать например на Atduino NANO, тогда можно реализовать настройку времени срабатывания будильника. Написать мелодии будильника и прочие фишки. Если данное видео и статья будут востребованы, то я сниму переделку на Arduino NANO. Но для первого раза я считаю что получилась не плох. А вы как считает? Пишите в комментариях свое мнение.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Новые Arduino проекты и Проекты сделанные на ЧПУ станке http://portal-pk.ru/news/159-novye-arduino-proekty-i-proekty-sdelannye-na-chpu-stanke.html Константин Portal-PK 2018-09-03T18:20:17+03:00 Вот и закончилось лета. И времени на разработку проектов на Arduino становиться больше. И сегодня я планирую рассказать о своих новых проектах которые я делаю на Ардуино и своем самодельном ЧПУ станке. Проекты еще в стадии разработки и не имеют конечного готового вида. Это вам не умз 42164 ремонт. Но все же я решил рассказать о них, чтобы услышит сторонне мнение. На канале видео я выложил раньше написания данной статьи. И первые мнения уже есть. Некоторые положительные, так же есть и отрицательны. Но любое мнение это повод улучить свои проект опираясь на ваше мнение.

Два проекта сделанные под управлением Arduino.
Первый проект про который я бы хотел рассказать это модифицированный и улучшенный светофор на ардуино и адресных светодиодах. Грубо говоря светофор версии 2.0. В данной версии я учел все недостатки и сделал его немного больше. Это видно по корпусу.

светофор на ардуино и адресных светодиодах. Грубо говоря светофор версии 2.0
Второй проект сделан так же на Arduino и адресных светодиодах WS2812. В качестве рассеивателя я использую стеклянные шарики которые рассеивают свет и вокруг каждого шарика и получается очень красивое свечение даже при белом свете. В данный момент уже внес некоторые изменения в данный проект и планируется разработка два направления данных ночников. Но об это в следующих статьях про мои проекты.

Ночник из стеклянных шариков
Третий проект сделан без использования Arduino. Это светильник общей мощностью 8 Вт на обычных светодиодах. Корпус высотой 42 см., выпилен на моем самодельном станке с ЧПУ. Данный корпус планирую использовать и в других моих проектах.

светильник общей мощностью 8 Вт на обычных светодиодах


Какой проект вам понравился больше всего? Пишите в комментарии. На основании ваших интересов буду планировать написание статей про данные проекты.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Аварийные огни + мигалка для автомобиля на Arduino и WS2812 http://portal-pk.ru/news/158-avariinye-ogni-migalka-dlya-avtomobilya-na-arduino-i-ws2812.html Константин Portal-PK 2018-08-08T11:49:31+03:00 Как вы наверное помните я деле машинку: СамодельнаяWifi машинка на NodeMCU. Машина делает дрифт. Мигалку делал на обычных светодиодах. Помещал их встарый корпус и получалась достаточно неплохая мигалка. Установленная на крышу машины. Так называемая крышная установка. На подобии наружной рекламы. Но как сделать мигалку и аварийные огни? В этом нам помогут светодиоды WS2812.

Как спаять последовательно светодиоды я думаю у вас не возникнет сложностей. Если возникнут посмотрите на сайте в проектах на Ардуино, там большое количество светильников на адресных светодиодах WS2812 . Тк же есть схемы подключение и краткое описание данных светодиодов.

Подключать будем к Arduino UNO, можно подключить и к другим моделям, например Arduino NANO подключение ни чем не будет отличаться.

Вход « DIN» на светодиодном модуле подключаем к PIN 6 на Arduino.

Для написания кода будем использовать библиотеку Adafruit NeoPixel. В которой есть пример «standtest». Который будет основой для кода. Также я бы порекомендовал вам посмотреть данный пример. Что он делает и как работает, это поможет вам понять код ниже.

Для примера будем подключать 8 светодиодов.

Режимы работы :

ArrowLeft и ArrowRight - Включение левой и правой секции светодиодов (по 4 шт.).

WigWag — Плавное включение всех светодиодов (8 шт.) Слева на права и наоброт.

WigWag2 — Предыдущий режим только с разными цветами

BlinkOuter - мигают два внешних светодиода

OnOuter - включает два внешних светодиода

ClearLights - отключает все светодиоды


#include 
#ifdef __AVR__
#include 
#endif
#define PIN 6

// All of this stuff below is from the example
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

//NOTE: I tested this code with an 8 LED module, but you should be able to daisy chain multiple modules
//NOTE: Try changing the "8" to "4" to see how it reacts.

// This warning is from the example, probably worth considering
// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This stuff is from the example, I commented it out since I am not using a Trinket
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  //#if defined (__AVR_ATtiny85__)
  // if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  //#endif
  // End of trinket special code
  strip.begin();
  strip.show();
}

void loop() {
  /*
   * For strip.Color(R, G, B), use 0-255 to set intensity
   * for each color (R)ed, (G)reen, (B)lue
   *
   * The last number is a delay 0-255 range.
   */

  // These are left/right signals
  ArrowLeft(strip.Color(0, 0, 255), 100); // Blue
  ArrowRight(strip.Color(255, 0, 0), 200); //Red

  // These are side to side or wig/wag
  WigWag(strip.Color(255, 0, 0), 200); // Red
  WigWag(strip.Color(0, 0, 255), 63); // Blue faster
  WigWag(strip.Color(0, 0, 255), 127); // Blue medium
  WigWag(strip.Color(0, 0, 255), 255); // Blue slowest
  WigWag(strip.Color(0, 255, 0), 200); // Green
  WigWag(strip.Color(255, 255, 0), 200); // Yellow
  ClearLights();
  delay(1000);
  // This is a 2 color wigwag
  WigWag2(strip.Color(0, 0, 255), strip.Color(255, 0, 0), 200); // Blue and Red
  ClearLights();
  delay(1000);

  // Blinks the outer most lights
  BlinkOuter(strip.Color(0, 0, 255), 200); //Blue
  BlinkOuter(strip.Color(0, 0, 255), 50); //Blue faster
  BlinkOuter(strip.Color(255, 255, 0), 200); //Yellow
  ClearLights();
  delay(1000);

  // Turns the outer most lights on
  OnOuter(strip.Color(63, 0, 0)); // Red 25%
  OnOuter(strip.Color(127, 0, 0)); // Red 50%
  OnOuter(strip.Color(191, 0, 0)); // Red 75%
  OnOuter(strip.Color(255, 0, 0)); // Red 100%
  ClearLights();
  delay(1000);
  OnOuter(strip.Color(0, 0, 255)); // Blue
  OnOuter(strip.Color(0, 255, 0)); // Green
  // Turns off all lights
  ClearLights();
  delay(5000);
}

void ArrowRight(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
    }
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
  }
}

void ArrowLeft(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
    }
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
  }
}

void WigWag(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    strip.show();
    delay(wait);
  }
}


void WigWag2(uint32_t c, uint32_t c2, uint8_t wait) {
  for (int j = 0; j < 20; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c2);
    }
    strip.show();
    delay(wait);
  }
}

void ClearLights() {
  for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);    //turn every pixel off
  }
  strip.show();
}

void BlinkOuter(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(wait);
    strip.setPixelColor(strip.numPixels() - 1, 0);
    strip.setPixelColor(0, 0);
    strip.show();
    delay(wait);
  }
}

void OnOuter(uint32_t c) {
  strip.setPixelColor(strip.numPixels() - 1, c);
  strip.setPixelColor(0, c);
  strip.show();
  delay(3000);
}

Код не является оригинальным и имеет ряд недочетов. Он является демонстрационным и для того чтобы у вас была отправная точка для разработки вашей модели.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Светодиодные часы на Arduino и светодиодах WS2812b http://portal-pk.ru/news/157-svetodiodnye-chasy-na-arduino-i-svetodiodah-ws2812b.html Константин Portal-PK 2018-08-01T09:18:00+03:00 Ка вы помните я уже делал часы на адресных светодиодах и Arduino. Если вы не в курсе смотрите мой проект: Классные самодельные настенные светодиодные часы на arduino.

Продумать реализацию часов на светодиодах можно много. И сделанных примеров в интернете большое количество. Недавно я нашел примеры реализации часов на 60 светодиодах. Вот некоторый из них:

Пример 1. Часы на Arduino, модуле реального времени RTC 1307 и светодиодной ленте WS2812b.

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

Часы на Arduino, модуле реального времени RTC 1307 и светодиодной ленте WS2812b
Вот такие симпатичные часы получаются и за небольшие деньги. Хоть вешай их себе в гостиную. Но для этого нужно подготовить стенку, чтобы часы гармонично вписывались. Интересно обои под покраску, цена данного удовольствия какая?
Код проекта.

/*
This is my sketch for a NEO PIXEL ring LED clock.
*/
//  Includes below:
#include <Wire.h>
#include <stdio.h>
#include <Adafruit_NeoPixel.h>
#include <RTClib.h> 
RTC_DS1307 RTC;             // Create RTC object
//  Define things here and set things up.
#define LED_Loop 60
#define PIN 6    // This is defining which Arduino pin is driving the Pixel ring used pin 6 but any digital will work
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_Loop, PIN, NEO_GRB + NEO_KHZ800);
int LED[LED_Loop];
int THREE = (LED_Loop / 4);
int SIX = (THREE * 2);
int NINE = (THREE * 3);
int TWELVE = (LED_Loop-1);
int HR_Fade = 7;
int MN_Fade;
long HR_Colour;
long SE_Colour = 0x000055;
long THIS_LED;
int Led_Flag;
int argh;
//  trying this way to get colours working.
int HR_R;
int HR_G;
int HR_B;
int HR1_R = 0x55;
int HR1_G = 0;
int HR1_B = 0;
int HR2_R = 0x0D;
int HR2_G = 0;
int HR2_B = 0x0D;
int MN_R = 0;
int MN_G = 33;
int MN_B = 0;
//int SE_R = 0;
//int SE_G = 0;
//int SE_B = 0x55;
int hour_led;
int minute_led;
int second_led;
int new_minute;
//-----------------------------  Set up here -----------------------------//
void setup() 
{
  // put your setup code here, to run once:
  delay(2000);          //  This is just to give you time to open the window and watch.
  Serial.begin(9600);
  Serial.println("-------------------------------");
  Serial.println("Setting up");
  Wire.begin();
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  if (! RTC.isrunning()) 
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  Serial.println("Done setting up");
  Serial.println("-------------------------------");
}
//-----------------------------  MAIN LOOP here -----------------------------//
void loop() 
{
  //  Get time
   DateTime now = RTC.now();
   //  24 hour time change colour of hour hand.
   int hr = now.hour();
   if (hr < 12)
   {
     //HR_Colour = HR_Colour1;
     HR_R = HR1_R;
     HR_G = HR1_G;
     HR_B = HR1_B;
   }
   else
   {
     //HR_Colour = HR_Colour2;
     HR_R = HR2_R;
     HR_G = HR2_G;
     HR_B = HR2_B;
   }
   int mins = now.minute();        //  This line is only incase any maths had to be done.
   second_led = now.second();
  //
  //  calculate leds
   hour_led = (((LED_Loop/12) * hr) + (mins / (LED_Loop/5)))%LED_Loop;
   if (hour_led == 60)
   {
     hour_led = 59;
   }
   minute_led = mins;
//  Debug code below
//
//------------------------------------------//
/*    
    Serial.print(now.year());
    Serial.print('/');
    Serial.print(now.month());
    Serial.print('/');
    Serial.print(now.day());
    Serial.print(' ');
    Serial.print(now.hour());
    Serial.print(':');
    Serial.print(now.minute());
    Serial.print(':');
    Serial.print(now.second());
    Serial.println();
*/
//------------------------------------------//
/*
  Serial.println("=========================");
  Serial.println(hr);
  Serial.println(mins);
  Serial.println("-------------------------");
  Serial.println(hour_led);
  Serial.println(minute_led);
  Serial.println(second_led);
*/
//------------------------------------------//
  //
  //  Show LEDs            ------------------   Main loop here -----------------
   //  Keep this at the top so it doesn't mess up any other settings when LEDs are
   //  turned on.
   strip.setPixelColor(second_led-1,SE_Colour/2);
   strip.setPixelColor(second_led-2,SE_Colour/4);
   strip.setPixelColor(second_led-3,SE_Colour/8);
   strip.setPixelColor(second_led-4,SE_Colour/16);
   strip.setPixelColor(second_led-5,0);
  //
  //  show THREE, SIX, NINE and TWELVE
  //
  strip.setPixelColor (THREE, 0x050505);
  strip.setPixelColor (SIX, 0x050505);
  strip.setPixelColor (NINE, 0x050505);
  strip.setPixelColor (TWELVE, 0x050505);
  //
  //  Now start setting LEDs below here.
  //
   if (second_led == 0)
   {
      strip.setPixelColor(LED_Loop-1, SE_Colour/2);
      strip.setPixelColor(LED_Loop-2,SE_Colour/4);
      strip.setPixelColor(LED_Loop-3,SE_Colour/8);
      strip.setPixelColor(LED_Loop-4,SE_Colour/16);
      strip.setPixelColor(LED_Loop-5,0);
      new_minute = 1;
   }
   if (second_led == 1)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(LED_Loop-1, SE_Colour/4);
      strip.setPixelColor(LED_Loop-2,SE_Colour/8);
      strip.setPixelColor(LED_Loop-3,SE_Colour/16);
      strip.setPixelColor(LED_Loop-4,0);
   }
   if (second_led == 2)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(LED_Loop-1, SE_Colour/8);
      strip.setPixelColor(LED_Loop-2,SE_Colour/16);
      strip.setPixelColor(LED_Loop-3,0);
   }
   if (second_led == 3)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(second_led-3, SE_Colour/8);
      strip.setPixelColor(LED_Loop-1,SE_Colour/16);
      strip.setPixelColor(LED_Loop-2,0);
   }
   if (second_led == 4)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(second_led-3, SE_Colour/8);
      strip.setPixelColor(second_led-4,SE_Colour/16);
      strip.setPixelColor(LED_Loop-1,0);
   }
/*
  if (Led_Flag == 0)
  {
    //
    Led_Flag = 1;
    THIS_LED = strip.getPixelColor(second_led);
    //  This is where I am at.
    Serial.print(second_led);
    Serial.print(" ");
    Serial.println(THIS_LED);
  }
*/  
  /*----------------  Draw SECOND HAND on clock ----------------*/
   strip.setPixelColor(second_led,SE_Colour);
//   strip.setPixelColor(second_led,SE_Colour+THIS_LED);
//   strip.setPixelColor(second_led-1,THIS_LED);
   if (new_minute == 1)
   {
     //new_minute = 0;
//     strip.setPixelColor(minute_led-1,MN_Colour/50);
   }
  /*----------------  Draw MINUTE HAND on clock ----------------*/
   //strip.setPixelColor(minute_led,MN_Colour);
   //  MN_Fade for fading.
   strip.setPixelColor(minute_led,MN_R,MN_G,MN_B);
   strip.setPixelColor(minute_led+1, MN_R,     (MN_G * (second_led*10/6)/100)      , MN_B);
   strip.setPixelColor(minute_led-1, MN_R,     (MN_G * (100-(second_led*10/6))/100)      , MN_B);
  /*----------------  Draw HOUR HAND on clock ----------------*/
   strip.setPixelColor(hour_led,HR_R,HR_G,HR_B);
   //strip.setPixelColor((hour_led-1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
   //strip.setPixelColor((hour_led+1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
/*
   strip.setPixelColor(hour_led,HR_Colour);
   strip.setPixelColor((hour_led-1)%LED_Loop,HR_Colour);
   strip.setPixelColor((hour_led+1)%LED_Loop,HR_Colour);
*/   
   if (second_led > minute_led)
   {
     new_minute = 0;
   }
/*
  if (second_led != argh)
  {
     Led_Flag = 0;
     argh = second_led;
  }
*/  
  //
  //  show alarms
  //
  strip.show();
  delay(400);
  //                    ------------------   End of Main loop here -----------------
}


Код я не проверял на работоспособность. Если у вас возникнут трудности пишите в комментарии.

Пример 2. Часы на Arduino, модуле реального времени RTC 1307 и кольце светодиодов WS2812b.

В данном примере автор купил готовое кольцо из 60 светодиодов WS2812b. Циферблат нарисовал самостоятельно, разместив его в центре кольца.

Часы на Arduino, модуле реального времени RTC 1307 и кольце светодиодов WS2812b
В связи с тем, что кольцо было куплено данные часы наварят ли получаться дешевле. А может даже и дороже по сравнению с первый вариантом. Но зато тут меньше проблем с подбором корпуса и светодиодной ленты.

Что понравилось мне в данном пример, это то, что код всего лишь 70 строчек.

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define PIXEL 60
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 RTC; // Establish clock object
DateTime Clock; // Holds current clock time
byte hourval, minuteval, secondval;
void setup() {
 Serial.begin(9600);
  Wire.begin();            // Begin I2C
  RTC.begin();   // begin clock
    if (! RTC.isrunning()) {
//    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
  }
//  RTC.adjust(DateTime(__DATE__, __TIME__));
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(20);
}
void loop() {
    Clock = RTC.now(); // get the RTC time
    secondval = Clock.second();  // get seconds
    minuteval = Clock.minute();  // get minutes
    hourval = Clock.hour();      // get hours
    if(hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
    hourval = (hourval*60 + minuteval) / 12;   
    strip.setPixelColor(hourval, 0x008080);strip.setPixelColor(hourval-1, 0x004040);strip.setPixelColor(hourval+1, 0x004040);
//    strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
    strip.setPixelColor(minuteval, 0x800080);
//    strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
    strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
    strip.show();
    strip.setPixelColor(hourval, 0x000000);strip.setPixelColor(hourval-1, 0x000000);strip.setPixelColor(hourval+1, 0x000000);
    strip.setPixelColor(hourval-2, 0x000000);strip.setPixelColor(hourval+2, 0x000000); 
    strip.setPixelColor(minuteval, 0x000000);strip.setPixelColor(minuteval-1, 0x000000);strip.setPixelColor(minuteval+1, 0x000000);
    strip.setPixelColor(secondval, 0x000000);//strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);
  delay(25);
/*
   Serial.print(hourval, DEC);
   Serial.print(':');
  Serial.print(minuteval, DEC);
   Serial.print(':');
   Serial.println(secondval, DEC);
*/
}

Этот пример можно пробовать реализовать в Digispark, в связи с тем что там очень мало памяти под программу.

Появились вопросы. Не стесняйся задавай из в комментарии.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 6 - Свечение светодиода пока нажата кнопка на пульте ДУ (IR) http://portal-pk.ru/news/156-urok-6---svechenie-svetodioda-poka-nazhata-knopka-na.html Константин Portal-PK 2018-07-30T10:53:45+03:00 В предыдущем уроке я уже рассказал как можно подключить IR приемник к Arduino и включать и выключать светодиод с помощью пульта дистанционного управления (ДУ).
После чего мне поступили вопросы :
1. «А возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения?»,
2. «Подскажите пожалуйста, а возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения? нигде не получилось найти инфу»
Данный вопрос в принципе простой и я делал машину на пульте управления и Arduino по данному принципу. Поделился ссылкой на материал. Но почему то есть трудности по реализации данного управления. Давайте наденем домашние тапочки и пойдем разбираться.

 подключить IR приемник к Arduino И так рассмотрим пример из предыдущего урока "Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote", когда мы получаем коды с кнопок.


#include 
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

При нажатии кнопок пульта ДУ мы получаем вот такой результат.

FF18E7
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFA857
FF02FD
FF5AA5
FFFFFFFF
FFFFFFFF
FFFFFFFF
FF10EF
FF5AA5

Как видим у нас при длительном нажатии выводит вот такой код: «FFFFFFFF». Который не относиться ни к одной кнопки. Этот код выводиться с определенной периодичностью, когда кнопка нажата и мы ее не отпускаем. Отпустив кнопку мы увидим, что данный код больше не выводиться в сериал порт. Используя данный принцип можно написать код под наши нужды. Вот пример условия который нам нужно добавить в код.

   

 if (results.value == 0xFFFFFFFF) // кнопка зажата
      {
        flag = flag;          // собновляем состояние светодиода
      }



Сперва думал сильно не изменять код и сделать на основе урока 5. Но код получается громоздкий и не читабельный. Немного все сократил и получился небольшой код. И более читабельный. Но при этом сложнее для понимания.

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево
#include "IRremote.h"
IRrecv irrecv(11);           // указываем вывод, к которому подключен приемник
decode_results results;
int flag = 0;                // состояние светодиода 0-выкл. 1- вкл. 
long prestroMillis = 0;      // для отчета времени первоночальное значение
void setup() {
  irrecv.enableIRIn();       // запускаем прием
}
void loop() {
  unsigned long curstroMillis = millis();  // устанавливаем время в сейчас
  if ((curstroMillis - prestroMillis) > 200) // проверяем интервал
  {
    if (irrecv.decode(&results)) { // если получаем данные с пульта ДУ
      if (results.value == 0xFF10EF)
        flag = 1;           // вкл. светодиод
      if (results.value == 0xFFFFFFFF) // кнопка зажата
      {
        flag = flag;          // собновляем состояние светодиода
      }
      irrecv.resume();        // принимаем следующую команду
    }
    prestroMillis = curstroMillis; // обнуляем счетчик для нового цикла 
  } 
  else                     // данные не поступают с пульта ДУ 
  flag = 0;                // выключаем светодиод
 digitalWrite( 13, flag );
}

Возникли вопросы. Пишите в комментарии.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Светофор на Digispark и адресных светодиодах WS2812 — Ардуино светофор http://portal-pk.ru/news/155-svetofor-na-digispark-i-adresnyh-svetodiodah-ws2812-arduino.html Константин Portal-PK 2018-07-27T08:54:02+03:00 В предыдущей статье: « Неудачныепроекты Arduino светильников и светофора» я уже рассказывал про разработку светофора и о том что у меня не получилось сделать его полностью функциональным и работоспособным. Спустя пару недель я доработал его и теперь готов представить самодельный светофор на Ардуино и адресных светодиодах WS2812.

Все заготовки для корпуса выпилил на своем самодельном ЧПУ станке .

аготовки для корпуса выпилил на своем самодельном ЧПУ станке

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

Схема подключения очень простая это вам не ктп трансформаторная подстанция.

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

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

 демонстрирую сборку схемы подключения на макетной плате

Светофор готов и что он умеет?

Светофор готов и что он умеет?


Я расширил его функционал и сделал не просто светофор но и ночник, у которого есть режимы:

1. Светофор

2. Смена цветов

3. Радуга

4. Белое свечение.


После сборки данного светофора на Digispark и адресных светодиодах WS2812 прошло больше месяца и я пока не менял батарейки. Не смотря на то что ребенок очень часто играет светофором. Да и гости, не зависимо от возраста готовы посмотреть и поиграть данной самоделкой на Arduino.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Неудачные проекты Arduino светильников и светофора http://portal-pk.ru/news/154-neudachnye-proekty-arduino-svetilnikov-i-svetofora.html Константин Portal-PK 2018-07-26T09:12:08+03:00 Любая разработка приводит к неудачным и промежуточным моделям. Которые не удовлетворяют всем потребностям и ожиданием.

Сегодня я вам расскажу про три моих неудачных проекта светильников на Arduino .


Первый мой проект о котором я хотел бы рассказать это светофор на адресных светодиодах под управлением Digispark — это небольшой борат ардуино, который можно программировать в среде Arduino IDE. Собрал я данный светильник и понял, что данный светофор очень посредственный. Не хватает функционала. И отображения сигнальных огней расплывчато.

светофор на Arduino

Поэтому я сделал вывод, что светофор на Arduino необходимо дорабатывать. И в ближайшее время сделаю новую версию.


Второй проект — это корпус для светильника на Ардуино и адресных светодиодах. В принципе корпус получился неплохой, но тут я столкнулся с двумя проблемами. Первая это нужно сделать рассеиватель. Для этого нужно склеивать 4 кусочка оргстекла или изогнуть оргстекло нужной формы. Что я пока не освоил. Вторая проблема это легкий вес и неустойчивость светильника, что приведет к постоянным падениям и возможны сколам и трещинам на корпусе. Не усиливать углеволокном же корпус. По аналогии, как это делают в строительстве.

корпус для светильника на Ардуино и адресных светодиодах

Пока думаю что можно сделать с данной моделью.


Третий проект - это тоже светильник. Можно сделать его на адресных или обычных светодиодах. Тут не принципиально. Почему данный проект не довел до ума, это опят же проблеме с изготовлением рассеивателя.

 светильник

Обо всем рассказываю подробно в видео.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
ЧПУ станок своими руками на базе arduino. Пошаговая инструкция + видео http://portal-pk.ru/news/153-chpu-stanok-svoimi-rukami-na-baze-arduino-poshagovaya.html Константин Portal-PK 2018-05-08T11:01:56+03:00 Все мои статьи с видео про создание ЧПУ станков на одной странице. Своего рода инструкция.

Данная страница будет пополняться. Не забудьте добавить ее в закладки!

UniversalG-Code Sender программа для управления ЧПУстанком.


Проект №3. самодельный CNC станок из мебельных направляющих на базе Arduino UNO

Получив опыт создания самодельных ЧПУ станков. Определился с какой электроникой мне проще работать. Решил вложить немного денег и сделать фрезерный CNC станок на мебельных направляющих.

Заготовке вырезанные на данном ЧПУ станке можно посмотреть тут......

Готовые проекты сотрите тут...

Комплектующие ЧПУ :

Механика для ЧПУ недорого >>>

Расходные материалы для CNC >>>


Проект №2. Лазерный гравировальный станок с ЧПУ (шаговые двигателя от матричного принтера)

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

Для управления использовал электронику: Arduino UNO + CNCshield v3 + драйвера A4988

Недорогую электронику для ЧПУ можно купить в Китае >>>


Проект №1. Мой первый ЧПУ станок из матричных принтеров (Не удачная версия)

Для проверки своих сил собрал ЧПУ станок из того что было под рукой. Дополнительно затратил денег не больше 3 тыс. руб.

Станок работал. Но работа была не очень хорошего качества и было много ограничений по функционалу. Но что можно ожидать от CNC станка за 3 000 руб.

Для сборки ЧПУ станка из деталей от принтера были использовано:

  1. 3 Матричных принтера формата А3.
  2. Мебельные направляющие: 2 пары 500 мм. И одна пара на 300 мм.
  3. Доска 25х100, брусок 25х25, фанера толщиной 8 мм.
  4. Блок питания от компьютера.
  5. Arduino NANO
  6. Драйвера L298 4 шт.
  7. Строительные и мебельные уголки.
  8. Саморезы, винты, гайки и шпилька М10.
  9. Телефонные провода, провода из компьютера.
  10. Переменный резистор из автомобиля.
  11. Двигатель от автомобильного компрессора.
  12. Шаговый двигатель от сканера .
  13. Латунная цанга.

Недорогие ЧПУ станки>>>

]]>
Universal G-Code Sender программа для управления ЧПУ станком. http://portal-pk.ru/news/152-universal-g-code-sender-programma-dlya-upravleniya-chpu-stankom.html Константин Portal-PK 2018-04-20T12:23:51+03:00 Для управления ЧПУ станками используется G-Code.
G-Code - это язык программирования, используемый для отправки команд на станки с ЧПУ (числовое программное управление).

Universal G-Code Sender можно с качать отсюда.
Основным преимуществом является то, что Universal G-code Sender может работать на разных настольных платформах, таких как Windows, OS X, Linux и даже Raspberry Pi.
Для работы Universal G-code Sender необходимо устоновить Java:

  • Java 7 или выше — для Universal G-code Sender 1.0.8 и более ранних
  • Java 8 или выше - для Universal G-code Sender 1.0.9 и 2.0

Если у вас не установлена Java, качаем и устанавливаем ее отсюда.
Как установить Java 8 в Ubuntu читайте тут.
Очень частый вопрос который мен задают: «Нет файла ***.exe как запустить приложение?» В Windows есть и другие исполняемых файлы. Один из которых ***.bat.
Для запуска программы в Windows запускаем "start-windows.bat", в Linux запускаем "start.sh".

Для того чтобы подключить программу к станку нужно:

  • Выбрали порт - у меня COM4
  • Скорость - 115200
  • Нажали кнопку "Open"

Universal G-code Sender

Увидели надпись **** Connected to COM4 @ 115200 baud **** - у нас все работает. Обратите внимание, что в Arduino должна быть загружена прошивка GRBL. В противном случае ни чего не получаться.

Следующий распространенный вопрос: «У меня на английском. Где взять русскую версию?» В Universal G-code Sender встроенны несколько языковых пакетов в том числе и Русский. Заходим в настройки и переключаем на русский.

Universal G-code Sender встроенны несколько языковых пакетов в том числе и Русский

Universal G-Code Sender можно с качать отсюда
В закладке "Консоль" - в консоли пишем команду G1 X10 Y10 F300 - наши моторы крутятся.
В закладке "Упровления осями", можно управлять осями через кнопки.
Можно загрузить GCODE файл, для этого нажмите на кнопку "Обзор" - указываем GCODE файл.


Как я создавал Свой самодельный ЧПУ станок можете посмотреть тут:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

Купить Комплектующие для ЧПУ или готовый ЧПУ станок. можно недорого в Китае:


Во второй версии Universal G-code Sender ветка UGS Platform. Тут все немного по другому.

Во второй версии Universal G-code Sender ветка UGS Platform
Для запуска программы вам нужно зайти в папку bin. В Windows запускаем "ugsplatform.exe" и "ugsplatform64.exe" для 64-битной ОС, в Linux и MAC OS запускаем "ugsplatform".
Для работы данной версии требуется Java 8 или выше.
Интерфейс тут отличается. Для смены языка на русский преходим Tools→Options. В вкладе UGS, вбираем вкладку Sender Options. Тут уже меняем язык.

Для смены языка на русский преходим Tools→Options. В вкладе UGS, вбираем вкладку Sender Options


Вот так выглядит окно 3D-вида заготовки для фрезерования.

3D-вида заготовки для фрезерования
Со второй версией работать немного проще и функция больше. Поэтому я рекомендую начинать сразу с нее. Но что выберете вы это уже ваше решение.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Подсветка на Arduino и ws2812 - На новый год http://portal-pk.ru/news/151-podsvetka-na-arduino-i-ws2812---na-novyi-god.html Константин Portal-PK 2018-04-05T12:25:10+03:00 Перед новым годом делал подсветку на Arduino и адресных светодиодах ws2812. Если вы постоянно читаете новости в группе проекта и на сайте, то вы наверное в курсе про основные этапы сборки данной подсветки. Если нет, то я вам расскажу.
Первое что я сделал это. Для этого я воспользовался своим самодельным фрезерным станком с ЧПУ.

вырезал заготовки для корпуса под электронику

 самодельным фрезерным станком с ЧПУ

Ручка для потенциометра вырезанная на ЧПУ

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

Склеил корпус для электроники

корпус для электроники


Для гирлянды я использовал следующую электронику:
1. Управляет всем -Arduino UNO
2. Тактовые кнопки переключают режимы.
3. Потенциометр регулирует яркость.
4. Светодиоды ws2812, но проще использовать светодиодную ленту ws2812. Но у меня ее не было под рукой.
5. Блок питания 5В 2А.
6. ЖК-дисплей 1602 16x2 с I2C модулем
7. Провода.

На все комплектующие которые я покупаю и мне они нравятся по соотношению цена и качество, я делаю закладки: Ардуино и все для проектов на Arduino, Комплектующие для ЧПУ и ЧПУ станки.
Подсветка выглядит вот так:

Подсветка выглядит вот так

Подсветка выглядит вот так
Получилось больше 30 режимов, регулирование яркости и вывод данной информации на дисплей. Достаточна приличная подсветка получилась.
Закрепил я ее под потолок, тем более у меня угол под потолком овальной формы. И свет очень красиво рассеивается по радиусу. На фото конечно не очень понятно и не передает всей красоты, тем более фотографировал днем.

свет очень красиво рассеивается по радиусу

Конечно из светодиодной ленты получилось бы намного ярче


Конечно из светодиодной ленты получилось бы намного ярче, равномернее и симпатичнее. Наследующий год так и сделаю. Так что не пропусти. Добавь сайт в закладки!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
NodeMcu Motor Shield. Описание и тестовый Скетч http://portal-pk.ru/news/150-nodemcu-motor-shield-opisanie-i-testovyi-sketch.html Константин Portal-PK 2018-04-03T09:07:25+03:00 Купил для NodeMcu Motor Shield. При покупке шилда будьте внимательны он совместим только с версией nodemcu amica. На картинке слева.

версией nodemcu amicaЕсли вы не знаете как прошить NodeMCU читайте: Чтотакое NodeMCU? Программируем в среде ArduinoIDE

Motor Shield Состоит из следующих элементов.

Motor Shield Состоит из следующих элементов

Колодка GPIO рассчитаны для подключения сервоприводов. Данную колодку я использовал в своем проекте на ESP8266: Манипуляторсвоими руками из фанеры

Данная колодка очень удобна и для подключении различной периферии .

Шилд еще оснащен драйвером L293DD. Благодаря чему к Motor Shield можно подключить 2 двигателя постоянного тока с напряжением до 36 В. Для работы драйвера необходимо подать питания на клеммы motor power. Первый двигатель подключается к колодке motor A, второй к motor B.

Распиновка и основные характеристики драйвера L293DD с лева на картинке.

 драйвера L293DD с лева на картинке

Справа L293D версия с 16 ногами у L293DD 20 ног. Прикладываю Даташит для данных драйверов L293DD.pdf.

Подключаем двигателя и питание к Motor Shield вот по такой схеме.

Подключаем двигателя и питание к Motor Shield вот по такой схеме


Может кому прегодиться файл Motor Shield для Fritzing ESP12E Motor Shield.fzpz

Для проверки работоспособности драйвера можно использовать вот этот скетч.

#define PIN_D1 5  // gpio5 = D1  PWM_A
#define PIN_D2 4  // gpio4 = D2  PWM_B
#define PIN_D3 0  // gpio0 = D3  DA (A- A+) подключается двигатель 
#define PIN_D4 2  // gpio2 = D4  DB (B- B+) подключается двигатель

void setup() 
   {
    pinMode(PIN_D1, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D2, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D3, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D4, OUTPUT); // инициализируем Pin как выход
   }

void loop()
{
  digitalWrite(PIN_D1, HIGH);   // PWM_A HIGH
  digitalWrite(PIN_D3, HIGH);   // DA HIGH
  delay(2000);                  // wait 
  digitalWrite(PIN_D3, LOW);    // DA LOW
  delay(2000);                  // wait
  digitalWrite(PIN_D2, HIGH);   // PWM_B HIGH, изменяется направление вращения двигателя на контактах (B- B+)
  digitalWrite(PIN_D4, HIGH);   // DB HIGH
  delay(2000);                  // wait 
  digitalWrite(PIN_D4, LOW);    // DB LOW
  delay(2000);                  // wait 
  digitalWrite(PIN_D2, LOW);    // PWM_B LOW

 }

Данная программа будет поочередно вращать двигателями . Если у вас по каким то причинам двигателя не вращаются проверьте правильность подключения. Если все правильно то скорее всего у вас бракованный шилд . Это достаточно распространенная ситуация . Пишите продавцу и просите возврат деньги.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Классные самодельные настенные светодиодные часы на arduino http://portal-pk.ru/news/149-klassnye-samodelnye-nastennye-svetodiodnye-chasy-na.html Константин Portal-PK 2018-03-22T13:39:54+03:00 Как вы знаете это мои вторые часы на Arduino и светодиодах. Если вы не вкурсе, посмотрите мой первый проект часов можете тут: Arduinoчасы - Видео 4. Делаем корпус и собираемArduino часы

Первые часы на Ардуино я дела все руками и у меня было мало опыта в программировании микроконтроллеров. Хотя это было буквально год назад. Сейчас у меня есть самодельный ЧПУ станок с помощью которого я вырезал все заготовки корпуса для часов .

заготовки корпуса для часов

заготовки корпуса для часов

Светодиоды не стал использовать обычные. Из предыдущего проекта, я усвоил урок. Паять нужно очень много и отладка занимает очень много времени. Поэтому я взял адресные светодиоды WS2812. Для управления данными светодиодами достаточно спаять их последовательно и пропоят к одному пину Arduino.

Для настройки часов я установил 2 кнопки. С помощью которых можно менять цветовые режимы часов, за это отвечает правая кнопка. При нажатии левой кнопки можно настраивать:

  • одно нажатие - настройка часов;
  • второе нажатие - настройка минут;
  • третье нажатие — настройка яркости часов.

Если не выйти из режима настроеки, часы автоматически переходят в рабочий режим через 30 секунд.

Комплектующие для часов покупал тут:

  1. Arduino NANO
  2. Адресные светодиоды WS2812
  3. Модуль реального времени DS1307. В первой версии использовал модуль DS3231SN
  4. Кнопки

Также в часах есть замечательный режим. Когда время ровно 1,2,3 и т. д. По минутным светодиодам бежит светодиод . Данное действия очень хорошо видно и даже боковым зрением можно заметить что время ровно, а вот столько часов, нужно будет посмотреть на часы.


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

Пару фото часов на arduino и адресных светодиодах WS2812

фото часов на arduino и адресных светодиодах WS2812

фото часов на arduino

фото часов на arduino и адресных светодиодах

фото на адресных светодиодах WS2812

фото часов на arduino и светодиодах

Это не последняя версия часов. У меня есть еще с пяток идей. Жду комплектующие из Китая. Так что не пропусти. Добавь сайт в закладки!


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Очередной проект на Digispark и адресных светодиодах WS2812. Работа ЧПУ http://portal-pk.ru/news/148-ocherednoi-proekt-na-digispark-i-adresnyh-svetodiodah-ws2812.html Константин Portal-PK 2018-03-16T11:36:07+03:00 Небольшой проект на Digispark и адресных светодиодах WS2812, но при этом достаточно симпатичный.
Сегодня я расскажу как я собирал очередной светильник.
На своем самодельном фрезерном станке с ЧПУ я вырезал заготовки для светильника. В группе ВК я уже выкладывал фото заготовок, с вопросом, что я такое делаю. Ответы были но все неправильные.

заготовки для светильника

заготовки для светильника


Схема подключения Digispark и адресных светодиодов WS2812 аналогично предыдущему проекту: Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

Схема подключения Digispark и адресных светодиодов WS2812
В итоге получается вот такой светильник.

Конечно фото и видео не передает всей красоты и яркости. Но тоже выглядит неплохо.

две версии светильников на Digispark и адресных светодиодах WS2812

светильник на Digispark и адресных светодиодах WS2812

на Digispark и адресных светодиодах WS2812

две версии светильников

две версии светильников на Digispark и адресных светодиодах WS2812

две версии светильников на Digispark

две версии светильников на Digispark и адресных светодиодах WS2812

светильникна Digispark
Как вы поняли сделал я две версии светильников на Digispark и адресных светодиодах WS2812. С восьмигранным основанием достаточно функциональный и красивый.
Но судить вам . Пишите в комментариях ваши мнения.

В планах сделать светильник с пультом ДУ и с Wi-fi управлением. Что получиться у меня смотрите на канале и читайте на сайте.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 5 - Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote http://portal-pk.ru/news/147-urok-4---upravlenie-arduino-s-pomoshchyu-pulta-du-ir.html Константин Portal-PK 2018-03-13T12:38:02+03:00

При создании проектов на Arduino. Часто возникает вопрос, с помощью чего управлять проектом. И желательно на расстоянии. Кнопки уже не модно.

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

Для урока я буду использовать вот такой набор и Arduino UNO.

 пульт с IR приемником

Купить пульт с IR приемником всего за 100 руб. можно тут.

Приемники могут быть распаянные как в моем случае.

IR приемником

IR приемником

И вот такого плана.

IR приемникомIR приемником

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

Подключаем IR к Arduino UNO вот по такой схеме

Подключаем к Arduino UNO вот по такой схеме. К другим Ардуинкам подключается аналогично.

Для работы нам понадобиться библиотека IRremote. Скачать ее можно тут.

С библиотекой устанавливается ряд примеров. Нам понадобиться IrrecvDemo.

IrrecvDemo

IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

После того как скетч загружен и IR приемник подключен можно проверить какой код соответствует той или иной кнопке пульта ДУ. Поднажимайте на кнопки и в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее.

;FF18E7
FFFFFFFF
FFA857
FF02FD
FF18E7
FF38C7
FF4AB5
FF5AA5
FF10EF
FF5AA5
FFFFFFFF
FF10EF
FF5AA5

 в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее

У вас возник наверное вопрос что за повторяющая команда FFFFFFFF. Это команда выводиться когда вы долго удерживаете кнопку на пульте и на Ардуино приходить одинаковая команда. В этом нет ни чего страшного, а иногда это даже полезно. На основе данной команды я сделал управление машинкой с помощью пульта ДУ. При этом машинка едет только тогда, когда нажата кнопка пульта. Отпускаем и машина перестает ехать и поворачивать.

Само простое, чем можно управлять это включение и выключения встроенного светодиода на плату Arduino при помощи пульта дистанционного управления и инфракрасного приемника.

Схема подключения как и в примере выше. Коды кнопок моего пульта:

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево

У вашего пульта команды будут другие. Код получается вот такой.

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево
#include "IRremote.h"
IRrecv irrecv(11); // указываем вывод, к которому подключен приемник
decode_results results;
void setup() {
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFF10EF:
        digitalWrite( 13, HIGH );
        break;
    case 0xFF5AA5:
        digitalWrite( 13, LOW );
        break;
    }    
    irrecv.resume(); // принимаем следующую команду
  }
  delay(100);
}

Вот так можно легко научить вашу Arduinо понимать команды с пульта.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Основы программирования Digispark в среде Arduino IDE. Модели A и B http://portal-pk.ru/news/146-osnovy-programmirovaniya-digispark-v-srede-arduino-ide.html Константин Portal-PK 2018-03-05T11:15:36+03:00 Сделал я пару проектов на Digispark :
1. Как сделать самодельный пистолет из Digispark и сломанной игрушки
2. Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

И меня засыпали вопросами: Чем отличается от Arduino? Как написать скетч в среде Arduino IDE для Digispark? И пр.

И я решил сделать небольшую заметки для вас и если я что то забуду, можно будет подсмотреть.
Обратите внимание Digispark есть 2 модели А и В. Но нет ни одной статьи чтобы было описаны модели А, а это В.
Но я опытным путем выявил что, это: модель Digispark А

модель Digispark А


Digispark модель В

Digispark модель В



Если я ошибаюсь обязательно напишите в комментарии.


Характеристики Digispark:

  • Поддержка Arduino IDE 1.0 и более поздних (OS X, Windows и Linux)
  • Питание от USB или внешнего источника - 5 В или 7-35 V (автоматический выбор)
  • Регулятор на 5В 500мА
  • Встроенный USB
  • 6 портов ввода / вывода (2 используются для USB, только если ваша программа активно общается по USB, в противном случае вы можете использовать все 6, даже если вы программируете с помощью USB)
  • 8KB флэш-памяти (около 6КБ с загрузчиком)
  • I²C и SPI интерфейс
  • PWM на 3 вывода (больше ШИМ выходов можно обеспечить программным способом)
  • сделан на базе ATtiny85-20SU микроконтроллера

Характеристики Digispark


Все выводы могут быть использованы в качестве цифровых входов/выходов:
Pin 0 → I2C SDA, PWM (LED on Model B)
Pin 1 → PWM (LED on Model A)
Pin 2 → I2C SCK, Analog
Pin 3 → Аналоговый вход (Занят контактом USB+, в случае использования USD)
Pin 4 → PWM (Занят контактом USB-, в случае использования USD)
Pin 5 → Аналоговый вход

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

Но не смотря на все плюсы Digispark все же отличается от Arduino. Вот список некоторых различий, которые стоит учитывать при проектировании или устранении неполадок:
1. Digispark сделан базе Attiny85 у которго есть много отличий от ATmega328 Arduino, и некоторые библиотеки могут работать некорректно на нем.
2. У Digispark имеется только около 6 КБ флэш-памяти для хранения вашего кода.
3. Контакт 3 и контакт 4 (P3 и P4) используются для связи через USB и программирования. Поэтому использовать данные пины при программировании нельзя. Их можно пользовать, когда у вас отключен USB.
4. Контакт 3 (P3) к нему подключен нагрузочный резистор 1,5 кОм, который требуется, когда P3 и P4 используются для связи через USB. Вам возможно потребоваться учесть данный факт при работе с данным пином.
5. Digispark не имеет аппаратного последовательного порта или аппаратного последовательного интерфейса к USB-конвертеру.

Пример использования цифрового выхода.
Все контакты способны к цифровому выходу, хотя P5 составляет 3 В при HIGH вместо 5 В.
0 - P0, 1 - P1, 2 - P2 и т. д. - обозначение пинов в программе.

void setup() {
    //All pins are capable of Digital output, though P5 is 3 V at HIGH instead of 5 V
    pinMode(0, OUTPUT); //0 is P0, 1 is P1, 2 is P2, etc. - unlike the analog inputs, for digital outputs the pin number matches.
}
void loop() {
    digitalWrite(0,HIGH); //Turn the pin HIGH (5 V)
    delay(1000);
    digitalWrite(0,LOW); //Turn the pin LOW (GND)
    delay(1000);
}

Пример использования цифрового входа (чтение).
ПРИМЕЧАНИЕ. Внутренний нагрузочный резистор (включается при вызове digitalWrite (0) после установки вывода на вывод, где 0 - номер штыря) намного слабее (около 25 кОм) на ATtiny, чем на Arduino, поэтому бортовой светодиод может помешает. Если они вам нужен, вы можете использовать другой порт. Измените схему, чтобы не требовалось внутреннее подтягивание, или вырезать светодиодную дорожку. Для модели A это пин P1 для модели B, это ппин P0.

int sensorValue = 0;

void setup() {
    //All pins are capable of digital input.
    pinMode(0, INPUT); //0 is P0, 1 is P1, 2 is P2, etc. - unlike the analog inputs, for digital inputs the pin number matches.
}
void loop() {
    sensorValue = digitalRead(1); //Returns HIGH or LOW (true or false / 1 or 0).
}

Пример аналогового чтения
Буте внимательны при аналоговом чтении, номера пинов отличаются от нумерации на плате. Например: P2 - аналоговый вход 1. Остальные смотрите в коде ниже.

int sensorValue = 0;

void setup() {
    //You need not set pin mode for analogRead - though if you have set the pin to
    //output and later want to read from it then you need to set pinMode(0,INPUT);
    //where 0 is the physical pin number not the analog input number.
    //
    //See below for the proper pinMode statement to go with each analog read.
}
void loop() {
    // The analog pins are referenced by their analog port number, not their pin
    //number and are as follows:

    sensorValue = analogRead(1); //Read P2
    //To set to input: pinMode(2, INPUT);
    //THIS IS P2, P2 is analog input 1, so when you are using analog read, you refer to it as 1.

    //sensorValue = analogRead(2); //Read P4
    //To set to input: pinMode(4, INPUT);
    //THIS IS P4, P4 is analog input 2, so when you are using analog read, you refer to it as 2.

    //sensorValue = analogRead(3); //Read P3
    //To set to input: pinMode(3, INPUT);
    //THIS IS P3, P3 is analog input 3, so when you are using analog read, you refer to it as 3.

    //sensorValue = analogRead(0); //Read P5
    //To set to input: pinMode(5, INPUT);
    //THIS IS P5, P5 is analog input 0, so when you are using analog read, you refer to it as 0.
}

Аналоговый выход
Тут все проще 0 - P0, 1 - P1, 4 - P4 - в отличие от аналоговых входов, для аналоговых (PWM) выходов номер штыря соответствует номеру порта.

void setup() {
    //P0, P1, and P4 are capable of hardware PWM (analogWrite).
    pinMode(0, OUTPUT); //0 is P0, 1 is P1, 4 is P4 - unlike the analog inputs, 
                        //for analog (PWM) outputs the pin number matches the port number.
}
void loop() {
    analogWrite(0,255); //Turn the pin on full (100%)
    delay(1000);
    analogWrite(0,128); //Turn the pin on half (50%)
    delay(1000);
    analogWrite(0,0);   //Turn the pin off (0%)
    delay(1000);
}

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты. http://portal-pk.ru/news/145-menyaem-arduino-na-digispark-v-svetilnike-na-ws2812.html Константин Portal-PK 2018-02-15T13:45:25+03:00 В интернете много проектов на Digispark, но светильника на адресных светодиодах с переключением режимов и регулированием яркости, на подобии моего светильника который я делал на Arduino, нет. Поэтому я решил переделать свой ночник на светодиодах ws2812 под управлением Arduino NANO.

Взял пример кода который устанавливаться с библиотекой Adafruit_NeoPixel проекта на Digispark .

#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.
#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 16
// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = HIGH;
int showType = 0;
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }
  // Set the last button state to the old state.
  oldState = newState;
}
void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
            break;
    case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
            break;
    case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
            break;
    case 7: rainbow(20);
            break;
    case 8: rainbowCycle(20);
            break;
    case 9: theaterChaseRainbow(50);
            break;
  }
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}
void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
        delay(wait);
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

Данный код хорошо работает на Arduino Но вот Digispark отказывается переключать режимы и происходит так называемое залипание. Но я не привык сдаваться и после не долгового анализа я понял в чем дела. Переписал код.

 // Код будет доступен когда к видео на канале будет больше 100 лайков. Это связанно с тем, что я потратил достаточно много времени на
// поиск проблемы и изменение кода.

Схема подключения светодиодов ws2812 к Digispark выгладит вот так.

Схема подключения светодиодов ws2812 к Digispark

К кнопкам подключил подтягивающие резисторы.

Фото моего светильника на Digispark и светодиодах ws2812 .

светильника на Digispark и светодиодах ws281

светильника на Digispark

Digispark и светодиодах ws2812

Есть идеи сделать Wi-fi светильник, но посмотрим как будет время и желание. Ваша активность на прямую влияет на мое желание. Не забывайте про это!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Манипулятор своими руками из фанеры http://portal-pk.ru/news/144-manipulyator-svoimi-rukami-iz-fanery.html Константин Portal-PK 2018-02-13T13:13:34+03:00 Как вы знаете сделал я самодельный ЧПУ фрезерный станок. Входе обучения работы на нем я делаю различные поделки и механизмы. Нашел в интернете исходные файлы (MeArmV03.svg) для манипулятора и решил вырезать его на ЧПУ станке.

 исходные файлы для манипулятора и решил вырезать его на ЧПУ станке

Я думал что с первого раза у меня ни чего не получиться. Так как это достаточно сложная работа для ЧПУ и очень много мелких деталей.

ЧПУ резал больше часа и вырезал все детали. Провел небольшую доработку с помощью надфиля. Собрал на винтики манипулятор. Кстати в интернете много инструкций, от текстовых до видео по сборке манипулятора.

И Вот что у меня получилось. Достаточно не плохо на мой взгляд.

Серо-приводы установлены, Манипулятор собран. Но как проверить его работоспособность. Поискал в интернете примеров не дал результатов и тогда я решил набросать небольшой пример кода для NodeMCU. Тем более у меня лежал без дела шилд для данной отладочной платы.

монипулятор на NodeMCU

Код получился не очень красивый но для проверки достаточно.

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h> 

#include <RemoteXY.h> 

// настройки соединения  
#define REMOTEXY_WIFI_SSID "portalpk" 
#define REMOTEXY_WIFI_PASSWORD "" 
#define REMOTEXY_SERVER_PORT 6377 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,4,0,0,0,31,0,6,5,0,
  4,128,48,50,42,9,4,4,0,6,
  12,9,36,2,4,0,85,11,9,37,
  2,4,128,8,4,42,9,4 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  int8_t slider_1; // =0..100 положение слайдера 
  int8_t slider_2; // =0..100 положение слайдера 
  int8_t slider_3; // =0..100 положение слайдера 
  int8_t slider_4; // =0..100 положение слайдера 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 


///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 
#include <Servo.h> 
#define PIN_SERVO1 D1
#define PIN_SERVO2 D2
#define PIN_SERVO3 D3
#define PIN_SERVO4 D4
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;



void setup()  
{ 
  RemoteXY_Init ();  
   
  // TODO you setup code  
  RemoteXY.slider_1 = 50;  
  RemoteXY.slider_2 = 50; 
  RemoteXY.slider_3 = 50; 
  RemoteXY.slider_4 = 50; 
  servo1.attach(PIN_SERVO1);
  servo2.attach(PIN_SERVO2);
  servo3.attach(PIN_SERVO3);
  servo4.attach(PIN_SERVO4);

   
} 

void loop()  
{  
  RemoteXY_Handler (); 
   
   
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 
  int ms = RemoteXY.slider_1*20+500;  
  servo1.writeMicroseconds(ms);  

    int ms2 = RemoteXY.slider_2*10+500;  
  servo2.writeMicroseconds(ms2);  

    int ms3 = RemoteXY.slider_3*10+500;  
  servo3.writeMicroseconds(ms3);  

    int ms4 = RemoteXY.slider_4*10+500;  
  servo4.writeMicroseconds(ms4);  

}

Вам скорее всего нужно будет изменить начальные угол для серо-приводов.

Тестирования самодельного манипулятора показал

NodeMCU

руки-манипулятора

Тестирования самодельного манипулятора показал , что все работает но скорее всего не достаточно питания от одного аккумулятора 18650. И происходить перезагрузка NodeMCU.


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

]]>
Inkscape где скачать русскую версию. Настройка Inkscape http://portal-pk.ru/news/143-inkscape-gde-skachat-russkuyu-versiyu-nastroika-inkscape.html Константин Portal-PK 2018-02-08T18:21:04+03:00 Мне часто задают вопрос с помощью какой программы я создаю G-Code для своего самодельного ЧПУ станка. Поэтому я решил снять небольшой курс по созданию G-Code для ЧПУ станков. В данном курсе расскажу какими программами пользуюсь я и какие сервисы мне помогают в этом деле.

И начну я с программы Inkscape. Как не странно но найти официальный сайт данной программы найти в поисковике не получается. Поэтому я снял видео как скачать данную программу.

Я скачиваю данную программу с официального сайта: inkscape.org.

с официального сайта: inkscape.org.

В разделе Download.

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

В видео рассказываю подробно как настроить Inkscape для начала работы

В Inkscape есть вспомогательные линии как в Компас 3D. Данный инструмент помогает упростить работу при создании чертежей. Хотя данная программа не предназначена для черчения чертежей.

В следующем видео расскажу как нарисовать простые детали и сделать G-Code.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Как сделать самодельный пистолет из Digispark и сломанной игрушки http://portal-pk.ru/news/142-kak-sdelat-samodelnyi-pistolet-iz-digispark-i-slomochnoi.html Константин Portal-PK 2018-01-31T14:21:08+03:00 При большом изобилии пластиковых игрушек, современные дети не ценят их. В следствии чего игрушки очень быстро надоедают или их просто ломают. У моего ребенка есть с пяток пистолетов из которых он играет одним.
Взял я один из таких пистолетов и решил его переделать. Для переделки мне понадобились:


1. Digispark
2. Светодиоды
3. резисторы 220 Ом
4. бокс под батарейки
5. Выключатель
6. конечный выключатель от старого принтера можно использовать и такой
7. компьютерный спикер
8. батарейки
9. провода


В общим из старых вещей и недорогих комплектующих из Китая на сумму 120 руб. (это мои затраты ваши могут быть другими) получилась интерактивная игрушка.

Корпус пистолета пришлось доработать. Удалил все лишние перегородки и выпилил отверстие для выключателя. Выключатель нужен для выключения пистолета когда ребенок не будет играть. Это сэкономит заряд батареек. Можно конечно выпоят с Digispark светодиод питания и при бездействии переводит в режим ожидания. Но я пока не очень хорошо освоил данную отладочную плату.

Все собрал по схеме:

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



Скетч для пистолета на Digispark

int led_0 = 0; // пин подключения Led1
int led_1 = 1; // пин подключения Led2
int led_2 = 2; // пин подключения Led3
const int buttonPin = 3;      // номер входа, подключенный к кнопке
int soundPin = 4; // объявляем переменную с номером пина спикера 
// переменные 
int flag = 0; // флаг Led
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
void setup()  { 
  //выводs на выход
  pinMode(led_0, OUTPUT);
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
    // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT_PULLUP); 
  pinMode(soundPin, OUTPUT); //объявляем пин как выход.  
} 
void loop()  { 
 boolean current = digitalRead (buttonPin); // считываем данные с кнопки
 if(current)
 {
   for (int x=0; x<6; x++) { // цикл 6 проходов
    if(flag > 3)
      flag = 0;
    if (open) // если true
        digitalWrite(flag, HIGH); 
    else // иначе
      digitalWrite(flag, LOW); 
    delay(interval[x]); // Ждем 
     if (x == 5) // если последний проход по циклу
        flag++; // передаем слово (меняем текущий пин) 
    open = !open; //меняем false на true и наоборот;
   if(open)
    tone(soundPin, 500); // включаем звук частотой 500 Гц 
    else
    tone(soundPin, 100); // включаем звук частотой 100 Гц  
   }  
 }
 else
 noTone(soundPin); // выключаем звук                    
}

Ребенок радостно играл примерно дней 5, не выпуская пистолет из рук. И тут он решил взять его в детский садик. И всего один день в садике превратил его вот в это:

И тут он решил взять его в детский садик. И всего один день в садике превратил его вот в это

Что в садике с ним сделали? Как там играют?


Что в садике с ним сделали? Как там играют? Вроде бы в садике игрушки тоже пластиковые и при этом целые.
По просьбе ребенка пистолет я восстановил. И он продолжает радовать ребенка.


Минутка программирования в Arduino IDE

А вы используете конструкцию:

if (условие 1)
{
  // выполнять действие A
}
else if (условие 2)
{
  // выполнять действие B
}
else
{
  // выполнять действие  C
}

Минутка программирования в Arduino IDE

Пишите ваши примеры.
Мой ответ будет в следующей статье.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный станок с ЧПУ цена. Калькуляция стоимости фрезерного станка http://portal-pk.ru/news/141-samodelnyi-stanok-s-chpu-cena-kalkulyaciya-stoimosti.html Константин Portal-PK 2018-01-23T13:06:29+03:00 Если вы не увлекаетесь изготовлением изделий из дерева, пластика и пр. Но вас наверняка не раз посещают мысль. А какая цена фрезерного ЧПУ станка ? И дешевле сделать самодельный станок с ЧПУ или купить?

Я собрал самодельный фрезерный станок с ЧПУ. Вот все этапы сборки и настройки:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

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

На сайте есть раздел, где я делаю закладки на материалы которые я покупал для ЧПУ.

Цена ЧПУ станка получилась следующая:

Цена ЧПУ станка

Комплектующие для ЧПУ покупал тут:

Средства потраченные на изготовления станка с учетом остатков получатся 6174 руб. Относительно небольшие деньги с учетом полученного результата.

Но я не посчитал стоимость шпинделя. В качестве шпинделя я использую гравер. Также я прикупил Бок питания на 7 А. Так как блок питания от компьютера не очень удобный и я решил его заменить на более компактный.

На дополнительные материалы я потратил:

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

Расходные материалы для ЧПУ станка лучше не учитывать в общую стоимость станка. Но я решил посчитать сколько всего потратил средств до полного запуска станка и небольшую модернизацию.

В итоге я потратил около 9 тыс руб.

Расходные материалы для ЧПУ станка лучше не учитывать

Вы скажете, что за данную сумму можно купить в Китае станок. И не нужно заморачиваться по разработке и сборке!

Во-первых станок прейдет вам в разобранном виде и собирать его все равно нужно.

Во-вторых рабочая область такого станка будет максимуму 200 на 300 мм.

В-третьих в эту стоимость не входят расходные материалы, которые вам нужно будет докупать.

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

Это мое мнение. Возможно у вас другое мнение и опыт поэтому жду ваши комментарии.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Что такое NodeMCU? Программируем в среде Arduino IDE http://portal-pk.ru/news/140-chto-takoe-nodemcu-programmiruem-v-srede-arduino-ide.html Константин Portal-PK 2018-01-19T19:36:45+03:00 NodeMCU это отладочная плат на базе микроконтроллера ESP8266. Основная особенность данных микроконтроллеров наличие Wi-fi на борту. Вы сможете управлять своим проектом через Wi-fi соединения, это упрощает создания радио управляемых моделей. Разработку систем умного дома и пр.

NodeMCU имеет 11 пинов ввода-выводов

Как показано на картинке выше NodeMCU имеет 11 пинов ввода-выводов.

Доп. Назначение пинов:

  • D1–D10 — выходы с ШИМ (PWM)
  • A0 — аналоговый вход с АЦП
  • D9, D10 — UART
  • D1, D2 — I²C/TWI
  • D5–D8 — SPI

Это не очень много по сравнению с той же Arduino NANO у которой 22.

Запитать NodeMCU можно :

  • 5-18 вольт через вывод Vin (согласно параметрам стабилизатора AMS1117-3.3)
  • 5 вольт через вывод VUSB или USB-гнездо
  • 3.3 вольта непосредственно через выводы 3V

Однако мой опыт показывает что при подключении по Vin больше 9 В . Стабилизатор начинает очень сильно греться и через некоторое время начинаются сбои в работе Wi-fi.

На плате установлен ESP-12E, параметры взяты из даташита на ESP-12E:

  • протокол Wi-Fi 802.11 b/n/g
  • частота 2.4 - 2.5 GHz (2400-2483.5 MHz)
  • режим Wi-Fi: точка доступа, клиент
  • защита Wi-Fi: WPA, WPA2
  • шифрование Wi-Fi: WEP, TKIP, AES
  • сетевые протоколы: IPv4, TCP, UDP, HTTP, FTP
  • 80 MHz 32-bit процессор
  • 11 доступных портов ввода/вывода UART, HSPI, I2C, I2S, GPIO, PWM
  • рабочее напряжение 3.0 ... 3.6 вольт
  • максимальная нагрузка на вывод не более 12 mA
  • максимальное потребление модуля 200 mA, среднее 80 mA (подробнее в 11 таблице даташита ESP-12E)
  • рабочая температура -40 ... 125 С

Еще одна особенность данной отладочной платы в том что ее можно программировать в среде Arduino IDE. Для данной платы написано много библиотек и есть много примеров на просторах интернета.

Для того чтобы начать программировать NodeMCU в среде Arduino IDE нужно подготовить срезу разработки.

В пункте меню Фаил → Настройки

программировать NodeMCU в среде Arduino IDE

В поле Дополнительные ссылки для Менеджера плат пишем такую ссылку:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Жмем ОК и переходим в окно менеджера плат:

 менеджер плат Arduino IDE

В самом низу будет нужный нам пакет « esp8266 by ESP8266 Community». Выбираем его и жмем кнопку «Установка».

«esp8266 by ESP8266 Community

Спустя некоторое время пакет скопирует необходимые файлы и в Arduino IDE.

пакет скопирует необходимые файлы и в Arduino IDE

После чего можно будет выбрать нужную нам плату.

Arduino IDE NodeMCU

После чего выбираем порт. В Ubuntu это выгладит так.

После чего выбираем порт. В Ubuntu это выгладит так.

В Windows это com-порт.

Все Сейчас можно загрузить первый скетч. Для примера возьмем ESP8266 Blink из примеров которые устанавливаются при установки платы ESP8266.

/*
 ESP8266 Blink by Simon Peter
 Blink the blue LED on the ESP-01 module
 This example code is in the public domain
 
 The blue LED on the ESP-01 module is connected to GPIO1 
 (which is also the TXD pin; so we cannot use Serial.print() at the same time)
 
 Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
*/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
                                    // but actually the LED is on; this is because 
                                    // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

После загрузки вы увидите мигание синего светодиода на плате NodeMCU

После загрузки вы увидите мигание синего светодиода на плате NodeMCU. Мы научились прошивать данную отладочную плату. Сейчас можно создавать различные проекты на ESP8266.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Модернизация самодельного станка с ЧПУ: выравниваю столешницу и пр. http://portal-pk.ru/news/139-modernizaciya-samodelnogo-stanka-s-chpu-vyravnivayu.html Константин Portal-PK 2018-01-16T12:16:06+03:00 Любая самоделка имеет ряд недочетов и изъянов. Не исключение и мой самодельный фрезерный станок с ЧПУ .

Как я собирал ЧПУ можно посмотреть тут:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

Модернизацию своего самодельного ЧПУ станка я начал с поднятии столешницы и выравнивании поверхности. Вы скажете: «А зачем понимать столешницу? Чем больше высота тем лучше.» Я также думал пока не поработал на станке с ЧПУ . И потом понял что это дополнительные перемещения и люфты. Поэтому я поднял столешницу станка на 50 мм. Сейчас рабочая высота 70 мм. Немного, но это оптимальная высота для фрезерного станка с ЧПУ данного размера.

Выравнивал столешницу в 2 этапа. Так как фрезеровал фрезой всего 3 мм. Одну половину фрезеровал около 2 часов и вторую также. Поэтому чтобы не шокировать соседей и станок не насиловать разбил на 2 этапа.

ыравнивал столешницу в 2 этапа. Так как фрезеровал фрезой всего 3 мм

Выравнивание прошло успешно. Но вот соседям шум не очень понравился. Нет они не жаловались! Просто я выключил станок и было слышно что за передачу они смотрят по телевизору. И тут я понял что нужно уменьшать шум.

роклеил мягким линолеумово все близ лежащие поверхности у гравера

Для уменьшения шума я проклеил мягким линолеумово все близ лежащие поверхности у гравера. Потому что гравер самый главный источник шума.

Шуметь стало немного тише и при этом звук стал менее звонкий. Буду дальше смотреть за реакцией соседей. Надеются, что сейчас не буду им мешать!

Следующее что я сделал, это установил импульсный блок питания о котором рассказываю тут: Дешевыйблок питания на 12 В для ЧПУ из Китая.Делаем корпус

установил импульсный блок питания

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

Вырезал заготовки для спинера

Как видно в видео присадки напряжения не было и при этом элементы блока питания не нагрелись. Поэтому я думаю что смена блока питания прошла успешно. Но буду тестировать и проверять.

Это не все что я хотел изменить в своем самодельном станке с ЧПУ. Буду еще переделывать и исправлять недочеты. Поэтому читайте на сайте Портал-ПК или смотрите на канале на ютюб.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!


]]>
Умный ночник на Arduino и адресных светодиодах WS2811 http://portal-pk.ru/news/138-umnyi-nochnik-na-arduino-i-adresnyh-svetodiodah-ws2811.html Константин Portal-PK 2018-01-15T07:47:12+03:00 В интернете большое количество проектов на Arduino с использованием адресных светодиодов и лент WS2812. Я тоже решил сделать пару проектов на данных замечательных светодиодах WS2811.

При создании проекта были использованный следующие материалы:

1. Адресные светодиоды

2. Arduino Nano

3. Тактовые кнопки

Сделал я вот такой ночник с двумя режимами и регулированием яркости.

Сделал я вот такой ночник на Arduino и ленте  WS2812

Первый режим плавно изменяет цвет светодиодов со сдвигом на один. Второй режим светит обычным белым цветом.

Регулирование яркости изменяет яркость на 20%.

Программа сделана практически на стандартных примерах которые устанавливаются с библиотекой FastLED.

Установить библиотеку FastLED можно из менеджера библиотек.

Установить библиотеку FastLED

Или скачать архив отсюда и установить библиотеку FastLED

Скетч небольшой и прокомментирован.

#include <FastLED.h>

#define LED_PIN     6
byte button_rejim = 2;  // кнопка режим
byte button_yarkast = 3;  // кнопка яркасть
int rejim = 0;       // текущий режим
int yarkast = 100;       // текущая яркасть 
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки

boolean lastButten2 = LOW;     // предыдущее состояние кнопки 2
boolean currentButten2 = LOW;  // текущее состояние кнопки 2

// Information about the LED strip itself
#define NUM_LEDS    15
#define CHIPSET     WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

// How many seconds to show each temperature before switching
#define DISPLAYTIME 20
// How many seconds to show black between switches
#define BLACKTIME   3

void setup() {
  pinMode(button_rejim, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_yarkast, INPUT_PULLUP); // настроить пин кнопки
  //delay( 3000 );
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalSMD5050 );
  
}

boolean debvance (boolean last) //убираем дребизг 1
{
  boolean current = digitalRead (button_yarkast); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (button_yarkast); // Присваеваем текущее состояние кнопки
    return current; 
  }
}

boolean debvance2 (boolean last) //убираем дребизг 2
{
  boolean current = digitalRead (button_rejim); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (button_rejim); // Присваеваем текущее состояние кнопки
    return current; 
  }
}

void loop(){
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    yarkast  = yarkast+50; // увеличиваем яркость 
  }
 lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  if (yarkast > 250)
    yarkast = 0;

  currentButten2 = debvance2 (lastButten2); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten2 == LOW && currentButten2 == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    rejim  = !rejim; // изменяем режим
  }
 lastButten2 =  currentButten2;  // Переприсваеваем прошлое состояние кнопки   

if (rejim)
{
  FastLED.setBrightness( yarkast );
  static uint8_t starthue = 0;
  fill_rainbow( leds, NUM_LEDS, ++starthue, 40);

}
else
{

  static uint8_t hue;
     for(int i = 0; i < NUM_LEDS; i++) {   
      leds[i] = CHSV(0,0,yarkast); 
     }
} 
   FastLED.show();
   FastLED.delay(10);
}

Я думаю вопросов не должно быть. Но если что то не работает пишите будем разбираться.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
ESP8266 ESP-01 светодиодная матрица. Выводим текст через web-интерфейс http://portal-pk.ru/news/137-esp8266-esp-01-delaem-svetodiodnuyu-matricu-vyvodim-tekst.html Константин Portal-PK 2018-01-10T09:51:30+03:00 Нашел пример светодиодной матрицы. Управление которой происходит через web-интерфейс. Достаточно интересная тема. Поэтому решил сделать заметку чтобы не потерять.

Сам не проверял. Да и пока нет возможности проверить. Но мне пригодятся некоторые библиотеки из данного проекта. Ссылка на проект вот тут: ESP8266 ESP-01 - NeoPixel NeoMatrix - Text Scroller.

Необходимые библиотеки можно скачать тут:

Скетч ESP8266 ESP-01 - NeoPixel NeoMatrix - Text Scroller

// Include NeoPixel Specific Libraries
#include <Adafruit_GFX.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_NeoMatrix.h>
// Include ESP Specific Libraries
#include <ESP8266httpUpdate.h>
#include "espneotext.h"
// Define ESP-01 PIN
#define PIN 2
// MATRIX DECLARATION:
// Parameter 1 = width of EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
  // 8x8 (8, 8)
// Parameter 3 = pin number (most are valid)
  // PIN 2
// Parameter 4 = matrix layout flags, add together as needed
// Parameter 5 = pixel type flags, add together as needed:
  // NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
  // NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800
);
// Define Your WiFi Connection Information
const char* WiFi_SSID = "<SSID-HERE>";
const char* WiFi_PASS = "<PASSWORD-HERE>";
// Set Defaults
String dispText;
String dispColor;
int disp = 0;
int pixelsInText;
int x = matrix.width();
const uint16_t colors[] = {
  matrix.Color(255, 0, 0),
  matrix.Color(0, 255, 0),
  matrix.Color(0, 0, 255)
};
// Create an instance of the server and specify the port to listen on as an argument.
WiFiServer server(80);
void setup(){
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(matrix.Color(80,255,0));
  //matrix.setTextColor(colors[0]);
  //Serial.begin(115200); // DEBUG
  delay(10);
  // Connect to WiFi network
  //Serial.println(); // DEBUG
  //Serial.print("Connecting to "); // DEBUG
  //Serial.println(WiFi_SSID); // DEBUG
  WiFi.begin(WiFi_SSID,WiFi_PASS);
  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
    //Serial.print("."); // DEBUG
  }
  //Serial.println(""); // DEBUG
  //Serial.println("WiFi Connected"); // DEBUG
  // Start the server
  server.begin();
  //Serial.println("Server Started"); // DEBUG
  // Print the IP address
  //Serial.println(WiFi.localIP()); // DEBUG
}
void loop(){
  // Check if a client has connected
  WiFiClient client = server.available();
  // Wait until the client sends some data
  if(!client){ return; }
    //Serial.println("Client Connected"); // DEBUG
  // Color Options
  // http://www.javascripter.net/faq/hextorgb.htm
  // Process the Request/GET - Strips out everything in order.
  String command0 = client.readStringUntil('?');
    //Serial.print("Command0: "); // DEBUG
    //Serial.println(command0); // DEBUG
  String allParams = client.readStringUntil(' ');
    //Serial.print("Query Parameter: "); // DEBUG
    //Serial.println(allParams); // DEBUG
  if(allParams.indexOf("line=") >= 0){
    disp = 1; // true
    dispText = allParams.substring(allParams.indexOf("=")+1,allParams.indexOf("&rgb="));
    dispText.replace("+"," ");
    dispText.replace("%20"," ");
    dispText.replace("%21","!");
    dispText.replace("%27","'");
    pixelsInText = (dispText.length() * 7)+8;
      //Serial.print("Scroll Text: ");       // DEBUG
      //Serial.println(dispText);            // DEBUG
    // Set user prefered color
    dispColor = allParams.substring(allParams.indexOf("&rgb=")+5,allParams.length());
      //Serial.print("Scroll Text Color: "); // DEBUG
      //Serial.println(dispColor);           // DEBUG
    // Lame check for any other parameters. Need a better way to do this!
    if(dispColor.indexOf("&") == -1){
      int r = dispColor.substring(0,dispColor.indexOf(",")).toInt();
        //Serial.println(r_val); // DEBUG
      int g = dispColor.substring(int(dispColor.indexOf(","))+1,(dispColor.lastIndexOf(","))).toInt();
        //Serial.println(g_val); // DEBUG
      int b = dispColor.substring(int(dispColor.lastIndexOf(","))+1).toInt();
        //Serial.println(b_val); // DEBUG
      matrix.setTextColor(matrix.Color(r,g,b));
    }
    if(disp){
      while(x + 17 > (matrix.width() - pixelsInText)){
        matrix.fillScreen(0);
        matrix.setCursor(--x, 0);
        matrix.print(dispText);
        matrix.show();
        delay(100);
      }
      x = matrix.width();
    }
    // Display form page again so it's not blank! ------------------
    // Prepare the response
    String resp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    resp += displayPage;
    // Send the response to the client
    while(resp.length()>2000){
      String dummy = resp.substring(0,2000);
      client.print(dummy);
      resp.replace(dummy," ");
    }
    client.flush();
    client.print(resp);
    delay(10);
    // The client will actually be disconnected, when the function returns and 'client' object is destroyed!
    //Serial.println("Client Disconnected!"); // DEBUG
  }else{
    // Display requested form page -----------------------------------
    // Prepare the response
    String resp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    resp += displayPage;
    // Send the response to the client
    while(resp.length()>2000){
      String dummy = resp.substring(0,2000);
      client.print(dummy);
      resp.replace(dummy," ");
    }
    client.flush();
    client.print(resp);
    delay(10);
    // The client will actually be disconnected, when the function returns and 'client' object is destroyed!
    //Serial.println("Client Disconnected!"); // DEBUG
  }
}

Настройка подключения к сети Wi-fi

// Define Your WiFi Connection Information
const char* WiFi_SSID = "<SSID-HERE>";
const char* WiFi_PASS = "<PASSWORD-HERE>";

Пин подключения светодиодов

// Define ESP-01 PIN
#define PIN 2

Настройка светодиодной матрица

// MATRIX DECLARATION:
// Parameter 1 = width of EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
  // 8x8 (8, 8)
// Parameter 3 = pin number (most are valid)
  // PIN 2
// Parameter 4 = matrix layout flags, add together as needed
// Parameter 5 = pixel type flags, add together as needed:
  // NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
  // NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800
);

Подключаем веб интерфейс приложения который находиться в файле #include "espneotext.h"

#ifndef header_h
#define header_h
String displayPage =
"<!DOCTYPE HTML>\r\n"
"<html lang=\"en\">\r\n"
"<head>\r\n"
"  <meta charset=\"utf-8\">\r\n"
"  <meta name='viewport' content='width=device-width'>\r\n"
"  <title>Send Text to ESP-01 / NeoMatrix / v2</title>\r\n"
"  <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet' integrity='sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7' crossorigin='anonymous'>\r\n"
"  <link rel=\"stylesheet\" href=\"https://raw.githubusercontent.com/bgrins/spectrum/master/spectrum.css\">\r\n"
"  <style>#sentMsgs{display:inline-block;margin:0 15px 20px;padding:10px 20px;min-height:60px;background-color:#777;color:lime;border:1px solid gray;clear:both;}.adjust-text{margin:20px 0 0;padding:0 20px;}.clearfix{clear:both;}</style>\r\n"
"</head>\r\n\r\n"
"<body style='background:#EFEFEF;'>\r\n"
"\r\n"
"   <form>\r\n"
"     <div class='col-md-4'>\r\n"
"       <h3>Enter Text to Send on the NeoPixel Matrix: <input type=\"text\" id=\"color-picker\"></h3>\r\n"
"       <div class='input-group'>\r\n"
"         <input type='text' name='line' id='line' class='form-control' maxlength='60'>\r\n"
"         <div class='input-group-btn'>\r\n"
"           <button class='btn btn-default' id='send-text'>Send Text</button>\r\n"
"         </div>\r\n"
"       </div>\r\n"
"     </div>\r\n"
"   </form><br>\r\n\r\n"
"   <div class='col-md-4 adjust-text clearfix'><h4>Messages Sent</h4></div>\r\n"
"   <div id='sentMsgs' class='col-md-4' contentEditable='true'></div>\r\n"
"\r\n"
" <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js\"></script>\r\n"
" <script src=\"https://raw.githubusercontent.com/bgrins/spectrum/master/spectrum.js\"></script>\r\n"
" <script>\r\n"
"   // This will build up a queue and send or just timeout if the messages are too many or the message is too long\r\n"
"   function sendMsg(){\r\n"
"     var line = $('#line');\r\n"
"     var color = '';\r\n"
"     var colorPicker = $('#color-picker');\r\n"
"     var msg = line.val().replace(';','');\r\n"
"     if(colorPicker.val() == ''){ color = '&rgb=80,255,0'; }\r\n"
"     else{ color = '&'+colorPicker.val().replace('(','=').replace(/\\)| /g,''); }\r\n"
"\r\n"
"     var url2Send = '/?line='+msg+color;\r\n"
"     line.val('');\r\n"
"     if(typeof msg !== 'undefined' && msg.trim() !== ''){\r\n"
"       $.ajax({ url: url2Send }).done(function(){ $('#sentMsgs').prepend('Message Sent: '+msg+'<br>\\n\'); console.log('Message Sent: '+msg+' ['+color+']'); });\r\n"
"     }\r\n"
"   }\r\n"
"   $(document).keypress(function(e){ if(e.which === 13){ sendMsg(); e.preventDefault(); } });\r\n"
"   $('#send-text').click(function(e){ sendMsg(); e.preventDefault(); });\r\n"
"   $('#color-picker').spectrum({preferredFormat:'rgb',clickoutFiresChange:true,color:'#50FF00'});\r\n"
" </script>\r\n"
"\r\n"
"</body>\r\n"
"</html>\r\n";
#endif

Если вы все правильно сделали у вас должно получиться вот такой интерфейс

ESP8266 ESP-01 - NeoPixel NeoMatrix

Можно изменить цвет текста

NeoPixel NeoMatrix - Text Scroller

Если у вас выводит на экран только текст проверти, что у вас есть подключения к интернету так как стили https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/cs... https://raw.githubusercontent.com/bgrins/spectrum/... и скрипты https://ajax.googleapis.com/ajax/libs/jquery/2.2.2... https://raw.githubusercontent.com/bgrins/spectrum/... грузятся из интернета. Или скачайте их и загрузите в микроконтроллер. Конечно я не могу гарантировать что для них хватит места в ESP-01.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Digispark подключаем светодиоды ws2812. Программируем в Arduino IDE http://portal-pk.ru/news/136-digispark--na-attiny85-podklyuchaem-adresnye-svetodiody-ws2812.html Константин Portal-PK 2018-01-10T08:20:22+03:00 Купил Digispark на ATtiny85. Установил поддержку платы в Arduino IDE. Так как по умолчанию Digispark не поддерживает. Подключил к компьютеру и залил пробный скетч. Все работает. С установочным пакетом установилось много примеров в том числе и работа с адресными светодиодами.

Подключил светодиоды ws2812 по схеме:

Digispark на ATtiny85 подключаем адресные светодиоды ws2812

Проверил из всех примеров у меня заработок всего один.

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN            0
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      1
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);
int delayval = 500; // delay for half a second
void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
}
void loop() {
  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
  for(int i=0;i<NUMPIXELS;i++){
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.
    pixels.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).
  }
}

Библиотеку NeoPixel устанавливать не нужно. Она устанавливается с примерами для Digispark.

Поискал в интернете и нашел неплохой пример мигания светодиодами как на дискотеке

#include <Adafruit_NeoPixel.h>
// set to pin connected to data input of WS8212 (NeoPixel) strip
#define PIN         0
// any pin with analog input (used to initialize random number generator)
#define RNDPIN      2
// number of LEDs (NeoPixels) in your strip
// (please note that you need 3 bytes of RAM available for each pixel)
#define NUMPIXELS   60
// max LED brightness (1 to 255) – start with low values!
// (please note that high brightness requires a LOT of power)
#define BRIGHTNESS  50
// increase to get narrow spots, decrease to get wider spots
#define FOCUS       65
// decrease to speed up, increase to slow down (it's not a delay actually)
#define DELAY       5000
// set to 1 to display FPS rate
#define DEBUG       0
// if true, wrap color wave over the edge (used for circular stripes)
#define WRAP        1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// we have 3 color spots (reg, green, blue) oscillating along the strip with different speeds
float spdr, spdg, spdb;
float offset;
#if DEBUG
// track fps rate
long nextms = 0;
int pfps = 0, fps = 0;
#endif
// the real exponent function is too slow, so I created an approximation (only for x < 0)
float myexp(float x) {
  return (1.0/(1.0-(0.634-1.344*x)*x));
}
void setup() {
  // initialize pseudo-random number generator with some random value
  randomSeed(analogRead(RNDPIN));
  // assign random speed to each spot
  spdr = 1.0 + random(200) / 100.0;
  spdg = 1.0 + random(200) / 100.0;
  spdb = 1.0 + random(200) / 100.0;
  // set random offset so spots start in random locations
  offset = random(10000) / 100.0;
  // initialize LED strip
  strip.begin();
  strip.show();
}
void loop() {
  // use real time to recalculate position of each color spot
  long ms = millis();
  // scale time to float value
  float m = offset + (float)ms/DELAY;
  // add some non-linearity
  m = m - 42.5*cos(m/552.0) - 6.5*cos(m/142.0);
  // recalculate position of each spot (measured on a scale of 0 to 1)
  float posr = 0.15 + 0.55*sin(m*spdr);
  float posg = 0.5 + 0.65*sin(m*spdg);
  float posb = 0.85 + 0.75*sin(m*spdb);
  // now iterate over each pixel and calculate it's color
  for (int i=0; i<NUMPIXELS; i++) {
    // pixel position on a scale from 0.0 to 1.0
    float ppos = (float)i / NUMPIXELS;
    // distance from this pixel to the center of each color spot
    float dr = ppos-posr;
    float dg = ppos-posg;
    float db = ppos-posb;
#if WRAP
    dr = dr - floor(dr + 0.5);
    dg = dg - floor(dg + 0.5);
    db = db - floor(db + 0.5);
#endif
    // set each color component from 0 to max BRIGHTNESS, according to Gaussian distribution
    strip.setPixelColor(i,
      constrain(BRIGHTNESS*myexp(-FOCUS*dr*dr),0,BRIGHTNESS),
      constrain(BRIGHTNESS*myexp(-FOCUS*dg*dg),0,BRIGHTNESS),
      constrain(BRIGHTNESS*myexp(-FOCUS*db*db),0,BRIGHTNESS)
      );
  }
#if DEBUG
  // keep track of FPS rate
  fps++;
  if (ms>nextms) {
    // 1 second passed – reset counter
    nextms = ms + 1000;
    pfps = fps;
    fps = 0;
  }
  // show FPS rate by setting one pixel to white
  strip.setPixelColor(pfps,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS);
#endif
  // send data to LED strip
  strip.show();
}

Также есть неплохой пример с использованием другой библиотеки light_ws2812. Скачиваем библиотеку отсюда.

// Dependency:
//   light_ws2812
//   https://github.com/cpldcpu/light_ws2812
// ---
// if you have USB 3.0 ports, you might need a USB 2.0 hub to program this.
// use the cRGB struct hsv method
#define USE_HSV
#include <WS2812.h>
#define NUM_LEDS 25
#define outputPin 0
#define UPDATES_PER_SECOND 20
WS2812 LED(NUM_LEDS); 
cRGB my_crgb;
int h = 0;   //stores 0 to 614
int x = 2;
byte steps = 1; //number of hues we skip in a 360 range per update
byte sat = 255;
byte val = 220;
void setup() {
  // Power up safety delay
  delay(1000);
  LED.setOutput(outputPin);
}
void loop() {
  int inner_h = h;
  for( int i = 0; i < NUM_LEDS; i++ ) {
    if (i%2) {
      inner_h += (i/2)*x;
    }
    if(inner_h >= 360)
    {
        inner_h %= 360;
    }
    my_crgb.SetHSV(inner_h, sat, val);
    LED.set_crgb_at(i, my_crgb);
  }
  h += steps;
  if(h >= 360)
  {
     h %= 360;
  }
  LED.sync();
  delay(1000 / UPDATES_PER_SECOND);
}

Для работы данного примера требуется намного меньше места на Digispark. Поэтому можно дописать функции.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки http://portal-pk.ru/news/135-urok-2-nazhatie-knopki-bez-lozhnyh-srabatyvanii.html Константин Portal-PK 2018-01-05T14:54:48+03:00 В предыдущем уроке: Урок1 - Подключение кнопки и светодиода к плате Arduino, я рассказал как подключить кнопку к Arduino . При нажатии на тактовую кнопку светодиод загорается. Если отпускаем он гаснет. Такое исполнение очень редко используется в проектах на Arduino.

Самое распространенное это смена состояния при нажатии на кнопку.

Вроде бы что тут сложного! Определил, что кнопка нажата и сменил состояния. Например включил светодиод. Но не так все проста при нажатии кнопки происходит так называемы дребезг. Состояние несколько раз меняет с высокого на низкое пока не примет устойчивое.

дребезг кнопки

Как видно на картинке. Дребезг есть не только при нажатие на кнопку но и когда мы ее отпускаем.

Как же бороться с дребезгом кнопки?

Существует несколько вариантов:

1. Аппаратное. Поставит дополнительные компоненты в электрическую схему. Самый простой, поставить конденсатор, который будет сглаживать импульсы. Но конденсатор не всегда справляется со своей задачей и поэтому используют более сложные схемы подключения.

2. Программный. Дребезг длиться не очень долго. И если сделать задержку между считыванием значения с кнопки, можно полностью устранить ложные срабатывание. Но тут есть тоже сложность и варианты решения.

Можно использовать библиотеку Bounce или написать свою небольшую функцию.

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

Для урока нам понадобиться:

Подключение не чем не отличается от предыдущего урока Урок1 - Подключение кнопки и светодиода к плате Arduino.

Подключение кнопки к Arduino. Дребезг

Электрическая принципиальная схема.

Электрическая принципиальная схема. Дребезг кнопки

Функция boolean debvance достаточно простая. Получаем прошлое состояние кнопки.

if (last != current) // Если текущее состояние отличается от предыдущего

Ждем 5 миллисекунд. И

current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки

И возвращаем значение current.

Вот и вся функция.

boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (buttonPin); // считываем данные с кнопки
  if (last != current) // Если текущее состояние отличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
    return current; 
  }
}
  

Осталось в скетче прописать небольшие изменения.

Всего одна строчка для работы с функцией

currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW

Также нужно проверить

if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет

После условия нужно обязательно сделать переприсваивание

lastButten =  currentButten;  // Переприсваиваем прошлое состояние кнопки

Остальной код пишется под ваши задачи. В данном случае включаем светодиод.

const int buttonPin = 2;      // номер входа, подключенный к кнопке
const int ledPin =  3;        // номер выхода светодиода

/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
boolean ledOn = false;        // текущее состояние свтодиода

void setup() // Функция setup()

{
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);     
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);   

}

boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (buttonPin); // считываем данные с кнопки
  if (last != current) // Если текущее состояние отличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
    return current; 
  }
}
  
void loop() // Функция loop

{
  
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    ledOn = !ledOn; // инвертируем значение 
  }
  
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  digitalWrite(ledPin, ledOn);   // Включаем или выключаем светодиот (смотря что пришло после инверсии) 
  delay (2);   // Ждем 2 милисек.
}

Не очень много кода и не надо дополнительных элементов при сборке схемы.

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

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Дешевый блок питания на 12 В для ЧПУ из Китая. Делаем корпус http://portal-pk.ru/news/134-deshevyi-blok-pitaniya-na-12-v-dlya-chpu-iz-kitaya-delaem.html Константин Portal-PK 2017-12-27T07:53:32+03:00 Собрал я самодельный ЧПУ фрезерный станок на Arduino. В качестве блока питания использовал блок питания от компьютера. Временно хорошее решение но достаточно не удобно при постоянном использовании. Во-первых блок питания больших размеров. Во-вторых у блока питания очень большая связка проводов. Конечно их можно выпоят или обрезать. А если понадобиться дополнительный выход, опять припаивать. Я решил, что это не вариант и купил в Китае импульсный источник питания 12 В 7А. Но данный источник питания идет без корпуса, но очень дешевый, всего 300 руб. (На момент покупки мной)

Но у меня есть самодельный фрезерный ЧПУ станок. Разве я не смогу сделать корпус для блока питания.

Сделал чертеж и раскрой заготовок для корпуса блока питания .

чертеж и раскрой заготовок для корпуса блока питания для ЧПУ станка

Вот что у меня получилось.

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

Не забывайте подписываться на мой новый канал Самоделкин на Portal-PK.ru. Все поделки сделанные на ЧПУ станке буду выкладывать там.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 4 - Подключаем потенциометр к Arduino. Пишем код в Ardiono IDE http://portal-pk.ru/news/133-podklyuchaem-potenciometr-k-arduino-pishem-kod-v-ardiono-ide.html Константин Portal-PK 2017-12-20T19:10:12+03:00

Подключить потенциометр не составит труда. Тем более в интернете очень много примеров. Написать подходящий код для проекта это уже сложнее.

Выводим значения с потенциометра в Serial port.

const int analogInPin = A0;  // потенциометр
int sensorValue = 0;        // считанное значение
void setup() {
  Serial.begin(9600); 
}
void loop() {
  sensorValue = analogRead(analogInPin);            
  Serial.print("sensor = " );                       
  Serial.println(sensorValue);      
  delay(50);                     
}

Мы получим значения от 0 до 1024. Это потому что у ардуино 10 bit АЦП. Данный вывод можно сгладить

#define analogInPin A0           // потенциометр
const byte averageFactor = 5;   // коэффициент сглаживания показаний (0 = не сглаживать)
                                // чем выше, тем больше "инерционность"
int sensorValue = 0;            // считанное значение
void setup() 
{
  Serial.begin(9600); 
}
void loop() 
{
  int newSensorValue = analogRead(analogInPin);
  if (averageFactor > 0)        // усреднение показаний для устранения "скачков"
  {      
    sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor;  
    // <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 
  } else {
    sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом
  }
  Serial.print("sensor = " );
  Serial.println(sensorValue);
  delay(50);                     
}

Чем больше коэффициент сглаживания тем меньше верхний придел. Это видно по формуле. При коэффициенте = 2 максимальное значение будет 1022 при 5 максимум на выходе будет 1019.

sensor = 982
sensor = 990
sensor = 996
sensor = 1001
sensor = 1005
sensor = 1008
sensor = 1011
sensor = 1013
sensor = 1015
sensor = 1016
sensor = 1017
sensor = 1018
sensor = 1019
sensor = 1019
sensor = 1019

Это нужно учитывать при разработке программы. Можете конечно и не использовать сглаживание. Это ваш выбор.

Выводы Arduino 8bit. Как же нам быть? С потенциометра получаем от 0 до 1024 а на вывод можем подать от 0 до 255. Для решение данной задачи нам поможет функция map(value, fromLow, fromHigh, toLow, toHigh)

#define analogInPin A0           // потенциометр
const byte averageFactor = 5;   // коэффициент сглаживания показаний (0 = не сглаживать)
                                // чем выше, тем больше "инерционность"
int sensorValue = 0;            // считанное значение
void setup() 
{
  Serial.begin(9600); 
}
void loop() 
{
  int newSensorValue = analogRead(analogInPin);
  if (averageFactor > 0)        // усреднение показаний для устранения "скачков"
  {      
    sensorValue = (sensorValue * (averageFactor - 1) + newSensorValue) / averageFactor;  
    // <новое среднее> = (<старое среднее>*4 + <текущее значение>) / 5 
  } else {
    sensorValue=newSensorValue; // не делаем усреднений, что прочитали то и считаем выводом
  }
  int  val = map(sensorValue, 0, 1023, 0, 255);
  Serial.print("sensor = " );
  Serial.println(val);
  delay(50);                     
}

С помощью функции map() можно вывести инвертированные значения

 int  val = map(sensorValue, 0, 1023, 255, 0);

Если у вас есть предложения по реализации подключения потенциометра к Arduino или у вас возник вопрос. Пишите в коментарии.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ http://portal-pk.ru/news/132-nastroika-proshivki-grbl-chpu-stanka-kalibrovka-chpu.html Константин Portal-PK 2017-12-04T09:12:15+03:00 Собрать ЧПУ станок на Arduino + CNC shield v 3 и сделать первый пробный запуск это пол дела. Нужно еще правильно настроить прошивку Grbl 0.9j . Скачать полную прошивку можете тут grbl.zip. На официальном сайтеGrbl 0.9j доступна только в .hex формате. Что не очень удобно. Но можно скачать код для Arduino IDE версии Grbl v1.1. Данная версия не сильно отличается от Grbl 0.9j .

Grbl 0.9j

Для тех кто только планирует сделать самодельный фрезерный станок с ЧПУ рекомендую почитать вот эти статьи:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника


Для управления ЧПУ станком я использую программу UniversalG-Code Sender.

Программа для упровления ЧПУ Universal G-Code Sender

Данная программа работает на всех распространенных операционных системах. Еще одни плюс для меня, это то что Universal G-Code Sender отлично работает как с лазерным гравировальным станком с ЧПУ так и с фрезерным ЧПУ станком.

Передначалом настройки нужно почитать инструкцию. Но все инструкции по Grbl на английском языке. Я сделал перевод. Немного корявый но понять можно. Скачиваем инструкцию по Grbl 0.9j тут: GRBL0.9j.doc

Процесс настройки описывать не буду. Весь процесс рассказываю достаточно подробно в видео

После настройки станка нужно провести калибровку. Вы скажите: «Мы все рассчитали и погрешностей не должно быть». Но ни тут то было. Погрешность может быть из за ряда причин. Поэтому необходимо произвести калибровку фрезерного ЧПУ станка.

 калибровка фрезерного ЧПУ станка

Калибровка достаточно простая. Рисуем прямоугольники 100 на 100 мм. И производим расчеты.

Как рассчитать рассказываю в видео.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный светодиодный меч. Многоуровневое фрезерование http://portal-pk.ru/news/131-samodelnyi-svetodiodnyi-mech-mnogourovnevoe.html Константин Portal-PK 2017-11-20T13:33:26+03:00 Возможности ЧПУ станка очень большие. И ими нужно правильно пользоваться. Например можно сделать многоуровневое фрезерование и гравирование. Можно не только вырезать по контуру но и полностью отфрезеровать отверстия или многоуровневые отверстия.

Для освоение многоуровневого фрезерования я сделал в программе Inkscape заготовку меча.

многоуровневого фрезерования я сделал в программе Inkscape заготовку меча

Спомощью плагина G-code в той же программе Inkscape сгенерировал код для станка Mech-1_0005.ngc.

Профрезеровал заготовку. Но так как у меня не очень большой опыт в работе с G-code у меня получилась 3 неточности:

1. ЧПУ фрезер фрезеровал сперва контур, а потом начел фрезеровать все остальное. Поэтому размеры пазов под провода получились уже чем были запланированы.

2. Забыл нарисовать одно отверстие или случайно удалил. Кстати на картинке выше его так же нет.

3. Неправильно расположил заготовку и ручка у меча немного не влезла и получилась обрубленная. Но это не страшно. Так как я ее подровнял и все получилась как будто так и запланировано.

Меч собрал и покрасил . Вот что у меня получилось.

Это неплохой результат учитывав что это мое первое многоуровневое фрезерования.

Для освоения работы ЧПУ я вырезал и собрал вот такой манипулятор.

Для освоения работы ЧПУ я вырезал и собрал вот такой манипулятор

Как я его вырезал и из чего он состоит читайте в следующих статьях на сайте Portal-PK.ru.

Не забывайте подписываться на мой новый канал Самоделкин на Portal-PK.ru. Все поделки сделанные на ЧПУ станке с декабря 2017 года буду выкладывать там.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Декоративная тарелка под фрукты из фанеры http://portal-pk.ru/news/130-dekorativnaya-tarelka-pod-frukty-iz-fanery.html Константин Portal-PK 2017-11-14T11:51:23+03:00 После сборки ЧПУ фрезерного станкаЧПУ фрезерного станка, его нужно проверить. Самая первая работа моего самодельного станка вот такая тарелка под хлеб или фрукты . Но под фрукты должна быть поглубже. На канале мне написал, что это конфетница. Да можно и как конфетницу использовать.

Данное изделия с деланно из МДФ.

тарелка под хлеб или фрукты

В видео говорю термоплита, в заголовке фанера. Это все по тому что я не специалист по материалам. А данную тарелку лучше делать из фанеры минимум 6 мм .

Как обещал выкладываю эскиз тарелки под фрукты из фанеры .

эскиз тарелки под фрукты из фанеры

И G-coge тарелки под фрукты из фанеры Pod-frukti400_0001.ngc. Компенсации инструмента нет. Так как можно фрезеровать любым инструментом. Просто лучи будут шире или уже. Конечно фрезой 6 мм. фрезеровать не стоит так как лучи будут очень тонкие.

Не забывайте подписываться на мой новый канал Самоделкин на Portal-PK.ru. Все поделки сделанные на ЧПУ станке с декабря 2017 года буду выкладывать там.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Мигающий киндер сюрприза. Самоделки из Kinder Surprise http://portal-pk.ru/news/129-migayushchii-kinder-syurpriza-samodelki-iz-kinder surprise.html Константин Portal-PK 2017-11-13T11:26:06+03:00 Мигающий киндер сюрприз очень популярный у детей. Вы спросите почему я так решил? Дети сказали! После того как я сделал данную игрушку для своего ребенка, меня постоянно дети просят сделать им такой же мигающий Kinder Surprise. Если честно мн уже надоело их делать =)

Конструкция достаточно простая состоит из 2 светодиодов пружинки 2 кусочков медного провода и батарейки

Конструкция достаточно простая состоит из 2 светодиодов пружинки 2 кусочков медного провода и батарейки. Все это припаиваем к небольшому кусочку макетной платы и приклеиваем на горячий клей на дно капсулы от Kinder Surprise . Мигающая игрушка из киндер сюрприза готова.

В видео более подробно показываю процесс изготовления и демонстрирую работу мигающего киндер сюрприза.

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

Вы наверное заметили что главная картинка поста и видео оформлены не в стиль канала и сайта. Дело в том что по просьбе подписчиков канала Arduino Portal-PK. Отделяю самоделки и переделки где не используются микроконтроллеры и сейчас они будут публиковаться вот на этом канале Самоделкин на Portal-PK.ru, а на канале Arduino Portal-PK будут только проекты на микроконтроллерах и про электронику.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Сравнение программ LaserGRBL и Inkscape g-code http://portal-pk.ru/news/128-sravnenie-programm-lasergrbl-i-inkscape-g-code.html Константин Portal-PK 2017-10-27T12:52:47+03:00 Как вам наверное известно собрал я из всякого хлама ЧПУ лазерный гравировальный станок . Самодельныйлазерный гравировальный станок с ЧПУ.

Станок работает неплохо. Мне нравиться. На днях решил сделать эксперимент и определить как можно быстро сделать гравировку и при этом затратить как можно меньше времени. Для этого я нарисовал в программе Inkscape шахматную доску . Вот так выглядит программка Inkscape. Скачать Inkscape можно тут.

 программка Inkscape

А так выглядит шахматная доска сделанная в программе Inkscape .

шахматная доска сделанная в программе Inkscape

С помощью плагина JTP Laser Tool сделал g-code.

Скачать g-code шамотной доски. Doska_0001.nc

Сделал гравировку с помощью программы universal g-code sender

Сделал гравировку с помощью программы universal g-code sender

Вот что у меня получилось:

Гравируем шахматную доску на лазерном ЧПУ

Для сравнения решил сделать гравировку из растровой графики с помощью программы LaserGRBL. Скачать LaserGRBL можно тут.

 LaserGRBL

Данная программа делает G-code из картинки и гравирует.

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

гравировку из растровой графики с помощью программы LaserGRBL

А гравировать как кортику достаточно долго.

Сделал вывод. Гравировать лучше из векторной графики и генерировать код с подошью Inkscape + g-code .

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

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Как сделать самодельный фонарик-брелок из киндер сюрприза http://portal-pk.ru/news/127-kak-sdelat-samodelnyi-fonarik-brelok-iz-kinder.html Константин Portal-PK 2017-10-25T07:43:14+03:00 Я уже сделал: Блокпитания 5v от сети 220 для arduino, Самодельныйночник из киндер сюрприза Продолжаю делать поделки из киндер сюрпризов.

Сегодня я раcскажу как я сделал фонарик-брелок из киндер сюрприза . Для данной поделки нам понадобиться небольшое количество запчастей.

1. Корпус можно сделать из киндер сюрприза или другого пластикового корпуса.

2. Светодиод белого цвета.

3. Тактовая кнопка , я выпаял ее из видео магнитофона.

4. Держатель для батарейки , выпаял я его из старой нерабочей материнской платы.

5. Провода.

6. Цепочка или шнурок .

7. Клей, можно и не использовать.

8 Средства для паяния (паяльник, припой, канифоль).

фонарик-брелок из киндер сюрприза

Как все собрать можно посмотреть в видео. Там я рассказываю подробно о сборке фонарик-брелок из киндер сюрприза.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный ЧПУ CNC фрезерный станок. Часть 2. Электроника http://portal-pk.ru/news/126-samodelnyi-chpu-cnc-frezernyi-stanok-chast-2.html Константин Portal-PK 2017-10-23T09:26:36+03:00

Продолжаю собирать самодельный фрезерный ЧПУ станок на Adruin o. В данной статья расскажу как я устанавливал электронику, прокладывал и фиксировал провода. Но обо всем по порядку. Если вы не видели как я собираю механическую часть CNC станка . Советую прочитать тут и посмотреть видео .

Пока я делал Фрезерный станок мой Лазерный гравировальный станок с ЧПУ выгравировал шахматную доску. Полный обзор данной работы уже скоро на сайте.

Гравировка шахмотной доски на Лазерном ЧПУ станке

Начал я с изготовления корпуса для электроники. Сделал я его из корпуса от CD-rom. Подогнул с одной стороны корпус и изогнул крышку, та чтобы одна сторона закрывалась плотно. Так как у меня нет больших тисков загнул не очень ровно. И стык получился с небольшим зазором. Но это не страшно.

 из корпуса от CD-rom

Для прокладки проводки закрепил кабель канал 10х20 мм. Та как большую часть проводки запланировал проложить снаружи ЧПУ станка.

закрепил кабель канал 10х20 мм

Блок питания будет компьютерный . Есть у меня идея избавиться от него и сделать менее оборотный блок питания. Но пока не все комплектующие пришли из Китая.

Блок питания будет компьютерный

Дальше я установил конечные выключатели на ось X, Y по 2 шт . На ось Z один, устанавливать второй пока не вижу смысла. Но возможно поставлю и его.

конечные выключатели на ось X, Y по 2 шт.

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

Все провода укладываю в кабельный канал. Провода которые недалеко от кабельного канала закрепляю на пластиковые скобки

Делаю держатель для проводов от гравера и от двигателя и конечного выключателя с оси Z. Необходимо их закрепить так, чтобы они не мешались и не пересекались друг с другом. Это уменьшит помехи и ложные срабатывание конечного выключателя.

Делаю держатель для проводов от гравера и от двигателя и конечного выключателя с оси Z

держатель для проводов от гравера и от двигателя и конечного выключателя с оси Z

Все провода в коробке под электронику. Получилось их достаточно приливное количество. Установил Arduino и CNC shield v3 с драйверами A4988. Подключал шаговые двигателя и сделал пробный запуск. Двигателя работаю!

Arduino и CNC shield v3 с драйверами A4988

Для подключения конечных выключателей припаиваю самодельные коннекторы и конденсатор на каждый конечный выключатель . Также на каждый провод от конечного выключателя одеваю по ферромагнитному кольцу.

конечных выключателей припаиваю самодельные коннекторы и конденсатор на каждый конечный выключатель

На крышку корпуса устанавливаю 4 тактовые кнопки и собираю панель управления ЧПУ.

крышку корпуса устанавливаю 4 тактовые кнопки

Проверка работоспособности показывает что все работает отлично.

В следующем видео сделаем настройку фрезерного станка ЧПУ и проведем калибровку . Не пропусти!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный ночник из киндер сюрприза http://portal-pk.ru/news/125-samodelnyi-nochnik-iz-kinder-syurpriza.html Константин Portal-PK 2017-10-11T12:20:36+03:00 На просторах интернета достаточно большое количества поделок из киндер сюрприза. У меня тоже появились идеи, что можно сделать из данного корпуса. Начел я с самого простого, ночник из киндер сюрприза.

Для изготовления данного ночника нам понадобиться:

1. корпус сделаем из киндер сюрприза.

2. USB провод, подойдет от мышки клавиатуры, зарядки и пр.

3. 3 светодиода, я использовал белый. Хотя можно использовать любого цвета на ваше усмотрение.

4. 3 резистора на 220 Ом.

5. Макетная плата для пайки.

Материалы необходимы для создания светильнока из киндер сбрприза

Если у вас нет каких то элементов их можно купить в любом магазине радиоэлектроники или купить в Китае. В Китае будет дешевле но придется ждать.

Ночник из киндер сюрприза

В Видео подробно рассказываю и показываю процесс сборки светильника. Если у вас возникли вопросы, задавайте их в комментариях .

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Радиоуправление на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050 http://portal-pk.ru/news/124-radioupravlenie-na-arduino-+-nrf24l01-+-giroskop-gy-521-mpu-6050.html Константин Portal-PK 2017-10-02T07:38:27+03:00 Собрал я машинку: СобираемArduino машинку на Motor Shield L293D и ИКпульте

Управлять пультом дистанционного управления не очень удобно. Вторую машинку я собрал на Wi-fi: СамодельнаяWifi машинка на NodeMCU. Машина делает дрифт

Данная машинка получилась более быстрая и удобная в управлении. Но все равно чего-то не хватает: гибкости настройки программы, чувствительности джойстика и пр.

Поэтому я решил сделать машинку на радио управлении.

Что мне понадобится.

Пульт:

1.Arduino Nano

2. Джойстик модуль KY-023

3 Гироскоп GY-521

4. Радио модуль NRF24L01 2.4 ГГц

5.Контроллер заряда 18650

6. MT3608 DC-DC Step Up

7. Кнопки для проектов на arduino

Машинка:

1. Arduino UNO

2.Радиомодуль NRF24L01 2.4 ГГц

3. Два мотор редуктора и два колеса

4. Драйвер двигателя L298N

5. Источник питания. Я использовал power bank

6. Провода для подключения можно взять от мышки, USB- зарядки и пр. что у вас не работает и лежит без дела.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050 выглядит вот так.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521

Скетч в среде программирования Arduino IDE выглядит вот так.

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>

const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);


byte button_jostik = 8;  // кнопка джостика
byte button_1 = 2;  // кнопка
byte button_2 = 3;  // кнопка 
byte button_3 = 4;  // кнопка 
byte button_4 = 4;  // кнопка 
byte button_5 = 5;  // кнопка 
byte button_6 = 7;  // кнопка 

byte transmit_data[9]; // массив, хранящий передаваемые данные
byte latest_data[9]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

// Гироскоп ///
#include <Wire.h>
#include "Kalman.h"

Kalman kalmanX;
Kalman kalmanY;

uint8_t IMUAddress = 0x68;

/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;

double accXangle; // Angle calculate using the accelerometer
double accYangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroYangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleY = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleY;

uint32_t timer;

/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
int status = 0;       // текущий статус

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  pinMode(button_jostik, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_1, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_2, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_3, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_4, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_5, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_6, INPUT_PULLUP); // настроить пин кнопки
  
  radio.begin();
    delay(50);
    radio.setChannel(9);
    radio.setPayloadSize(8);
    radio.setRetries(1,1);
    radio.setDataRate(RF24_250KBPS);
    radio.setPALevel(RF24_PA_HIGH);
    radio.openWritingPipe(pipe);

  /// Гтроскоп 

    Wire.begin();
  i2cWrite(0x6B,0x00); // Disable sleep mode
  if(i2cRead(0x75,1)[0] != 0x68) { // Read "WHO_AM_I" register
    Serial.print(F("MPU-6050 with address 0x"));
    Serial.print(IMUAddress,HEX);
    Serial.println(F(" is not connected"));
    while(1);
  }    
  kalmanX.setAngle(180); // Set starting angle
  kalmanY.setAngle(180);
  timer = micros();
  
}

void loop() {

  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    status = !status; // инвертируем Статус 
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки


  if (status == true)
  {
    transmit_data[1] = map(analogRead(A0), 0, 1023, 0, 255); // получить значение
    // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
    transmit_data[2] = map(analogRead(A1), 0, 1023, 0, 255);
    }
  else
  {
    /* Update all the values */
    uint8_t* data = i2cRead(0x3B,14);
    accX = ((data[0] << 8) | data[1]);
    accY = ((data[2] << 8) | data[3]);
    accZ = ((data[4] << 8) | data[5]);
    tempRaw = ((data[6] << 8) | data[7]);
    gyroX = ((data[8] << 8) | data[9]);
    gyroY = ((data[10] << 8) | data[11]);
    gyroZ = ((data[12] << 8) | data[13]);
  
    /* Calculate the angls based on the different sensors and algorithm */
    accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
    accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;  
  
    double gyroXrate = (double)gyroX/131.0;
    double gyroYrate = -((double)gyroY/131.0);
    gyroXangle += gyroXrate*((double)(micros()-timer)/1000000); // Calculate gyro angle without any filter
    gyroYangle += gyroYrate*((double)(micros()-timer)/1000000);
    //gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
    //gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
  
    compAngleX = (0.93*(compAngleX+(gyroXrate*(double)(micros()-timer)/1000000)))+(0.07*accXangle); // Calculate the angle using a Complimentary filter
    compAngleY = (0.93*(compAngleY+(gyroYrate*(double)(micros()-timer)/1000000)))+(0.07*accYangle);
  
    kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
    kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
    timer = micros();
  
    temp = ((double)tempRaw + 12412.0) / 340.0;
    
    Serial.print(kalAngleX);Serial.print("\t");
    Serial.print(kalAngleY);Serial.print("\t");
  
    //Serial.print(temp);Serial.print("\t");
  
    Serial.print("\n");
     int y = compAngleY;
     if (y>250) y=250;
     if (y< 110) y= 110;
     
     int x = compAngleX;
     if (x>250) x=250;
     if (x< 110) x= 110;

    transmit_data[1] = map(x, 110, 250, 0, 255); // получить значение
    // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
    transmit_data[2] = map(y, 110, 250, 0, 255);
  
  }
  
  transmit_data[0] = !digitalRead(button_jostik); // инвертированный (!) сигнал с кнопки

  transmit_data[3] = !digitalRead(button_1); // инвертированный (!) сигнал с кнопки
   transmit_data[4] = !digitalRead(button_2); // инвертированный (!) сигнал с кнопк
   transmit_data[5] = !digitalRead(button_3); // инвертированный (!) сигнал с кнопки
   transmit_data[6] = !digitalRead(button_4); // инвертированный (!) сигнал с кнопки
   transmit_data[7] = !digitalRead(button_5); // инвертированный (!) сигнал с кнопки
   transmit_data[8] = !digitalRead(button_6); // инвертированный (!) сигнал с кнопки
            
  for (int i = 0; i < 9; i++) { // в цикле от 0 до числа каналов
    if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; // запомнить последнее изменение
    }
  }

  //if (flag == 1) { 
  //  radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
 //   flag = 0; //опустить флаг
  //  radio.powerDown(); // выключить передатчик
  // }

}

boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (button_jostik); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (button_jostik); // Присваеваем текущее состояние кнопки
    return current; 
  }
}

void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}

uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data[i] = Wire.read();
  return data;
}

Схема подключения Ардуино машинки на на радио управлении NRF24L01 выглядит вот таким образом.

Схема подключения Ардуино машинки на на радио управлении NRF24L01

Скетч среде программирования Arduino IDE для радио Arduino машинки.

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[9];
unsigned long time;
int data; 
int pos;
int fspeed;           // forward speed 
int bspeed;           // backward speed
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int in3 = 7;    // PWM pin to change speed
const int in4 = 8;    // direction pin 2
const int ena = 5;    // PWM pin to change speed
const int enb = 6;    // PWM pin to change speed
/* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] =   {in1, in2, ena};
unsigned char LeftMotor[3] =   {in3, in4, enb};
/*
   управление скоростью мотора
   motor - ссылка на массив пинов
   v - скорость мотора, может принимать значения от -100 до 100
*/
void Wheel (unsigned char * motor, int v)
{
  if (v>100) v=100;
  if (v<-100) v=-100;
  if (v>0) {
    digitalWrite(motor[0], HIGH);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], v*2.55);
  }
  else if (v<0) {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], HIGH);
    analogWrite(motor[2], (-v)*2.55);
  }
  else {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], 0);
  }
}
void setup(){
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(in3, OUTPUT);      // connection to L298n
  pinMode(in4, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n;
  pinMode(enb, OUTPUT);      // connection to L298n;
  Serial.begin(9600);
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(8);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
  time = millis();
radio.read(&msg, sizeof(msg));} 
if (millis() - time > 1000){
msg[0]=0;
msg[1]=0;}
int x= map(msg[2], 0, 255, -100, 100);
int y= map(msg[1], 0, 255, -100, 100);
 /* управляем правым мотором */
  Wheel (RightMotor, y - x);
  /* управляем левым мотором */
  Wheel (LeftMotor, y + x); 
Serial.println(msg[1]);
Serial.println(msg[2]);
}

У Вас наверное возник вопрос, а для чего 6 тактовых кнопок на пульте управлении. Данными кнопками я планирую управлять ковшом который установлю на данную Ардуино машинку . Также есть возможность поставить еще один джойстик. Я его поставлю когда буду собирать уже в нормальный корпус. Также установлю модуль NRF24L01 с внешней антенной . За всеми переделка следите на сайте Portal-PK.ru и на YouTube канале.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!


]]>
Самодельный фрезерный ЧПУ станок из мебельных направляющих. Механика http://portal-pk.ru/news/123-samodelnyi-frezernyi-chpu-stanok-iz-mebelnyh.html Константин Portal-PK 2017-09-19T09:05:16+03:00 Как вы уже знаете последнее время я собираю ЧПУ станки . Первый станок я собрал из всяких ненужных вещей и обошелся он мне всего 3000 руб. Лазерный гравировальный станок с ЧПУ я собрал вторым. Сейчас я приступил к сборке боле мене качественного фрезерного станка с ЧПУ. В данной статье пойдет речь как и из чего я его собирал.

Для сборки станка я купил фанеру толщиной 16 мм. И начел ее раскраивать на детали похожие, как я делал для лазерного станка, только пришлось учесть пару моментов. Это то что ведущие валы всего 600 мм. И станок должен получиться так чтобы валы не были маленькими. Чуть больше ни чего страшного. Самое проблематичное было рассчитать размеры заготовок для оси Y так как это общий каркас станка и от него зависит не только ось Y но и ось X.

ось Y но и ось X CNC

В качестве направляющих выбрал мебельные направляющие длиной 600 мм. Установил на основания ЧПУ станка .

мебельные направляющие на ЧПУ станке

На направляющие установил лист фанеры . А поверх установил мебельного ламината. У вас наверное возник вопрос для чего мебельный ламинат. А дело в том, что в мебельном ламинате я планирую сделать фиксаторы для материала. И также при фрезеровании фреза будит портить основание стола. А тут поменял лист мебельного ламината и работаешь дальше.

На направляющие установил лист фанеры

Ответную часть для ведущего вала сделал следующим образом. Отфрезеровал отверстия для латунной гайки и стянул винтами М3 заготовки из фанеры. Вот такой бутерброд получился.

Ответную часть для ведущего вала

Установил мебельные направляющие на ось X примерно по тому же принципу что и на ось Y.

Установил мебельные направляющие на ось X

Чтобы закрепить горизонтальные направляющие пришлось сверху станка и в заранее подготовленный выступ установить два куска фанеры. А после закрепить мебельные направляющие. Ответную часть сделал аналогично оси Y.

 сверху станка и в заранее подготовленный выступ установить два куска фанеры

Ответную часть сделал аналогично оси Y

Для того чтобы сделать ось Z установил на ось X небольшой кусок мебельного ламината. Перпендикулярно закрепил заготовки из фанеры для крепления мебельных направляющих.

ось Z установил на ось X небольшой кусок мебельного ламината

На данной оси решил использовать всего 1 пару мебельных направляющих. Так как тут я их закрепил перпендикулярно оси X и плюс кусок фанеры установил достаточно плотно между направляющими. Поэтому хождений практически нет. Если возникнут проблемы с данной конструкцией ни когда не поздно ее переделать.

ось Z

Все шаговые двигателя установил на самодельные крепления сделанные из корпуса видео магнитофона.

Сделал из фанеры крепления для гравера . В итоге у меня получилось вот такой самодельный фрезерный станок с ЧПУ.

В следующем видео буду устанавливать электронику на самодельный фрезерный ЧПУ станок. Не пропустите!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Подключение концевых выключателей (концевики) на ЧПУ станок http://portal-pk.ru/news/122-podklyuchenie-koncevyh-vyklyuchatelei-konceviki-na--chpu.html Константин Portal-PK 2017-09-14T12:18:27+03:00 Уже прошло больше месяца как я собрал самодельный лазерный гравировальный станок с ЧПУ . И уже сделал небольшую модернизацию: Самодельный лазерный гравировальный станок с ЧПУ. Модернизация

Станок работает неплохо. Вот пример гравирования фото 110 на 120 мм.

Пример гравирования лазерного станка с ЧПУ

Чтобы было комфортно работать на станке. Решил установить конечные выключатели. Отдали мне 2 конечника, не очень хорошего качества но для лазерного гравера достаточно.

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

1. Проложил провод от конечников так, что бы он не пересекались с проводами 220 в и не проходили рядом с блоком питания.

2. Припаял на разъемы подключения конечников конденсаторы.

3. Сделал пару витков каждый пары провод вокруг ферромагнитного сердечника.

Подключение кончивиков к ЧПУ

После данный действий ложных срабатываний настало.

Попробовал настроить режим ДОМ. Но у меня постоянно выходит ошибка. Не знаю в чем проблема, буду разбираться

Попробовал настроить режим ДОМ. Но у меня постоянно выходит ошибка.

Еще одна проблема с которой я столкнулся, это нагрев шаговых двигателей при долгой работе. Для устранения нагрева ШД, приклеил радиаторы от компьютера на ось Y и от старого телевизора на ось X. Клеил не на обычный скотч на на термоскотч, который хорошо проводит тепло.

термо скотч

Двигателя перестали нагреваться, даже после 6 часов работы температура двигателей 30-40 градусов. Что меня сильно порадовало.

Радиаторы на шаговом двигателе для охлоджения

Радиатор на ШД

Смотрите видео, там рассказываю более подробно о гравировке картинки на ЧПУ станке и пр.

Начал сборку ЧПУ фрезерного станка скоро выложу видео. Не пропустите!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный спиннер из ненужных вещей http://portal-pk.ru/news/121-samodelnyi-spinner-iz-nenuzhnyh-veshchei.html Константин Portal-PK 2017-09-13T11:04:34+03:00 Делать спиннер я даже не планировал. Все получилось совершенно спонтанно. Разбирали мы с сыном видео магнитофон. Ребенку интересно из чего состоят электронные вещи. В магнитофоне много механических частей, которые перемешаются, переключаются, поднимаются и пр. Когда мы дошли до головки видеомагнитофона, там обнаружили 2 подшипника на оси. Ко мне прешла мысль сделать спиннер. Ребенок поддержал идею.

На изготовление спиннера у меня ушло около 30-40 мин. Качества конечно не очень хорошее, но поиграть пойдет. Тем более спиннер получился уникальный и сделанный из ненужного барахла.

Как я делал самодельный спиннер из ненужных вещей смотрите в видео.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельная Wifi машинка на NodeMCU. Машина делает дрифт http://portal-pk.ru/news/120-samodelnaya-wifi-mashinka-na-nodemcu-mashina-delaet-drift.html Константин Portal-PK 2017-09-12T11:33:39+03:00 В данной статье я расскажу вам про модификацию самодельной Wi-Fi машинки на NodeMCU. Как я сделал из нерабочей машинки на радио управлении, Wi fi машинку. Читайте и смотрите вот тут: Своимируками беспроводная Wifi машинка на NodeMCU и RemoteXY.

Как рассказываю в предыдущей статье, электроника машинки была подключена по вот такой схеме.

Схема подключения самодельной Wi-Fi машинки

И потаилась от 4 батареек формата АА. Так как постоянно покупать батарейки надоело, я решил переделать питание от аккумулятора 18650 . А так как у меня аккумуляторы из старой батареи ноутбука , они плохо держат заряд. По этой причине я решил сделать питание от двух аккумуляторов. Но как показала практика, данные аккумуляторы оказались еще хуже чем я думал. Даже 2 не держат нагрузку и Wi-Fi постоянно отваливался. Как я разбирал батарею от ноутбука смотрите тут. Позднее я разобрал второй батарею от ноутбука. Аккумуляторы были розового цвета. И держат они нагрузку неплохо. Даже один аккумулятор 18650 справлялся с нагрузкой без проблем.


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

Модификация самодельной Wi-Fi машинки на NodeMCU. Схема подключения

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

Также по схеме видно что остался один двигатель и появился сервопривод. Сейчас управление поворотами происходит благодаря сервоприводу.

Скетч для NodeMCU в среде программирования Arduino IDE для приложения RemoteXY выглядит вот так:

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////
// определение режима соединения и подключение библиотеки RemoteXY 
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h>
#include <RemoteXY.h>
// настройки соединения 
#define REMOTEXY_WIFI_SSID "PortalPk"
#define REMOTEXY_WIFI_PASSWORD ""
#define REMOTEXY_SERVER_PORT 6377
// конфигурация интерфейса  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,3,0,0,0,25,0,6,5,2,
  5,8,43,13,39,39,10,52,43,43,
  2,3,131,13,12,14,37,10,18,45,
  17,4 };
// структура определяет все переменные вашего интерфейса управления 
struct {
    // input variable
  int8_t joystick_1_x; // =-100..100 координата x положения джойстика 
  int8_t joystick_1_y; // =-100..100 координата y положения джойстика 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ... 
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////
/* определяем пины управления правым мотором */
#define MOTOR_RIGHT_UP D1
#define MOTOR_RIGHT_DN D2
/* определяем пины управления левым мотором 
#define MOTOR_LEFT_UP D3
#define MOTOR_LEFT_DN D4*/
#include <Servo.h>  
#define PIN_SERVO D4
Servo servo; 
//светодиоды
#define PIN_LED_STOP D0
#define PIN_LED_5 D5
#define PIN_LED_6 D6
#define PIN_LED_7 D7
#define PIN_LED_8 D8
// переменные 
boolean status = true; // флаг, что активна левая
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
long prestro1Millis = 0;        // до мигания ( в целом переменная времени)
int x=0;
void setup() 
{
  RemoteXY_Init (); 
    pinMode (PIN_LED_STOP, OUTPUT);
    pinMode (PIN_LED_5, OUTPUT);
    pinMode (PIN_LED_6, OUTPUT);
    pinMode (PIN_LED_7, OUTPUT);
    pinMode (PIN_LED_8, OUTPUT);
   servo.attach(PIN_SERVO);
}
void loop() 
{ 
  RemoteXY_Handler ();
 //  Положение селектора 0 и 2   ///   
  if (RemoteXY.select_1 == 2)
      {
          Migalka ();// Мигалка 
      } 
   if (RemoteXY.select_1 == 1)
      {
          digitalWrite(PIN_LED_STOP, HIGH); //
          digitalWrite(PIN_LED_5, HIGH); // 
          digitalWrite(PIN_LED_6, HIGH); // 
      }   
   if (RemoteXY.select_1 == 0)
      {
          digitalWrite(PIN_LED_STOP, LOW); //
          digitalWrite(PIN_LED_5, LOW); // 
          digitalWrite(PIN_LED_6, LOW); // 
          digitalWrite(PIN_LED_7,  LOW); // 
          digitalWrite(PIN_LED_8, LOW); // 
      } 
 //END Положение селектора 0 и 2 ////
 /* управляем мотором */  
 int y = RemoteXY.joystick_1_y;
   if (y>100) y=100;
  if (y<-100) y=-100;
  if (y>20) {
    analogWrite(MOTOR_RIGHT_UP, y*10.23);
    digitalWrite(MOTOR_RIGHT_DN, LOW);   
  }
  else if (y<-20) {
    digitalWrite(MOTOR_RIGHT_UP, LOW);
    analogWrite(MOTOR_RIGHT_DN, (-y)*10.23);
  }
  else {
    digitalWrite(MOTOR_RIGHT_UP, LOW);
    digitalWrite(MOTOR_RIGHT_DN, LOW);
  }
  int x = RemoteXY.joystick_1_x;
  if (x>100) x=100;
  if (x<-100) x=-100;
  if (x>10) {
    servo.writeMicroseconds(x*2.5+1600);  
  }
  else if (x<-10) {
    servo.writeMicroseconds(x*2.5+1600); 
  }
  else {
    servo.writeMicroseconds(1600); 
  }
}
void Migalka () // Мигалка 
{
 unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > interval[x]) // проверяем интервал
    {
      if (open) // если true
        digitalWrite(status ? PIN_LED_7 : PIN_LED_8, HIGH); //
      else // иначе
       digitalWrite(status ? PIN_LED_7 : PIN_LED_8, LOW); // 
       x++;
      if (x == 6) // если последний проход по циклу
      {
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
        x=0;
      }
      open = !open; //меняем false на true и наоборот 
    prestro1Millis = curstro1Millis;
  }
}

Повторить данную машинку может каждый желающий. Вам не нужно писать код или писать приложения для Android. Достаточно загрузить прошивку в NodeMCU. И на свое устройства установить приложение RemoteXY. Подключиться к Wi-fi сети с имением PortalPK. И ваше устройство станет пультом для машинки.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Мини-дрель своими руками. Версия 2 http://portal-pk.ru/news/119-mini-drel-svoimi-rukami-versiya-2.html Константин Portal-PK 2017-09-11T12:23:45+03:00 У меня в очередной раз сломался гравер. Для его замены сделана мини дрель. Как его делал я рассказываю в статье: Самодельная мини дрель гравер. После того как я сделал мини дрель-гравер. Мне написали немало комментариев, о том что я сделал не правильно и что можно использовать для более качественного изготовления данного инструмента.

В связи с тем что у меня скопились материалы которые можно использовать для изготовления боле качественной мини-дрели. Я принял решения сделать мини дрель версии 2.

В качестве блока питания решил использовать блок питания от лазера. Из крышки от банки из под витамин сделал верхнюю часть дрели. Под крышку уложил провода и сверху установил переключатель. В итоге получилась вот такая дрель.

Самодельная мини-дрель

Также прикупил новую цангу и набор фрез. В видео можете посмотреть как я гравирую фрезами с подошью новой мини дрели-гравера. Прошу сильно не критиковать не не специалист по гравированию!

Конечно можно купит готовую мини дрель и не мучатся. Как поступить решать вам.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный лазерный гравировальный станок с ЧПУ. Модернизация http://portal-pk.ru/news/118-samodelnyi-lazernyi-gravirovalnyi-stanok-s-chpu.html Константин Portal-PK 2017-08-08T09:05:35+03:00 Подключил электроники на свой гравировальный станок . Сделал пару пробных работ и понял что нужно произвести доработки. С небольшими недочетами можно работать но вот с дребезгом по оси X, нужно что то срочно делать.

Для устроения данной проблемы я выполнил ряд изменений в конструкции ЧПУ станка.

Во первых заменил ведущий вал на более прямой и более жесткий. Одну направляющую перенес в другую плоскость. Что поспособствовала уменьшению колебаний. Сделал винт в натяжку, для этого поменял местами боковые стенки в которых крепиться подшипники.

первых заменил ведущий вал на более прямой и более жесткий

Крепления для лазерного модуля сделал из железа загнутого под 90 градусов.

Крепления для лазерного модуля сделал из железа загнутого под 90 градусов

Кроме этого переделал ответную часть для ведущего винта. Зажал гайку между двух фанерок 10мм. Сделал две такие заготовки. Закрепил их на расстоянии в 20-30 мм друг от друга. Это уменьшило хождение вала.

Кроме этого переделал ответную часть для ведущего винта

Переделал панель управления гравировальным лазерным станком . Добавил кнопку Отмена и установил выключатель для лазера. Выключатель нужен для удобства роботы. Лазер мигает при перезагрузку контролера и не отключается при нажатии кнопки пауза.

панель управления гравировальным лазерным станком


Тестовое гравирование показало что линии по оси X стали прямыми.

Сейчас планирую установить на станок конечные включатели.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino http://portal-pk.ru/news/117-programma-arduino-ide-besplatno-dlya-windows-mac-os-linux-proshivaem.html Константин Portal-PK 2017-08-02T11:36:46+03:00 В связи с постоянными вопросами по софту для Arduino и ЧПУ . Решил снять несколько видео роликов посвященных данной теме.

Скачать Arduino IDE можно на официальном сайте совершенно бесплатная для различных операционных систем: Windows, Mac OS, linux.

Скачать Arduino IDE можно на официальном сайте

Arduino IDE можно пользоваться без установки на компьютер с Windows необходимо скачать архив в формате .zip.

Если у вас китайская версия Arduino и операционная система Windows вам необходимо поставить дополнительный драйвер ch340 driver, в противном случаи ваша Arduino не определиться компьютером.

Arduino и операционная система Windows вам необходимо поставить дополнительный драйвер ch340 driver

Скачать драйвер CH340G

Установка драйвера

  1. Скачайте драйвер по ссылкам выше.
  2. Распакуйте архив
  3. Запустите исполнительный файл CH341SER.EXE
  4. В открывшемся окне нажмите кнопку Install
  5. На этом установка завершена

В других операционных системах такой проблемы нет. Можно подключать и перепрошивать.

Иногда в Linux необходимо дать право для пользование портом.

Посмотрим к какому порту подключена Arduino.

dmesg

Видим похожую строку.

cdc_acm 3-2:1.0: ttyACM0: USB ACM device

Это значит что Arduino находится ttyACM0, делаем порт доступным всем пользователям.

$ sudo usermod -a -G dialout <username>
$ sudo chmod a+rw /dev/ttyACM0

Все, теперь заходим в Arduino IDE, переходим Инструменты/Порт видим нашу подключенную Arduino.

Arduino IDE


Как загрузить свой первый код в Arduino рассказываю в видео.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Установка электроники на лазерный гравировальный станок с ЧПУ http://portal-pk.ru/news/116-ustanovka-elektroniki-na-lazernyi-gravirovalnyi.html Константин Portal-PK 2017-07-27T08:09:21+03:00 Механическая часть лазерного гравировального станка с ЧПУ готова. Сейчас необходимо установить электронику. В качестве управляющей электроники буду использовать Arduino UNO + CNC shield v3. Почему мой выбор пал на данные комплектующие рассказываю в статье Преимущества и недостатки L298, почему я перехожу на СNC shield + A4988 . Описание платы расширения CNC shield v3 можете посмотреть тут. Как настроить драйвера читайте в статье Настройка драйвера A4988. Первый запуск шаговых двигателей .

Ардуинку с шилдом установил внутри корпуса станка. Блок питания снаружи. После чего проложил провода от двигателей и закрепил информационный провод для Arduino UNO.

Ардуинку с шилдом установил внутри корпуса станка.

В корпусе сделал отверстия и закрепил кнопки стоп, пауза и пуск.

В корпусе сделал отверстия и закрепил кнопки стоп, пауза и пуск.

Провода для кнопок проложил по внутренней стенке корпуса станка ЧПУ.

Провода для кнопок проложил по внутренней стенке корпуса станка ЧПУ.

Провода идущие к лазерному модулю поднял и сделал механизм который их придерживает защищая от попадания в механические части стенка.

Провода идущие к лазерному модулю поднял и сделал механизм

Конечные выключатели не установил. Устанавливать буду в следующем видео.

Эта первая гравировка станка.

первая гравировка станка

Как вам?

Также произвел некоторые доработки станка. Более подробнее смотрите в видео.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный лазерный гравер с ЧПУ. Делаем ось X http://portal-pk.ru/news/115-samodelnyi-lazernyi-graver-s-chpu-delaem-os-x.html Константин Portal-PK 2017-07-17T08:02:42+03:00 Продолжаю собирать лазерный гравер с ЧПУ. В предыдущей статья я рассказал как собрал ось Y. В данной статья расскажу как на основание сделанной в предыдущей статья сделать ось Y CNC станка.

Из того же мебельного ламината, что и в при изготовлении основания станка ЧПУ, делаю заготовки для оси X. Врезаю подшипники и матирую ведущий вал. По аналогии делаю ответную часть для перемещения каретки станка. Направляющие все также использую мебельные. Закрепил небольшой прямоугольник из термоплиты на направляющие и к ответной части ведущего вала. Ось X готова.

Установил лазерный модуль. Запустил тестовое гравирования и выявил кучу недостатков:

1. Вал при монтаже погнул. При вращения вала каретка колеблется и гравирование по оси X происходит неровное.

2. Подшипники нудно было устанавливать с снаружи, а не внутри. Если сильно затянуть фиксирующие гайки вал выгибает.

3. Вал М8 очень хлипкий.

В Следующем видео буду устранять недочеты и монтировать электронику. Не пропустите!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Самодельный ЧПУ станок. Делаем ось Y ЧПУ лазерного станка http://portal-pk.ru/news/114-samodelnyi-chpu-stanok-delaem-os-y-chpu-lazernogo.html Константин Portal-PK 2017-07-11T11:54:32+03:00 Переделку станка ЧПУ начал с изготовление оси Y. Изначально ось Y не хотел переделывать, а взять основание от старого станка. В связи с тем что, рабочее поле старого основание было око 400 мм. Решил его увеличить до 600 мм.

Основание станка ЧПУ сделал из мебельного ламината, который остался у меня от старого шкафа. Направляющи взял мебельные дленной 600 мм . Для того чтобы увеличить рабочий ход направляющих пришлось убрать ограничитель для средней части направляющей.

Передачу сделал винтовую из шпильки М10. Для того чтобы стол перемешался с наименьшим люфтом, ответную часть для ходового вала сделал из двух гаек зажатым между 3 фанерками. Что у меня получилось смотрите в видео.

Двигатель взял EM-181. Данный шаговый двигатель с легкостью перемещает стол с заготовкой. Данный факт меня очень порадовал.

Двигатель я подключил к CNC shield v3. Обзор шилда мо жете посмотреть в предыдущей статье: Плата расширения для Arduino UNO, CNC shield v3 и драйверовA4988

Также рекомендую посмотреть Настройка драйвера A4988. Первый запуск шаговых двигателей

В следующей статье расскажу как собирал ось X самодельного ЧПУ станка. Не пропустите!


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!


]]>
Настройка драйвера A4988. Первый запуск шаговых двигателей http://portal-pk.ru/news/113-nastroika-draivera-a4988-pervyi-zapusk-shagovyh.html Константин Portal-PK 2017-06-29T12:41:51+03:00 Продолжаю сборку станка ЧПУ. Шаговые двигателя я уже подобрал. Для проверки электроники, собрал тестовое подключение на столе.

Сперва я подключил к CNC shield v3 шаговые двигателя:

  1. 17HS4401 - ток 1,7A
  2. EM-181 - ток 1,2A
  3. EM-142- значение максимального тока не нашел.

Двигателя выбраны сейчас нам нужно настроить рабочий ток драйверов A4988 для каждого шагового двигателя. Это можно сделать двумя способами:

1. Подключить двигатель в полношаговом режиме и замерить ток на одной обмотки. Он должен быть 70% от номинального тока двигателя. Т.е. для 17HS4401 1,7*0,7= 1,19 А

2. Рассчитать значение Vref — напряжение на переменном резисторе расположенном на драйвере А4988.


A4988 изменяется от номинала токочувствительных резисторов

Формула Vref для A4988 изменяется от номинала токочувствительных резисторов. Это два черных прямоугольника на плате драйвера. Обычно подписаны R050 или R100.

Vref = Imax * 8 * (RS)

Imax — ток двигателя;

RS — сопротивление резистора. В моем случае RS = 0,100.
Для 17HS4401 Vref = 1,7 * 8 * 0,100 = 1,36 В.

В связи с тем что рабочий ток двигателя равен 70% от тока удержания. Полученное значение нам нужно умножить на 0,7. В противном случае двигателя в режиме удержания будут сильно греться.

Для 17HS4401 Vref ист. = 1,36*0,7 = 0,952 В.

Аналогично рассчитываю значения для EM-181

Vref = 1,2 * 8 * 0,100 = 0,96 В

Vrefист. = 0,96*0,7 = 0 ,672 В.

Так как я не смог найти datasheets для ЕМ-142. Для расчетов предложил, что ток на обмотку данного двигателя составляет 0,6 А. Если двигатель будит издавать гул сильнее обычного значит ток превышает максимальное значение. Его нужно понижать. Так как я взял ток обмотки. При расчете Vref ист. Не нужно умножать на 0,7, как я говорил выше ток одной обмотки составляет 70% от номинального. Расчет будет вот таким:

Vrefист. = 0,6 * 8 * 0,100 = 0,48 В.

По моим ощущениям я угадал с током двигателя ЕМ-142. Останется рассчитать сколько шагов он делает для совершения одного оборота. Об этом расскажу в следующей статье.

В видео подключил кнопки «Пауза», «Продолжить», «Аварийная остановка» . Подключил на пины шпинделя светодиод. И протестировал работу. Так же установил один конечный выключатель. Все работает. Если у вас возникли вопросу что куда подключается к CNC shield v3, читайте статью: Плата расширения для Arduino UNO, CNC shield v3 и драйверов A4988

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Плата расширения для Arduino UNO, CNC shield v3 и драйверов A4988 http://portal-pk.ru/news/112-plata-rasshireniya-dlya-arduino-uno--cnc-shield-v3-i-draiverov-a4988.html Константин Portal-PK 2017-06-22T11:35:02+03:00 Не смотря на то, что в интернете много информации по CNC shield v3 и драйвера A4988 для ЧПУ станка. Я решил собрать все необходимо по данным железкам.

CNC shield v3 и драйвера A4988 можно использовать для создания CNC машины (ЧПУ станки) :

  • фрезерный станок ;
  • 3D-принтер;
  • лазерный гравер .

Что же из себя представляет CNC shield v3:

CNC shield v3

1 – Кнопка сброса.
2 – Колодки контактов для подключения внешних драйверов двигателей.
3 – Ось A может дублировать одну из осей X, Y, Z с помощью дополнительного двигателя и драйвера или работать автономно (например ось A может быть использована для двигателя экструдера, в случае 3D-принтера). Эти колодки контактов служат для настройки оси A. Для дублирования осей нужно установить джамперы на эти колодки следующим образом:

колодки контактов служат для настройки оси A

колодки контактов служат для настройки оси A

колодки контактов служат для настройки оси A

колодки контактов служат для настройки оси A

Для автономной работы оси A. Колодка D12 замыкается для возможности управления шагом, колодка D13 замыкается для возможности управления направлением вращения. Направление вращение двигателя меняется путем смены контактов двигателя или изменение маски в прошивки.
4 – Разъем питания. На плату необходимо подавать питание 12 – 36 В.
5 – Возле каждого слота для подключения драйвера двигателей имеется колодка управления микрошагом двигателя. В зависимости от выставленных перемычек вы можете добиться вплоть до 1/32 шага на драйверах DRV8825 и 1/16 шага на драйверах A4988 . Установки джамперов для управления шагом или микрошагом для драйвера A4988 показаны в таблице.

MS1

MS2

MS3

Разрешение микрошага

Низкий

Низкий

Низкий

Полный шаг

Высокий

Низкий

Низкий

1/2 шага

Низкий

Высокий

Низкий

1/4 шага

Высокий

Высокий

Низкий

1/8 шага

Высокий

Высокий

Высокий

1/16 шага



6 – Колодки для подключения биполярного шагового двигателя (на 4 провода).

Как подобрать шаговый двигатель и как подключить шаговик с выводами больше 4 расазываю вот в предыдущей статье: Как подобрать шаговый двигатель для станка ЧПУ. ШД из принтера
7 – Колодка контактов для интерфейсов UART и I2C:

  • Контакты UART: RX, TX, 5V, 3V3;
  • Контакты I2C: SCL, SDA, GND, RST.

8 – Колодка контактов для подключения 3 концевиков.
9 – Колодка для подключения контактов:

  • Включения шпинделя (SpnEn);
  • Направления шпинделя (SpnDir);
  • Включения подачи охлаждения (CoolEn);

10 – Колодка для подключения контактов:

Внимание!!! С прошивки GBRL 9.0i были поменяны местами Z-Max (D12) и Spn_EN (D11).

С прошивки GBRL 9.0i были поменяны местами Z-Max (D12) и Spn_EN (D11)

Сейчас шпиндель подключается к D11, который является ШИМ портом. Для управлять оборотами шпинделя через ШИМ.

Теперь, если вы желаете подключить концевик Z_Max, то его необходимо подключить в Spn_EN, а включение шпинделя необходимо подключать в Z+.


Характеристики драйвера A4988:

Характеристики драйвера A4988

  • напряжения питания: от 8 до 35 В;
  • возможность установки шага: от 1 до 1/16 от максимального шага;
  • напряжение логики: 3-5.5 В;
  • защита от перегрева;
  • максимальный ток на фазу: 1 А без радиатора, 2 А с радиатором;
  • расстояние между рядами ножек: 12 мм;
  • размер платы: 20 х 15 мм;
  • габариты драйвера: 20 х 15 х 10 мм;
  • габариты радиатора: 9 х 5 х 9 мм;
  • вес с радиатором: 3 г;
  • вес без радиатора: 2 г.


Краткое описание драйвера A4988

Плата создана на базе микросхемы A4988 компании Allegro - драйвера биполярного шагового двигателя. Особенностями A4988 являются регулируемый ток, защита от перегрузки и перегрева, драйвер также имеет пять вариантов микрошага (вплоть до 1/16-шага). Он работает от напряжения 8 - 35 В и может обеспечить ток до 1 А на фазу без радиатора и дополнительного охлаждения (дополнительное охлаждение необходимо при подаче тока в 2 A на каждую обмотку).

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


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Как подобрать шаговый двигатель для станка ЧПУ. ШД из принтера. http://portal-pk.ru/news/111-kak-podobrat--shagovyi-dvigatel-dlya-stanka-chpu-shd-iz.html Константин Portal-PK 2017-06-15T09:35:56+03:00 Любая разработка начинается с выбора компонентов. При разработке ЧПУ станка очень важно правильно подобрать шаговые двигателя . Если у вас есть деньги на покупку новых двигателей, в таком случае нужно определить рабочее напряжения и мощность двигателя. Я купил себе для второго ЧПУ станка шаговые двигателя вот такие: Nema17 1.7 А.

Если у вас нет достаточно денег или вы просто пробуете свои силы в данной сфере. То вы скорее всего будите использовать двигателя из принтеров . Это самый недорогой вариант. Но тут Вы столкнетесь с рядом проблем. У двигателя может быть 4, 5, 6, 8 — проводов для подключения. Как их подключить к драйверам L298n и СNC shield.

Давайте разберемся по порядку. Какие шаговые двигателя бывают. Если вы видите четное количество выводов это биполярный шаговый двигатель . Расположение обмотки для данного двигателя вот такое.

биполярный шаговый двигатель

Если у двигателя 5 выводов, это униполярный шаговый двигатель . Вот так выгладит его схема.

униполярный шаговый двигатель


Наши драйвера рассчитаны на двигателя с 4 выводами . Как быть? Как их подключить?

Биполярные ШД с 6-ю выводами подключаются к драйверу двумя способами:

биполярный шаговый двигатель с 6 выводами подключение по 4

В данном случае ШД имеет момент в 1.4 раза больше. Момент более стабилен на низких частотах.

При таком типе подключения нужно уменьшить ток, подаваемый на обмотки двигателя в √2 раз. Например, если номинальный рабочий ток двигателя составляет 2 А, то при последовательном включении обмоток требуемый ток - 1.4 А, то есть в 1.4 раза меньше.

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

Номинальный рабочий ток, указанный в каталоге, рассчитан на сопротивление одной обмотки (R - именно оно приведено в каталоге). При последовательном включении обмоток сопротивление объединенной обмотки возрастает в два раза (2R).

Потребляемая мощность ШД — I*2 * R

При последовательном включении обмоток потребляемая мощность становится Iпосл.*2 * 2 * R

Потребляемая мощность не зависит от типа подключения, поэтому I*2 * R = Iпосл.*2 * 2* R, откуда

Iпосл.= I/ √2, т.е.

Iпосл.= 0.707 *I.

Так как крутящий момент двигателя прямо пропорционален величине магнитного поля, создаваемого обмотками статора, то он возрастает с увеличением числа витков обмотки и убывает с уменьшением ток, пропускаемого через обмотки. Но так как ток уменьшился в √2 раз, а число витков обмотки увеличилось в 2 раза, то крутящий момент возрастет в √2 раз.

Tпосл. = 1.4 * T.

Биполярный двигатель шаговый 6 проводов подключение


Во втором случае момент более стабилен на высоких частотах. Параметры ШД при таком подключении соответствуют заявленным в datasheet, (момент, ток), момент более стабилен на высоких частотах .

Униполярный шаговый двигатель можно переделать.

Переделываем униполярный шаговый двигатель в биполярный

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

 разобрать шаговый двигатель и перерезать провод соединяющий центр обмоток

В итоге у нас получается биполярный двигатель с 4 выводами.

Шаговые двигателя с 8-ю выводами можно подключить тремя способами.

8 проводной шаговый двигатель способы подключения

Подключение А - шаговик работает с характеристиками, заявленными в описании (момент, ток), момент более стабилен на высоких частотах.

Подключение B – момент ↑1.4 раза, момент более стабилен на низких частотах (относительно А).

Подключение C – момент ↑1.96 раза, момент более стабилен на высоких частотах (относительно А).

Вот мы и решили проблему подключения шаговых двигателей. Но не все двигателя у нас заработают. Нужно еще определить рабочее напряжение двигателей. Самый правильный способ это найти datasheet. Так все параметры есть. Но не ко все двигателя из принтера можно найти datasheet. В таких случаях я пользуюсь вот такой таблицой.

Сопротивление обмотки, Ом

Рабочее напряжение, В

5-15

5

30-60

12

60-120

24

Не знаю на сколько данная таблица верная но у меня все сходиться и работает как надо.

Двигателя я выбираю чтобы рабочее напряжение было меньше или равно напряжению источника питания. Для двигателей рассчитанных на меньшее напряжения необходимо настроить ток ниже.

Настраивать СNC shield будем в следующей статье. Не пропустите!

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Преимущества и недостатки L298, почему я перехожу на СNC shield + A4988 http://portal-pk.ru/news/110-preimushchestva-i-nedostatki-draiverov-l298-i-pochemu-ya.html Константин Portal-PK 2017-06-09T08:06:57+03:00 Продолжаю тему самодельный ЧПУ станок из принтеров за 3000 руб. И сегодня расскажу почему я решил перейти с драйверов L298 на драйвера A4988 .

Дело в том что для драйверов L298 нет стабильных библиотек для работы с G-Code. А прошивка + программа работающая с изображениями не очень стабильна и не подходит для фрезерования точных деталей. Поэтому появилась необходимость перейти на G-Code . Для драйверов L298 нашел библиотеку uCNC controller. Перемещение по осям работает. Но данная библиотека не очень хорошо развита, есть глюки и не все функции работают.

После попытки научить станок понимать G-Code. Понял что проще поменять электронику. Тем более СNC shield v3 + A4988 стоят всего 300 руб. Эта стоимость приемлема и общая стоимость ЧПУ станка не превысит 3000 руб .

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

На этом преимущества драйверов L298n заканчиваются.

У вас наверное возник вопрос. Если рабочее напряжения двигателей разное как в током случае использовать СNC shield v3 с драйверами A4988? У СNC shield один клеммник для подключения 12- 36 вольт. Дело в том что драйвера для для СNC shield имеют подстроечны резистор которым можно настроить рабочий ток. Выбираем двигателя у которых рабочее напряжения близкое по значению. Но не превышает напряжения которое вы подадите на СNC shield.

Более подробнее по подбору шагового двигателя расскажу в следующей статье.

Еще одно преимущество СNC shield v3 в том что на нем уже есть вывода для подключения конечных выключателей, кнопки аварийного подключения, кнопки старт и пауза. И прочие возможности которые нельзя реализовать используя драйвера L298n.

Описание всех возможностей СNC shield v3 сделаю в отдельной статье.


Спасибо за внимание!

]]>
Самодельная мини дрель гравер http://portal-pk.ru/news/109-samodelnaya-mini-drel-graver.html Константин Portal-PK 2017-06-02T09:09:49+03:00 Когда делаешь самоделки из подручных средств часто приходиться шлифовать, отрезать, вырезать, гравировать, сверлить, полировать и пр. Для выполнения данной работы я использовал электрический гравер. Но при переделки галогенового прожектора в светодиодный прожектор, мой гравер сломался . Отнес я его в ремонт, мне сказали что ремонтировать будут не меньше двух недель.

Решил сделать замену граверу из того что было под рукой. Двигатель взял от автомобильного компрессора. Корпус сделал из куска пластика. Установил переключатель и разъем для подключения источника питания. После того как я выложил видео про то как я сделал самодельный гравер на канале Arduino Portal-PK мне уже пишут подсказки из чего лучше нужно было сделать корпус. Но я сделал из того что было под рукой, тем более это у меня временная замена.

Получилось не очень красиво но достаточно функционально и удобно.

Процесс сборки самодельной мини дрели гравер смотрите в видео ролике:

Как я переделывал Галогеновый прожектор в светодиодный читайте тут или смотрите на канале Arduino Portal-PK.


Спасибо! До встречи в следующем проекте!

]]>
Arduino часы - Видео 4. Делаем корпус и собираем Arduino часы http://portal-pk.ru/news/108-arduino-chasy---video-4-delaem-korpus-i-sobiraem-arduino-chasy.html Константин Portal-PK 2017-05-26T09:32:41+03:00 Где-то месяца 2 назад начал собирать часы на Arduino . В планах часы должны были выводить время на семисегментный индикатор , дублировать время отображая с помощью 28 светодиодов . Также планировал сделать умную систему регулирования яркости светодиодов и семи сегментного индикатора . В качестве светочувствительного датчика планировал использовать фото резистор. Часы по задумке должны были выводить температуру и влажность на семи сегментный индикатор . Настройка времени производиться с помощью пульта дистанционного управления.

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

Предыдущие этапы сборки программирования Arduino часов:

1. Светодиодные часы на Arduino Паяем 74HC595N для управления LED

2. Подключаем к Arduino семисегментный индикатор TM1637, датчик DHT11

3. Подключаем к Arduino DS3231 модуль и ИК приемник

Процесс изготовления корпуса и установка электроники в корпус смотрит в видео.

После сборки проверил ток. При максимальной яркости светодиодов рабочий ток 250-280 мА . При уменьшении яркости светодиодов до комфортного состояния, и глаза не режет и видно отлично как ночью так и днем. В данном режиме работы ток понизился до 70-80 мА .

Исходя из этих показании я принял решения сделать питание от сети 220 В. Для этого я использовал зарядное устройство от телефона.

Скетч Выкладывать к данному видео не буду, так как его не сложно собрать из предыдущих видео. Если у вас возникли трудности вы можете написать в группе В контакте или на Фейсбуке.


Спасибо! И до встречи в следующем проекте.

]]>
Переделка галогенового прожектора в LED прожектор http://portal-pk.ru/news/107-peredelka-galogenovogo-prozhektora-v-led-prozhektor.html Константин Portal-PK 2017-05-24T07:57:42+03:00 Попросил меня брат переделать его галогеновый прожектор . Так как 300-500 Вт., это очень большое потребления и греется очень сильно. А так как прожектор используется на стройке, это еще и не безопасно.

Купил я в Китае плату для светодиодного прожектора на 30 Вт . Покупал за 150 руб вот тут: http://ali.pub/1hg4au. Распаковку посылки можно посмотреть на моем канале: Arduino Portal-PK.

Купил винтики с гайками на 3 мм и термопасту. Остальное компоненты использовал из того что у меня лежит без дела:

1. Алюминиевый радиатор от компьютера

2. Консервные банки

Возможно вам будет полезна информация по кодированию от алкоголя

Сборка довольно простая. Зачистил от краски поверхность где радиатор соприкоснуться с корпусам. Нанес термопасту. Установил радиатор, него установил плату светодиодного прожектора. Просверлим в корпусе отверстия 3 мм. И с помощью винтов закрепил LED плату. Из консервных банок вырезал пластинки и установил как отражатели. Зачислит заднюю стеку корпуса от краски для максимального отвода тепла, и сделал отверстия на против радиатора.

Переделка галогенового прожектора в LED светодиодный прожектор обошлась мен в 250 рублей.

Более подробно о переделке продектора можете посмотреть в видео.

Смотре другие мои проекты на канале Arduino Portal-PK.

]]>
detachInterrupt() http://portal-pk.ru/news/106-detachinterrupt.html Константин Portal-PK 2017-05-16T11:43:49+03:00 Описание

Запрещает заданное прерывание.

Синтаксис

detachInterrupt(interrupt)
detachInterrupt(pin)     //только для Arduino Due 

Параметры

  • interrupt: номер прерывания, которое необходимо запретить (подробнее см. attachInterrupt()).
  • pin: номер вывода, соответствующее прерывание которого необходимо запретить (только для Arduino Due)
]]>
attachInterrupt() http://portal-pk.ru/news/105-attachinterrupt.html Константин Portal-PK 2017-05-16T11:40:41+03:00 Описание

Задает функцию, которую необходимо вызвать при возникновении внешнего прерывания. Заменяет предыдущую функцию, если таковая была ранее ассоциирована с прерыванием. В большинстве плат Ардуино существует два внешних прерывания: номер 0 (цифровой вывод 2) и 1 (цифровой вывод 3). Номера выводов для внешних прерываний, доступные в тех или иных платах Ардуино, приведены в таблице ниже:

Плата int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7
Due (см. ниже)

Плата Arduino Due предоставляет больше возможностей по работе с прерываниями, поскольку позволяют ассоциировать функцию-обработчик прерывания с любым из доступных выводов. При этом в функции attachInterrupt() можно непосредственно указывать номер вывода.

Синтаксис

attachInterrupt(interrupt, function, mode)
attachInterrupt(pin, function, mode)     // только для Arduino Due

Параметры

interrupt: номер прерывания (int)
pin: номер вывода (только для Arduino Due)
function: функция, которую необходимо вызвать при возникновении прерывания; эта функция должна быть без параметров и не возвращать никаких значений. Такую функцию иногда называют обработчиком прерывания.
mode:

определяет условие, при котором должно срабатывать прерывание. Может принимать одно из четырех предопределенных значений:

  • LOW - прерывание будет срабатывать всякий раз, когда на выводе присутствует низкий уровень сигнала
  • CHANGE - прерывание будет срабатывать всякий раз, когда меняется состояние вывода
  • RISING - прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий
  • FALLING - прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий.

В Arduino Due доступно еще одно значение:

  • HIGH - прерывание будет срабатывать всякий раз, когда на выводе присутствует высокий уровень сигнала (только для Arduino Due).

Возвращаемые значения

нет

Примечание

Внутри функции-обработчика прерывания функция delay() не будет работать; значения, возвращаемые функцией millis(), не будут увеличиваться. Также будут потеряны данные, полученные по последовательному интерфейсу во время выполнения обработчика прерывания. Любые переменные, которые изменяются внутри функции обработчика должны быть объявлены как volatile.

Использование прерываний

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

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

Пример

int pin = 13;
volatile int state = LOW;
void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}
void loop()
{
  digitalWrite(pin, state);
}
void blink()
{
  state = !state;
}
]]>
random() http://portal-pk.ru/news/104-random.html Константин Portal-PK 2017-05-16T09:52:53+03:00 Описание

Функция random() генерирует псевдо-случайные числа.

Синтаксис

random(max)
random(min, max)

Параметры

min - нижняя граница случайной величины, включительно (необязательный параметр).

max - верхняя граница случайной величины, не включительно.

Возвращаемые значения

случайное число в диапазоне от min до max-1 (long)

Примечание

Если при циклическом использовании функции random() важно получать последовательность различных случайных чисел, то для инициализации генератора случайных чисел используйте функцию randomSeed() с параметром, представляющим собой в определенной степени случайную величину. Таким параметром может быть, например, величина напряжения, считанная функцией analogRead() с не подсоединенного вывода.

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

Пример

long randNumber;
 
void setup(){
  Serial.begin(9600);
 
  // если аналоговый вход 0 ни к чему не подсоединен, то произвольный аналоговый
  // шум на нем обеспечит разные исходные числа, передаваемые функции randomSeed()
  // при каждом запуске программы. Впоследствии это позволит функции random 
  // генерировать разные значения.
  randomSeed(analogRead(0));
}
 
void loop() {
  // выводим случайное число в диапазоне от 0 до 299
  randNumber = random(300);
  Serial.println(randNumber);  
 
  // выводим случайное число в диапазоне от 10 до 19
  randNumber = random(10, 20);
  Serial.println(randNumber);
 
  delay(50);
}
]]>
randomSeed(seed) http://portal-pk.ru/news/103-randomseedseed.html Константин Portal-PK 2017-05-16T09:51:00+03:00 Описание

Функция randomSeed() инициализирует генератор псевдо-случайных чисел, запуская его с произвольной точки последовательности случайных чисел. Несмотря на то, что эта последовательность состоит из очень большого количества случайных чисел, она всегда одна и та же.

Если при циклическом использовании функции random() важно получать последовательность различных случайных чисел, то для инициализации генератора случайных чисел используйте функцию randomSeed() с параметром, представляющим собой в определенной степени случайную величину. Таким параметром может быть, например, величина напряжения, считанная функцией analogRead() с неподсоединенного вывода.

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

Параметры

long, int - число для генерирования начального значения.

Возвращаемые значения

нет

Пример

long randNumber;
 
void setup(){
  Serial.begin(9600);
  randomSeed(analogRead(0));
}
 
void loop(){
  randNumber = random(300);
  Serial.println(randNumber);
 
  delay(50);
}
]]>
tan(rad) http://portal-pk.ru/news/102-tanrad.html Константин Portal-PK 2017-05-16T09:13:32+03:00 Описание

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

Параметры

rad: угол в радианах (float)

Возвращаемые значения

тангенс угла (double)

]]>
cos(rad) http://portal-pk.ru/news/101-cosrad.html Константин Portal-PK 2017-05-16T09:12:44+03:00 Описание

Вычисляет косинус угла (в радианах). Результат лежит в пределах от -1 до 1.

Параметры

rad: угол в радианах (float)

Возвращаемые значения

косинус угла ("double")

]]>
sin(rad) http://portal-pk.ru/news/100-sinrad.html Константин Portal-PK 2017-05-16T09:11:51+03:00 Описание

Вычисляет синус угла (в радианах). Результат лежит в пределах от -1 до 1.

Параметры

rad: угол в радианах (float)

Возвращаемые значения

синус угла (double)

]]>
sq(x) http://portal-pk.ru/news/99-sqx.html Константин Portal-PK 2017-05-16T09:09:32+03:00 Описание

Вычисляет квадрат числа: число, умноженное само на себя.

Параметры

x: число, любой тип данных

Возвращаемые значения

квадрат числа

]]>
sqrt(x) http://portal-pk.ru/news/98-sqrtx.html Константин Portal-PK 2017-05-16T09:08:29+03:00 Описание

Вычисляет квадратный корень числа.

Параметры

x: число, любой тип данных

Возвращаемые значения

double, квадратный корень числа.

]]>
pow(base, exponent) http://portal-pk.ru/news/97-powbase-exponent.html Константин Portal-PK 2017-05-16T09:07:20+03:00 Описание

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

Параметры

base: число (float)

exponent: показатель степени, в которую необходимо возвести число (float)

Возвращаемые значения

Результат возведения в степень (double)

Пример

См. функцию fscale в библиотеке.

]]>
map(value, fromLow, fromHigh, toLow, toHigh) http://portal-pk.ru/news/96-mapvalue-fromlow-fromhigh-tolow-tohigh.html Константин Portal-PK 2017-05-16T09:05:29+03:00 Описание

Преобразовывает значение переменной из одного диапазона в другой. Т.е. значение переменной value, равное fromLow, будет преобразовано в число toLow, а значение fromHigh - в toHigh. Все промежуточные значения value масштабируются относительного нового диапазона [toLow; toHigh].

Функция не ограничивает значение переменной заданными пределами, поскольку ее значения вне указанного диапазона иногда несут полезную информацию. Для ограничения диапазона необходимо использовать функцию constrain() либо до, либо после функции map().

Обратите внимание, что нижние пределы указываемых диапазонов (fromLow, toLow) численно могут быть больше верхних пределов (fromHigh, toHigh). В этом случае функция map() может использоваться для создания обратного диапазона чисел, например:

y = map(x, 1, 50, 50, 1);

Функция может обрабатывать отрицательные числа, поэтому этот пример

y = map(x, 1, 50, 50, -100);

также работает корректно.

Функция map() использует целочисленные вычисления, поэтому не возвращает дробных значений, как это иногда ожидается. При этом дробная часть числа просто отбрасывается, без округления или вычисления средних значений.

Параметры

value: переменная, значение которой необходимо преобразовать

fromLow: нижний предел текущего диапазона переменной value

fromHigh: верхний предел текущего диапазона переменной value

toLow: нижний предел нового диапазона переменной value

toHigh: верхний предел нового диапазона переменной value

Возвращаемые значения

Преобразованное значение.

Пример

/* Преобразование аналогового значения в 8-битное число (от 0 до 255) */
void setup() {}
 
void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

Дополнение

Для интересующихся математикой приводим исходный код функции:

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
]]>
функция dtostrf () http://portal-pk.ru/news/95-funkciya--dtostrf-.html Константин Portal-PK 2017-05-16T08:58:24+03:00 Функция dtostrf (), преобразует данные с плавающей точкой в массив символов, поэтому они могут быть легко напечатаны.

Формат функции следующий

dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);

где:

floatvar - преобразуемая переменная типа float;

StringLengthIncDecimalPoint - длина получаемого символьного значения;

numVarsAfterDecimal - количество символов после запятой;

charbuf - символьный массив для сохранения результата преобразования

Следующий пример программы поможет понять что к чему

static float f_val = 123.6794;
static char outstr[15];

void setup() {
  dtostrf(f_val,7, 3, outstr);

  Serial.begin(9600);
  Serial.println(outstr);
}

void loop(){
}

В результате работы скетча получим

123.679

Имеем 7 символов вдлину, с тремя цифрами после запятой.

При этом, если бы входное значение было например 1.6794, что бы мы получили? Длина строчки символов осталась бы равной 7-ми, с тремя цифрами после запятой, и это значит что функция вставит 2 пробела сначала строки.

1.679

Теперь попробуйте сами.

]]>
Arduino часы. Подключаем к Arduino DS3231 модуль и ИК приемник http://portal-pk.ru/news/94-arduino-chasy-podklyuchaem-k-arduino-ds3231-modul-i-ik-priemnik.html Константин Portal-PK 2017-05-11T08:35:23+03:00 Продолжаем собирать Arduino часы . И в данной статье мы подключим к Arduino DS3231 модуль реального времени , ИК приемник и выведи полученную информацию на семи сегментный индикатор TM1637 .

Посмотрите предыдущие части сборки LED часов на Arduino :

1. Светодиодные часы на Arduino Паяем 74HC595N для управления LED

2. Arduino часы. Подключаем к Arduino семисегментный индикатор TM1637, датчик DHT11

Подключим DS3231 модуль , ИК приемник и семи сегментный индикатор к Arduino вот по такой схеме.

Подключим DS3231 модуль , ИК приемник и семи сегментный индикатор к Arduino вот по такой схеме.

При подключении будьте внимательны при подключении ИК приемника . Возможно, что ваш приемник подключаться к другом ножкам. Поищите в интернете где у вашего приемника VCC, GND, DATA. Я спалил один ИК приемник, подключил его не к тем пинам.

Принципиальная схема подключения к Arduino DS3231 модуль реального времени , ИК приемник и семи сегментного индикатора TM1637 .

Принципиальная схема подключения к Arduino DS3231 модуль реального времени, ИК приемник и семи сегментного индикатора TM1637.


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

///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
void setDateDs3231(byte second,        // 0-59
   byte minute,        // 0-59
   byte hour,          // 1-23
   byte dayOfWeek,     // 1-7
   byte dayOfMonth,    // 1-28/29/30/31
   byte month,         // 1-12
   byte year)          // 0-99
{
   Wire.beginTransmission(DS3231_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}
void getDateDs3231(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
void blink() {
  flag = !flag;
  tm1637.point(flag); 
}

Добавлял переменные.

int interval[5]={10000, 3000, 3000, 5000, 5000};    // интервал 
int status = 0;
long prestro1Millis = 0;        // до

Функция Status() отвечает за время отображения информации на семи сегментный индикаторе. В видео рассказываю немного подробнее о данной функции. Но в принципе она достаточно простая.

void Status() {
  unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
    if ((curstro1Millis - prestro1Millis) > interval[status]) // проверяем интервал
      {
         status++;
        if (status >= 3) // если последний проход по циклу
        {
          status=0;
        }
      prestro1Millis = curstro1Millis;
    }
}

Данную функция нужно вызвать в loop(). В противном случае она работать не будет.

void loop(){
   Status();
}

Получаем информацию с модуля реального времени DS3231. Приводим в вид для вывода на семи сегментный индикатор.

// читаем время из модуля
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
    // забиваем массив значениями для отпарвки на экран
    int  ch1 = hour / 10;
    int  ch2 = hour % 10;
    int  m1 = minute / 10;
    int  m2 = minute % 10;
    int  d1 = dayOfMonth / 10;
    int  d2 = dayOfMonth % 10;
    int  me1 = month / 10;
    int  me2 = month % 10;

В данной конструкции switch ( status ) выводим на семи сегментный индикатор TM1637 информации в соответствии с полученным статусом из функции Status().

switch ( status ) {
    case 0:
        {
          tm1637.display(0,ch1);
          tm1637.display(1,ch2); 
          tm1637.display(2,m1); 
          tm1637.display(3,m2);
          attachInterrupt(0, blink, CHANGE);
        }
     break;
     case 1:
        {
          tm1637.point(false); 
          tm1637.display(0,0x7f); 
          tm1637.display(1,0x7f); 
          tm1637.display(2,0x7f);
          tm1637.display(3,15);  // put a C at the end
        }
     break;
     case 2:
        {
          tm1637.point(false);
          tm1637.display(0,0x7f); 
          tm1637.display(1,0x7f); 
          tm1637.display(2,0x7f);
          tm1637.display(3,12);  // put a C at the end
        }
     break;
     case 3:
        {
          tm1637.point(false); 
          tm1637.display(0,d1);
          tm1637.display(1,d2); 
          tm1637.display(2,0x7f); 
          tm1637.display(3,13); 
        }
     break;
     case 4:
        {
          tm1637.point(false); 
          tm1637.display(0,23);
          tm1637.display(1,0x7f); 
          tm1637.display(2,me1); 
          tm1637.display(3,me2); 
        }
     break;
   }

Температура и влажность не выводиться так как в данной части мы не подключаем датчик температуры и влажности DHT11 . Как подключить датчик температуры рассказывал в предыдущей статье: « Arduino часы. Подключаем к Arduino семисегментный индикатор TM1637, датчик DHT11».


Настройка времени с помощью пульта.

if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0x61D6D02F:
        {
          status = 0;
          hour++;                               // пребавляем единицу к часам
          if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
         setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
        }
        break;
     case 0x61D6A857:
        {
          status = 0;
          hour--;                               // пребавляем единицу к часам
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
        }
        break;
     case 0x61D618E7:
        {
          status = 0;
          second = 0;
          minute--;
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
        }
        break;
    case 0x61D630CF:
        {
          status = 0;
          second = 0;
          minute++;
          if (minute > 59) minute = 0;
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
        }
        break;
    case 0x61D650AF:
        {
          status = 3;
        }
        break;
     case 0x61D628D7:
        {
          status = 4;
        }
        break;
    }   
   // Serial.println( results.value, HEX ); // печатаем данные 
    irrecv.resume(); // принимаем следующую команду
  }

В данной конструкция switch ( results.value ) . Обрабатывает команды полученные с пульта ДУ . У вас данные команду будут другие.

Для получения команд с пульта ДУ в Serial порте разкомментируйте строки.

// Serial.begin(9600); // Выставляем скорость COM порта
// Serial.println( results.value, HEX ); // печатаем данные

Скетч в среде Arduino IDE, управления часами получится вот таим:

#include <Wire.h>
#include "TM1637.h"  
#include "IRremote.h"
IRrecv irrecv(11); // Указываем пин, к которому подключен приемник
decode_results results;
    // 7сигментный индикатор
#define CLK 6         
#define DIO 7 
#define brightness 2  // яркость, от 0 до 7
int interval[5]={10000, 3000, 3000, 5000, 5000};    // интервал 
int status = 0;
long prestro1Millis = 0;        // до 
TM1637 tm1637(CLK,DIO);  
#define DS3231_I2C_ADDRESS 0x68
volatile boolean flag;
///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
void setDateDs3231(byte second,        // 0-59
   byte minute,        // 0-59
   byte hour,          // 1-23
   byte dayOfWeek,     // 1-7
   byte dayOfMonth,    // 1-28/29/30/31
   byte month,         // 1-12
   byte year)          // 0-99
{
   Wire.beginTransmission(DS3231_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}
void getDateDs3231(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
void blink() {
  flag = !flag;
  tm1637.point(flag); 
}
void Status() {
  unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
    if ((curstro1Millis - prestro1Millis) > interval[status]) // проверяем интервал
      {
         status++;
        if (status >= 3) // если последний проход по циклу
        {
          status=0;
        }
      prestro1Millis = curstro1Millis;
    }
}
void setup() {
 // Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
  Wire.begin();
  pinMode(13, OUTPUT);
  tm1637.init();
  tm1637.set(brightness);  
}
void loop(){
    // читаем время из модуля
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
    // забиваем массив значениями для отпарвки на экран
   Status();
    int  ch1 = hour / 10;
    int  ch2 = hour % 10;
    int  m1 = minute / 10;
    int  m2 = minute % 10;
    int  d1 = dayOfMonth / 10;
    int  d2 = dayOfMonth % 10;
    int  me1 = month / 10;
    int  me2 = month % 10; 
   switch ( status ) {
    case 0:
        {
          tm1637.display(0,ch1);
          tm1637.display(1,ch2); 
          tm1637.display(2,m1); 
          tm1637.display(3,m2);
          attachInterrupt(0, blink, CHANGE);
        }
     break;
     case 1:
        {
          tm1637.point(false); 
          tm1637.display(0,0x7f); 
          tm1637.display(1,0x7f); 
          tm1637.display(2,0x7f);
          tm1637.display(3,15);  // put a C at the end
        }
     break;
     case 2:
        {
          tm1637.point(false);
          tm1637.display(0,0x7f); 
          tm1637.display(1,0x7f); 
          tm1637.display(2,0x7f);
          tm1637.display(3,12);  // put a C at the end
        }
     break;
     case 3:
        {
          tm1637.point(false); 
          tm1637.display(0,d1);
          tm1637.display(1,d2); 
          tm1637.display(2,0x7f); 
          tm1637.display(3,13); 
        }
     break;
     case 4:
        {
          tm1637.point(false); 
          tm1637.display(0,23);
          tm1637.display(1,0x7f); 
          tm1637.display(2,me1); 
          tm1637.display(3,me2); 
        }
     break;
   }
   if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0x61D6D02F:
        {
          status = 0;
          hour++;                               // пребавляем единицу к часам
          if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
        }
        break;
     case 0x61D6A857:
        {
          status = 0;
          hour--;                               // пребавляем единицу к часам
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
        }
        break;
     case 0x61D618E7:
        {
          status = 0;
          second = 0;
          minute--;
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
        }
        break;
    case 0x61D630CF:
        {
          status = 0;
          second = 0;
          minute++;
          if (minute > 59) minute = 0;
          setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
        }
        break;
    case 0x61D650AF:
        {
          status = 3;
        }
        break;
     case 0x61D628D7:
        {
          status = 4;
        }
        break;
    }   
   // Serial.println( results.value, HEX ); // печатаем данные 
    irrecv.resume(); // принимаем следующую команду
  }
}
]]>
Собираем Arduino машинку на Motor Shield L293D и ИК пульте http://portal-pk.ru/news/93-sobiraem-arduino-mashinku-na-motor shield l293d-i-ik-pulte.html Константин Portal-PK 2017-04-28T12:52:35+03:00 Пол года назад коме пришла идея изучать программирование микроконтроллеров. Почитал в интернете и понял, что самая простая среда разработки Arduino IDE. Посмотрел кто и что делает и решил сделать свою машинку на пульте управления. Почему именно на ИК пульте управления? Просто по всем отзывам и разработкам это самая простая и дешевая машинка.

При выборе комплектующих выбор пал на Arduino UNO и Motor Shield L293D.

Почему именно Motor Shield ? Это связанно с тем что я к тому моменту паять пробовал в жизни 2 раза. И решил что использование шилд паять не нужно будет.

Что мне понадобилось:

1. Arduino UNO 190 руб.

2. Motor Shield L293D 100 руб.

3. Два мотор редуктора и два колеса. 240 руб.

4.IR приемник + пульт ДУ 50 руб.

5. Источник питания. Я покупал power bank за 300 руб. или тут

Можно купить бокс под батарейки 50 руб.

6. провода для подключения мотор редуктора к шилду можно взять от мышки, USB- зарядки и пр., что у вас не работает и лежит без дела.

7. ПВХ панель. Обрезок картонки, фанерки и пр.

8. мебельное колесико в магазине стоит около 50 руб.

9. винтики болтик можно купить руб за 40 в строительном магазине.

И того машинку на Motor Shield L293D и ИК пульте можно собрать за 670 руб.


Когда пришли все комплектующие я понял, что паять все таки нужно будет. И на первом этапе мне показалось что Motor Shield не предназначен для сборки машинок на ИК пульте управления.

Прочитал я статьи про Motor Shield и понял, что стандартную библиотеку использовать в данном случае не получиться. Разобрав электрическую схему я понял как можно подключить I R приемник и двигателя. Написал небольшой скетч. Сделал основу из панели ПВХ. Процесс сборки смотрите в видео. Я повторил первую версию машинки в точности как была сделана.


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

В новый год у меня сломался power bank. Я заказал запчасти чтобы его отремонтировать. Dc-Dc преобразователь и плата контроля заряда шли больше 2 месяцев. И поэтому машинка у меня стояла, пылилась.

После того как я восстановил Power bank и переписал код, исправив недостаток предыдущей версии. Машинка стала ездить и поворачивать пока нажата кнопка на пульте. Пульт можно отвернуть в противоположную сторону, при этом машинка продолжает движение.

После того как отпускаем кнопку машинка останавливается. Стало намного удобнее.


По просьбе подписчиков выкладываю скетч. Снять отдельно видео пока не получается. Если возникнут вопросы пишите в группу в контакте: Arduino Portal-PK.

Нужно поставить библиотеку для работы со сдвиговым регистром

#include <Shift595.h> // https://sites.google.com/site/shift595arduino/downloads

Укажите ваши коты с пульта ДУ

#define POWER_KEY 0x61D66897 // коды пульта ДУ
#define KEY1 0x61D6D02F  // вперед 
#define KEY2 0x61D6A857 // назад
#define KEY3 0x61D618E7  // влево
#define KEY4 0x61D630CF  // вправо

Подключения IR приемника производиться к пинам серво привода 1 или 2

#define SER1 10
#define SER2 9

IRrecv irrecv(SER1);

Полный код Arduino машинки на Motor Shield L293D и ИК пульте

#include <Shift595.h> // https://sites.google.com/site/shift595arduino/downloads
#include <IRremote.h> 
#define POWER_KEY 0x61D66897 // коды пульта ДУ
#define KEY1 0x61D6D02F  // вперед 
#define KEY2 0x61D6A857 // назад
#define KEY3 0x61D618E7  // влево
#define KEY4 0x61D630CF  // вправо
#define M1A 2 
#define M1B 3 
#define M2A 1
#define M2B 4
#define M4A 0
#define M4B 6
#define M3A 5
#define M3B 7
#define PWM_M1 11
#define PWM_M2 3
#define PWM_M3 6
#define PWM_M4 5
#define SER1 10
#define SER2 9
#define PWRON 7
IRrecv irrecv(SER1);
Shift595 Shifter(8, 12, 4, 1);
decode_results results;
 /* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] =  {M3A, M3B, PWM_M3};
unsigned char LeftMotor[3] = {M4A, M4B, PWM_M4}; 
long prestro1Millis = 0;        // до мигания ( в целом переменная времени)
int key;
int v= 10;
void setup()
{ 
  irrecv.enableIRIn();
  pinMode(PWRON, OUTPUT); 
  digitalWrite(PWRON, LOW); // включение 74HC595
  pinMode(PWM_M1, OUTPUT); // включение L293D
  pinMode(PWM_M2, OUTPUT); 
  pinMode(PWM_M3, OUTPUT); 
  pinMode(PWM_M4, OUTPUT); 
  digitalWrite(PWM_M1, HIGH);
  digitalWrite(PWM_M2, HIGH);
  digitalWrite(PWM_M3, HIGH);
  digitalWrite(PWM_M4, HIGH);
}
void loop(){
  unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > 200) // проверяем интервал
  {
  if (irrecv.decode(&results)) {
        if (results.value == KEY1)
          key = 1;
         else if (results.value == KEY2)
          key = 2;
         else if (results.value == KEY3)
          key = 3;
           else if (results.value == KEY4)
          key = 4;
           else if (results.value == POWER_KEY)
           {
            key = 0;
            v= 10;
           }
          if (results.value == 0xFFFFFFFF)
          {
            key = key;
            v= v+10;
          }
        irrecv.resume();// Receive the next value
    }
    else
    {
      key = 0;
      v= 10;
     }
    prestro1Millis = curstro1Millis;
    } 
      if (key == 1){ 
        Motor (RightMotor, v);
        Motor (LeftMotor, v);
     }
     else if (key == 2){
        Motor (RightMotor, -v);
        Motor (LeftMotor, -v);     
     }
     else if (key == 3){
        Motor (RightMotor, -v);
        Motor (LeftMotor, v);
     }
     else if (key == 4){
        Motor (RightMotor, v);
        Motor (LeftMotor, -v);  
     } 
     else if (key == 0) {       
        Motor (RightMotor,0);
        Motor (LeftMotor,0);  
     }
}
   void Motor(unsigned char * motor, int v) {
    if (v>100) v=100;
    if (v<-100) v=-100;
    if (v>0) {
      Shifter.setRegisterPin(motor[0], LOW);
      Shifter.setRegisterPin(motor[1], HIGH);
      digitalWrite(motor[2], v*2.55);
      Serial.println(motor[0]);
    }
    else if (v<0) {
      Shifter.setRegisterPin(motor[0], HIGH);
      Shifter.setRegisterPin(motor[1], LOW);
      digitalWrite(motor[2], (-v)*2.55);
    }
    else {
      Shifter.setRegisterPin(motor[0], LOW);
      Shifter.setRegisterPin(motor[1], LOW);
      digitalWrite(motor[2], 0);
    } 
}
]]>
constrain(x, a, b) - ​Ограничивает значение переменной заданными пределами. http://portal-pk.ru/news/92-constrainx-a-b---​ogranichivaet-znachenie-peremennoi.html Константин Portal-PK 2017-04-24T14:11:10+03:00 Описание

Ограничивает значение переменной заданными пределами.

Параметры

x: переменная, значение которой необходимо ограничить, любой тип данных

a: нижний предел, любой тип данных

b: верхний предел, любой тип данных

Возвращаемые значения

x: если x лежит в пределах между a и b.

a: если x меньше a.

b: если x больше b.

Пример

sensVal = constrain(sensVal, 10, 150);
// числовые показания датчика ограничены диапазоном от 10 до 150
]]>
abs(x) Вычисляет абсолютную величину (модуль) числа. http://portal-pk.ru/news/91-absx--vychislyaet-absolyutnuyu-velichinu-modul-chisla.html Константин Portal-PK 2017-04-24T14:09:04+03:00 Описание

Вычисляет абсолютную величину (модуль) числа.

Параметры

x: число

Возвращаемые значения

x: если x больше или равен 0.

-x: если x меньше 0.

Предупреждение

Реализация функции abs() запрещает указывать другие функции в качестве параметров в скобках - это приведет к некорректным результатам:

abs(a++);       // избегайте этого - функция выдаст некорректный результат
 
a++;
abs(a);        // вместо этого осуществляйте математические вычисления за пределами функции
]]>
max(x, y) - Arduino IDE http://portal-pk.ru/news/90-maxx-y---arduino-ide.html Константин Portal-PK 2017-04-24T14:07:04+03:00 Вычисляет максимальное значение из двух чисел.

Параметры

x: первое число, любой тип данных

y: второе число, любой тип данных

Возвращаемые значения

Большее из двух указанных чисел.

Пример

sensVal = max(senVal, 20); // присваивает sensVal большее из двух чисел sensVal и 20
                           // позволяя убедиться, что значение sensVal будет не меньше 20

Примечание

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

Предупреждение

Реализация функции max() запрещает указывать другие функции в качестве параметров в скобках - это приведет к некорректным результатам:

max(a--, 0);   // избегайте этого - функция выдаст некорректный результат
 
a--;
max(a, 0);    // вместо этого - осуществляйте математические вычисления за пределами функции
]]>
min(x, y) - Arduino IDE http://portal-pk.ru/news/89-minx-y---arduino-ide.html Константин Portal-PK 2017-04-24T14:04:31+03:00 Описание

Вычисляет минимальное значение из двух чисел.

Параметры

x: первое число, любой тип данных

y: второе число, любой тип данных

Возвращаемые значения

Меньшее из двух чисел.

Пример

sensVal = min(sensVal, 100); // присваивает sensVal меньшее из чисел sensVal и 100
                             // позволяя убедиться, что значение sensVal никогда не превысит 100

Примечание

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

Предупреждение

Реализация функции min() запрещает указывать другие функции в качестве параметров в скобках - это приведет к некорректным результатам:

min(a++, 100);   // избегайте этого - функция выдаст некорректный результат
a++;
min(a, 100);    // вместо этого - осуществляйте математические вычисления за пределами функции
]]>
Урок 8 — Светофор на Arduino для машин и пешеходов http://portal-pk.ru/news/88-urok-8-—-svetofor-na-arduino--dlya-mashin-i-peshehodov.html Константин Portal-PK 2017-04-21T12:18:38+03:00 Это второй урок посещенный светофору. В уроке 7 «Светофор на Arduino своими руками. Пишем скетч используя функции» . Мы подключали 3 светодиода делали работу одной стороны светофора. В данном уроке мы сделаем работу светофора для машин и для пешеходов. Правда это еще не полноценный светофор, но на основе данного урока его можно сделать без проблем.

Для сокращения объема кода напишем 2 функции в среде разработки Arduino IDE . Одну для управления светофором для машин, а вторую для управления светофором для пешеходов.

Для урока нам понадобится:

Подключим светодиоды к плате ArduinoUNO . У нас получиться вот такая схема.

одключим светодиоды к плате Arduino UNO . У нас получиться вот такая схема.

Принципиальная схема светофора на Arduino для машин и пешеходов.

Принципиальная схема светофора на Arduino для машин и пешеходов.

Скетч в среде разработки Arduino IDE будит выглядит так.

int car_red = 2; // пин подключения 2
int car_yellow = 3; // пин подключения 3
int car_green = 4; // пин подключения 4
int people_red = 5; // пин подключения 5
int people_green = 6; // пин подключения 6
void setup() {
    pinMode(car_red, OUTPUT);
    pinMode(car_yellow, OUTPUT);
    pinMode(car_green, OUTPUT);
    pinMode(people_red, OUTPUT);
    pinMode(people_green, OUTPUT);
}
void loop() {
      digitalWrite(car_red, LOW); 
      digitalWrite(car_yellow, HIGH); 
      digitalWrite(car_green, LOW);       
              delay(2000); 
       digitalWrite(car_red, HIGH); 
       digitalWrite(car_yellow, LOW); 
       digitalWrite(car_green, LOW);
              delay(1000); 
        digitalWrite(people_red, LOW); 
        digitalWrite(people_green, HIGH);
            delay(5000); 
    for (int x=0; x<10; x++) 
    {
          digitalWrite(people_red, LOW); 
          digitalWrite(people_green, HIGH);
            delay(250);
          digitalWrite(people_red, LOW); 
          digitalWrite(people_green, LOW);
          delay(250);
      }
      digitalWrite(people_red, HIGH); 
      digitalWrite(people_green, LOW);
            delay(500);
       digitalWrite(car_red, LOW); 
       digitalWrite(car_yellow, HIGH); 
       digitalWrite(car_green, LOW);
            delay(1000);
       digitalWrite(car_red, LOW); 
       digitalWrite(car_yellow, LOW); 
       digitalWrite(car_green, HIGH);
            delay(5000);
}

Напишем функции для управления светофорами в среде разработки Arduino IDE.

Первая управляет светофором для машин.

void Car (byte red, byte yellow, byte green) {
      digitalWrite(car_red, red); 
      digitalWrite(car_yellow, yellow); 
      digitalWrite(car_green, green);
}

Вторая

управлять светофором для пешеходов.

void People (byte red, byte green) {
      digitalWrite(people_red, red); 
      digitalWrite(people_green, green);
}

В итоге у нас получиться вот такой код. Как видно код стал намного короче и читабельнее.

int car_red = 2; // пин подключения 2
int car_yellow = 3; // пин подключения 3
int car_green = 4; // пин подключения 4
int people_red = 5; // пин подключения 5
int people_green = 6; // пин подключения 6
void setup() {
    pinMode(car_red, OUTPUT);
    pinMode(car_yellow, OUTPUT);
    pinMode(car_green, OUTPUT);
    pinMode(people_red, OUTPUT);
    pinMode(people_green, OUTPUT);
}
void loop() {
        Car (LOW, HIGH, LOW);          
              delay(2000); 
        Car (HIGH, LOW, LOW);
              delay(1000); 
        People (LOW, HIGH);
            delay(5000); 
        for (int x=0; x<10; x++) {
          People (LOW, HIGH);
              delay(250);
          People (LOW, LOW);
              delay(250);
        }
         People (HIGH, LOW);
            delay(500);
        Car (LOW, HIGH, LOW);
            delay(1000);
        Car (LOW, LOW, HIGH);
            delay(5000);
}
void Car (byte red, byte yellow, byte green) {
      digitalWrite(car_red, red); 
      digitalWrite(car_yellow, yellow); 
      digitalWrite(car_green, green);
}
void People (byte red, byte green) {
      digitalWrite(people_red, red); 
      digitalWrite(people_green, green);
}

Следующий урок:

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

]]>
delayMicroseconds() - Arduino http://portal-pk.ru/news/87-delaymicroseconds---arduino.html Константин Portal-PK 2017-04-20T13:51:08+03:00 Описание

Приостанавливает выполнение программы на указанный промежуток времени (в микросекундах). В одной миллисекунде 1000 миллисекунд, и 1 000 000 микросекунд.

На данный момент наибольшее число, позволяющее сформировать точную задержку, - 16383. В будущих версиях Ардиуно этот показатель может быть изменен. Для создания задержек длительностью больше, чем несколько тысяч микросекунд, используйте функцию delay().

Синтаксис

delayMicroseconds(us)

Параметры

us: количество микросекунд, на которые необходимо приостановить программу (unsigned int)

Возвращаемые значения

нет

Пример

int outPin = 8;                 // цифровой вывод 8
 
void setup()
{
  pinMode(outPin, OUTPUT);      // конфигурируем цифровой вывод как выход
}
 
void loop()
{
  digitalWrite(outPin, HIGH);   // включаем вывод
  delayMicroseconds(50);        // задержка в 50 микросекунд 
  digitalWrite(outPin, LOW);    // выключаем вывод
  delayMicroseconds(50);        // задержка в 50 микросекунд
}

Вывод номер 8, сконфигурированный как выход, формирует последовательность импульсов с периодом 100 микросекунд

Предупреждения и известные проблемы

Данная функция работает с высокой точностью в диапазоне от 3 микросекунд и выше. При более коротких задержках точная работа delayMicroseconds() не гарантируется.

Начиная с версии Arduino 0018, функция delayMicroseconds() больше не отключает прерывания.

]]>
micros() -Ardiono IDE http://portal-pk.ru/news/86-micros--ardiono-ide.html Константин Portal-PK 2017-04-20T13:48:37+03:00 Описание

Возвращает количество микросекунд, прошедших с момента начала выполнения программы Arduino. Возвращаемое число переполнится (сбросится в 0) спустя приблизительно 70 минут. На платах Arduino с тактовой частотой 16 МГц (Duemilanove и Nano) разрешение этой функции составляет четыре микросекунды (т.е. возвращаемое значение будет всегда кратно четырем). На платах Ардуино с тактовой частотой 8 МГц (LilyPad), разрешение функции составляет восемь микросекунд.

Примечание: в одной миллисекунде 1000 микросекунд, а в одной секунде - 1 000 000 микросекунд.

Параметры

Нет

Возвращаемые значения

Количество микросекунд, прошедших с момента старта программы (unsigned long)

Пример

unsigned long time;
 
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("Time: ");
  time = micros();
  //выводим время с момента старта программы
  Serial.println(time);
  // ждем 1 секунду, чтобы не отправлять большой массив данных
  delay(1000);
}
]]>
millis() - Arduino IDE http://portal-pk.ru/news/85-millis---arduino-ide.html Константин Portal-PK 2017-04-20T13:47:15+03:00 Описание

Возвращает количество миллисекунд, прошедших с момента старта программы Ардуино. Возвращаемое число переполнится (сбросится в 0) спустя приблизительно 50 дней.

Параметры

Нет

Возвращаемые значения

Количество миллисекунд, прошедших с момента старта программы (unsigned long)

Пример

unsigned long time;
 
void setup(){
  Serial.begin(9600);
}
void loop(){
  Serial.print("Time: ");
  time = millis();
  //выводим время с момента старта программы
  Serial.println(time);
  // ждем 1 секунду, чтобы не отправлять большой массив данных
  delay(1000);
}

Совет:

Помните, что значение, возвращаемое функцией millis(), имеет тип unsigned long. При попытке выполнения математических операций между этим значением и значениями другого типа (например, int) будет сгенерирована ошибка.

]]>
pulseIn() - Arduino http://portal-pk.ru/news/84-pulsein---arduino.html Константин Portal-PK 2017-04-20T13:45:35+03:00 Считывает длительность импульса (любого - HIGH или LOW) на выводе. Например, если заданное значение (value) - HIGH, то функцияPulseIn() ожидает появления на выводе сигнала HIGH, затем засекает время и ожидает переключения вывода в состояние LOW, после чего останавливает отсчет времени. Функция возвращает длительность импульса в микросекундах, либо 0 в случае отсутствия импульса в течение определенного таймаута.

Эмпирическим путем установлено, что при использовании функции для измерения широких импульсов возможно возникновение ошибок. Функция работает с импульсами длительностью от 10 микросекунд до 3 минут.

Синтаксис

pulseIn(pin, value)
pulseIn(pin, value, timeout)

Параметры

pin: номер вывода, с которого необходимо считыть импульс (int)

value: тип считываемого импульса: HIGH или LOW (int)

timeout (опционально): время ожидания импульса в микросекундах; значение по умолчанию - одна секунда (unsigned long)

Возвращаемые значения

длительность импульса (в микросекундах) либо 0 в случае отсутствия импульса в течение таймаута (unsigned long)

Пример

int pin = 7;
unsigned long duration;
 
void setup()
{
  pinMode(pin, INPUT);
}
 
void loop()
{
  duration = pulseIn(pin, HIGH);
}
]]>
shiftIn() - Arduino http://portal-pk.ru/news/83-shiftin---arduino.html Константин Portal-PK 2017-04-20T13:43:06+03:00 Осуществляет побитовый сдвиг и считывание байта данных, начиная с самого старшего (левого) или младшего (правого) значащего бита. Процесс считывания каждого бита заключается в следующем: тактовый вывод переводится в высокий уровень, считывается очередной бит из линии данных, после чего тактовый вывод сбрасывается в низкий уровень.

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

Синтаксис

byte incoming = shiftIn(dataPin, clockPin, bitOrder)

Параметры

dataPin: вывод, с которого будет считываться каждый бит (int)

clockPin: тактовый вывод, который будет переключаться при считывании с dataPin

bitOrder: порядок, в котором будут сдвигаться и считываться биты; может принимать значения MSBFIRST или LSBFIRST. (Most Significant Bit First - старший значащий бит первым, или Least Significant Bit - младший значащий бит первым)

Возвращаемые значения

считанное значение (byte)

]]>
shiftOut() - Arduino IDE http://portal-pk.ru/news/82-shiftout---arduino-ide.html Константин Portal-PK 2017-04-20T13:40:35+03:00 Осуществляет побитовый сдвиг и вывод байта данных, начиная с самого старшего (левого) или младшего (правого) значащего бита. Функция поочередно отправляет каждый бит на указанный вывод данных, после чего формирует импульс (высокий уровень, затем низкий) на тактовом выводе, сообщая внешнему устройству о поступлении нового бита.

Примечание: Для взаимодействия с устройствами, тактируемыми по фронту импульсов, перед вызовом shiftOut() необходимо убедиться, что тактовый вывод переключен в низкий уровень, например с помощью функции digitalWrite(clockPin, LOW).

Функция является программной реализацией SPI; аппаратная версия реализована в библиотеке SPI, поэтому она является быстрее, но работает только со специальными выводами.

Синтаксис

shiftOut(dataPin, bitOrder, value)

Параметры

dataPin: вывод, которому будет отправляться каждый бит из сдвигаемого байта данных (int)

clockPin: тактовый вывод, который будет переключаться каждый раз, когда на выводе dataPin устанавливается корректное значение (int)

bitOrder: характеризует порядок, в котором будут сдвигаться и выводиться биты; может принимать значения MSBFIRST или LSBFIRST. (Most Significant Bit First - старший значащий бит первым, или Least Significant Bit - младший значащий бит первым)

value: сдвигаемый байт данных (byte)

Возвращаемые значения

нет

Примечание

Выводы dataPin и clockPin должны быть уже сконфигурированы как выходы с помощью функции pinMode().

На данный момент функция shiftOut позволяет выводить только 1 байт (8 бит), поэтому для вывода значений, больших 255, требуется два этапа:

// Последовательная передача в режиме MSBFIRST
int data = 500;
// сдвигаем и выводим старший байт
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));  
// сдвигаем и выводим младший байт
shiftOut(dataPin, clock, MSBFIRST, data);
 
// Последовательная передача в режиме LSBFIRST
data = 500;
// сдвигаем и выводим младший байт
shiftOut(dataPin, clock, LSBFIRST, data);  
// сдвигаем и выводим старший байт
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

Пример

Схема, соответствующая примеру, описана в инструкции по работе со сдвиговым регистром 74HC595.

//**************************************************************  //
//  Название : shiftOutCode, Hello World                           //
//  Автор    : Carlyn Maw,Tom Igoe                                 //
//  Дата     : 25 октября 2006                                     //
//  Версия   : 1.0                                                 //
//  Заметки  : Программа использования сдвигового регистра 74HC595 //
//           : для счета от 0 to 255                               //
//****************************************************************
 
//Вывод соединен с выводом ST_CP микросхемы 74HC595
int latchPin = 8;
//Вывод соединен с выводом SH_CP микросхемы 74HC595
int clockPin = 12;
////Вывод соединен с DS микросхемы 74HC595
int dataPin = 11;
 
void setup() {
  //переключение выводов в режим работы "вывод", т.к. к ним идет обращение в главном цикле
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
 
void loop() {
  //процедура последовательного счета
  for (int j = 0; j < 256; j++) {
    //формируем ноль на latchPin и удерживаем его до конца передачи
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, j);   
    //возвращаем высокий уровень на latchin, тем самым сообщая микросхеме о том, что
    //больше не требуется воспринимать информацию
    digitalWrite(latchPin, HIGH);
    delay(1000);
  }
}
]]>
noTone() - Arduino IDE http://portal-pk.ru/news/81-notone---arduino-ide.html Константин Portal-PK 2017-04-20T13:36:11+03:00 Прекращает генерирование прямоугольного сигнала после использования функции tone(). Если сигнал не генерируется, функция ни к чему не приводит.

ПРИМЕЧАНИЕ: для воспроизведение разных звуков на нескольких выводах, необходимо сперва вызывать noTone() на одном выводе и только после этого использовать функцию tone() на следующем.

Синтаксис

noTone(pin)

Параметры

pin: вывод, на котором следует прекратить генерирование сигнала

Возвращаемые значения

нет

]]>
tone() - Arduino IDE http://portal-pk.ru/news/80-tone---arduino-ide.html Константин Portal-PK 2017-04-20T13:34:20+03:00 Описание

Генерирует на выводе прямоугольный сигнал заданной частоты (с коэффициентом заполнения 50%). Функция также позволяет задавать длительность сигнала. Однако, если длительность сигнала не указана, он будет генерироваться до тех пор, пока не будет вызвана функция noTone(). Для воспроизведения звука вывод можно подключить к зуммеру или динамику.

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

Использование функции tone() может влиять на ШИМ-сигнал на выводах 3 и 11 (на всех платах, кроме Mega).

ПРИМЕЧАНИЕ: для воспроизведение разных звуков на нескольких выводах, необходимо сперва вызывать noTone() на одном выводе и только после этого использовать функцию tone() на следующем.

Синтаксис

tone(pin, frequency)
tone(pin, frequency, duration)

Параметры

pin: вывод, на котором будет генерироваться сигнал

frequency: частота сигнала в Герцах - unsigned int

duration: длительность сигнала в миллисекундах (опционально) - unsigned long

Возвращаемые значения

нет

]]>
sizeof - Arduino IDE http://portal-pk.ru/news/79-sizeof---arduino-ide.html Константин Portal-PK 2017-04-20T13:26:57+03:00 Описание

Оператор sizeof возвращает количество байт, занимаемых типом переменной, либо количество байт, занимаемых массивом.

Синтаксис

sizeof(variable)

Параметры

variable: переменная любого типа или массив (например, int, float, byte)

Пример кода

Оператор sizeof удобно использовать при работе с массивами, особенно в тех случаях, когда размерность массива заранее неизвестна или может меняться.

Следующая программа посимвольно выводит строку. Если изменить исходную фразу - программа останется работоспособной, независимо от длины текста.

char myStr[] = "this is a test";
int i;
 
void setup(){
  Serial.begin(9600);
}
 
void loop() { 
  for (i = 0; i < sizeof(myStr) - 1; i++){
    Serial.print(i, DEC);
    Serial.print(" = ");
    Serial.write(myStr[i]);
    Serial.println();
  }
  delay(5000); // задержка программы
}

Обратите внимание, что sizeof возвращает общее количество байтов. Поэтому, при работе с массивами более объемных типов данных (такими, как int), цикл будет выглядеть примерно так. Кроме того, не забывайте, что правильно объявленная строка заканчивается нулевым символом с ASCII-кодом 0.

for (i = 0; i < (sizeof(myInts)/sizeof(int)) - 1; i++) {
  // какие-либо операции с myInts[i]
}
]]>
Ключевое слово const http://portal-pk.ru/news/78-klyuchevoe-slovo-const.html Константин Portal-PK 2017-04-20T13:24:04+03:00 Ключевое слово const обозначает константу. Это спецификатор, который изменяет поведение переменной и делает ее доступной только для чтения. Другими словами, эта переменная может использоваться так же, как и любая другая переменная этого же типа, однако ее значение изменить нельзя. Если вы попытаетесь переприсвоить значение константе, компилятор выдаст ошибку.

На константы, обозначенные ключевым словом const, распространяются те же правила области видимости, как и для обычных переменных. Именно поэтому использование ключевого слова keyword при объявлении констант более предпочтительно, чем использование директивы #define.

Пример

const float pi = 3.14;
float x;
// ....
x = pi * 2;    // удобно использовать константы при математических вычислениях
pi = 7;        // ошибка - нельзя записывать значения (изменять) константы

#define или const

Для создания числовых или строковых констант можно использовать как const, так и #define. Для массивов необходимо использоватьconst. В общем случае при объявлении констант предпочтительнее использовать const вместо #define.

]]>
Ключевое слово volatile http://portal-pk.ru/news/77-klyuchevoe-slovo-volatile.html Константин Portal-PK 2017-04-20T13:22:16+03:00 volatile - это ключевое слово, известное как спецификатор переменной. Как правило, употребляется перед указанием типа переменной, чтобы изменить порядок ее обработки компилятором и последующей программой.

Объявление переменной как volatile - это директива компилятору. Компилятор - программа, которая переводит программный код C/C++ в машинный код, представляющий собой набор команд для микроконтроллера ATmega в Ардуино.

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

Переменную необходимо объявлять как volatile в тех случаях, когда ее значение может быть изменено чем-либо, не зависящем от того участка кода, в котором она фигурирует (например, параллельно выполняющимся потоком). Применительно к Ардуино, единственное место, где подобное может случиться - это участки кода, связанные с прерываниями (также называемые процедурами обработки прерываний).

Пример:

// переключение светодиода при изменении состояния вывода
 
int pin = 13;
volatile int state = LOW;
 
void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}
 
void loop()
{
  digitalWrite(pin, state);
}
 
void blink()
{
  state = !state;
}
]]>
Static - Arduino IDE http://portal-pk.ru/news/76-static----arduino-ide.html Константин Portal-PK 2017-04-20T13:20:43+03:00 Ключевое слово static используется для создания переменных, которые будут видны только одной функции. Однако, в отличие от локальных переменных, которые создаются и уничтожаются при каждом вызове функции, переменные static сохраняют свое значение между вызовами.

Переменные, объявленные как static, создаются и инициализируются только при первом вызове функции.

Пример:

/* RandomWalk
* Paul Badger 2007
* RandomWalk в случайном порядке перемещается вверх или вниз между двумя
* точками. Длина максимального перемещения за один цикл задается 
* параметром "stepsize".
* Статическая переменная увеличивается или уменьшается на случайную величину.
* Эта техника также известна как "розовый шум" или "пьяная походка".
*/
 
#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;
 
int thisTime;
int total;
 
void setup()
{
  Serial.begin(9600);
}
 
void loop()
{        //  функция randomWalk 
  stepsize = 5;
  thisTime = randomWalk(stepsize);
  Serial.println(thisTime);
   delay(10);
}
 
int randomWalk(int moveSize){
  static int  place;     // переменная для хранения величины случайного перемещения - объявлена как static, поэтому 
                         // сохраняет свое значение между вызовами функции. При этом другие функции не могут ее изменить
 
  place = place + (random(-moveSize, moveSize + 1));
 
  if (place < randomWalkLowRange){                    // проверка нижнего и верхнего пределов
    place = place + (randomWalkLowRange - place);     // восстановление числа в положительном направлении
  }
  else if(place > randomWalkHighRange){
    place = place - (place - randomWalkHighRange);     // восстановление числа в отрицательном направлении
  }
 
  return place;
}
]]>
Область видимости переменной http://portal-pk.ru/news/75-oblast-vidimosti-peremennoi.html Константин Portal-PK 2017-04-20T13:18:53+03:00 В языке программирования C, использующемся при программировании Ардуино, переменные имеют свойство, называемое область видимости, чего нельзя сказать про первые языки программирования (подобные BASIC), в которых все переменные являютсяглобальными.

Глобальная переменная - эта та переменная, которая может быть доступна ("видна") из любой функции программы. Локальные переменные доступны только внутри тех функций, в которых они объявлены. При программировании Ардуино, любая переменная, объявленная за пределами функции (таких как, setup(), loop(), и т.д.), является глобальной переменной.

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

Также иногда удобно объявить и инициализировать переменную внутри цикла for. В этом случае переменная будет доступна только в пределах скобок цикла for.

Пример:

int gPWMval;  // эта переменная будет доступна из любой функции
 
void setup()
{
  // ...
}
 
void loop()
{
  int i;    // переменная "i" "видна" только внутри "loop"
  float f;  // переменная "f" "видна" только внутри "loop"
  // ...
 
  for (int j = 0; j <100; j++){
  // переменная j доступна только внутри скобок цикла for
  }
 
}
]]>
Arduino часы. Видео 2. Подключаем к Arduino TM1637 и датчик DHT11 http://portal-pk.ru/news/74-arduino-chasy-video-2---podklyuchaem-k-arduino-semisegmentnyi.html Константин Portal-PK 2017-04-17T12:28:18+03:00 В Виде «Светодиодные часы на Arduino. Паяем 74HC595N для управления LED», я начел собирать светодиодные часы на Arduino . Спаял систему управления светодиодами которые показывают время с помощью 28 светодиодов с точностью до минуты.

В этом видео я подключаю к Arduino семисегментный индикатор TM1637 и датчик DHT11 . Пишу скетч который считывает показание температуры и влажность с датчик DHT11 и выводит на с емисегментный индикатор TM1637.

Схема подключения к Arduino семисегментный индикатор TM1637 и датчик DHT11 выглядит вот так.

Схема подключения к Arduino семисегментный индикатор TM1637 и датчик DHT11

Скетч для данной схемы

#include "dht.h"
#include "TM1637.h"
//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//0~9,A,b,C,d,E,F 
#define dht_pin 2 // Pin sensor 
#define CLK 3//Pins for TM1637       
#define DIO 4
TM1637 tm1637(CLK,DIO);
dht DHT;
void setup(){
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL); 
  //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7   0-7; 
  delay(1500);//Delay 
}
void loop(){
  DHT.read11(dht_pin);
 int temp = DHT.temperature;
 int humidity = DHT.humidity;
 int digitoneT = temp / 10;
 int digittwoT = temp % 10;
 int digitoneH = humidity / 10;
 int digittwoH = humidity % 10;
    tm1637.display(1,digitoneT); 
    tm1637.display(2,digittwoT);
    tm1637.display(3,12);  //  C 
    delay (5000);
    tm1637.display(1,digitoneH); 
    tm1637.display(2,digittwoH); 
    tm1637.display(3,15); //  F
    delay(5000);
}

Библиотека TM1637.h позволяет нам вывести символы «0~9,A,b,C,d,E,F».

Цифры от 0 до 9 выводят на экран соответственную цифру, а цифры от 10 до 15 выводят буквы A,b,C,d,E,F.

Для обозначения температуры выведу символ C равный 12, а для обозначения влажности выведу на семи сегментный индикатор TM1637 символ F равный 15.

#include "TM1637.h"
//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//0~9,A,b,C,d,E,F

Считываем показание с дачка DHT11. В переменную temp сохраняем значение температуры в значение humidity влажности.

DHT.read11(dht_pin);
 int temp = DHT.temperature;
 int humidity = DHT.humidity;

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

int digitoneT = temp / 10;
int digittwoT = temp % 10;

Аналогично разделим значение влажности на десятки и единицы.

int digitoneH = humidity / 10;
int digittwoH = humidity % 10;

Выведем значение на семи сегментный индикатор. Начнем формировать со второго символов. Последним значением выведем символ С, для температура и F для влажности.

    tm1637.display(1,digitoneT); 
    tm1637.display(2,digittwoT);
    tm1637.display(3,12);  //  C 
    delay (5000);
    tm1637.display(1,digitoneH); 
    tm1637.display(2,digittwoH); 
    tm1637.display(3,15); //  F
    delay(5000);


В следующем видео по сборке LED часов на Arduino подключу к микроконтроллеру Arduino модуль реального времени DS3231. Выведу время на семи сегментный индикатор TM1637. Подключу инфракрасный приемник и напишу программу которая позволит настраивать время с помощью пульта дистанционного управления.


]]>
Урок 3 - Подключаем 2 сдвиговых регистра к Arduino. Пишем скетч «Бегущие огни» http://portal-pk.ru/news/73-video-urok-3----podklyuchaem-2-sdvigovyh-registra-k-arduino.html Константин Portal-PK 2017-04-17T09:32:29+03:00 В предыдущем уроке: Урок 2 — Подключаем сдвиговый регистр 74НС595 к Arduino. «Бегущие» огни . Мы научились подключать сдвиговый регистр к плате Arduino . Написали небольшой скетч для управления подключенными светодиодами.

После этого урока мне стали задавать вопросы как можно подключить 2 и больше сдвиговых регистра 74HC595 к Arduino UNO. Не смотря на то что я уже рассказывал в видео Часы на Arduino. Паяем 74HC595N для управления LED. Часть 1 как подключить и уровнять сдвиговыми регистрами, у многих возникает сложность в данной теме.

Я решил снять данный урок. И написает небольшой скетч для управления встречными бегущими огнями.

Для Видео урока нам понадобится:

-Arduino UNO или Arduino Nano

- 2 Сдвиговых регистра 74HC595

- Плата макетная беспаечная

- Резисторы 220 ОМ

-Соединительные провода папа-папа

-Светодиоды 3 или 5 мм.


Подключил светодиоды к Arduino вот по такой схеме.

подключения двух сдвиговых регистров к Arduino

Подключение практически такое же как и подключений одного сдвигового регистра. Только при подключении с первого сдвигового регистра ко второму. Нужно с 9 ножки 74НС595 подключить к 14 ножки сдвигового регистра.

Принципиальная схема подключения двух сдвиговых регистров к Arduino.


При написании скетча трудностей у вас возникнуть не должно. Так как Программа будет с небольшим изменением.


int dataPin = 2; //Пин подключен к DS входу 74HC595 
int latchPin = 3; //Пин подключен к ST_CP входу 74HC595
int clockPin = 4; //Пин подключен к SH_CP входу 74HC595
void setup() { //устанавливаем режим OUTPUT 
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); } 
void loop() { 
  byte byteToSend = 0; //Создаем пустой байт B00000000 
             for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
              byteToSend = 0; // Обнуляем байт при каждом проходе  
               bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
               digitalWrite(latchPin, LOW); // Открыли регистр
               shiftOut(dataPin, clockPin, MSBFIRST, byteToSend);   // передаем последовательно на dataPin - в первом регистре значение B01001100
               shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
               digitalWrite(latchPin, HIGH); /// Закрываем регистр тем самым передаем значение на выводы 
               delay(150);
             }
             byteToSend = 0; // Обнуляем байт при каждом проходе
             digitalWrite(latchPin, LOW); 
             shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
             shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
             digitalWrite(latchPin, HIGH); 
             delay(150);
             for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
               byteToSend = 0; // Обнуляем байт при каждом проходе  
               bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
               digitalWrite(latchPin, LOW); // Открыли регистр
               shiftOut(dataPin, clockPin, LSBFIRST, byteToSend);   // передаем последовательно на dataPin - в первом регистре значение B01001100
               shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
               digitalWrite(latchPin, HIGH); /// Закрываем регистр тем самым передаем значение на выводы 
               delay(150);
             }
            byteToSend = 0; // Обнуляем байт при каждом проходе
            digitalWrite(latchPin, LOW); 
            shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
            shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
            digitalWrite(latchPin, HIGH); 
            delay(150);
     }

Следующий урок:



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

]]>
Источник питания для Arduino машинки из нерабочего power bank http://portal-pk.ru/news/72-istochnik-pitaniya-dlya-arduino-mashinki-iz-nerabochego-power-bank.html Константин Portal-PK 2017-04-07T11:33:00+03:00 В качестве источника питания для машинки на Arduino и Motor Shield L293D использовал power bank . В новогодние каникулы сделал гирлянду и подключил ее к power bank . Но что то произошло. Или кот решил поиграть или ребенок, но повер банк вышел из строя.

Я не стал расстраиваться и заказал в Китае контроля заряда на контроллере TP4056 и DC-DC повышающий преобразователь. Просто данный комплект стоит дешевле чем аналог схемы управления зарядом у power bank . Ждал долго. Около 2,5 месяцев.

Процесс сборки и все тонкости с которыми я столкнулся рассказываю в видео.

В итоге power bank работает отлично. Машинка стала ездить быстрее чем раньше.

Как я собирал машинку на Arduino и Motor Shield L293D . Скоро на канале Arduino Portal-PK.

]]>
Урок 2 — Подключаем сдвиговый регистр 74НС595 к Arduino. «Бегущие» огни http://portal-pk.ru/news/71-urok-2-—-podklyuchaem-sdvigovyi-registr-74ns595-k-arduino-.html Константин Portal-PK 2017-04-05T09:24:25+03:00 В данном уроке мы с вами подключим сдвиговый регистр 74HC595 к Arduino. Но все по порядку. Сперва рассмотрим что такое сдвиговый регистр и как он устроен.

74HC595 — восьмиразрядный (это означает, что он имеет 8 управляемых выходов) с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой.

сдвигового регистра 74HC595

Vcc

Питание

Q0...Q7

Параллельные выходы

DS или SER

(Data Serial) Вход для последовательных данных

OE

Вход для переключения состояния выходов из высоко много в рабочее(активация при получении LOW)

ST_CP или RCK

(STorage register Clock input, storage — хранилище) Синронизация(«защелкивание») выходов

SH_Cp или SCK

(SHift register Clock input, shift — сдвиг) Вход для тактовых импульсов

MR

Сброс значений регистра (активация при получении LOW)

Q7S

Выход для последовательного соединения регистров

GND

Земля

При использовании 3 пинов Arduino можно получить 8 выходов к которым мы можем подключить не только светодиоды, но и например драйвер двигателя и пр.

Для примера работы сдвигового регистра 74HC595 подключим светодиоды.

Для Видео урока нам понадобится:

- Arduino UNO или Arduino Nano

- Сдвигового регистра 74HC595

- Плата макетная беспаечная

- Резисторы 220 ОМ

-Соединительные провода папа-папа

-Светодиоды 3 или 5 мм.

Схема подключения сдвигового регистра к плате Arduino UNO.

Схема подключения сдвигового регистра к плате Arduino UNO

Принципиальная схема подключения сдвигового регистра к плате Arduino UNO.

Принципиальная схема подключения сдвигового регистра к плате Arduino UNO.

В видео уроке показан пример работы сдвигового регистра. Скетч управления бегущими огнями в среде Arduino IDE будит вот таким:

int dataPin = 10; //Пин подключен к DS входу 74HC595 
int latchPin = 11; //Пин подключен к ST_CP входу 74HC595 
int clockPin = 12; //Пин подключен к SH_CP входу 74HC595 
void setup() { //устанавливаем режим OUTPUT 
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
} 
void loop() { 
  byte byteToSend = 0; //Создаем пустой байт B00000000 
  for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
    byteToSend = 0; // Обнуляем байт при каждом проходе 
    bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
    digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    delay(150); 
  } 
  for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
    byteToSend = 0; // Обнуляем байт при каждом проходе 
    bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
    digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    delay(150); 
  } 
}

Скетч из видео урока вот такой:

int dataPin = 10; //Пин подключен к DS входу 74HC595 
int latchPin = 11; //Пин подключен к ST_CP входу 74HC595 
int clockPin = 12; //Пин подключен к SH_CP входу 74HC595 
void setup() { //устанавливаем режим OUTPUT 
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
} 
void loop() { 
  byte byteToSend = 0; //Создаем пустой байт B00000000 
  for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
    byteToSend = 0; // Обнуляем байт при каждом проходе 
    bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
    digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, LSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    delay(150); 
  } 
   byteToSend = 0; // Обнуляем байт при каждом проходе 
  for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита 
   // byteToSend = 0; // Обнуляем байт при каждом проходе 
    bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д. 
    digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
    shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
    delay(150); 
  } 
}

Как видно из примеров мы можем управлять выходами с сдвигового регистра по нашему усмотрении. И это только самые распространенные примеры. Вы можете сделать свои. Например включение светодиодов через один. Или сделать стробоскоп используя знания полученные в уроке: Полицейский стробоскоп своими руками на Arduino.

Придумать можно много интересных вариантов применения сдвигового регистра 74HC595 в проектах на Arduino.

Следующий урок: Два сдвиговых регистра 74HC595. Бегущие огни.

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

]]>
Часы на Arduino. Паяем 74HC595N для управления LED. Часть 1 http://portal-pk.ru/news/70-svetodiodnye-chasy-na-arduino-payaem-74hc595n-dlya-upravleniya-led.html Константин Portal-PK 2017-03-30T09:12:38+03:00 В данной статье рассмотрю первый этап сборки LED часов на Arduino. Весь процесс сборки разделю на 4 этапа:

1. Паяем схему управления 26 светодиодами. Подключение к Ардуино и тестирование.

2. Подключаем к Arduino семи сегментный индикатор, датчик температуры и влажности.

3. Подключаем к Arduino модуль реального времени, семи сегментный индикатор и Ir приемник. Настраиваем время с помощью пульта ду.

4. Сборка часов в корпус. Доработка программы.

Сейчас расскажу по порядку про сборку схемы управления 26 светодиодами который будут выводить время с точностью до 1 минуты.

подключение к Arduino UNO 5 сдвиговых регистров 74HC595N и 26 светодиодов


Вот так выгладит подключение к Arduino UNO 5 сдвиговых регистров 74HC595N и 26 светодиодов. Также подключил фото резистор для управления яркостью свечения светодиодов. А в дальнейшем и управление яркостью семисегментного индикатора.

Принципиальная схем подключения к Arduino UNO 5 сдвиговых регистров 74HC595N и 26 светодиодов.

Принципиальная схем подключения к Arduino UNO 5 сдвиговых регистров 74HC595N и 26 светодиодов.

Чтобы проверить работоспособность схемы написал тестовый скетч в среде Arduino IDE

int dataPin = 2; //Пин подключен к DS входу 74HC595 
int latchPin = 3; //Пин подключен к ST_CP входу 74HC595
int clockPin = 4; //Пин подключен к SH_CP входу 74HC595
int pwmPin   = 5;   //Пин подключен к OE входу 74HC595 для управления ШИМ
int fr = 0; //и фоторезистора

byte path[9]= {
  B00000000,
  B00000001,
  B00000010,
  B00000100,
  B00001000,
  B00010000,
  B00100000,
  B01000000,
  B10000000 
  };

void setup() { 
  pinMode(latchPin, OUTPUT); 
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(pwmPin, OUTPUT);
  
} 
void loop() { 
   
 for (int chas = 1; chas < 12; chas++) { // В переменной хранится позиция изменяемого бита   
  for (int min = 0; min < 60; min++) { // В переменной хранится позиция изменяемого бита 

        int photocell = analogRead(fr); // получаем данные фото резистора
          int LED = map(photocell, 6, 680, 200, 10); /// приводим к нужному диапазону значений 
          analogWrite(pwmPin,LED); // Назначаем выходу ШИМ разные значения

      int val = map(min, 0, 59, 0, 12); // приводим к 12 так как у нас не 60 а 12 
      digitalWrite(latchPin, LOW); // Открыли регистр

      int x = min % 5;   // x остаток от деления на 5
      shiftOut(dataPin, clockPin, MSBFIRST, path[x]);   // передаем последовательно на dataPin - в первом регистре значение B01001100
  
               if (val < 9)
               {                 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[0]); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[val]);   // передаем последовательно на dataPin - в первом регистре значение B01001100                                              
              }
               else if (val >= 9) // если минут больше 8*5 выводи на второй микросхеме 
               {

                     int val1 = val-8; // 
                 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[val1]); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[0]);   // передаем последовательно на dataPin - в первом регистре значение B01001100
               }               
               delay(200); // ждем       
               if (chas < 9)
               {
                     shiftOut(dataPin, clockPin, MSBFIRST, path[0]);   // передаем последовательно на dataPin - в первом регистре значение B01001100
                     shiftOut(dataPin, clockPin, MSBFIRST, path[chas]);  // передаем последовательно на dataPin - в первом регистре значение B01001100                                       
               }
               else if (chas >= 9) // если минут больше 8*5 выводи на второй микросхеме 
               {
                     int chas1 = chas-8; // 
                 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[chas1]); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита 
                     shiftOut(dataPin, clockPin, MSBFIRST, path[0]);   // передаем последовательно на dataPin - в первом регистре значение B01001100
               }
                
              digitalWrite(latchPin, HIGH); /// Закрываем регистр тем самым передаем значение на выводы    
             }
     }
}

Программа не применима для работы часов. Но для проверки работоспособности подключения к Arduino UNO 5 сдвиговых регистров 74HC595N и 26 светодиодам подойдет отлично.

]]>
Своими руками беспроводная Wifi машинка на NodeMCU и RemoteXY http://portal-pk.ru/news/69-svoimi-rukami-besprovodnaya-wifi-mashinka-na-nodemcu-i-remotexy.html Константин Portal-PK 2017-03-29T08:35:07+03:00 В данном проекте я собираю беспроводную Wifi машинку используя самые простые и доступные средства. Установил NodeMCU на микроконтроллере ESP8266. Поставил драйвер L9110S. Сперва думал что драйвер будет греться. Но двигателя постоянного тока которые были в машине не очень мощные и драйвера L9110S достаточно для управления. Вы можете поставить на сваю WIFI машинку другой драйвер например L298N.

Схема подключения для L9110S и для L298N одинаковая. Программа также будет работать с обоими драйверами.

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

Схема подключения всех элементов Wi-fi машинки выглядит следующим образом

Схема подключения всех элементов Wi-fi машинки

На Сайте http://remotexy.com/ru/editor/ Сделал приложение RemoteXY.

Приложение RemoteXY NodeMCU для вайфай машинки


Код получился следующий

////////////////////////////////////////////// 
//        RemoteXY include library          // 
////////////////////////////////////////////// 
// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h> 
#include <RemoteXY.h> 
// настройки соединения  
#define REMOTEXY_WIFI_SSID "PortakPK" 
#define REMOTEXY_WIFI_PASSWORD "" 
#define REMOTEXY_SERVER_PORT 6377 
// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,5,0,0,0,84,0,7,5,0,
  1,1,5,7,22,13,5,208,146,208,
  191,208,181,209,128,208,181,208,180,0,
  1,1,6,43,20,13,4,208,157,208,
  176,208,183,208,176,208,180,0,1,1,
  75,8,18,12,1,208,146,208,187,208,
  181,208,178,208,190,0,1,1,76,43,
  18,13,2,208,146,208,191,209,128,208,
  178,208,190,0,3,3,44,15,13,35,
  2 }; 
// структура определяет все переменные вашего интерфейса управления  
struct { 
    // input variable
  uint8_t button_1; // =1 если кнопка нажата, иначе =0 
  uint8_t button_2; // =1 если кнопка нажата, иначе =0 
  uint8_t button_3; // =1 если кнопка нажата, иначе =0 
  uint8_t button_4; // =1 если кнопка нажата, иначе =0 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ... 
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY; 
#pragma pack(pop) 
///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 
#define PIN_BUTTON_1 D1
#define PIN_BUTTON_2 D2
#define PIN_BUTTON_3 D3
#define PIN_BUTTON_4 D4
void setup()  
{ 
  RemoteXY_Init ();  
  pinMode (PIN_BUTTON_1, OUTPUT);
  pinMode (PIN_BUTTON_2, OUTPUT);
  pinMode (PIN_BUTTON_3, OUTPUT);
  pinMode (PIN_BUTTON_4, OUTPUT);
  // TODO you setup code 
} 
void loop()  
{  
  RemoteXY_Handler (); 
  digitalWrite(PIN_BUTTON_1, (RemoteXY.button_1==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_2, (RemoteXY.button_2==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_3, (RemoteXY.button_3==0)?LOW:HIGH);
  digitalWrite(PIN_BUTTON_4, (RemoteXY.button_4==0)?LOW:HIGH);
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 
}

Подправил код управления движениями и поворотами.

// Движения и повороты ///
  if (RemoteXY.button_1==1) // вперед
  {
     digitalWrite(PIN_BUTTON_1, HIGH);
     if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2) //если силектор в положении 1 или 2 включаем переднии фары
      {
        digitalWrite(PIN_LED_5, HIGH);
        digitalWrite(PIN_LED_6, HIGH);
      }
    }
   if (RemoteXY.button_2==1) // назад
  {
      digitalWrite(PIN_BUTTON_2, HIGH);
      if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2)//если силектор в положении 1 или 2 включаем стоп сигналы
      {
        digitalWrite(PIN_LED_STOP, HIGH);
      }
    }
  if (RemoteXY.button_3==1)  // влево
  {
     digitalWrite(PIN_BUTTON_3, HIGH);
    }
   if (RemoteXY.button_4==1)  // вправо
  {
      digitalWrite(PIN_BUTTON_4, HIGH);
    }
 //END Движения и повороты ///

Настроил работу селектора

//  Положение селектора 0 и 2   ///   
  if (RemoteXY.select_1 == 2)
      {
        Migalka ();// Мигалка 
      }   
  if (RemoteXY.select_1 == 0)
      {
          digitalWrite(PIN_LED_STOP, LOW); //
          digitalWrite(PIN_LED_5, LOW); // 
          digitalWrite(PIN_LED_6, LOW); // 
          digitalWrite(PIN_LED_7,  LOW); // 
          digitalWrite(PIN_LED_8, LOW); // 
      } 
 //END Положение селектора 0 и 2 ////

Добавил функцию управления полицейским стробоскопом. Данная функция написано на основании Урок 6 - Полицейский стробоскоп своими руками на Arduino.

void Migalka() // Мигалка 
{
 unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > interval[x]) // проверяем интервал
    {
      if (open) // если true
        digitalWrite(status ? PIN_LED_7 : PIN_LED_8, HIGH); //
      else // иначе
       digitalWrite(status ? PIN_LED_7 : PIN_LED_8, LOW); // 
       x++;
      if (x == 6) // если последний проход по циклу
      {
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
        x=0;
      }
      open = !open; //меняем false на true и наоборот 
    prestro1Millis = curstro1Millis;
  }
}

Чтобы машинке не продолжала движения когда кнопка отпущена написал вот такой код.

// Кнопка не нажата. снимам сигнал с пина //    
   if (RemoteXY.button_1==0)
   {
      digitalWrite(PIN_BUTTON_1, LOW);  
      digitalWrite(PIN_LED_5, LOW); // 
      digitalWrite(PIN_LED_6, LOW); // 
   }
   if (RemoteXY.button_2==0)
   {
      digitalWrite(PIN_LED_STOP, LOW); //
      digitalWrite(PIN_BUTTON_2, LOW); 
   }
   if (RemoteXY.button_3==0)
      digitalWrite(PIN_BUTTON_3, LOW); 
   if (RemoteXY.button_4==0)
      digitalWrite(PIN_BUTTON_4, LOW); 
 //END Кнопка не нажата. снимам сигнал с пина //

В итоге скетч для управления Wifi машинкой в среде Arduino IDE получился следующим.

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////
// определение режима соединения и подключение библиотеки RemoteXY 
#define REMOTEXY_MODE__ESP8266WIFIPOINT_LIB
#include <ESP8266WiFi.h>
#include <RemoteXY.h>
// настройки соединения 
#define REMOTEXY_WIFI_SSID "PortalPK"
#define REMOTEXY_WIFI_PASSWORD ""
#define REMOTEXY_SERVER_PORT 6377 
// конфигурация интерфейса  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 5,0,102,0,6,12,2,1,1,72
  ,10,21,13,49,63,12,12,2,208,155
  ,208,181,208,178,208,190,0,1,1,72
  ,37,21,13,48,82,12,12,1,208,159
  ,209,128,208,176,208,178,208,190,0,1
  ,1,5,10,21,12,5,83,12,12,5
  ,208,146,208,191,208,181,209,128,208,181
  ,208,180,0,1,1,5,37,21,12,5
  ,63,12,12,4,208,157,208,176,208,183
  ,208,176,208,180,0,3,3,44,12,14
  ,38,29,66,8,22,2 }; 
// структура определяет все переменные вашего интерфейса управления 
struct {
    // input variable
  uint8_t button_1; // =1 если кнопка нажата, иначе =0 
  uint8_t button_2; // =1 если кнопка нажата, иначе =0 
  uint8_t button_3; // =1 если кнопка нажата, иначе =0 
  uint8_t button_4; // =1 если кнопка нажата, иначе =0 
  uint8_t select_1; // =0 если переключатель в положении A, =1 если в положении B, =2 если в положении C, ...   
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 
} RemoteXY;
#pragma pack(pop)
/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////
#define PIN_BUTTON_1 D1
#define PIN_BUTTON_2 D2
#define PIN_BUTTON_3 D3
#define PIN_BUTTON_4 D4
//светодиоды
#define PIN_LED_STOP D0
#define PIN_LED_5 D5
#define PIN_LED_6 D6
#define PIN_LED_7 D7
#define PIN_LED_8 D8
// переменные 
boolean status = true; // флаг, что активна левая
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
long prestro1Millis = 0;        // до мигания ( в целом переменная времени)
int x=0;
void setup() 
{
  RemoteXY_Init (); 
  pinMode (PIN_BUTTON_1, OUTPUT);
  pinMode (PIN_BUTTON_2, OUTPUT);
  pinMode (PIN_BUTTON_3, OUTPUT);
  pinMode (PIN_BUTTON_4, OUTPUT);
    pinMode (PIN_LED_STOP, OUTPUT);
    pinMode (PIN_LED_5, OUTPUT);
    pinMode (PIN_LED_6, OUTPUT);
    pinMode (PIN_LED_7, OUTPUT);
    pinMode (PIN_LED_8, OUTPUT);
}
void loop() 
{ 
  RemoteXY_Handler ();
 // Движения и повороты ///
  if (RemoteXY.button_1==1) // вперед
  {
     digitalWrite(PIN_BUTTON_1, HIGH);
     if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2) //если силектор в положении 1 или 2 включаем переднии фары
      {
        digitalWrite(PIN_LED_5, HIGH);
        digitalWrite(PIN_LED_6, HIGH);
      }
    }
   if (RemoteXY.button_2==1) // назад
  {
      digitalWrite(PIN_BUTTON_2, HIGH);
      if (RemoteXY.select_1 == 1 || RemoteXY.select_1 == 2)//если силектор в положении 1 или 2 включаем стоп сигналы
      {
        digitalWrite(PIN_LED_STOP, HIGH);
      }
    }
  if (RemoteXY.button_3==1)  // влево
  {
     digitalWrite(PIN_BUTTON_3, HIGH);
    }
   if (RemoteXY.button_4==1)  // вправо
  {
      digitalWrite(PIN_BUTTON_4, HIGH);
    }
 //END Движения и повороты ///   
 //  Положение селектора 0 и 2   ///   
  if (RemoteXY.select_1 == 2)
      {
        Migalka ();// Мигалка 
      }   
  if (RemoteXY.select_1 == 0)
      {
          digitalWrite(PIN_LED_STOP, LOW); //
          digitalWrite(PIN_LED_5, LOW); // 
          digitalWrite(PIN_LED_6, LOW); // 
          digitalWrite(PIN_LED_7,  LOW); // 
          digitalWrite(PIN_LED_8, LOW); // 
      } 
 //END Положение селектора 0 и 2 ////      
 // Кнопка не нажата. снимам сигнал с пина //    
   if (RemoteXY.button_1==0)
   {
      digitalWrite(PIN_BUTTON_1, LOW);  
      digitalWrite(PIN_LED_5, LOW); // 
      digitalWrite(PIN_LED_6, LOW); // 
   }
   if (RemoteXY.button_2==0)
   {
      digitalWrite(PIN_LED_STOP, LOW); //
      digitalWrite(PIN_BUTTON_2, LOW); 
   }
   if (RemoteXY.button_3==0)
      digitalWrite(PIN_BUTTON_3, LOW); 
   if (RemoteXY.button_4==0)
      digitalWrite(PIN_BUTTON_4, LOW); 
 //END Кнопка не нажата. снимам сигнал с пина // 
}
void Migalka () // Мигалка 
{
 unsigned long curstro1Millis = millis();  // устанавливаем время в сейчас
  if ((curstro1Millis - prestro1Millis) > interval[x]) // проверяем интервал
    {
      if (open) // если true
        digitalWrite(status ? PIN_LED_7 : PIN_LED_8, HIGH); //
      else // иначе
       digitalWrite(status ? PIN_LED_7 : PIN_LED_8, LOW); // 
       x++;
      if (x == 6) // если последний проход по циклу
      {
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
        x=0;
      }
      open = !open; //меняем false на true и наоборот 
    prestro1Millis = curstro1Millis;
  }
}

Код долек от идеального.

При тестирование машинки выявлены следующие недостатки:

1. стандартных батареек не хватает для плавного запуска двигателя машинки. Машинка пищит и не едет.

2. При сильном ударе об стену батарейки отходят и микроконтроллер на время теряет питание в связи с чем происходит потеря сигнала Wifi .

3. Заряда батареек хватает всего на 1 неделю при использовании по 30-60 мин в день .


P.S.: Начал устранят минусы. Ждите продолжения.

]]>
Урок 7 - Светофор на Arduino своими руками. Пишем скетч используя функции http://portal-pk.ru/news/68-urok-7----svetofor-na-arduino--svoimi-rukami-pishem-sketch.html Константин Portal-PK 2017-03-28T12:08:49+03:00 В данном уроке сделаем самый простой светофор из трех светодиодов . Работать он должен вот по такой схеме.

Работа светофора

1. Светит только красный цвет нашего будущего светофора.

2. Не выключая красный сигнал светофора включаем желтый .

3. Выключаем красный и желтый включаем зеленый.

4. Выключаем зеленый сигнал светофора включаем желтый.

После чего цикл повторяем с красного сигнала светофора.

Для урока нам понадобится:

Подключим три LED к плате Arduino UNO . У нас получиться вот такая схема.

Светофор на ардуино своими руками

Принципиальная схема.

Принципиальная схема подключения светофора на Arduino

Скетч выглядит так

int led_red = 2; // пин подключения 2
int led_yellow = 3; // пин подключения 3
int led_green = 4; // пин подключения 4
void setup() {
pinMode(led_red, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(led_green, OUTPUT);
}
void loop() {
    digitalWrite(led_red, HIGH); 
          delay(10000); // Ждем
    digitalWrite(led_yellow, HIGH); 
          delay(2000);// Ждем
    digitalWrite(led_green, HIGH); 
    digitalWrite(led_red, LOW);
    digitalWrite(led_yellow, LOW);
          delay(10000);// Ждем
    digitalWrite(led_yellow, HIGH);
    digitalWrite(led_green, LOW);
        delay(2000);// Ждем
    digitalWrite(led_yellow, LOW);
}

Для управления светодиодами используем функции digitalWrite().

Давайте заменим стандартную функции digitalWrite() на свою функцию Led().

void Led (uint8_t pin, byte status)
{
      digitalWrite(pin, status);
}

Функция принимает две переменные pin — пин светодиода и status — состояние светодиода HIGH или LOW.

В итоге получим вот такой скетч

int led_red = 2; // пин подключения 2
int led_yellow = 3; // пин подключения 3
int led_green = 4; // пин подключения 4
void setup() {
pinMode(led_red, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(led_green, OUTPUT);
}
void loop() {
    Led (led_red, HIGH); 
          delay(10000); // Ждем
    Led (led_yellow, HIGH); 
          delay(2000);// Ждем
    Led (led_green, HIGH); 
    Led (led_red, LOW);
    Led (led_yellow, LOW);
          delay(10000);// Ждем
    Led (led_yellow, HIGH);
    Led (led_green, LOW);
        delay(2000);// Ждем
    Led (led_yellow, LOW);
}
void Led (uint8_t pin, byte status)
{
      digitalWrite(pin, status);
}


Как видно по скетчу код стал больше, а функции используют для уменьшения объема кода и упрощения логики. Но мы на этом простом примере посмотрели что такое функция и как передавать переменные в функции в среде разработки arduino IDE.

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

Ест вопросы смотрите видео там подробно описываю программу светофора на Arduino.

Следующий урок: Светофор из 3 светодиодов для машин и 2 для пешеходов на Arduino



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

]]>
Урок 6 - Полицейский стробоскоп своими руками на Arduino http://portal-pk.ru/news/67-urok-6-----policeiskii-stroboskop-svoimi-rukami-na-arduino.html Константин Portal-PK 2017-03-28T07:42:08+03:00 В видео уроке : Урок 5 - Полицейская мигалка своими руками из светодиодов на Arduino . Мы подключили два светодиода и заставили их поочередно плавно включатся и выключаться. В данном уроке подключение аналогично предыдущему уроку. Измениться только программа управления.

Для урока нам понадобится:

Подключим два светодиода к плате Arduino UNO . У нас получиться вот такая схема.

полицейский стробоскоп на Arduino

Принципиальная схема.

Схема принципиальная полицейский стробоскоп на Arduino

Скетч для управления полицейским стробоскопом во такой. Менее 30 строчек кода.

int led_5 = 5; // пин подключения 5
int led_3 = 3; // пин подключения 3
// переменные 
boolean status = true; // флаг, что активна левая
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
void setup()  { 
  // два вывода на выход
  pinMode(led_5, OUTPUT);
  pinMode(led_3, OUTPUT);
} 
void loop()  { 
   for (int x=0; x<6; x++) { // цикл 6 проходов
    if (open) // если true
        digitalWrite(status ? led_3 : led_5, HIGH); // если status == false то падаем на пин 3 иначе на пин 5
    else // иначе
      digitalWrite(status ? led_3 : led_5, LOW); // если status == false то падаем на пин 3 иначе на пин 5
    delay(interval[x]); // Ждем 
     if (x == 5) // если последний проход по циклу
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;
    open = !open; //меняем false на true и наоборот;
   }                      
}

Переменные:

// переменные 
boolean status = true; // флаг, что активна левая
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED

Переменная status — отвечает за работу левого и правого светодиода. Если статус true (истина). Программа управляет левым светодиодом. Иначе false (ложно) — программа управляет правым светодиодом.

Переменная open — аналогично переменой статус. Если true- светодиод светиться, иначе false — светодиод выключен.

Массив interval- содержит 6 значений. Нечетные значения это время свечения светодиода. Четные время сколько светодиод не светиться между интервалами свечения.

В основно цикле loop() у нас выполняется цикл for() 6 раз, равно столько сколько у нас элементов в массиве interval.

digitalWrite(status ? led_3 : led_5, HIGH); // если status == false то падаем на пин 3 иначе на пин 5

В данной строчке нас интересует вырождение в круглых скобках.

status ? led_3 : led_5

Данное вырождение сокращенная форма условия. По другому данную строку можно написать:

if (status == true) 
    led_3
else
    led_5
delay(interval[x]); // Ждем

Обычная функция delay(). Просто мы передаем в качестве аргумента элемент массива, где x - это номер прохода по циклу

for (int x=0; x<6; x++) { // цикл 6 проходов

Первый элемент interval[0], так как у нас цикл начинается с 0 и нумерация элементов массива начинается с 0. Второй элемент interval[1] и так далее до interval[5].

if (x == 5) // если последний проход по циклу 
   status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот;

Если мы делаем проход по циклю меряем статус на противоположный тем самым передаем слова другому светодиоду.

open = !open; //меняем false на true и наоборот;

Переменную open меняем на противоположное значения при каждом выполнении цикла. Для смены свечения светодиода: вкл → выкл →вкл → выкл →вкл → выкл. Так как у нас 6 интервалов времени в массиве interval.

После того как цикл выполнился 6 раз. Передается слова другому светодиоду и все повторяется снова.

Следующий урок: Светофор на Arduino своими руками. Пишем скетч используя функции

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

]]>
Самодельный ЧПУ станок из принтеров своими руками — Часть 2 http://portal-pk.ru/news/66-samodelnyi-chpu-stanok-iz-printerov-svoimi-rukami-␔.html Константин Portal-PK 2017-03-14T09:18:37+03:00 В предыдущей статье: Как собрать ЧПУ станка на Arduino своими руками за 3000 руб - Часть 1 Были рассмотренный основные этапы сборки станка ЧПУ из принтеров на Arduino. В данном обзоре расскажу из каких деталей и комплектующих собирался данный принтер. Покажу как устроены основные узлы. А также сделаем пуск станка на Arduino. Включим шпиндель.

Схема подключения драйверов L298n к Arduino NANO

Схема подключения драйверов L298n к Arduino NANO

Схема подключения шагового двигателя к L298n

Схема подключения шагового двигателя к L298n

Схема подключения с двумя двигателями на оси X:

Схема подключения с двумя двигателями на оси X

Самое простоя программное обеспечение для запуска станка при такое схеме подключения смотрите тут. Данный пример очень простой но у него есть достаточно большое количества недостатков.


Для сборки ЧПУ станка из деталей от принтера были использовано:

  1. 3 Матричных принтера формата А3.
  2. Мебельные направляющие: 2 пары 500 мм. И одна пара на 300 мм.
  3. Доска 25х100, брусок 25х25, фанера толщиной 8 мм.
  4. Блок питания от компьютера.
  5. Arduino NANO
  6. Драйвера L298 4 шт.
  7. Строительные и мебельные уголки.
  8. Саморезы, винты, гайки и шпилька М10.
  9. Телефонные провода, провода из компьютера.
  10. Переменный резистор из автомобиля.
  11. Двигатель от автомобильного компрессора.
  12. Шаговый двигатель от сканера.
  13. Латунная цанга.

Кратко что для чего применялось в ЧПУ стнке:

Ось X ЧПУ станка сделана из двух оснований от матричных принтеров формата А3. С помощью брусков 25х25 сделана обвязка оснований принтеров и на данные бруски закреплены две мебельные направляющие длиной 500 мм. На мебельные направляющие сверху закреплен лист фанеры польщенной 8 мм.

Двигатель принтера станка ЧПУ

Ось X Станка ЧПУ из принтеров

Ось Y станка на Arduino расположена на портале,который сделан из трех досок 25х100 мм. Для перемещения используется двигатель от матричного принтера и ременная передача. Направляющие также мебельные длиной 500 мм.

Двигатель из принтера для станка ЧПУ

Ось Z ЧПУ закреплена на направляющие оси Y. Для перемещения был использован шаговый двигатель взятый из сканера. Передача винтовая сделанная из шпильки М10. Направляющи мебельные длиной 300 мм. Соединенные под углом 90 градусов для жесткости.

Шаговый двигатель из сканера для станка ЧПУ

Шпиндель из двигателя от автомобильного компрессора

Шпиндель станка ЧПУ сделан из двигателя взятого из нерабочего автомобильного компрессора. На вал двигателя закреплена цанга.

Управляет станком Arduino NANO. Драйвера L298. Для понижения напряжения с 12 вольт до 8, используются транзисторы.

Станок ЧПУ на Arduino

Драйвера L298 Для станка ЧПУ на Arduino

Смотрите также видео:

Фрезерование на самодельном фрезерном станке ЧПУ.

]]>
Бесплатный аккумулятор 18650 из батареи ноутбука http://portal-pk.ru/news/65-besplatnyi-akkumulyator-18650-iz-batarei-noutbuka.html Константин Portal-PK 2017-03-09T08:16:18+03:00 Отдали мне старую батарею от ноутбука. Как я уже знал в батареях от ноутбука находятся аккумуляторные батарейки 18650. Поэтому я решил разобрать батарею и снять видео как это сделать.

Разобрать батарею от ноутбука не составило труда. Батарейки я извлек. После проверки оказалось что рабочих всего 3 аккумулятора 18650 . Ну что стоило ожидать от такой старой батареи.

Так же решил сделать с помощью неодимовых магнитов подключения к батарейкам 18650. Для этого я вырезал из консервной банки два элемента в виде капелек. Припаял провода и в месте пайки установил термоупрочненную трубку.

Данного рода подключения для аккумуляторов 18650 эффективны. Но имеют ряд недостатков. Хорошо бы сделать бокс для аккумулятора. Но этим я займусь в следующий раз.


]]>
Как собрать ЧПУ станка на Arduino своими руками за 3000 руб - Часть 1 http://portal-pk.ru/news/64-kak-sobrat-chpu-stanka-na-arduino-svoimi-rukami-za-3000-rub--.html Константин Portal-PK 2017-03-09T07:45:21+03:00 В век информатизации и автоматизации. Станок с ЧПУ очень распространенный и им ни кого не удавишь. И многие самостоятельно собирают данные станки в домашних условиях. Не так давно мой старый знакомый предложил собрать станок. Он работает на фрезерном станке с ЧПУ. После небольшого размышления, мы приняли решения что будем собирать станок ЧПУ с минимальной затратой средств.

Схема подключения драйверов L298n к Arduino NANO

Схема подключения драйверов L298n к Arduino NANO

Схема подключения шагового двигателя к L298n

Схема подключения шагового двигателя к L298n

Схема подключения с двумя двигателями на оси X:

Схема подключения с двумя двигателями на оси X

Цель создания станка ЧПУ:

Во-первых, чтобы проверить свои силы и возможности.

Во-вторых, первый бил чаше всего бывает комом. Но не в нашем случае. Буквально за 2 выходных мы собрали станок который перемешался по 2 осям.

После чего мы провели небольшие доработки. Вот что у нас получилось:

Для управления выбрали Arduino NANO. Дешевый и надежный вариант, так как для ардуины большой выбор прошивок и программ для управления станком. Блок питания взяли от компьютера. Мотор для шпинделя взят от сломленного автомобильного компрессора. Полный обзор схемы и программы будет в следующем видео.

Для сборки были использованы материалы который у нас лежали без дела. Купили только мебельные направляющие. И один матричный принтер. В итоге наш расход привесил чуть больше 2000 руб. Написал в заголовке станок ЧПУ за 3000 руб. потому что если все покупать то в данную сумму можно уложиться.

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


]]>
Выводы, сконфигурированные как INPUT_PULLUP http://portal-pk.ru/news/63-vyvody-skonfigurirovannye-kak-input_pullup.html Константин Portal-PK 2017-03-02T08:26:09+03:00 Микроконтроллер ATmega в Ардуино имеет внутренние подтягивающие резисторы (резисторы, подключенные к питанию внутри микросхемы), которыми можно управлять. Если вы предпочитаете использовать их вместо внешних резисторов, подключенных к земле, - используйте параметр INPUT_PULLUP в функции pinMode(). Это позволит инвертировать поведение подключенного к выводу внешнего датчика: HIGH будет означать его отключение, а LOW - включение. См. пример использования INPUT_PULLUP при последовательной связи.

]]>
Самодельные соединительные провода для breadboard и Arduino http://portal-pk.ru/news/62-samodelnye-soedinitelnye-provoda-dlya-breadboard.html Константин Portal-PK 2017-03-02T08:01:42+03:00 При изучении электроники и микроконтроллеров не обойтись без breadboard — макетная плата, плата для макетирования (прототипирования).

Но бредборда недостаточно. Нужны соединительные провода, которые можно купить в Китае за 2-3 рубля за штуку. Или сделать самому из подручных средств.

Сделать провода для бредборада можно из проводов взятых из компьютера. Провода которые подключаются к материнской плате подойдут как разъем мама. Проводя из блока питания толстые и не имеют необходимых разъемов, но их можно разрезать на нужную длину и припаять наконечники.

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

Отличные перемычки для бредборда получаются из проводов взятых из витой пары и телефонных проводов. О чем я рассказываю в видео ролике.

Кроме подключения бредборада к Arduino или другим микроконтроллерам. Нужно подключать другие элементы схемы: двигателя, большие резисторы, катушки, источники питания, платы и пр. Не всегда удобно к ним припаивать провода для одного подключения. Для решения данной задачи подойдут проводов с крокодилами, которые также продаются в Китае. Пара таких проводов стоят от 30 до 100 руб. В магазине крокодилы стоят 5-10 руб шт. В целях экономии средств и времени можно сделать данные провода самостоятельно.

Плюсы самодельных проводов для breadboard:

  1. Можно сделать провод любой длины
  2. Одножильные провода занимают меньше места при монтаже и не мешаются.
  3. Не нужно ждать пока они прейдут из Китая
  4. При потребности можно сделать еще
  5. Дешевле

Минусы самодельных проводов для breadboard:

  1. Качество не всегда получаться как у фабричных
  2. Затраты время на изготовления


Как видно плюсов больше, но решать вам делать или нет самодельные провода для бредборда.

]]>
float() http://portal-pk.ru/news/61-float.html Константин Portal-PK 2017-03-01T12:38:40+03:00 Описание

Приводит значение к типу float.

Синтаксис

float(x)

Параметры

x: значение любого типа

Возвращаемые значения

float

]]>
long() http://portal-pk.ru/news/60-long.html Константин Portal-PK 2017-03-01T12:36:38+03:00 Описание

Приводит значение к типу long.

Синтаксис

long(x)

Параметры

x: значение любого типа

Возвращаемые значения

long

]]>
word() http://portal-pk.ru/news/59-word.html Константин Portal-PK 2017-03-01T12:34:34+03:00 Описание

Приводит значение к типу word или создает значение типа word из двух байт.

Синтаксис

word(x)
word(h, l)

Параметры

x: значение любого типа

h: старший байт (левая часть) значения word

l: младший байт (правая часть) значения word

Возвращаемые значения

word


]]>
int() http://portal-pk.ru/news/58-int.html Константин Portal-PK 2017-03-01T12:32:44+03:00 Описание

Приводит значение к типу int.

Синтаксис

int(x)

Параметры

x: значение любого типа

Возвращаемые значения

int


]]>
byte() http://portal-pk.ru/news/57-byte.html Константин Portal-PK 2017-03-01T12:30:30+03:00 Описание

Приводит значение к типу byte.

Синтаксис

byte(x)

Параметры

x: значение любого типа

Возвращаемые значения

byte


]]>
char() Преобразование типов данных http://portal-pk.ru/news/56-char-preobrazovanie-tipov-dannyh.html Константин Portal-PK 2017-03-01T12:27:37+03:00 Описание

Приводит значение к типу char.

Синтаксис

char(x)

Параметры

x: значение любого типа

Возвращаемые значения

char


]]>
Урок 5 - Полицейская мигалка своими руками из светодиодов на Arduino http://portal-pk.ru/news/55-urok-5---policeiskaya-migalka-svoimi-rukami-iz-.html Константин Portal-PK 2017-02-27T08:16:36+03:00 Каждый мальчишка мечтает о полицейской машинке с мигалкой . Сейчас в продаже очень большой выбор полицейских, пожарных машин и другой спец техники. Можно найти с мигалкой и сиреной. Но можно ли самому собрать мигалку и на сколько это сложно?

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

Для урока нам понадобиться:

Подключим два светодиода к плате Arduino UNO. У нас получиться вот такая схема.

Полицейская мигалка на Arduino

Принципиальная схема.

Полицейская мигалка на Arduino схема подключения


Скетч аналогичен уроку : Урок 3 — плавное включение светодиода на Arduino с помощью ШИМ (PWM) . В данном уроке нам нужно подключать светодиоды к пинам у которых есть ШИМ. Поэтому подключим к 3 и 5 цифровому выводу/выводу Arduino.

int led_5 = 5; // пин подключения 5
int led_3 = 3; // пин подключения 3
int brightness = 0;    // яркость светодиода 
int fadeAmount = 5;   // шаг изменения яркости
void setup()  { 
  // два вывода на выход
  pinMode(led_5, OUTPUT);
  pinMode(led_3, OUTPUT);
} 
void loop()  { 
  // у первого вывода минимальное значение,  у второго - максимальное
  analogWrite(led_5, brightness); 
  analogWrite(led_3, 255 - brightness);  
  brightness = brightness + fadeAmount; // прибавляем шаг изменения яркости
  // Проверяем границы 
  if (brightness == 0 || brightness == 255) {// Условие
    fadeAmount = -fadeAmount ; // Меняем знак
    delay(200); // Ждем 
  }     
  delay(10); // Ждем                           
}

В код добавим инверсию для одного светодиода для этого добавим следующую строчку:

analogWrite(led_3, 255 - brightness);

Данная строчке свечение светодиода противоположно строчке:

analogWrite(led_5, brightness);

Если brightness = 255, светодиод подключенный к третьему пину не светиться, а к пятому, напротив светит на полную мощность.

Когда brightness = 0 светодиод подключенный к третьему пину светится на полную мощность, а к пятому не светиться.

Оба светодиода светят одинаково в половину мощности.

Трудностей возникнуть не должно если вы смотрели предыдущие уроки.

Следующий урок: Полицейский стробоскоп своими руками на Arduino


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

]]>
Урок 4 - Сигнал SOS с помощью светодиода и Arduino http://portal-pk.ru/news/54-urok-4---signal-sos-s-pomoshchyu-svetodioda-i-arduino.html Константин Portal-PK 2017-02-21T08:27:53+03:00 SOS — радиосигнал о помощи, терпящих бедствие на море. Состоит из сочетания трех точек, трёх тире и ещё трех точек азбуки Морзе. Мнение, будто SOS — аббревиатура английского словосочетания «Save Our Souls» («Спасите наши души») или «Save Our Ship» («Спасите наш корабль») — красивая легенда. На самом деле расшифровки нет, просто соединение точек, тире, точек — наиболее простая и отчетливая комбинация.

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

Для урока нам понадобиться:

Схема подключения такая же как и в уроке: Мигаем светодиодом на Arduino.


Сигнал SOS на Arduino

В скетче будут использоваться 3 цикла for в среде разработке Arduino IDE. (В Видео ролике немного наврал, циклы for мы еще не рассматривали.)

int led_pin=3;          // пин подключения
void setup() {
pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
}
void  loop()  { 
   for (int x=0; x<3; x++) {
    digitalWrite(led_pin, HIGH);// зажигаем светодиод
    delay(250);         // ждем 350 милисекунд
    digitalWrite(led_pin, LOW); // выключаем светодиод
    delay(100);         // ждем 300 милисекунд
   }
   delay(300);
   for (int x=0; x<3; x++) {
    digitalWrite(led_pin, HIGH);// зажигаем светодиод
    delay(500);         // ждем 700 милисекунд
    digitalWrite(led_pin, LOW); // выключаем светодиод
    delay(100);         // ждем 300 милисекунд
   }
   delay(300);
   for (int x=0; x<3; x++) {
    digitalWrite(led_pin, HIGH);// зажигаем светодиод
    delay(250);         // ждем 350 милисекунд
    digitalWrite(led_pin, LOW); // выключаем светодиод
    delay(100);         // ждем 300 милисекунд
   }
  delay(5000); // ждем 5 секунд
}

Конструкция for используется для повторения блока операторов, заключенных в фигурные скобки. Счетчик приращений обычно используется для приращения и завершения цикла. Оператор for подходит для любых повторяющихся действий и часто используется в сочетании с массивами коллекций данных/выводов.

Заголовок цикла for состоит из трех частей:

for (initialization; condition; increment) {операторы выполняющиеся в цикле}

Инициализация (Initialization) выполняется самой первой и один раз. Каждый раз в цикле проверяется условие (condition), если оно верно, выполняется блок операторов и приращение (increment), затем условие проверяется вновь. Когда логическое значение условия становится ложным, цикл завершается.

for (int x=0; x<3; x++)

int x=0 — Присвоим переменной x значение равное 0.

x<3; - Если x Меньше чем 3 выполняем цикл.

x++ - При каждом выполнении цикла прибавляем к x единицу. По другому данную строку можно записать x=x+1.

Изначально Икс ( x) равен 0. Сравниваем 0<3, прибавляем к x единицу и выполняем действия в {}. После выполнения действия в скобках. Выполняем проверку x у нас сейчас равен 1. 1<3, прибавляем к x единицу и выполняем действия в {}. Аналогично пройдет третий проход по циклу. А при попытке выполнить цикл четвертый раз у нас получиться что 3=3. Условия цикла не выполняется. Выполнение цикла прекращаться.

Остальные циклы в скетче выполняются аналогично.

Следующий урок: Мигалка из 2 светодиодов на Arduino

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


]]>
Урок 1 -Подключает servo-привод к arduino. Сервопривод + кнопка http://portal-pk.ru/news/53-urok-1--podklyuchaet-servo-privod-k-arduino-servoprivod-+.html Константин Portal-PK 2017-02-17T14:02:06+03:00 Сервопривод – это привод, вал которого может встать в заданное положение или поддерживать заданную скорость вращения. Другими словами, валом сервопривода можно управлять, например, задавая ему положение в градусах или определенную частоту вращения.

Сервоприводы используются в самых разных областях, например, в робототехнике они помогают моделировать различные движения роботов. Сервоприводы – эффективное решение для перемещения механизмов в пространстве.

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

Для урока нам понадобиться:

Подключение к Arduino

Для достижения самых разных целей робототехники к программируемому контроллеру Arduino может быть подключен сервопривод. Подключение осуществляется через кабели, которые выходят из сервопривода. Обычно это три кабеля: красный; коричневый или черный; желтый, оранжевый или белый.

Подключение сервопривода к плате Arduino производится через ШИМ-выводы. Что Такое PWM (ШИМ) мы уже рассматривали в уроке: Плавное включение светодиода на Arduino с помощью ШИМ (PWM)

За основу возьмем урок Подключение кнопки и светодиода плате Arduino к схеме добавим сервопривод и вот что у нас должно получиться.

Servo Arduino

Принципиальная схема подключения сервопривода к плате ардуино

Изменим код:

#include <Servo.h> // подключаем библиотеку для работы с сервоприводом
Servo servo; // объявляем переменную servo типа "servo"
int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
// переменные
int buttonState = 0;          // переменная для хранения состояния кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
    servo.attach(5); // привязываем сервопривод к аналоговому выходу 10
}
void loop() {
  buttonState = digitalRead(button_pin);// считываем значения с входа кнопки
   if (buttonState == HIGH) { 
    digitalWrite(led_pin, HIGH);// зажигаем светодиод
    servo.write(0); //ставим вал на 180
    delay (1000); // задержка в 1 секунду
  }
  else {
    digitalWrite(led_pin, LOW);// выключаем светодиод
    servo.write(180); //ставим вал на 0
    delay (1000); // задержка в 1 секунду
  }
}


#include <Servo.h> // подключаем библиотеку для работы с сервоприводом

Мы еще не работали с библиотеками. Библиотека это класс, содержащий функции которые мы можем использовать в нашей программе. Библиотека позволяет сократить объем написанного кода и скорость разработки приложения.

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

Servo servo; // объявляем переменную servo типа "servo"

Объявлением переменную, она нам понадобиться для работы с библиотекой.

servo.attach(5); // привязываем сервопривод к аналоговому выходу 5

Функция библиотеки Servo.

servo.write(180); //ставим вал на 180

С помощью данной функции мы можем повернуть сервопривод на заданный угол.


Следующий урок: IR Пульт. Включение выключение светодиода.


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

]]>
Блок питания 5v от сети 220 для arduino http://portal-pk.ru/news/52-blok-pitaniya-5v-ot-seti-220-dlya-arduino.html Константин Portal-PK 2017-02-17T07:57:44+03:00 При работе с проектами на Arduino, USB провод не всегда под рукой. А платы Arduino Mini Pro не имеют usb-интерфейса. Как подать питание на наши проекты? Не ужели постоянно пользоваться батарейками или покупать дорогие блоки питания?

Для себя я нашел недорогое решение: модуль преобразующий 220v AC в 5v DC.

Модуль питания 5 Вольт

Данная плата имеет небольшие размеры и ее можно легко уместить в подрозетник, под крепления люстры, в распределительную коробку.

На основе этой схемы я сделал небольшой блок питания. В качестве корпуса использовал яйцо из кинтдерсюрприза. Получился небольшой и удобный источник питания для Arduino проектов.

Блок питания 5 вольт из яйца из под киндерсюрприза

Купить модуль преобразований 220v AC в 5v DC у проверенного продавца можно тут.

Да встречи в следующем проекте!

]]>
Библиотека Servo http://portal-pk.ru/news/51-biblioteka-servo.html Константин Portal-PK 2017-02-13T12:06:07+03:00 Эта библиотека функций для Arduino контроллера предоставляет набор функций для управления сервоприводами. Стандартные сервоприводы позволяют поворачивать привод на опредленный угол от 0 до 180 градусов обычно. Некоторые сервоприводы позволяют совершать полные обороты на заданной скорости.

Библиотека Servo позволяет одновременно управлять 12-ю сервоприводами на большинстве плат Arduino и 48-ю на Arduino Mega. На контроллерах отличных от Mega использование библиотеки отключает возможность использовать выходы 9 и 10 врежиме ШИМ даже если привод не подключен к этим выводам. На плате Mega могут быть использованы до 12 сервоприводов без потери функционала ШИМ. При использовании Mega для управления от 12 до 23 сервоприводов нельзя будет использовать выходы 11 и 12 для ШИМ.

Подключение

В общем случае сервопривод подключается 3-мя проводами : питание, земля и сигнальный. Обычно питание - красный провод и может быть подключен к выводу +5V на плате Arduino. Черный провод земля подключается к GND выводу Arduino, сигнальный, обычно желты, провод подключается к цифровому выводу котроллера Arduino. Следует отметить, что мощные сервоприводы могут создавать большую нагрузку, в этом случает он должен быть запитан отдельно (не через выход +5V Arduino). Тоже самое верно для случая подключения сразу нескольких сервоприводов. Убедитесь, что привод и контроллер подключены к общей земле.

Функции:


Servo.attach()

Подключает Servo к указанному выходу, с которого осуществляется управление приводом. На ранних версиях Arduino - 0016 и более ранних, библиотека Servo поддерживала управления только через порты 9 и 10.

Синтаксис

servo.attach(pin)
servo.attach(pin, min, max)

Параметры

  • servo: переменная типа Servo
  • pin: номер выхода, к которому подключаем servo и с которого осуществляется управление приводом
  • min (опциональный): ширина импульса в микросекундах, соответствующий минимальному (угол 0 градусов) положению сервопривода. (по умолчанию 544)
  • max (optional): ширина импульса в микросекундах, соответствующий максимальному (угол 180 градусов) положению сервопривода.

Пример

#include <Servo.h> 
Servo myservo;
    void setup() 
{ 
  myservo.attach(9);
} 
    void loop() {}


Servo.write()

Передает значения для управления приводом. Для стандартного сервопривода это угол поворота. Для привод постоянного вращения, функция задает скорость вращения (0 - для максимальной скорости вращения в одну сторону, 180 - для максимальной скорости в другую сторону и около 90 для неподвижного состояния).

Синтаксис

servo.write(angle)

Параметры

  • servo: переменная типа Servo
  • angle: значение записываемое в servo, от 0 до 180

Пример

#include <Servo.h> 
Servo myservo;
 void setup() 
{ 
  myservo.attach(9);
  myservo.write(90);  // устанавливает сервопривод в среднее положение
} 
  void loop() {}


Servo.writeMicroseconds()

Передает значение для управления сревоприводом в микросекундах (uS), устанавливая угол поворота на это значение. Для стандартного привода значение 1000 максимальный поворот против часовой стрелки, 2000 максимальный поворот по часовой стрелке, 1500 посередине.

Замечание: некоторые производители не придерживаются стандартных значение и такие приводы могут управляться значениями от 700 до 2300. Поэкспериментируйте со значениями, до момента пока привод не повернется и остановится в крайнем положение. Тем не менее следует избегать постоянного использования привода на значениях больше допустимых.

Приводы постоянного вращения реагируют на данную комманду подобно реакции на функцию write().

Синтаксис

servo.writeMicroseconds(uS)

Параметры

  • servo: переменная типа Servo
  • uS: значение в микросекундах (int)

Пример

#include <Servo.h> 

Servo myservo;

void setup() 
{ 
  myservo.attach(9);
  myservo.writeMicroseconds(1500);  // устанавливает привод в среднее положение
} 

void loop() {}


Servo.read()

Считывает значение текущего положения сервопривода (значение записанное последним вызовом функции write()).

Синтаксис

servo.read()

Параметры

  • servo: a variable of type Servo

Возвращаемое значение

Положение (угол) сервопривода от 0 до 180.


Servo.attached()

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

Синтаксис

servo.attached()

Параметры

  • servo: переменная типа Servo

Возвращаемое значение

  • true если подключена; false в противном случае.

Servo.detach()

Отсоединяет переменную Servo от указанного выхода. Если все Servo переменные отсоединены, то выходы 9 и 10 могут быть использованы в режиме ШИМ с помощью analogWrite().

Синтаксис

servo.detach()

Параметры

  • servo: переменная типа Servo
]]>
Константы с плавающей запятой (floating point constants) http://portal-pk.ru/news/50-konstanty-s-plavayushchei-zapyatoi-floating-point-constants.html Константин Portal-PK 2017-02-13T12:01:15+03:00 Очень похожи на целочисленные константы. Используются в коде программы для более удобного понимания и чтения кода. Значения записываются по зарубежному стандарту только через точку.

Пример

n = .005;

Также принимаются значения, записанные с экспонентой вида «Е» и «е».

Формат записи константы с плавающей запятой Значение константы: либо:
10.0 10
2.34Е5 2.34 * 10^5 234000
67е-12 67.0 * 10^-12 .000000000067
]]>
Целочисленные константы http://portal-pk.ru/news/49-celochislennye-konstanty.html Константин Portal-PK 2017-02-13T11:59:07+03:00 Целочисленные константы — это числа используемые напрямую в коде скетча, без определения переменной для их хранения. По умолчанию такие константы трактуются как тип int, но это может быть изменено директивами U и L (см. ниже)

Обычно такие константы считаются десятичными целыми числами, но специальные директивы позволяют задать отличный базис.

Базис Пример Директива Комментарий
10 (decimal- десятеричный 123 нет
2 ( binary - двоичный) B1110111 первая B только для 8-бит значений (0-255), разрешенные знаки 0 и 1
8 (octal) 073 первая "0" разрешенные знаки 0-7
16(hexadecimal) 0x7B первые "0x" разрешенные знаки 0-9, A-F, a-f

Decimal (десятичные) базис 10. Наиболее распространен. Константы без префиксов (директив) по умолчанию считаются десятичными

Пример:

101     // 101 десятичные   ((1 * 10^2) + (0 * 10^1) + 1)

Binary (двоичный или бинарный) базис 2. Только 0 и 1 разрешены для записи.

Пример:

B101    // тоже что 5 десятичных   ((1 * 2^2) + (0 * 2^1) + 1)

Использование двоичного формата допускается только с 8-битными числами, принимающими значение от 0 (B0) до 255(B11111111). Если необходимо задать значение 16-битного целого )int бинарными константами, то это может быть сделано в два шага:

myInt = (B11001100 * 256) + B10101010;

Octal — базис 8. Допустимы 0-7. Форматирующий префикс "0".

Пример:

0101    // то же, что десятичное 65   ((1 * 8^2) + (0 * 8^1) + 1)

Внимание! Включение "0" перед константой по ошибке может привести к очень сложно-диагностируемой ошибке, из-за того, что компилятор будет считать константу в восьмеричной системе.

Hexadecimal (or hex) базис 16. Допустимы знаки 0-9, A-F и a-f. A — это десятеричное 10, B — 11, и т.д до F — 15. Предваряющий "0x" используется как форматирующая директива.

Пример:

0x101   // same as 257 decimal   ((1 * 16^2) + (0 * 16^1) + 1)

U и L директивы.

По умолчанию целочисленные константы относятся компилятором к типу int. Чтобы заставить компилятор использовать другой тип данных, используются следующие директивы.

  • 'u' или 'U' для беззнакового целочисленного числа. Пример: 33u
  • 'l' или 'L' для long типа данных. Пример: 100000L
  • 'ul' или 'UL' для беззнакового числа long типа данных. Пример: 32767ul
]]>
Урок 1 - Подключение кнопки и светодиода к плате Arduino http://portal-pk.ru/news/48-urok-1---podklyuchenie-knopki-i-svetodioda-k-plate-arduino.html Константин Portal-PK 2017-02-10T11:34:05+03:00 В блоке уроков Светодиоды, Резисторы, Arduino . Мы научились управлять светодиодом с помощью платы Arduino. Но как сделать включение светодиода при нажатии кнопки?

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

Для урока нам понадобиться:

В уроке Мигаем светодиодом на Arduino мы уже рассмотрели программу и схему подключения светодиода. Добавим к ней кнопку и у нас получиться:

Урок 1 - Подключение кнопки и светодиода к плате Arduino

Принципиальная схема подключения кнопки к arduino

Скетч получится довольно простой.

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
   if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
 }
  else { //Иначе
      digitalWrite(led_pin, LOW);// выключаем светодиод
  }
}

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

pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.

В данной строчке пин button сконфигурирован как вход, для дальнейшего приема на него сигнала.

if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата

Считываем цифровое значение с pin button. Если получаем 5В, это значит HIGH и 0В LOW.

Конструкция if..else предоставляет больший контроль над процессом выполнения кода, чем базовый оператор if, позволяя осуществлять несколько проверок, объединенных вместе.

if (digitalRead(button_pin) == HIGH) //Если на пин button приходит сигнал HIGH то выполняем действие А
 { 
    // действие A
 }
else  //Иначе. В нашем случае если на пин button приходит LOW, выполняем действие В
 { 
    // действие B
 }

Если вам что то не понятно посмотрите уроки в блоке: Светодиоды, Резисторы, Arduino

Следующий урок: Arduino управляем двумя светодиодами с помощью кнопки

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


]]>
Функция analogWrite() http://portal-pk.ru/news/47-funkciya-analogwrite.html Константин Portal-PK 2017-02-08T13:53:34+03:00 Описание

Выдает аналоговую величину (ШИМ волну) на порт вход/выхода. Функция может быть полезна для управления яркостью подключенного светодиода или скоростью электродвигателя. После вызова analogWrite() на выходе будет генерироваться постоянная прямоугольная волна с заданной шириной импульса до следующего вызова analogWrite (или вызова digitalWriteили digitalRead на том же порту вход/выхода). Частота ШИМ сигнала приблизительно 490 Hz.

На большинстве плат Arduino (на базе микроконтроллера ATmega168 или ATmega328) ШИМ поддерживают порты 3, 5, 6, 9, 10 и 11, на плате Arduino Mega порты с 2 по 13. На более ранних версиях плат Arduino analogWrite() работал только на портах 9, 10 и 11.

Для вызова analogWrite() нет необходимости устанавливать тип вход/выхода функцией pinMode().

Функция analogWrite никак не связана с аналоговыми входами и с функцией analogRead.

Синтаксис

analogWrite(pin, value)

Параметры
  • pin: порт вход/выхода на который подаем ШИМ сигнал.
  • value: период рабочего цикла значение между 0 (полностью выключено) and 255 (сигнал подан постоянно).
Возвращаемое значение

нет

Замечание

Период ШИМ сигнала на портах вход/выхода 5 и 6 будет несколько длиннее. Это связано с тем, что таймер для данных выходов также задействован функциями millis() и delay(). Данный эффект более заметен при установке коротких периодов ШИМ сигнала (0-10).

Пример

Задание яркости светодиода пропорционально значению, снимаемому с потенциометра

int ledPin = 9;    // Светодиод подключен к выходы 9
int analogPin = 3; // потенциометр подключен к выходу 3
int val = 0;       // переменная для хранения значения

void setup()
{
    pinMode(ledPin, OUTPUT);      // установка порта на выход
}

void loop()
{
    val = analogRead(analogPin);  // считываем значение с порта, подключенному к потенциометру
    analogWrite(ledPin, val / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
}
]]>
Функция analogReference() http://portal-pk.ru/news/46-funkciya-analogreference.html Константин Portal-PK 2017-02-08T13:51:48+03:00 Описание

Функция определяет опорное напряжение относительно которого происходят аналоговые измерения. Функция analogRead() возвращает значение с разрешением 10 бит пропорционально входному напряжению на аналоговом входе, и в зависимости от опорного напряжения.

Возможные настройки:

  • DEFAULT: стандартное опорное напряжение 5 В (на платформах с напряжением питания 5 В) или 3.3 В (на платформах с напряжением питания 3.3 В)
  • INTERNAL: встроенное опорное напряжение 1.1 В на микроконтроллерах ATmega168 и ATmega328, и 2.56 В на ATmega8.
  • INTERNAL1V1: встроенное опорное напряжение 1.1 В (Arduino Mega)
  • INTERNAL2V56: встроенное опорное напряжение 2.56 (Arduino Mega)
  • EXTERNAL: внешний источник опорного напряжения, подключенный к выводу AREF
Синтаксис
analogReference(type)
Параметры

type: определяет используемое опорное напряжение (DEFAULT, INTERNAL или EXTERNAL).

Возвращаемое значение

нет

Внимание

Внешнее напряжение рекомендуется подключать к выводу AREF через резистор 5 кОм.

Таким образом уменьшается риск повреждения микросхемы Atmega если настройки analogReference не совпадают с возможностями платформы. Однако при этом произойдет небольшая просадка напряжения, вследствие того, что имеется встроенный резистор 32 кОм, подключенный к выводу AREF. В этом случае оба резистора работают как делитель напряжения. Подсоединение внешнего резистора позволяет быстро переключаться на напряжение 3.3 В вывода AREF с напряжения 5 В DEFAULT без конфигурации аппаратной части и АЦП.

Использование вывода AREF

Напряжение, подключенное к выводу AREF, конвертируется АЦП и, затем, определяется значение напряжения, при котором АЦП выдает самое высокое цифровое значение, т.е 1023. Другие значения напряжения, поступающие в АЦП, конвертируются пропорционально. Таким образом, при настройке DEFAULT 5 В значение напряжения 2.5 В в АЦП будет конвертироваться в 512.

В стандартной конфигурации платформ Arduino вывод AREF (вывод 21 Atmega) не задействован. В этом случае при настройке DEFAULT к выводу подключается внутреннее напряжение AVCC. Соединение является низко-импедансным и любое напряжение подведенное к выводу в этот момент может повредить микросхему ATMEGA.

Настройкой INTERNAL к выводу AREF подключается внутреннее напряжение 1.1 В (или 2.56 микросхемы ATmega8). При этом напряжение соответствующее или превышающее 1.1 В будет конвертироваться АЦП в 1023. Другие значения напряжения конвертируются пропорционально.

Внутреннее подключение источника 1.1 В к выводу является высоко-импедансным, что означает, что для измерение напряжения на выводе может быть произведено только мультиметром с высоким сопротивлением. Ошибочное подключение напряжения к выводу AREF при этой настройке функции analogReference не повредит микросхему, но превысит значение 1.1 В. В этом случае АЦП будет конвертировать напряжение внешнего источника. Во избежание вышеописанных проблем настоятельно рекомендуется подключать внешнее напряжение через резистор 5 кОм.

Рекомендуемой настройкой для вывода AREF является EXTERNAL. При этом происходит отключение обоих внутренних источников, и внешнее напряжение будет являться опорным для АЦП.

]]>
Функция analogRead() http://portal-pk.ru/news/45-funkciya-analogread.html Константин Portal-PK 2017-02-08T13:49:11+03:00 Функция считывает значение с указанного аналогового входа. Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini и Nano, 16 у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference().

Считывание значение с аналогового входа занимает примерно 100 микросекунд (0.0001 сек), т.е. максимальная частота считывания приблизительно 10,000 раз в секунду.

Синтаксис

analogRead(pin)

Параметры

pin: номер порта аналогового входа с которого будет производиться считывание (0..5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega)

Возвращаемое значение

int (0 to 1023)

Замечание

Если аналоговый вход не подключен, то значения возвращаемые функцией analogRead() могут принимать случайные значения.

Пример
int analogPin = 3;     // номер порта к которому подключен потенциометр
int val = 0;           // переменная для хранения считываемого значения

void setup()
{
  Serial.begin(9600);              //  установка связи по serial
}

void loop()
{
  val = analogRead(analogPin);     // считываем значение
  Serial.println(val);             // выводим полученное значение
}
]]>
Урок 3 — плавное включение светодиода на Arduino с помощью ШИМ (PWM) http://portal-pk.ru/news/44-urok-3-—-plavnoe-vklyuchenie-svetodioda-na-arduino-s-pomoshchyu.html Константин Portal-PK 2017-02-08T09:44:37+03:00 В первом уроке Мигаемвстроенным на плату Arduino светодиодом мы рассмотрели как можно мигать встроенным светодиодом. Но кроме мигания можно плавно включать и выключать светодиод с подошью ШИМ или в английском PWM (Pulse-Width Modulation) широтно-импульсная модуляция . Что такое ШИМ рассказывать не буду. В интернете очень много информации по данной теме.

Для урока нам понадобиться:

Подключение будет аналогично второму уроку: Мигаем светодиодом на Arduino. Только Переключим на пин на котором есть ШИМ. Их иногда обозначают волнистой чертой "~" или обводят кружочками или ещё как-то выделяют среди прочих. На Arduino Uno это "~".

Подключим к з пину, у нас получится следующая схема подключения.

PWM Arduino ШИМ

Так как ШИМ в Arduino 8 bit соответственно в программе мы можем использовать любое значение от 0 до 225.

Подправим код:

int led_pin=3;          // пин подключения
int brightness = 0;     // яркость светодиода
int fadeAmount = 3;     // шаг изменения яркости

void setup() { }

void loop()  { 
    analogWrite(led_pin, brightness);    // устанавливаем значение 
    brightness = brightness + fadeAmount;   // прибавляем шаг изменения яркости, которая установится в следующем цикле
    if (brightness == 0|| brightness == 255) { // Условие 
          fadeAmount = -fadeAmount ; // Меняем знак 
     //  delay(500);                  // ожидаем 1/2 секунды
    } 

   delay(50);                  // ожидаем 1/20 секунды        
}

int - означать что у нас переменные целочисленные от -32 768 до 32 767.

Переменная brightness нужна нам, чтобы задать первоначальное свечение светодиода и для увлечение в цикле.

Переменная fadeAmount устонавливает шага изменения яркости. Данная переменная должна быть кратная 255, для данной программы. Можно конечно проверить, чтобы при выполнении цикла наше значение не выходила за пределы 255. Но мы пока этого делать не умеем.

analogWrite(led_pin, brightness);

Для работы с ШИМ инициализируем выход как аналоговый analogWrite().

brightness = brightness + fadeAmount;

В данной строчке мы складываем две переменные. Так как все что находиться внутри функции loop() обрабатывается в непрерывном цикли. Благодаря этому сложение будет происходить при каждом проходе по циклу.

Для того чтобы переменная brightness не выходила за границы ШИМ (от 0 до 255 ) сделаем проверку:

if (brightness == 0 || brightness == 255)

Оператор If означает логическое ЕСЛИ. || логическое ИЛИ. == - это символ равенства двух значений. В нашем случае двух целочисленных значений.

Прочитаем строчку: ЕСЛИ переменная brightness равная 0 ИЛИ равны 255 то выполняем действия в {}.

В {} у нас вырождение fadeAmount = -fadeAmount ; Данное вырождение меняет знак на противоположный.


И так что же у нас происходит в цикле :

brightness увеличивается до тех пор пока не станет равным 255. После чего переменная fadeAmount меняет знак на минус а brightness начинает уменьшаться. После того как brightness становиться равным 0. fadeAmount снова меняет знак на положительный. И так все повторяется пока мы не отключим питание.


Следующий урок: Сигнал SOS с помощью Arduino и одного светодиода


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

]]>
+= , -= , *= , /= http://portal-pk.ru/news/43-+=---=--*=---=.html Константин Portal-PK 2017-02-07T11:56:44+03:00 Короткий способ записи арифметических действий над переменной и одним операндом.

Синтаксис
x += y;   // эквивалент записи x = x + y;
x -= y;   // эквивалент записи x = x - y; 
x *= y;   // эквивалент записи x = x * y; 
x /= y;   // эквивалент записи x = x / y;
Параметры
  • x: переменная любого типа
  • y: переменная любого типа или константа
Пример
x = 2;
x += 4;      // x равно 6
x -= 3;      // x равно 3
x *= 10;     // x равно 30
x /= 2;      // x равно 15
]]>
++ (увеличение значения) / -- (уменьшение значения) http://portal-pk.ru/news/42-++-uvelichenie-znacheniya------umenshenie-znacheniya.html Константин Portal-PK 2017-02-07T11:54:35+03:00 Унарные (имеющие один операнд) операторы ++, -- увеличивают, уменьшают значение переменной соответственно.

Синтаксис
x++;  // увеличивает значение x на единицу и возвращает старое значение x
++x;  // увеличивает значение x на единицу и возвращает новое значение x

x-- ;   // уменьшает значение x на единицу и возвращает старое значение x
--x ;   // уменьшает значение x на единицу и возвращает новое значение x
Параметры
  • x: переменная типа int или long (может быть беззнаковой)
Возвращаемое значение

Изначальное или новое, увеличенное или уменьшенное на единицу, значение переменной.

Пример
x = 2;
y = ++x;      // x теперь равно 3, y равно 3
y = x--;      // x равно 2, y равно 3
]]>
Логические операторы http://portal-pk.ru/news/41-logicheskie-operatory.html Константин Portal-PK 2017-02-07T11:51:39+03:00 Логические операторы чаще всего используются в проверке условия оператора if. Базовые сведения о логических операциях, смотрите в Википедии.

&& (логическое И)

Истина, если оба операнда истина (true).

if (digitalRead(2) == HIGH  && digitalRead(3) == HIGH) { // считывает состояние двух портов
  // ...
}

Истина если оба порта вход/выхода HIGH

|| (логическое ИЛИ)

Истина, если хотя бы один операнд истина, например:

if (x > 0 || y > 0) {
  // ...
}

будет верно (истина) если x или y больше 0.

! (логическое отрицание)

True, если операнд false, и наоборот, например:

if (!x) {
  // ...
}

условие верно, если x - false (x равно 0).

Важно различать логический оператор "И" - && и битовый оператор "И" - &. Тоже самое относится к логическому оператору "ИЛИ" - || и битовому оператору "ИЛИ" - |.

Пример
if (a >= 10 && a <= 20){}   // условие верно, если a больше 10, но меньше 20
]]>
Операторы сравнения http://portal-pk.ru/news/40-operatory-sravneniya.html Константин Portal-PK 2017-02-07T11:47:12+03:00 x == y (x равно y) x != y (x не равно y) x < y (x меньше чем y) x > y (x больше чем y) x <= y (x меньше чем или равно y) x >= y (x больше чем или равно y)

Внимание!

Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х). Вместо этого используйте знак двойного равенства (например, if (x == 10)), который является оператором сравнения и проверяет, х равен 10 или нет. Последнее из двух выражений будет истинно, только если х равен 10, но предыдущее выражение всегда верно.

Это связано с тем, что С вычисляет выражение if (x=10) следующим образом: значение 10 присваивается х (помним, что простой знак равенства – это оператор присваивания), таким образом, х теперь равен 10. Затем условный if вычисляет 10, которое уже равно ИСТИНА, так как любое число, неравное 0, равно ИСТИНА. Поэтому if (x=10) будет всегда иметь логическое значение ИСТИНА, которое не является желательным результатом, когда используется оператор if. Вдобавок, переменной х будет присвоено значение 10, что также не является желаемым действием.

]]>
% оператор http://portal-pk.ru/news/39-%-operator.html Константин Portal-PK 2017-02-07T11:44:28+03:00 Возвращает остаток от деления одного целого (int) операнда на другой.

Синтаксис
result = dividend % divisor
Параметры
  • dividend: делимое
  • divisor: делитель
Возвращаемое значение

Остаток от деления.

Пример
x = 7 % 5;   // x имеет значение 2
x = 9 % 5;   // x имеет значение 4
x = 5 % 5;   // x имеет значение 0
x = 4 % 5;   // x имеет значение 4
Советы по использованию %

Нельзя применить к типу float.

]]>
Арифметические операторы http://portal-pk.ru/news/38-arifmeticheskie-operatory.html Константин Portal-PK 2017-02-07T11:42:02+03:00 Сложение, вычитание, умножение и деление

Операторы +, -, * и / соответственно, возвращают результат выполнения арифметических действий над двумя операндами. Возвращаемый результат будет зависеть от типа данных операндов, например, 9 / 4 возвратит 2, т.к. операнды 9 и 4 имеют тип int. Также следует следить за тем, чтобы результат не вышел за диапазон допустимых значений для используемого типа данных. Так, например, сложение 1 с переменной типа int и значением 32 767 возвратит -32 768. Если операнды имеют разные типы, то тип с более "широким" диапазоном будет использован для вычислений.

Если один из операндов имеет тип float или double, то арифметика "с плавающей запятой" будет использована для вычислений.

Пример
y = y + 3;
x = x - 7;
i = j * 6;
r = r / 5;

Синтаксис

result = value1 + value2;
result = value1 - value2;
result = value1 * value2;
result = value1 / value2;
Параметры
  • value1: любая переменная или константа
  • value2: любая переменная или константа
]]>
= оператор присваивания http://portal-pk.ru/news/37-=-operator-prisvaivaniya.html Константин Portal-PK 2017-02-07T11:39:49+03:00 Присваивает переменной слева от оператора значение переменной или выражения, находящееся справа.

Пример
int sensVal;                 // объявление переменной типа integer
senVal = analogRead(0);       // присваивание переменной sensVal, значения, считанное с аналогового входа 0
Важно

Переменная слева от оператора присваивания (=) должна быть способна сохранить присваиваемое значение. Если оно выходит за диапазон допустимых значений, то сохраненное значение будет не верно.

Необходимо различать оператор присваивания (=) и оператор сравнения (== двойной знак равенства), который осуществляет проверку на равенство.

]]>
Комментарии http://portal-pk.ru/news/36-kommentarii.html Константин Portal-PK 2017-02-07T11:37:59+03:00 Комментарии – это строки в программе, которые используются для информирования вас самих или других о том, как работает программа. Они игнорируются компилятором и не экспортируются в процессор, таким образом, они не занимают место в памяти микроконтроллера Atmega.

Комментарии предназначены только для того, чтобы помочь вам понять (или вспомнить), как работает ваша программа или объяснить это другим. Есть два способа пометить строку как комментарий:

Пример
x = 5; // Это комментарий в одной строке. Все после двойного слэша – комментарий
      // до конца строки

/* это многострочный комментарий – используйте его для закоментирования целых кусков кода

if (gwb == 0){   // комментарий в строке допустим внутри многострочного комментария
                // но не другой многострочный комментарий
}

// не забывайте «закрывать» комментарии – они должны быть парными!
*/
Подсказка

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

]]>
{} (фигурные скобки) http://portal-pk.ru/news/35-{}-figurnye-skobki.html Константин Portal-PK 2017-02-07T11:36:23+03:00 Фигурные скобки {} (также называются просто «скобки») – важный элемент языка программирования С. Они используются в нескольких различных конструкциях, приведенных ниже, и это может иногда сбивать с толку начинающих.

Открывающая скобка “{” должна всегда сопровождаться закрывающей скобкой “}”. Это условие, известное как парность (симметричность) фигурных скобок. Arduino IDE (интегрированная среда разработчика) включает подходящий инструмент для проверки парности скобок. Достаточно выделить скобку, или даже поставить курсор сразу же за скобкой, как будет подсвечена её логическая пара.

Сейчас эта возможность работает с ошибкой, так как IDE часто ищет (некорректно) скобку в тексте, который «закомментирован».

Начинающие программисты или программисты, перешедшие на Си с Бейсика, часто считают использование фигурных скобок сбивающим с толку или пугающим. В конце концов, одни и те же фигурные скобки заменяют оператор RETURN в подпрограммах (функциях), оператор ENDIF в условных циклах и оператор NEXT в циклах FOR.

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

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

Основные способы использования фигурных скобок

Функции

void НазваниеФункции(тип данных аргумента){
   оператор(ы)
}

Циклы

while (логическое выражение)
 {
     оператор(ы)
 }
//////////////////////////
do<p>{
   оператор(ы)</p><p>} while (логическое выражение);
///////////////////////
for (инициализация; условие окончания цикла; приращения цикла)</p><p>{</p><p>   оператор(ы)</p><p>}</p>

Условные операторы

if (логическое выражение)
{
   оператор(ы)
}
else if (логическое выражение)
{
   оператор(ы)
}
else
{
   оператор(ы)
}
]]>
; (точка с запятой) http://portal-pk.ru/news/34-;-tochka-s-zapyatoi.html Константин Portal-PK 2017-02-07T11:31:27+03:00 Синтаксис ; (точка с запятой) используется для обозначения конца оператора.

Пример

int a = 13;

Подсказка

Забытая в конце строки точка с запятой приводит к ошибке компиляции. Текст ошибки может быть либо видимым и ссылаться на пропущенную точку с запятой, либо нет. Если встречается непонятная или похожая на нелогичную ошибка компиляции, одним из первых действий должна быть проверка пропущенных точек с запятой, в коде, непосредственно предшествующем строке, в которой компилятор выдал предупреждение.

]]>
Ключевое слово void http://portal-pk.ru/news/33-klyuchevoe-slovo-void.html Константин Portal-PK 2017-02-07T06:52:22+03:00 Ключевое слово void используется при объявлении функций, если функция не возвращает никакого значение при ее вызове (в некоторых языках программирования такие функции называют процедурами).

Пример
// в функциях "setup" и "loop" производятся некоторые действия,
// но ничего не возвращается во внешнюю программу

void setup()
{
  // ...
}

void loop()
{
  // ...
}
]]>
Массивы (arrays) http://portal-pk.ru/news/32-massivy-arrays.html Константин Portal-PK 2017-02-07T06:50:51+03:00 Массивы (arrays) — именованный набор однотипных переменных, с доступом к отдельным элементам по их индексу.

ОБЪЯВЛЕНИЕ МАССИВОВ

Ниже приведены несколько корректных вариантов объявления массивов:

int myInts[6];
int myPins[] = {2, 4, 8, 3, 6};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";

Массив может быть объявлен без непосредственной инициализации элементов массива, как в случае массива myInts.

Массив myPins был объявлен без явного задания размера. Компилятор сам посчитает фактическое количество элементов и создаcт в памяти массив необходимого размера.

Размер может быть задан явно, одновременно с инициализацией элементов массива. Обратите внимания, что при создании массива типа char, необходим дополнительный элемент массива для нулевого символа. Подробнее см. строки.

Доступ к элементам массива

Индексация массива начинается с 0. Это значит, что для массива с 10-тью элементами, индекс 9 будет последним:

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // myArray[0]    первый элемент, содержит 9
     // myArray[9]    последний элемент, содержит 11
     // myArray[10]   это неверно возможно возвращение произвольного значения из области памяти не относящийся к массиву

Присваиваем значение элементу массива

mySensVals[0] = 10;

Возвращаем значение элемента массива:

x = mySensVals[4];
Массивы и FOR циклы

Чаще всего для перебора элементов цикла используется цикл for, счетчик цикла используется как индекс для доступа к каждому элементу массива. Например, для вывода массива через Serial порт можно использовать следующий код:

int i;
for (i = 0; i < 5; i = i + 1) {
  Serial.println(myPins[i]);
}
]]>
String http://portal-pk.ru/news/31-string.html Константин Portal-PK 2017-02-07T06:45:35+03:00 String класс появился в версии Arduino 0019. Этот класс позволяет хранить и манипулировать текстовыми строками, по сравнению с string (массивом символов) класс String предоставляет удобные функции для работы со строками, такие как поиск вхождения в строку, объединение строк и др. Класс String занимает несколько больше места в памяти, чем массив символов string.

Обратите внимание при обращение к классу String — он пишется с заглавной S. Массив символов string — с прописной s. Строковые константы, записанные в "двойных кавычка" интерпретируются компилятором как массив символов, а не объект класса String.

]]>
string - текстовые строки http://portal-pk.ru/news/30-string---tekstovye-stroki.html Константин Portal-PK 2017-02-07T06:44:33+03:00 Описание

Текстовые строки в Ардуино объявляются как массив (array) типа char (символов - литер), оканчивающийся символом "конца строки".

Синтаксис

Ниже приведены варианты объявления и присвоения строк:

char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";

Возможны следующие варианты объявления текстовых строк:

  • Объявить массив символов без присваивания значений — Str1
  • Объявить массив символов и присвоить значения всем элементам, кроме последнего, компилятор Arduino автоматически добавит символ конца строки, как в Str2
  • Явно объявить завершающий символ, как в Str3
  • Инициализировать массив строковой константой в двойных кавычках. Компилятор автоматически задаст требуемый размер на массив, равный количеству символов плюс завершающий символ, как в варианте Str4
  • Инициализировать массив с явным заданием размера и присвоением строковой константы, строка Str5
  • Инициализировать массив с явным заданием дополнительного размера (с запасом), фактически превышающего размер строковой константы при начальном присвоение, как в варианте Str6
Символ окончания строки

Обычно строки оканчиваются нулевым символом (код 0 в ASCII). Это позволяет функциям (таким как Serial.print()) выявлять окончание строки. В противном случае могут считаться байты памяти, не принадлежащие переменной.

Массивы символов, выделяемый под строку, должен иметь один дополнительный элемент для символа конца строки. Именно поэтому Str2 и Str5 должны иметь 8 символом, хотя "arduino" 7 символов — последнему элементу автоматически присваивается символ окончания строки.

Технически возможно объявить строку без символа окончания строки, например, объявить длину массива равной 7 для Str2. Это приведет к некорректной работе функций, оперирующих строками.

Одинарные и двойные кавычки

Строки всегда объявляются внутри двойных кавычек ("Abc"). Символы — внутри одинарных ('A')

Инициализация длинных строк

Длинные строки могут быть объявлены так:

char myString[] = "This is the first line"
" this is the second line"
" etcetera";
Массивы строк

При работе с большими объемами текстовой информации, например в проектах с LCD дисплеем, бывает удобно использовать массивы строк. Так как строки сами по себе массивы, массивы строк будет двумерным массивом.

В примере ниже, символ звездочки после объявления типа "char*" указывает на то, что это массив указателей. Это необходимо для задания двумерного массива. В данном случае не требуется понимания всех тонкостей работы с указателями.

Пример
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6"};


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


void loop(){
for (int i = 0; i < 6; i++){
   Serial.println(myStrings[i]);
   delay(500);
   }
}
]]>
double http://portal-pk.ru/news/29-double.html Константин Portal-PK 2017-02-07T06:38:59+03:00 Описание типа данных

Тип данных double, в отличие от большинства языков программирования, имеет ту же точность, что и тип float и занимает также 4 байта памяти.

Тип double поддерживается в Arduino для совместимости кода с другими платформами.

]]>
float http://portal-pk.ru/news/28-float.html Константин Portal-PK 2017-02-07T06:37:33+03:00 Описание типа

Тип данных float служит для хранения чисел с плавающей запятой. Этот тип часто используется для операций с данными, считываемыми с аналоговых входов. Диапазон значений — от -3.4028235E+38 до 3.4028235E+38. Переменная типа floatзанимает 32 бита (4 байта) в памяти.

Тип float имеет точность 6-7 знаков, имеются ввиду все знаки, а не только мантисса. Обычно для увеличения точности используют другой тип - double, но на платформе Arduino, double и float имеют одинаковую точность.

Хранение в памяти чисел с плавающей точкой в двоичной системе обуславливает потерю точности. Так, например, 6.0 / 3.0 не обязательно равен 2.0. Сравнивая два числа с плавающей точкой следует проверять не точное равенство, а разницу между этими числами, меньше ли она некого выбранной малого порога.

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

Пример
float myfloat;
float sensorCalbrate = 1.117;

Синтаксис

float var = val;
  • var - имя переменной
  • val - присваиваемое значение
Пример использования в коде
int x;
int y;
float z;

x = 1;
y = x / 2;            // y теперь равен 0, тип int не может хранить дробные числа
z = (float)x / 2.0;   // z равна .5 (следует использовать 2.0, а не 2)
]]>
unsigned long http://portal-pk.ru/news/27-unsigned-long.html Константин Portal-PK 2017-02-07T06:33:06+03:00 Описание типа

Unsigned long используется для хранения положительных целых чисел в диапазоне от 0 до 4,294,967,295 (2^32 - 1) изанимает 32 бита (4 байта) в памяти.

Пример
unsigned long time;

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

void loop()
{
  Serial.print("Time: ");
  time = millis();
  //выводит время прошедшее с момента начала выполнения программы
  Serial.println(time);
  // ожидаем (делаем пауза) 1 секунду
  delay(1000);
}

Синтаксис

unsigned long var = val;
  • var - имя переменной
  • val - присваиваемое значение
]]>
long http://portal-pk.ru/news/26-long.html Константин Portal-PK 2017-02-07T06:30:48+03:00 Описание типа

Тип данных long используется для хранения целых чисел в расширенном диапазоне от -2,147,483,648 до 2,147,483,647.long занимает 4 байта в памяти.

Пример
long speedOfLight = 186000L;  // См. значение постфикса 'L' в теме Целочислесленные константы

Синтаксис

long var = val;
  • var - имя переменной
  • val - присваиваемое значение
]]>
word http://portal-pk.ru/news/25-word.html Константин Portal-PK 2017-02-07T06:27:45+03:00 Описание типа

Тип данных word хранит 16-битное, не содержащее знака, число от 0 до 65535. Тоже самое, что unsigned int — (беззнаковое целое число).

Пример
word w = 10000;
]]>
unsigned int http://portal-pk.ru/news/24-unsigned-int.html Константин Portal-PK 2017-02-06T09:26:26+03:00 Описание типа

Тип данных unsigned int - беззнаковое целое число, также как и тип int (знаковое) занимает в памяти 2 байта. Но в отличие от int, тип unsigned int может хранить только положительные целые числа в диапазоне от 0 до 65535 (2^16)-1).

Отличие кроется в том как unsigned int использует старший бит, иногда называемый знаковый бит. Если старший бит равен 1, то для типа int компилятор Arduino считает, что это число отрицательное, а остальные 15 bit несут информацию о модуле целого числа в дополнительного кода представления числа, в то время как unsigned int использует все 16 бит для хранения модуля числа.

Пример
unsigned int ledPin = 13;

Синтаксис

unsigned int var = val;
  • var - имя переменной
  • val - присваиваемое значение
Замечание по использованию типа unsigned int

Когда переменная типа int в следствие арифметической операции достигает своего максимального значения, она "перескакивает" на самое минимальное значение и наоборот:

unsigned int x
   x = 0;
   x = x - 1;       // x теперь равна 65535 
   x = x + 1;       // x теперь 0
]]>
int http://portal-pk.ru/news/23-int.html Константин Portal-PK 2017-02-06T09:23:35+03:00 Описание типа данных

Тип данных int (от англ. integer - целое число) один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1)

Для размещения отрицательных значений int использует, так называемый, дополнительный код представления числа. Старший бит указывает на отрицательный знак числа, остальные биты инвертируются с добавлением 1.

Arduino компилятор сам заботиться о размещение в памяти и представление отрицательных чисел, поэтому арифметические действия над целыми числами производятся как обычно.

Пример
int ledPin = 13;
Синтаксис

int var = val;

  • var - имя переменной;
  • val - значение присваиваемое переменной;
Замечание по использованию типа int

Когда переменная типа int в следствие арифметической операции достигает своего максимального значения, она "перескакивает" на самое минимальное значение и наоборот:

int x
x = -32,768;
x = x - 1;       // x теперь равно 32,767 - перескакивает на минимальное значение

x = 32,767;
x = x + 1;       // x теперь равно -32,768
]]>
byte http://portal-pk.ru/news/22-byte.html Константин Portal-PK 2017-02-06T09:20:00+03:00 Описание типа

Тип данных byte 8-ми битное беззнаковое целое число, в диапазоне 0..255.

byte c = B10010;  // "B" префикс двоичной системы счисления(B10010 = 18 в десятичной системе счисления)
]]>
char http://portal-pk.ru/news/21-char.html Константин Portal-PK 2017-02-06T09:18:54+03:00 Переменная типа char занимает 1 байт памяти и может хранить один алфавитно-цифровой символ (литеру). При объявление литеры используются одиночные кавычки: 'A' (двойные кавычки используется при объявлении строки символов - тип string: "ABC").

Символ хранится в памяти как число, соответствующее коду символа в таблице кодировки символов ASCII. Т.к. символ хранится как число в памяти над ним возможно производить арифметические действия (например, 'A' + 1 будет 66, т.к. ASCII код для 'A' - 65).

Тип char знаковый тип, т.е. число (код) хранящийся в памяти может принимать значения от -128 до 127. Если необходим беззнаковая однобайтовая переменная, используйте тип byte.

char myChar = 'A';
char myChar = 65;      //Варианты эквивалентны


]]>
boolean http://portal-pk.ru/news/20-boolean.html Константин Portal-PK 2017-02-06T09:17:19+03:00 Логический (булевый) тип данных — boolean. Может принимать одно из двух значений true или false. boolean занимает в памяти один байт.

int LEDpin = 5;       // Светодиод на входе 5
int switchPin = 13;   // выключатель на порту 13, замыкает на землю


boolean running = false;


void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);      // включаем подтягивающий резистор
}


void loop()
{
  if (digitalRead(switchPin) == LOW)
  {  // выключатель нажат, т.к. подтягивающий резистор будет давайть HIGH на входе, если не замкнут напрямую на землю
    delay(100);                        // ждем 0.1сек
    running = !running;                // меняем значение булевой переменной
    digitalWrite(LEDpin, running)      // включаем или выключаем светодиод.
  }
}


]]>
Оператор goto http://portal-pk.ru/news/19-operator-goto.html Константин Portal-PK 2017-02-03T06:45:38+03:00 Условное «перемещение» выполнения программы к определенной метке-указателю в самой программе, при этом пропускается весь код до самой метки, а исполняется - после нее.

Синтаксис:
label: 
//
// какой-либо код
//
goto label; // переходим к метке label
Замечание по использованию

Использование goto не рекомендуется в С программировании, многие авторы книг не советуют его применять вообще, так как это не является необходимым(с их точки зрения). Причины их негодования заключаются в том, что программист при частом использовании в коде, команды goto - может запустить программу в бесконечный цикл, который потом трудно будет найти – отладка программы значительно усложниться. С другой стороны, если взгянуть на ассемблерный код, то там часто используется подобный переход по метке.

При разумном применении, команда может значительно упростить код программы и сохранить время программиста. Например, в случае необходимости выхода из глубоких циклов for, while, проверок if и прочих многократно вложенных контрукций.

Пример
for(byte r = 0; r < 255; r++){
    for(byte g = 255; g > -1; g--){
        for(byte b = 0; b < 255; b++){
            if (analogRead(0) > 250){ goto bailout;}
            // еще код
        }
    }
}
bailout:


]]>
return http://portal-pk.ru/news/18-return.html Константин Portal-PK 2017-02-03T06:43:36+03:00 Прекращает вычисления в функции и возвращает значение из прерванной функции в вызывающую, если это нужно.

Синтаксис

return;

return значение; // обе формы допустимы

Параметры

Значение: переменная или константа любого типа

Примеры:

Функция сравнивает значение на датчике входа с пороговым

int checkSensor(){      
    if (analogRead(0) > 400) {
        return 1;
    else{
        return 0;
    }
}

С помощью ключевого слова return удобно тестировать блоки кода без «закомментирования» больших кусков с возможным ошибочным кодом.

void loop(){

  // здесь блестящая идея тестирования кода

  return;

  // оставшаяся часть неправильно функционирующего варианта здесь
  // этот код никогда не будет выполняться

}
]]>
continue http://portal-pk.ru/news/17-continue.html Константин Portal-PK 2017-02-03T06:40:30+03:00 Оператор continue пропускает оставшиеся операторы в текущем шаге цикла. Вместо них выполняется проверка условного выражения цикла, которая происходит при каждой следующей итерации.

for (x = 0; x < 255; x ++)
{
    if (x > 40 && x < 120){      // если истина то прыгаем сразу на следующую итерацию цикла
        continue;
    }

    digitalWrite(PWMpin, x);
    delay(50);

}
]]>
break http://portal-pk.ru/news/16-break.html Константин Portal-PK 2017-02-03T06:38:49+03:00 Break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch

Пример
for (x = 0; x < 255; x ++)
{
    digitalWrite(PWMpin, x);
    sens = analogRead(sensorPin); 
    if (sens > threshold){      // выходим из цикла если есть сигнал с датчика
       x = 0;
       break;
    } 
    delay(50);
}
]]>
do ... while http://portal-pk.ru/news/15-do--while.html Константин Portal-PK 2017-02-03T06:37:25+03:00 Цикл do работает так же, как и цикл while, за исключением того, что условие проверяется в конце цикла, таким образом, цикл do будет всегда выполняться хотя бы раз.

do
{
    // последовательность операторов
} while (проверка условия);

Пример

do
{
  delay(50);          // подождать, пока датчики стабилизируются
  x = readSensors(); // проверить датчики 
} while (x < 100);
]]>
Циклы while http://portal-pk.ru/news/14-cikly-while.html Константин Portal-PK 2017-02-03T06:35:41+03:00 While будет вычислять в цикле непрерывно и бесконечно до тех пор, пока выражение в круглых скобках, () не станет равно логическому ЛОЖНО. Что-то должно изменять значение проверяемой переменной, иначе выход из цикла whileникогда не будет достигнут. Это изменение может происходить как в программном коде, например, при увеличении переменной, так и во внешних условиях, например, при тестировании датчика.

Синтаксис
while(выражение){
 // оператор(ы)
}
Параметры

выражение - (булевский) C-оператор, который возвращает значение истина или ложь

Пример
var = 0;

while(var < 200){
 // выполнить что-то, повторив 200 раз
 var++;
}
]]>
Функция delay() http://portal-pk.ru/news/13-funkciya-delay.html Константин Portal-PK 2017-02-01T09:11:42+03:00 Останавливает выполнение программы на заданное в параметре количество миллисекунд (1000 миллисекунд в 1 секунде).

Синтаксис
delay(ms)
Параметры

ms: количество миллисекунд, на которое приостанавливается выполнение программы.

Возвращаемое значение

Нет

Пример
int ledPin = 13;                 // светодиод подключен на порт 13

void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливается режим порта - выход
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // включаем светодиод
  delay(1000);                  // ожидаем секунду
  digitalWrite(ledPin, LOW);    // выключаем светодиод
  delay(1000);                  // ожидаем секунду
}
Замечания по использования функции

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

Большинство активности платы останавливается функцией delay(). Тем не менее работа прерываний не останавливается, продолжается запись последовательно (serial) передаваемых данных на RX порту, ШИМ сигнал (analogWrite) продолжает генерироваться на портах.

]]>
Оператор Switch http://portal-pk.ru/news/12-operator-switch.html Константин Portal-PK 2017-02-01T09:00:59+03:00 Подобно конструкции if, switch...case управляет процессом выполнения программы, позволяя программисту задавать альтернативный код, который будет выполняться при разных условиях. В частности, оператор switch сравнивает значение переменной со значением, определенном в операторах case. Когда найден оператор case, значение которого равно значению переменной, выполняется программный код в этом операторе.

Ключевое слово break является командой выхода из оператора case и обычно используется в конце каждого case. Без оператора break оператор switchбудет продолжать вычислять следующие выражения, пока не достигнет break или конец оператора switch.

switch (var) {
    case 1:
      //выполняется, когда var равно 1
      break;
    case 2:
      //выполняется когда  var равно 2
      break;
    default: 
      // выполняется, если не выбрана ни одна альтернатива 
      // default необязателен 
  }

Синтаксис:

switch (var) {
 case label:
    // код для выполнения
    break;
 case label:
    // код для выполнения
    break;
 default:
    // код для выполнения
}

Параметры:

  • var: переменная, которая вычисляется для сравнения с вариантами в case
  • label: значение, с которым сравнивается значение переменно


]]>
Оператор For http://portal-pk.ru/news/11-operator-for.html Константин Portal-PK 2017-02-01T08:57:00+03:00 Конструкция for используется для повторения блока операторов, заключенных в фигурные скобки. Счетчик приращений обычно используется для приращения и завершения цикла. Оператор for подходит для любых повторяющихся действий и часто используется в сочетании с массивами коллекций данных/выводов.

Заголовок цикла for состоит из трех частей:

for (initialization; condition; increment) {операторы выполняющиеся в цикле}

Инициализация (Initialization) выполняется самой первой и один раз. Каждый раз в цикле проверяется условие (condition), если оно верно, выполняется блок операторов и приращение (increment), затем условие проверяется вновь. Когда логическое значение условия становится ложным, цикл завершается.

Пример
// Затемнение светодиода с использованием ШИМ-вывода
int PWMpin = 10; // Светодиод последовательно с резистором 470 ом на 10 выводов
void setup()
{
 // настройка не нужна 
}
void loop()
{
   for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);
   }
}
Советы по применению

Цикл for в Си гораздо более гибкий, чем циклы for в других языках программирования, например, в Бейсике. Любой из трех или все три элемента заголовка могут быть опущены, хотя точки с запятой обязательны. Также операторы для инициализации, условия и приращения цикла могут быть любым допустимым в Си операторами с независимыми переменными, и использовать любой тип данных Си, включая данные с плавающей точкой (floats). Эти необычные для цикла for типы операторов позволяют обеспечить программное решение некоторых нестандартных проблем.

Например, использование умножения в операторе счетчика цикла позволяет создавать логарифмическую прогрессию:

for(int x = 2; x < 100; x = x * 1.5){
    println(x);
}

Генерируется: 2,3,4,6,9,13,19,28,42,63,94

Другой пример, плавное уменьшение или увеличение уровня сигнала на светодиод с помощью одного цикла for:

void loop()
{
  int x = 1;
  for (int i = 0; i > -1; i = i + x){
      analogWrite(PWMpin, i);
      if (i == 255) x = -1;             // переключение управления на максимуме
      delay(10);
   }
}


]]>
Оператор If..else http://portal-pk.ru/news/10-operator-ifelse.html Константин Portal-PK 2017-02-01T08:53:29+03:00 Конструкция if..else предоставляет больший контроль над процессом выполнения кода, чем базовый оператор if, позволяя осуществлять несколько проверок, объединенных вместе. Например, аналоговый вход может быть проверен и выполнено одно действие, если на входе меньше 500, или другой действие, если на входе 500 или больше. Код при этом может выглядеть так:

if (pinFiveInput < 500)
{
  // действие A
}
else
{
  // действие B
}

Другой способ создания переходов со взаимоисключающими проверками использует оператор switch case.

Else позволяет делать отличную от указанной в if проверку, чтобы можно было осуществлять сразу несколько взаимоисключающих проверок. Каждая проверка позволяет переходить к следующему за ней оператору не раньше, чем получит логический результат ИСТИНА. Когда проверка с результатом ИСТИНА найдена, запускается вложенная в нее блок операторов, и затем программа игнорирует все следующие строки в конструкции if..else. Если ни одна из проверок не получила результат ИСТИНА, по умолчанию выполняется блок операторов в else, если последний присутствует, и устанавливается действие по умолчанию.

Отметим, что конструкция else if может быть использована с или без заключительного else и наоборот. Допускается неограниченное число таких переходов else if.

if (pinFiveInput < 500)
{
  // выполнять действие A
}
else if (pinFiveInput >= 1000)
{
  // выполнять действие B
}
else
{
  // выполнять действие  C
}

Другой способ создания переходов со взаимоисключающими проверками использует оператор switch case.

]]>
Оператор If http://portal-pk.ru/news/9-operator-if.html Константин Portal-PK 2017-02-01T08:50:58+03:00 if (условие) и ==, !=, <, > (операторы сравнения)

if, используется в сочетании с операторами сравнения, проверяет, достигнута ли истинность условия, например, превышает ли входное значение заданное число. Формат оператора if следующий:

if (someVariable > 50)
{
// выполнять действия
}

Программа проверяет, значение someVariable больше чем 50 или нет. Если да, то выполняются определенные действия. Говоря иначе, если выражение в круглых скобках истинно, выполняются операторы внутри фигурных скобок. Если нет, программа пропускает этот код.

Скобки после оператора if могут быть опущены. Если так сделано, только следующая строка (обозначенная точкой с запятой) становится оператором, выполняемым в операторе if.

if (x > 120) digitalWrite(LEDpin, HIGH);

if (x > 120)
digitalWrite(LEDpin, HIGH);

if (x > 120){ digitalWrite(LEDpin, HIGH); }

if (x > 120){
digitalWrite(LEDpin1, HIGH);
digitalWrite(LEDpin2, HIGH);
}                                 // все правильно

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

Операторы сравнения

x == y (x равно y)

x != y (x не равно y)

x < y (x меньше чем y)

x > y (x больше чем y)

x <= y (x меньше чем или равно y)

x >= y (x больше чем или равно y)

Внимание!

Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х). Вместо этого используйте знак двойного равенства (например, if (x == 10)), который является оператором сравнения и проверяет, х равен 10 или нет. Последнее из двух выражений будет истинно, только если х равен 10, но предыдущее выражение всегда верно.

Это связано с тем, что С вычисляет выражение if (x=10) следующим образом: значение 10 присваивается х (помним, что простой знак равенства – это оператор присваивания), таким образом, х теперь равен 10. Затем условный if вычисляет 10, которое уже равно ИСТИНА, так как любое число, неравное 0, равно ИСТИНА. Поэтому if (x=10) будет всегда иметь логическое значение ИСТИНА, которое не является желательным результатом, когда используется оператор if. Вдобавок, переменной х будет присвоено значение 10, что также не является желаемым действием.

If также может быть частью разветвленной управляющей конструкции с использованием if...else

]]>
Функция digitalRead() http://portal-pk.ru/news/8-funkciya-digitalread.html Константин Portal-PK 2017-01-31T14:01:52+03:00 digitalRead()
Описание

Функция считывает значение с заданного входа - HIGH или LOW.

Синтаксис

digitalRead(pin)

Параметры

pin: номер вход/выхода(pin) который Вы хотите считать

Возвращаемое значение

HIGH или LOW

Пример
int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
int inPin = 7;                   // кнопка на входе 7
int val = 0;                     // переменная для хранения значения

void setup()
{
  pinMode(ledPin, OUTPUT);       // устанавливает режим работы - выход для 13го вход/выхода (pin)
  pinMode(inPin, INPUT);         //  устанавливает режим работы - вход для 7го вход/выхода (pin)
}

void loop()
{
  val = digitalRead(inPin);      // считываем значение с входа
  digitalWrite(ledPin, val);     // устанавливаем значение на светодиоде равным значению входа кнопки
}
Примечание

Если вход не подключен, то digitalRead может возвращать значения HIGH или LOW случайным образом.

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

]]>
Функция digitalWrite() http://portal-pk.ru/news/7-funkciya-digitalwrite.html Константин Portal-PK 2017-01-31T13:58:18+03:00 digitalWrite()

Описание

Подает HIGH или LOW значение на цифровой вход/выход (pin).

Если вход/выход (pin) был установлен в режим выход (OUTPUT) функцией pinMode(), то для значение HIGH напряжение на соответствующем вход/выходе (pin) будет 5В (3.3В для 3.3V плат), и 0В(земля) для LOW.

Если вход/выход (pin) был установлен в режим вход (INPUT), то функция digitalWrite со значением HIGH будет активировать внутренний 20K нагрузочный резистор. Подача LOW в свою очередь отключает этот резистор. Нагрузочного резистра достаточно чтобы светодиод, подключенный к входу, светил тускло. Если вдруг светодиод работает, но очень тускло, возможно необходимо установить режим выход (OUTPUT) функцией pinMode().

Замечание. Вход/выход 13 сложнее использовать как цифровой вход, т.к. он имеет встроенный в плату резистор и светодиод. Если вы активируете еще внутренний нагрузочный резистор 20K, то напряжение на этом входе будет около 1.7В, вместо ожидаемых 5В, т.к. светодиод и добавочный резистор снижает напряжение, т.е. Вы всегда будете получать LOW. Если же Вам все же необходимо использовать 13ый вход/выход, то используйте внешний нагрузочный резистор.

Синтаксис

digitalWrite(pin, value)

Параметры
  • pin: номер вход/выхода(pin)
  • value: значение HIGH или LOW
Возвращаемое значение

нет

Пример
int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}

void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  delay(1000);                  // ждет секунду
  digitalWrite(ledPin, LOW);    // выключает светодиод
  delay(1000);                  // ждет секунду
}
Примечание

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

]]>
Функция pinMode http://portal-pk.ru/news/6-funkciya-pinmode.html Константин Portal-PK 2017-01-31T12:46:45+03:00 pinMode()
Описание

Устанавливает режим работы заданного вход/выхода(pin) как входа или как выхода. Подробнее про цифровые вход/выходы(pins).

Синтаксис

pinMode(pin, mode)

Параметры
  • pin: номер вход/выхода(pin), который Вы хотите установить
  • mode: режим одно из двух значение - INPUT или OUTPUT, устанавливает на вход или выход соответственно.
Возвращаемое значение

нет

Пример
int ledPin = 13;                 // Светодиод, подключенный к вход/выходу 13
void setup()
{
  pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
}
void loop()
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  delay(1000);                  // ждет секунду
  digitalWrite(ledPin, LOW);    // выключает светодиод
  delay(1000);                  // ждет секунду
}
Примечание

Аналоговые входы (analog pins) могут быть использованы как цифровые вход/выходы (digital pins). Обращение к ним идет по номерам от 14 (для аналогового входа 0) до 19 (для аналогового входа 5).

]]>
Константы http://portal-pk.ru/news/5-konstanty.html Константин Portal-PK 2017-01-31T12:42:53+03:00 Константами в языке Ардуино называют некоторые предопределенные значения. Они позволяют сделать код программы более легким для восприятия. Константы разделяют на три группы:

Логические константы

В языке Ардуино есть две константы для представления логических значений истина и ложь: true и false.

false

false определяется как 0, в логическом выражении.

true

Обычно говорят, что true — это 1, это корректно, но также корректно то, что для integer любой значение отличное от 0 будет также true в логическом выражение. Т.е -1, -2 и -200 будет также true в логическом выражении.

Обратите внимание, что true и false пишутся строчными буквами, в отличие от HIGH, LOW, INPUT и OUTPUT.

Задание значение на входа/выходе, HIGH и LOW

Возможны только два значения для считывания или записи на цифровой порт вход/выхода: HIGH и LOW.

HIGH

HIGH может обозначать несколько разное в зависимость от уставки режима порта как INPUT или OUTPUT. Когда порт вход/выхода установлен в режим INPUT с помощью функции pinMode, и считывается функцией digitalRead, микроконтроллер отдаст значение HIGH при напряжение 3В или выше на указанном порту.

Также порт может быть установлен как INPUT функцией pinMode, и затем установлен в HIGH значение функцией digitalWrite. Это подключит к порту внутренний подтягивающий резистор 20K, что позволит получать постоянное значение HIGH при чтение этого порта, если только значение не будет приведено к LOW внешней цепью подключенной к этому порту.

Когда порт вход/выхода сконфигурирован как OUTPUT функцией pinMode, и установлено значение HIGH функцией digitalWrite, на порту будет постоянное напряжение 5В. От этого порта может быть запитан светодиод, подключенный через резистор на землю или к другому порту, сконфигурированному как OUTPUT и установленному в LOW.

LOW

Значение LOW также разное для режима INPUT и OUTPUT. Когда порт сконфигурирован как INPUT, и считывается функцие digitalRead, микроконтроллер вернет LOW если напряжение на данном порту меньше или равно 2В.

Если же порт установлен в OUTPUT и LOW, то напряжение на выходе порта будет 0 Вольт. К этому порту можно подключать нагрузку как к земле, как описано выше на примере светодиода.

Задание режима порта вход/выхода, INPUT и OUTPUT

Цифровые порты вход/выхода, могут быть установлены в режимы работы как вход или выход: INPUT или OUTPUT. Установка производится функцией pinMode().

INPUT

Порты Arduino установленные в режим INPUT находятся в высокоимпедансном состоянии. Это означает то, что порт ввода дает слишком малую нагрузки на схему, в которую он включен. Эквивалентом внутреннему сопротивлению будет резистор 100 МОм подключенный к выводу микросхемы. Таким образом, для перевода порта ввода из одного состояния в другое требуется маленькое значение тока. Это позволяет применять выводы микросхемы для подключения различных датчиков, но не питания.

OUTPUT

Порт установленный в режим выхода — OUTPUT, находится в низкоимпедансном состояние. Он может пропускать через себя довольно большой ток, до 40 mA, достаточный для запитывание внешней цепи, например, светодиода. В этом состоянии порт может быть поврежден как замыкании на землю так и на питание 5В. Тока с порта микроконтроллера не достаточно для питания моторов и сервоприводов напрямую.

]]>
Функция Loop http://portal-pk.ru/news/4-funkciya-loop.html Константин Portal-PK 2017-01-31T12:39:38+03:00 loop()

После вызова функции setup(), которая инициализирует и устанавливает первоначальные значения, функция loop() делает точь-в-точь то, что означает её название, и крутится в цикле, позволяя вашей программе совершать вычисления и реагировать на них. Используйте её для активного управления платой Arduino.

int buttonPin = 3;

// setup инициализирует последовательный порт и кнопку
void setup()
{
  beginSerial(9600);
  pinMode(buttonPin, INPUT);
}

// в цикле проверяется состояние кнопки,
// и на последовательный порт будет отправлено сообщение, если она нажата
void loop()
{
  if (digitalRead(buttonPin) == HIGH)
    serialWrite('H');
  else
    serialWrite('L');


  delay(1000);
}
]]>
Функция Setup http://portal-pk.ru/news/3-funkciya-setup.html Константин Portal-PK 2017-01-31T12:36:00+03:00 Функция setup() вызывается, когда стартует скетч. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Функция setup запускает только один раз, после каждой подачи питания или сброса платы Arduino.

Пример

int buttonPin = 3;

void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}

void loop()
{
  // ...
}


]]>
Урок 2 – Мигаем светодиодом на Arduino http://portal-pk.ru/news/2-urok-2---migaem-svetodiodom--na-arduino.html Константин Portal-PK 2017-01-27T09:59:54+03:00 В предыдущем уроке Мигаем встроенным на плату Arduino светодиодом мы рассмотрели как можно мигать встроенным светодиодом. Но как подключить светодиод, который нравиться нам: зеленый или синий, 3 или 5 мм? К какому пину (pin) платы Arduino можно подключить светодиод?

Все эти вопросы рассмотрим в данном уроке: Мигаем светодиодом на Arduino .

Для урока нам понадобиться:

Сначала подключим светодиод к 13 пину. Для данного подключения программа будет точно такой же.

/*
  Зажигаем светодиод на одну секунду, затем выключаем его на  
  одну  секунду в цикле.
 */
void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.
    pinMode(13, OUTPUT);   
}
void loop() {
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(1000);              // ждем секунду
  digitalWrite(13, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}

Только мигать будут и встроенный светодиод и который мы подключим.

Ардуино и светодиод

Как же сделать чтобы мигал только наш светодиод? Для этого необходимо его подключить к другому цифровому пину (pin) платы Arduino. Цифровыми выводами на плате Arduino UNO и Arduino NANO являются выводы подписанные Digital (имеют нумерацию 0 до 13).

Подключим например к пину 2 платы Arduino.

Arduino LED

Наша программа примет вот такой вид.

/*
  Зажигаем светодиод на одну секунду, затем выключаем его на  
  одну  секунду в цикле.
 */
void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(2, OUTPUT);   
}
void loop() {
  digitalWrite(2, HIGH);   // зажигаем светодиод
  delay(3000);              // ждем 3 секунды
  digitalWrite(2, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}

Немного изменим время свечения светодиода с 1 секунды до 3.

Следующий урок: Плавное включение светодиода на Arduino с помощью ШИМ (PWM)

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


]]>
Урок 1 - Мигаем встроенным на плату Arduino светодиодом http://portal-pk.ru/news/1-urok-1---miganie-vstroennym-na-platu-arduino-svetodiodom.html Константин Portal-PK 2017-01-27T08:46:58+03:00 На плату Arduino UNO (Nano, Mega, micro и пр.) установлен светодиод который соединен с 13 pin платы. На плате он обозначается буквой L.

Для того чтобы заставить мигать встроенный светодиод на плату Arduino. Достаточно загрузить не большую программу.

Для урока нам понадобиться:

/*
  Зажигаем светодиод на одну секунду, затем выключаем его на  
  одну  секунду в цикле.
 */
void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.
    pinMode(13, OUTPUT);   
}
void loop() {
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(1000);              // ждем секунду
  digitalWrite(13, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}

Функция setup() вызывается, когда стартует скетч. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Функция setup запускает только один раз, после каждой подачи питания или сброса платы Arduino.

pinMode(13, OUTPUT); Инициализируем цифровой вход/выход в режиме выхода. Этого можно не делать так как цифровые выходы Ардуины по умолчанию настроенные на режим выход.

После вызова функции setup(), которая инициализирует и устанавливает первоначальные значения, функция loop() делает точь-в-точь то, что означает её название, и крутится в цикле, позволяя вашей программе совершать вычисления и реагировать на них. Использовать её нужно для активного управления платой Arduino.

DigitalWrite() - Так как у нас пин настроен как выход (pinMode(13, OUTPUT);), то для значение HIGH напряжение на соответствующем вход/выходе (pin) будет 5В (3.3В для 3.3V плат), и 0В(земля) для LOW.

Т.е. digitalWrite(13, HIGH); - На пин 13 подается 5 вольт.

digitalWrite(13, LOW); - На пин 13 подается 0В.

delay() - Останавливает выполнение программы на заданное в параметре количество миллисекунд (1000 миллисекунд в 1 секунде).

Следующий урок: Мигаем светодиодом подключенным к 2 pin Arduino



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

]]>